Skip to content

Commit c62933e

Browse files
committed
operator: add _makepromise
Signed-off-by: Masatake YAMATO <[email protected]>
1 parent 6c8ce10 commit c62933e

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

main/lregex.c

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
39433996
static 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

41034162
extern void initRegexOptscript (void)

0 commit comments

Comments
 (0)