void pdc_set_fopen_errmsg(pdc_core *pdc, int errnum, const char *qualifier, const char *filename) { const char *stemp1 = NULL; const char *stemp2 = NULL; int errno1 = errno; #if defined(EMACOSERR) && defined(MAC) errno1 = (int) __MacOSErrNo; #endif errnum = pdc_get_fopen_errnum(pdc, errnum); if (errnum == PDC_E_IO_RDOPEN) errnum = PDC_E_IO_RDOPEN_CODE; else if (errnum == PDC_E_IO_WROPEN) errnum = PDC_E_IO_WROPEN_CODE; if (errnum == PDC_E_IO_RDOPEN_CODE || errnum == PDC_E_IO_WROPEN_CODE) { stemp1 = pdc_errprintf(pdc, "%d", errno1); #ifdef PDC_HAS_STRERROR stemp2 = strerror(errno1); if (stemp2 != NULL) { if (errnum == PDC_E_IO_RDOPEN_CODE) errnum = PDC_E_IO_RDOPEN_CODETEXT; else if (errnum == PDC_E_IO_WROPEN_CODE) errnum = PDC_E_IO_WROPEN_CODETEXT; } #endif } pdc_set_errmsg(pdc, errnum, qualifier, filename, stemp1, stemp2); }
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; } } }