@@ -3940,6 +3940,59 @@ static EsObject *lrop_markplaceholder (OptVM *vm, EsObject *name)
3940
3940
return es_false ;
3941
3941
}
3942
3942
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
+
3943
3996
static struct optscriptOperatorRegistration lropOperators [] = {
3944
3997
{
3945
3998
.name = "_matchstr" ,
@@ -4097,7 +4150,13 @@ static struct optscriptOperatorRegistration lropOperators [] = {
4097
4150
.fn = lrop_markplaceholder ,
4098
4151
.arity = 1 ,
4099
4152
.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
+ },
4101
4160
};
4102
4161
4103
4162
extern void initRegexOptscript (void )
0 commit comments