@@ -3940,6 +3940,59 @@ static EsObject *lrop_markplaceholder (OptVM *vm, EsObject *name)
39403940 return es_false ;
39413941}
39423942
3943+ static EsObject * lrop_makepromise (OptVM * vm , EsObject * name )
3944+ {
3945+ struct lregexControlBlock * lcb = opt_vm_get_app_data (vm );
3946+ if (lcb -> window -> patbuf -> regptype == REG_PARSER_SINGLE_LINE )
3947+ {
3948+ error (WARNING , "don't use `%s' operator in --regex-<LANG> option" ,
3949+ es_symbol_get (name ));
3950+ return OPTSCRIPT_ERR_NOTMTABLEPTRN ; /* TODO */
3951+ }
3952+
3953+ EsObject * endobj = opt_vm_ostack_top (vm );
3954+ if (es_object_get_type (endobj ) != OPT_TYPE_MATCHLOC )
3955+ return OPT_ERR_TYPECHECK ;
3956+ matchLoc * end = es_pointer_get (endobj );
3957+ off_t end_off = (off_t )(end -> base + end -> delta );
3958+
3959+ EsObject * startobj = opt_vm_ostack_peek (vm , 1 );
3960+ if (es_object_get_type (startobj ) != OPT_TYPE_MATCHLOC )
3961+ return OPT_ERR_TYPECHECK ;
3962+ matchLoc * start = es_pointer_get (startobj );
3963+ off_t start_off = (off_t )(start -> base + start -> delta );
3964+
3965+ if (! (start_off < end_off ))
3966+ return OPT_ERR_RANGECHECK ;
3967+
3968+ EsObject * lang = opt_vm_ostack_peek (vm , 2 );
3969+ const char * langc = opt_string_get_cstr (lang );
3970+ langType t = getNamedLanguageOrAlias (langc , 0 );
3971+ if (t == LANG_IGNORE )
3972+ return OPTSCRIPT_ERR_UNKNOWNLANGUAGE ;
3973+
3974+ if (start_off == end_off )
3975+ {
3976+ opt_vm_ostack_pop (vm );
3977+ opt_vm_ostack_pop (vm );
3978+ opt_vm_ostack_pop (vm );
3979+ opt_vm_ostack_push (vm , es_false );
3980+ return es_false ;
3981+ }
3982+
3983+ int promise = makePromiseForAreaSpecifiedWithOffsets (langc ,
3984+ start_off ,
3985+ end_off );
3986+ opt_vm_ostack_pop (vm );
3987+ opt_vm_ostack_pop (vm );
3988+ opt_vm_ostack_pop (vm );
3989+ EsObject * promise_obj = es_integer_new (promise );
3990+ opt_vm_ostack_push (vm , promise_obj );
3991+ es_object_unref (promise_obj );
3992+
3993+ return es_false ;
3994+ }
3995+
39433996static struct optscriptOperatorRegistration lropOperators [] = {
39443997 {
39453998 .name = "_matchstr" ,
@@ -4097,7 +4150,13 @@ static struct optscriptOperatorRegistration lropOperators [] = {
40974150 .fn = lrop_markplaceholder ,
40984151 .arity = 1 ,
40994152 .help_str = "tag:int _MARKPLACEHOLDER -" ,
4100- }
4153+ },
4154+ {
4155+ .name = "_makepromise" ,
4156+ .fn = lrop_makepromise ,
4157+ .arity = 3 ,
4158+ .help_str = "lang:string start:matchloc end:matchloc _MAKEPROMISE promise:int|false"
4159+ },
41014160};
41024161
41034162extern void initRegexOptscript (void )
0 commit comments