char * pdc_file_fullname_mem(pdc_core *pdc, const char *dirname, const char *basename) { static const char fn[] = "pdc_file_fullname_mem"; char *fullname; size_t len; len = strlen(basename); if (dirname && dirname[0]) len += strlen(dirname); len += EXTRA_SPACE; fullname = (char *) pdc_malloc(pdc, len, fn); pdc_file_fullname(dirname, basename, fullname); return fullname; }
char * pdc_temppath( pdc_core *pdc, char *outbuf, const char *inbuf, size_t inlen, const char *dirname) { char name[TMP_NAME_LEN + TMP_SUFF_LEN + 1]; MD5_CTX md5; time_t timer; unsigned char digest[MD5_DIGEST_LENGTH]; int i; size_t dirlen; #ifdef VMS char *tmpdir = NULL; #endif /* VMS */ #if defined(WIN32) #if defined(__BORLANDC__) int pid = getpid(); #else int pid = _getpid(); #endif #else #if !defined(MAC) pid_t pid = getpid(); #endif #endif #ifdef PDC_TMPDIR_ENV if (!dirname) { dirname = (char *) getenv(PDC_TMPDIR_ENV); } #endif /* !PDC_TMPDIR_ENV */ time(&timer); MD5_Init(&md5); #if !defined(MAC) MD5_Update(&md5, (unsigned char *) &pid, sizeof pid); #endif MD5_Update(&md5, (unsigned char *) &timer, sizeof timer); if (inlen == 0 && inbuf != (const char *) 0) inlen = strlen(inbuf); if (inlen != 0) MD5_Update(&md5, (unsigned char *) inbuf, inlen); dirlen = dirname ? strlen(dirname) : 0; if (dirlen) MD5_Update(&md5, (const unsigned char *) dirname, dirlen); MD5_Final(digest, &md5); for (i = 0; i < TMP_NAME_LEN - 1; ++i) name[i] = (char) (PDF_A + digest[i % MD5_DIGEST_LENGTH] % 26); name[i] = 0; strcat(name, TMP_SUFFIX); if (!outbuf) outbuf = pdc_file_fullname_mem(pdc, dirname, name); else pdc_file_fullname(dirname, name, outbuf); return outbuf; }
pdc_file * pdf_fopen(PDF *p, const char *filename, const char *qualifier, int flags) { const pdc_byte *data = NULL; size_t size = 0; pdf_virtfile *vfile; vfile = pdf_find_pvf(p, filename, NULL); if (vfile) { size = vfile->size; data = (const pdc_byte *) vfile->data; return pdc_fopen(p->pdc, filename, qualifier, data, size, flags); } else { pdf_category *cat; /* Bad filename */ if (!*filename || !strcmp(filename, ".") || !strcmp(filename, "..")) { pdc_set_errmsg(p->pdc, PDC_E_IO_ILLFILENAME, filename, 0, 0, 0); return NULL; } /* Read resource configuration file if it is pending */ if (p->resfilepending) { p->resfilepending = pdc_false; pdf_read_resourcefile(p, p->resourcefilename); } #ifdef PDF_TEST_RESOURCE printf("Search for file '%s'\n", filename); #endif /* Searching resource category */ for (cat = p->resources; cat != (pdf_category *) NULL; cat = cat->next) if (!strcmp(cat->category, "SearchPath")) break; if (!cat) { /* No resource category */ return pdc_fopen(p->pdc, filename, qualifier, NULL, 0, flags); } else { pdf_res *res = cat->kids; pdf_res *lastres = cat->kids; char *pathname = NULL; char fullname[PDC_FILENAMELEN]; FILE *fp = NULL; int errnum = PDC_E_IO_RDOPEN_NF; /* Find last SearchPath entry */ while (res != (pdf_res *) NULL) { lastres = res; res = res->next; } /* First local search and then search with concatenated * filename with search paths one after another backwards */ while (1) { /* Test opening */ pdc_file_fullname(pathname, filename, fullname); #ifdef PDF_TEST_RESOURCE printf(" pathname '%s' -> fullname: '%s'\n", pathname, fullname); #endif fp = fopen(fullname, READBMODE); if (fp) { /* File found */ fclose(fp); return pdc_fopen(p->pdc, fullname, qualifier, NULL, 0, flags); } errnum = pdc_get_fopen_errnum(p->pdc, PDC_E_IO_RDOPEN); if (errno != 0 && errnum != PDC_E_IO_RDOPEN_NF) break; if (lastres == (pdf_res *) NULL) break; pathname = lastres->name; lastres = lastres->prev; } pdc_set_errmsg(p->pdc, errnum, qualifier, filename, 0, 0); return NULL; } } }
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; } }