static void * copyfunc(const void *item) { const stp_param_string_t *string = (const stp_param_string_t *) (item); stp_param_string_t *new_string = stp_malloc(sizeof(stp_param_string_t)); new_string->name = stp_strdup(string->name); new_string->text = stp_strdup(string->text); return new_string; }
static void load_channel(stp_mxml_node_t *node, stp_mxml_node_t *root, ink_channel_t *icl) { const char *name; stp_mxml_node_t *child = node->child; int count = 0; while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "subchannel")) count++; child = child->next; } name = stp_mxmlElementGetAttr(node, "name"); if (name) icl->name = stp_strdup(name); icl->n_subchannels = count; icl->subchannels = stp_zalloc(sizeof(physical_subchannel_t) * count); count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "subchannel")) load_subchannel(child, root, &(icl->subchannels[count++])); else if (!strcmp(child->value.element.name, "HueCurve")) { stp_mxml_node_t *cchild = child->child; stp_curve_t *curve; const char *cref = stp_mxmlElementGetAttr(child, "ref"); if (cref) { cchild = stp_mxmlFindElement(root, root, "curve", "name", cref, STP_MXML_DESCEND); STPI_ASSERT(cchild, NULL); } else { while (cchild && cchild->type != STP_MXML_ELEMENT) cchild = cchild->next; STPI_ASSERT(cchild, NULL); } curve = stp_curve_create_from_xmltree(cchild); icl->hue_curve = curve; } else if (!strcmp(child->value.element.name, "HueCurveParam")) { name = stp_mxmlElementGetAttr(child, "name"); if (name) icl->hue_curve_name = stp_strdup(name); } } child = child->next; } }
void stp_string_list_add_string_unsafe(stp_string_list_t *list, const char *name, const char *text) { stp_param_string_t *new_string = stp_malloc(sizeof(stp_param_string_t)); new_string->name = stp_strdup(name); new_string->text = stp_strdup(text); stp_list_item_create((stp_list_t *) list, NULL, new_string); }
static inkgroup_t * load_inkgroup(const char *name) { stp_list_t *dirlist = stpi_data_path(); stp_list_item_t *item; inkgroup_t *igl = NULL; item = stp_list_get_start(dirlist); while (item) { const char *dn = (const char *) stp_list_item_get_data(item); char *ffn = stpi_path_merge(dn, name); stp_mxml_node_t *inkgroup = stp_mxmlLoadFromFile(NULL, ffn, STP_MXML_NO_CALLBACK); stp_free(ffn); if (inkgroup) { int count = 0; stp_mxml_node_t *node = stp_mxmlFindElement(inkgroup, inkgroup, "escp2InkGroup", NULL, NULL, STP_MXML_DESCEND); if (node) { stp_mxml_node_t *child = node->child; igl = stp_zalloc(sizeof(inkgroup_t)); while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "InkList")) count++; child = child->next; } igl->n_inklists = count; if (stp_mxmlElementGetAttr(node, "name")) igl->name = stp_strdup(stp_mxmlElementGetAttr(node, "name")); else igl->name = stp_strdup(name); igl->inklists = stp_zalloc(sizeof(inklist_t) * count); child = node->child; count = 0; while (child) { if (child->type == STP_MXML_ELEMENT && !strcmp(child->value.element.name, "InkList")) load_inklist(child, node, &(igl->inklists[count++])); child = child->next; } } stp_mxmlDelete(inkgroup); break; } item = stp_list_item_next(item); } stp_list_destroy(dirlist); return igl; }
static void load_inklist(stp_mxml_node_t *node, stp_mxml_node_t *root, inklist_t *ikl) { const char *name; stp_mxml_node_t *child = node->child; int count = 0; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "InkName")) count++; else if (!strcmp(child->value.element.name, "initSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->init_sequence = stp_xmlstrtoraw(child->child->value.text.string); else if (!strcmp(child->value.element.name, "deinitSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->deinit_sequence = stp_xmlstrtoraw(child->child->value.text.string); } child = child->next; } name = stp_mxmlElementGetAttr(node, "name"); if (name) ikl->name = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "text"); if (name) ikl->text = stp_strdup(name); ikl->n_inks = count; ikl->inknames = stp_zalloc(sizeof(inkname_t) * count); count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "InkName")) { inkname_t *inl = &(ikl->inknames[count++]); inl->init_sequence = ikl->init_sequence; inl->deinit_sequence = ikl->deinit_sequence; load_inkname(child, root, inl, ikl); } else if (!strcmp(child->value.element.name, "Shades")) load_shades(child, root, ikl); } child = child->next; } }
stpi_escp2_printer_t * stp_escp2_get_printer(const stp_vars_t *v) { int model = stp_get_model_id(v); STPI_ASSERT(model >= 0, v); if (!escp2_model_capabilities) { escp2_model_capabilities = stp_zalloc(sizeof(stpi_escp2_printer_t) * (model + 1)); escp2_model_count = model + 1; } else if (model >= escp2_model_count) { escp2_model_capabilities = stp_realloc(escp2_model_capabilities, sizeof(stpi_escp2_printer_t) * (model + 1)); (void) memset(escp2_model_capabilities + escp2_model_count, 0, sizeof(stpi_escp2_printer_t) * (model + 1 - escp2_model_count)); escp2_model_count = model + 1; } if (!(escp2_model_capabilities[model].active)) { #ifdef HAVE_LOCALE_H char *locale = stp_strdup(setlocale(LC_ALL, NULL)); setlocale(LC_ALL, "C"); #endif escp2_model_capabilities[model].active = 1; stp_escp2_load_model(v, model); #ifdef HAVE_LOCALE_H setlocale(LC_ALL, locale); stp_free(locale); #endif } return &(escp2_model_capabilities[model]); }
static void stp_xml_dither_cache_set(int x, int y, const char *filename) { stp_xml_dither_cache_t *cacheval; assert(x && y && filename); stp_xml_init(); if (dither_matrix_cache == NULL) dither_matrix_cache = stp_list_create(); if (stp_xml_dither_cache_get(x, y)) /* Already cached for this x and y aspect */ return; cacheval = stp_malloc(sizeof(stp_xml_dither_cache_t)); cacheval->x = x; cacheval->y = y; cacheval->filename = stp_strdup(filename); cacheval->dither_array = NULL; stp_list_item_create(dither_matrix_cache, NULL, (void *) cacheval); stp_deprintf(STP_DBG_XML, "stp_xml_dither_cache_set: added %dx%d\n", x, y); stp_xml_exit(); return; }
void stp_register_xml_preload(const char *filename) { stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_preloads, filename); if (!item) { char *the_filename = stp_strdup(filename); stp_list_item_create(stpi_xml_preloads, NULL, the_filename); } }
/** * Cache a list node by its long name. * @param list the list to use. * @param long_name the long name. * @param cache the node to cache. */ static void set_long_name_cache(stp_list_t *list, const char *long_name, stp_list_item_t *cache) { if (list->long_name_cache) stp_free(list->long_name_cache); list->long_name_cache = NULL; if (long_name) list->long_name_cache = stp_strdup(long_name); list->long_name_cache_node = cache; }
void stp_string_list_add_string(stp_string_list_t *list, const char *name, const char *text) { stp_param_string_t *new_string = stp_malloc(sizeof(stp_param_string_t)); do { const char *xname = name; while (*xname) { if (!isalnum(*xname) && *xname != '_' && *xname != '-' && *xname != '+') { stp_erprintf("Gutenprint: bad string %s (%s)\n", name, text); break; } xname++; } } while(0); new_string->name = stp_strdup(name); new_string->text = stp_strdup(text); stp_list_item_create((stp_list_t *) list, NULL, new_string); }
void stp_register_xml_parser(const char *name, stp_xml_parse_func parse_func) { stpi_xml_parse_registry *xmlp; stp_list_item_t *item = stp_list_get_item_by_name(stpi_xml_registry, name); if (item) xmlp = (stpi_xml_parse_registry *) stp_list_item_get_data(item); else { xmlp = stp_malloc(sizeof(stpi_xml_parse_registry)); xmlp->name = stp_strdup(name); stp_list_item_create(stpi_xml_registry, NULL, xmlp); } xmlp->parse_func = parse_func; }
static void load_subchannel(stp_mxml_node_t *node, stp_mxml_node_t *root, physical_subchannel_t *icl) { const char *name; stp_mxml_node_t *child = node->child; name = stp_mxmlElementGetAttr(node, "color"); if (name) icl->color = stp_xmlstrtol(name); name = stp_mxmlElementGetAttr(node, "subchannel"); if (name) icl->subchannel = stp_xmlstrtol(name); else icl->subchannel = -1; name = stp_mxmlElementGetAttr(node, "headOffset"); if (name) icl->head_offset = stp_xmlstrtol(name); name = stp_mxmlElementGetAttr(node, "name"); if (name) icl->name = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "text"); if (name) icl->text = stp_strdup(name); while (child) { if (child->type == STP_MXML_ELEMENT) { const char *param = child->value.element.name; name = stp_mxmlElementGetAttr(child, "name"); if (name && !strcmp(param, "ChannelDensityParam")) icl->channel_density = stp_strdup(name); else if (name && !strcmp(param, "SubchannelTransitionParam")) icl->subchannel_transition = stp_strdup(name); else if (name && !strcmp(param, "SubchannelValueParam")) icl->subchannel_value = stp_strdup(name); else if (name && !strcmp(param, "SubchannelScaleParam")) icl->subchannel_scale = stp_strdup(name); else if (!strcmp(param, "SplitChannels")) { if (stp_mxmlElementGetAttr(child, "count")) icl->split_channel_count = stp_xmlstrtoul(stp_mxmlElementGetAttr(child, "count")); if (icl->split_channel_count > 0) { char *endptr; int count = 0; stp_mxml_node_t *cchild = child->child; icl->split_channels = stp_zalloc(sizeof(short) * icl->split_channel_count); while (cchild && count < icl->split_channel_count) { if (cchild->type == STP_MXML_TEXT) { unsigned val = strtoul(cchild->value.text.string, &endptr, 0); if (endptr) icl->split_channels[count++] = val; } cchild = cchild->next; } } } } child = child->next; } }
static void load_inkname(stp_mxml_node_t *node, stp_mxml_node_t *root, inkname_t *inl, inklist_t *ikl) { const char *name; stp_mxml_node_t *child = node->child; int channel_count = 0; int aux_channel_count = 0; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "Channels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); if (idx + 1 > channel_count) channel_count = idx + 1; } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "AuxChannels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); if (idx + 1 > aux_channel_count) aux_channel_count = idx + 1; } } cchild = cchild->next; } } } child = child->next; } inl->channel_count = channel_count; if (channel_count > 0) inl->channels = stp_zalloc(sizeof(ink_channel_t) * channel_count); inl->aux_channel_count = aux_channel_count; if (aux_channel_count > 0) inl->aux_channels = stp_zalloc(sizeof(ink_channel_t) * aux_channel_count); name = stp_mxmlElementGetAttr(node, "name"); if (name) inl->name = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "text"); if (name) inl->text = stp_strdup(name); name = stp_mxmlElementGetAttr(node, "InkID"); if (name) { if (!strcmp(name, "CMYK")) inl->inkset = INKSET_CMYK; else if (!strcmp(name, "CcMmYK")) inl->inkset = INKSET_CcMmYK; else if (!strcmp(name, "CcMmYyK")) inl->inkset = INKSET_CcMmYyK; else if (!strcmp(name, "CcMmYKk")) inl->inkset = INKSET_CcMmYKk; else if (!strcmp(name, "Quadtone")) inl->inkset = INKSET_QUADTONE; else if (!strcmp(name, "Hextone")) inl->inkset = INKSET_HEXTONE; else if (!strcmp(name, "OTHER")) inl->inkset = INKSET_OTHER; else if (!strcmp(name, "Extended")) inl->inkset = INKSET_EXTENDED; } channel_count = 0; aux_channel_count = 0; child = node->child; while (child) { if (child->type == STP_MXML_ELEMENT) { if (!strcmp(child->value.element.name, "Channels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); load_channel(cchild, root, &(inl->channels[idx])); } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "AuxChannels")) { stp_mxml_node_t *cchild = child->child; while (cchild) { if (cchild->type == STP_MXML_ELEMENT && !strcmp(cchild->value.element.name, "channel")) { name = stp_mxmlElementGetAttr(cchild, "index"); if (name) { unsigned idx = stp_xmlstrtoul(name); load_channel(cchild, root, &(inl->aux_channels[idx])); } } cchild = cchild->next; } } else if (!strcmp(child->value.element.name, "initSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->init_sequence = stp_xmlstrtoraw(child->child->value.text.string); else if (!strcmp(child->value.element.name, "deinitSequence") && child->child && child->child->type == STP_MXML_TEXT) ikl->deinit_sequence = stp_xmlstrtoraw(child->child->value.text.string); } child = child->next; } }