int pdc_read_textfile(pdc_core *pdc, pdc_file *sfp, int flags, char ***linelist) { static const char fn[] = "pdc_read_textfile"; char buf[PDC_BUFSIZE]; char *content = NULL; char **strlist = NULL; int nlines = 0; pdc_off_t filelen; size_t len = 0, sumlen = 0, maxl = 0; pdc_bool tocont = pdc_false; int i, nbs, is = -1; /* get file length */ filelen = pdc_file_size(sfp); if (filelen) { /* allocate content array */ content = (char *) pdc_calloc(pdc, (size_t) filelen, fn); /* read loop */ while (pdc_fgetline(buf, PDC_BUFSIZE, sfp) != NULL) { /* trim white spaces */ if (tocont) pdc_strtrim(buf); else pdc_str2trim(buf); /* skip blank and comment lines */ if (buf[0] == 0 || buf[0] == '%') { tocont = pdc_false; continue; } /* register new line */ if (!tocont) { if (nlines) pdc_logg_cond(pdc, 2, trc_filesearch, "\t\tLine %d; \"%s\"\n", nlines, strlist[nlines - 1]); if (nlines >= (int) maxl) { maxl += PDC_ARGV_CHUNKSIZE; strlist = (strlist == NULL) ? (char **)pdc_malloc(pdc, maxl * sizeof(char *), fn): (char **)pdc_realloc(pdc, strlist, maxl * sizeof(char *), fn); } is += sumlen + 1; strlist[nlines] = &content[is]; nlines++; sumlen = 0; } /* process new line */ nbs = 0; len = strlen(buf); for (i = 0; i < (int) len; i++) { /* backslash found */ if (buf[i] == '\\') { nbs++; } else { /* comment sign found */ if (buf[i] == '%') { if (nbs % 2) { /* masked */ memmove(&buf[i-1], &buf[i], (size_t) (len-i)); len--; buf[len] = 0; } else { buf[i] = 0; len = strlen(buf); } } nbs = 0; } } /* continuation line */ tocont = (nbs % 2) ? pdc_true : pdc_false; if (tocont) { if (flags & PDC_FILE_KEEPLF) buf[len - 1] = '\n'; else len--; } buf[len] = '\0'; /* backslash substitution */ if (flags & PDC_FILE_BSSUBST) { len = (size_t) pdc_subst_backslash(pdc, (pdc_byte *) buf, (int) len, NULL, pdc_bytes, pdc_true); } /* concatenate line */ strcat(&content[is], buf); sumlen += len; } if (!strlist) pdc_free(pdc, content); } if (nlines) pdc_logg_cond(pdc, 2, trc_filesearch, "\t\tLine %d; \"%s\"\n", nlines, strlist[nlines - 1]); *linelist = strlist; return nlines; }
void pdf_add_resource(PDF *p, const char *category, const char *resource) { static const char fn[] = "pdf_add_resource"; pdf_rescategory rescat; pdf_category *cat, *lastcat = NULL; pdf_res *res, *lastres = NULL; char *name; char *value; char *prefix = NULL; size_t len; int k, absolut; /* We no longer raise an error but silently ignore unknown categories */ k = pdc_get_keycode(category, pdf_rescategories); if (k == PDC_KEY_NOTFOUND) return; rescat = (pdf_rescategory) k; /* Read resource configuration file if it is pending */ if (p->resfilepending) { p->resfilepending = pdc_false; pdf_read_resourcefile(p, p->resourcefilename); } /* Find start of this category's resource list, if the category exists */ for (cat = p->resources; cat != (pdf_category *) NULL; cat = cat->next) { lastcat = cat; if (!strcmp(cat->category, category)) break; } if (cat == NULL) { cat = (pdf_category *) pdc_malloc(p->pdc, sizeof(pdf_category), fn); cat->category = pdc_strdup(p->pdc, category); cat->kids = NULL; cat->next = NULL; if (lastcat) lastcat->next = cat; else p->resources = cat; } /* Determine name and value of resource */ absolut = 0; len = strlen(resource); value = strchr(resource, '='); if (value) { len = (size_t) (value - resource); value++; if (*value == '=') { absolut = 1; value++; } /* file name is assumed */ if (value[0] != '\0' && value[0] == '.' && value[1] == '/') { value += 2; } } /* Copy resource name */ name = (char *) pdc_malloc(p->pdc, len + 1, fn); strncpy(name, resource, len); name[len] = 0; pdc_strtrim(name); /* Find resource name in resource list */ for (res = cat->kids; res != (pdf_res *) NULL; res = res->next) { if (!strcmp(res->name, name)) break; lastres = res; } /* New resource */ if (res) { pdc_free(p->pdc, name); } else { res = (pdf_res *) pdc_calloc(p->pdc, sizeof(pdf_res), fn); if (lastres) lastres->next = res; else cat->kids = res; res->prev = lastres; res->name = name; } /* New value */ if (res->value) pdc_free(p->pdc, res->value); res->value = NULL; if (!value) { value = ""; } else if (!absolut && p->prefix) { /* Directory prefix */ prefix = p->prefix; if (prefix[0] != '\0' && prefix[0] == '.' && prefix[1] == '/') prefix += 2; if (prefix) { len = strlen(prefix) + strlen(value) + 6; res->value = (char *) pdc_malloc(p->pdc, len, fn); pdc_file_fullname(prefix, value, res->value); } } if (!res->value) { res->value = pdc_strdup(p->pdc, value); pdc_str2trim(res->value); } #undef PDF_TEST_RESOURCE #ifdef PDF_TEST_RESOURCE printf("%s.%s: '%s'\n", category, res->name, res->value); #endif switch (rescat) { case pdf_FontOutline: case pdf_FontAFM: case pdf_FontPFM: case pdf_HostFont: case pdf_Encoding: case pdf_ICCProfile: if (!strlen(res->name) || !strlen(res->value)) pdc_error(p->pdc, PDF_E_RES_BADRES, resource, category, 0, 0); break; default: break; } }