/* internal continuation operator for filenameforall */ static int xpost_op_contfilenameforall (Xpost_Context *ctx, Xpost_Object oglob, Xpost_Object Proc, Xpost_Object Scr) { glob_t *globbuf; char *str; char *src; int len; Xpost_Object interval; globbuf = oglob.glob_.ptr; if (oglob.glob_.off < globbuf->gl_pathc) { /* xpost_stack_push(ctx->lo, ctx->es, xpost_operator_cons(ctx, "contfilenameforall", NULL,0,0)); */ xpost_stack_push(ctx->lo, ctx->es, xpost_operator_cons_opcode(ctx->opcode_shortcuts.contfilenameforall)); xpost_stack_push(ctx->lo, ctx->es, Scr); /* xpost_stack_push(ctx->lo, ctx->es, xpost_operator_cons(ctx, "cvx", NULL,0,0)); */ xpost_stack_push(ctx->lo, ctx->es, xpost_operator_cons_opcode(ctx->opcode_shortcuts.cvx)); xpost_stack_push(ctx->lo, ctx->es, xpost_object_cvlit(Proc)); ++oglob.glob_.off; xpost_stack_push(ctx->lo, ctx->es, oglob); str = xpost_string_get_pointer(ctx, Scr); src = globbuf->gl_pathv[ oglob.glob_.off-1 ]; len = strlen(src); if (len > Scr.comp_.sz) return rangecheck; memcpy(str, src, len); interval = xpost_object_get_interval(Scr, 0, len); if (xpost_object_get_type(interval) == invalidtype) return rangecheck; xpost_stack_push(ctx->lo, ctx->os, interval); xpost_stack_push(ctx->lo, ctx->es, Proc); } else { xpost_glob_free(globbuf); /* reference has already been popped */ } return 0; }
/* create an instance of the device using the class .copydict procedure */ static int _create (Xpost_Context *ctx, Xpost_Object width, Xpost_Object height, Xpost_Object classdic) { xpost_stack_push(ctx->lo, ctx->os, width); xpost_stack_push(ctx->lo, ctx->os, height); xpost_stack_push(ctx->lo, ctx->os, classdic); xpost_dict_put(ctx, classdic, namewidth, width); xpost_dict_put(ctx, classdic, nameheight, height); /* call device class's ps-level .copydict procedure, then call _create_cont, by continuation. */ if (!xpost_stack_push(ctx->lo, ctx->es, xpost_operator_cons_opcode(_create_cont_opcode))) return execstackoverflow; if (!xpost_stack_push(ctx->lo, ctx->es, xpost_dict_get(ctx, classdic, //xpost_name_cons(ctx, ".copydict") namedotcopydict ))) return execstackoverflow; return 0; }