/* * FILE: psinfo.c * PURPOSE: reading of PostScript mapping of a TeX font * AUTHOR: Piet Tutelaers * VERSION: 1.0 (October 1995) */ #include /* isalnum(), isspace() */ #include /* fgets(), fclose() */ #include /* getenv(), malloc() */ #include /* strcmp(), strlen(), etc. */ #include "basics.h" /* (*pfopen)(), fatal() */ #include "psearch.h" /* search_file(), path() */ #include "cfg.h" /* cfg_value() */ static char *texconfig, *printer; #define BUFSIZE 512 #define MAXMAPFILES 32 static char *files[MAXMAPFILES]; /* thanks PBR! */ /* Scan_config_files() scans the configuration files used by dvips * in order to find all mapfiles that are used. The configuration file * `config.ps' is always read and the file `config.' only when * the environment PRINTER differs from `ps'. * The found mapfiles are put in and the number of found * files is returned. The first mapfile will be `psfonts.map' or its * replacement. */ static int scan_config_files(char ***mapfiles) { int i, j, n, count = 0, cf_cnt, additional; char *mf, *cf, *cfn[2], line[BUFSIZE]; FILE *CF; cf_cnt = 0; texconfig = cfg_value("texconfig"); if (texconfig == NULL) fatal("texconfig not defined in mtpk.cfg\n"); cf = search_file(texconfig, "config.ps", NONFATAL); if (cf == NULL) return 0; cfn[cf_cnt++] = cf; printer = getenv("PRINTER"); if (printer != NULL && strcmp(printer, "ps") != 0) { char printercfg[80]; strcpy(printercfg, "config."); strcat(printercfg, printer); cf = search_file(texconfig, printercfg, NONFATAL); if (cf != NULL) cfn[cf_cnt++] = cf; } files[0] = "psfonts.map"; count = 1; for (j = 0; j < cf_cnt; j++) { CF = pfopen(cfn[j], "r"); if (CF == NULL) fatal("%s: can not open\n", cfn[j]); while (fgets(line, BUFSIZE, CF)) { if (line[0] == 'p') { for (i = 1; isspace(line[i]); i++); if (line[i] == '+') { for (i = i+1; isspace(line[i]); i++); additional = 1; } else additional = 0; for (n = 1; !isspace(line[i+n]) && line[i+n] != '\n'; n++); mf = (char *) malloc(n+1); if (mf == NULL) fatal("Out of memory\n"); strncpy(mf, &line[i], n); *(mf+n) = '\0'; if (additional) { if (count == MAXMAPFILES) fatal("More than %d mapfiles\n", MAXMAPFILES); files[count++] = mf; } else files[0] = mf; } } fclose(CF); } *mapfiles = files; return count; } /* * This function returns the name of the PostScript font for * if found in one of the mapfiles from dvips otherwise NULL. * In case of a match will contain a pointer to it. */ char *psfont(char *texfont, char **mapinfo) { int i, n, count, found = 0; char line[BUFSIZE]; char *p, *ppsfont, *mf, **mapfiles; FILE *MF; count = scan_config_files(&mapfiles); if (count == 0) return 0; while (!found && count--) { mf = search_file(texconfig, *mapfiles++, NONFATAL); if (mf == NULL) continue; MF = pfopen(mf, "r"); if (MF == NULL) fatal("%s: can not open\n", mf); while (fgets(line, BUFSIZE, MF)) { if (!isalpha(line[0])) continue; n = 1; while (isalnum(line[n])) n++; if (strlen(texfont) == n && strncmp(texfont, line, n) == 0) { found = 1; break; } } fclose(MF); } if (!found) return NULL; i = n; while (isspace(line[i])) i++; n = 0; p = &line[i]; while (!isspace(line[i]) && line[i] != '\n') { i++; n++; } ppsfont = (char *) malloc(n+1); if (ppsfont == NULL) fatal("Out of memory\n"); strncpy(ppsfont, p, n); *(ppsfont+n) = '\0'; n = strlen(line) - 1; /* without NEWLINE */ *mapinfo = malloc(n + 1); if (mapinfo == NULL) fatal("Out of memory\n"); strncpy(*mapinfo, line, n); return ppsfont; } /* * put arguments for ps2pk from into . */ void ps2pk_args(char *mapinfo, char args[]) { int n, i; char *p, *q; if (mapinfo == NULL) fatal("No mapinfo\n"); p = mapinfo; while (isalnum(*p)) p++; /* texname */ while (isspace(*p)) p++; while (isalnum(*p)) p++; /* psname */ while (isspace(*p)) p++; i = 0; if (q = strstr(p, "ExtendFont")) { q--; while (q > p && isspace(*q)) q--; while (q > p && *q != '"' && !isspace(*q)) q--; strcpy(&args[i], "-E"); for (i = i+2, q = q+1; !isspace(*q); q++) args[i++] = *q; args[i++] = ' '; } if (q = strstr(p, "SlantFont")) { q--; while (q > p && isspace(*q)) q--; while (q > p && *q != '"' && !isspace(*q)) q--; strcpy(&args[i], "-S"); for (i = i+2, q = q+1; !isspace(*q); q++) args[i++] = *q; args[i++] = ' '; } if (q = strstr(p, "ReEncodeFont")) { q--; while (q > p && isspace(*q)) q--; while (q > p && *q != '"' && !isspace(*q)) q--; strcpy(&args[i], "-e"); for (i = i+2, q = q+1; !isspace(*q); q++) args[i++] = *q; args[i++] = ' '; } args[i] = '\0'; }