/* Creates a file depending on PDC_FILE_ASCII and pdc->asciifile. */ size_t pdc_write_file( pdc_core *pdc, const char *filename, const char *qualifier, const char *content, size_t len, int flags) { size_t wlen = 0; pdc_file *sfp; sfp = pdc_fopen(pdc, filename, qualifier, NULL, 0, flags); if (sfp != NULL) { wlen = pdc_fwrite_ascii(pdc, content, len, sfp->fp); pdc_fclose(sfp); if (wlen != len) { pdc_set_errmsg(pdc, PDC_E_IO_WRITE, filename, 0, 0, 0); } } return wlen; }
/* Creates a file depending on PDC_FILE_ASCII and pdc->asciifile. */ size_t pdc_write_file( pdc_core *pdc, const char *filename, const char *qualifier, const char *content, size_t len, int flags) { size_t wlen = 0; pdc_file *sfp; sfp = pdc_fopen(pdc, filename, qualifier, NULL, 0, flags); if (sfp != NULL) { wlen = pdc_fwrite_ascii(pdc, content, len, sfp->fp); if (wlen < len) { pdc_set_fwrite_errmsg(pdc, filename); PDC_RETHROW(pdc); } pdc_fclose(sfp); } return wlen; }
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; } } }