/* Take a key's value from a given dictionary, create [/key any] array, * and store it in $error.errorinfo. * The key must be a permanently allocated C string. */ void gs_errorinfo_put_pair_from_dict(i_ctx_t *i_ctx_p, const ref *op, const char *key) { ref *val, n; if (dict_find_string(op, key, &val) <= 0) { make_null(&n); val = &n; } gs_errorinfo_put_pair(i_ctx_p, key, strlen(key), val); }
/* According to PLRM 3rd ed, p. 264 "indexed color space is not * allowed in any shading whose color values are generated by a function; * this applies to any shading dictionary that contains a Function entry." * Adobe interpreters follow PLRM in this respect and we follow them. */ static int check_indexed_vs_function(i_ctx_t *i_ctx_p, const ref *op, const gs_color_space *pcs, const gs_function_t *funct) { if (funct && gs_color_space_get_index(pcs) == gs_color_space_index_Indexed) { static const char fn[] = "Function"; ref *f; if (dict_find_string(op, fn, &f) > 0) gs_errorinfo_put_pair(i_ctx_p, fn, sizeof(fn) - 1, f); return_error(gs_error_typecheck); /* CET 12-14a */ } return 0; }
/* Do dict_floats_param() and store [/key any] array in $error.errorinfo * on failure. The key must be a permanently allocated C string. */ int dict_floats_param_errorinfo(i_ctx_t *i_ctx_p, const ref * pdict, const char *kstr, uint maxlen, float *fvec, const float *defaultvec) { ref *val; int code = dict_float_array_check_param(imemory, pdict, kstr, maxlen, fvec, defaultvec, e_rangecheck, e_rangecheck); if (code < 0) { if (dict_find_string(pdict, kstr, &val) > 0) gs_errorinfo_put_pair(i_ctx_p, kstr, strlen(kstr), val); } return code; }
static int zimage_data_setup(i_ctx_t *i_ctx_p, const gs_pixel_image_t * pim, gx_image_enum_common_t * pie, const ref * sources, int npop) { int num_sources = pie->num_planes; int inumpush = NUM_PUSH(num_sources); int code; gs_image_enum *penum; int px; const ref *pp; bool string_sources = true; check_estack(inumpush + 2); /* stuff above, + continuation + proc */ make_int(EBOT_NUM_SOURCES(esp), num_sources); /* * Note that the data sources may be procedures, strings, or (Level * 2 only) files. (The Level 1 reference manual says that Level 1 * requires procedures, but Adobe Level 1 interpreters also accept * strings.) The sources must all be of the same type. * * The Adobe documentation explicitly says that if two or more of the * data sources are the same or inter-dependent files, the result is not * defined. We don't have a problem with the bookkeeping for * inter-dependent files, since each one has its own buffer, but we do * have to be careful if two or more sources are actually the same file. * That is the reason for the aliasing information described above. */ for (px = 0, pp = sources; px < num_sources; px++, pp++) { es_ptr ep = EBOT_SOURCE(esp, px); make_int(ep + 1, 1); /* default is no aliasing */ switch (r_type(pp)) { case t_file: if (!level2_enabled) return_error(e_typecheck); /* Check for aliasing. */ { int pi; for (pi = 0; pi < px; ++pi) if (sources[pi].value.pfile == pp->value.pfile) { /* Record aliasing */ make_int(ep + 1, -pi); EBOT_SOURCE(esp, pi)[1].value.intval++; break; } } string_sources = false; /* falls through */ case t_string: if (r_type(pp) != r_type(sources)) { if (pie != NULL) gx_image_end(pie, false); /* Clean up pie */ return_error(e_typecheck); } check_read(*pp); break; default: if (!r_is_proc(sources)) { static const char ds[] = "DataSource"; if (pie != NULL) gx_image_end(pie, false); /* Clean up pie */ gs_errorinfo_put_pair(i_ctx_p, ds, sizeof(ds) - 1, pp); return_error(e_typecheck); } check_proc(*pp); string_sources = false; } *ep = *pp; } /* Always place the image enumerator into local memory, because pie may have local objects inherited from igs, which may be local when the current allocation mode is global. Bug 688140. */ if ((penum = gs_image_enum_alloc(imemory_local, "image_setup")) == 0) return_error(e_VMerror); code = gs_image_enum_init(penum, pie, (const gs_data_image_t *)pim, igs); if (code != 0 || (pie->skipping && string_sources)) { /* error, or empty image */ int code1 = gs_image_cleanup_and_free_enum(penum, igs); if (code >= 0) /* empty image */ pop(npop); if (code >= 0 && code1 < 0) code = code1; return code; } push_mark_estack(es_other, image_cleanup); esp += inumpush - 1; make_int(ETOP_PLANE_INDEX(esp), 0); make_int(ETOP_NUM_SOURCES(esp), num_sources); make_struct(esp, avm_local, penum); switch (r_type(sources)) { case t_file: push_op_estack(image_file_continue); break; case t_string: push_op_estack(image_string_continue); break; default: /* procedure */ push_op_estack(image_proc_process); break; } pop(npop); return o_push_estack; }