This is resident.c in view mode; [Download] [Up]
/* * resident.c of TeXview software package. (C) 1986 Radical Eye Software. * This code reads in and handles the postscript fonts. */ #include "structures.h" #include "paths.h" /* * This is the structure definition for resident fonts. We use * a small and simple hash table to handle these. We don't need * a big hash table. */ struct resfont *reshash[RESHASHPRIME] ; /* * These are the external routines we use. */ extern void add_header() ; extern void error() ; extern integer scalewidth() ; extern void tfmload() ; extern FILE *search() ; extern void setenvvars() ; extern char *malloc() ; extern void setenvvars() ; extern shalfword pkbyte() ; extern integer pkquad() ; extern integer pktrio() ; extern Boolean pkopen() ; extern char *pkpath, *vfpath, *tfmpath ; extern char *strcpy(), *strcat() ; extern int strcmp(), strlen() ; /* * These are the external variables we use. */ extern int lastresortsizes[] ; /* * We use malloc here. */ char *mymalloc() ; /* * Allocate a new string. */ char *newstring(s) char *s ; { if (s==NULL) return(NULL) ; else return(strcpy(mymalloc(strlen(s)+1), s)) ; } /* * Our hash routine. */ int hash(s) char *s ; { int h = 12 ; while (*s != 0) h = (h + h + *s++) % RESHASHPRIME ; return(h) ; } /* * Cleanres marks all resident fonts as not being yet sent. */ void cleanres() { register int i ; register struct resfont *p ; for (i=0; i<RESHASHPRIME; i++) for (p=reshash[i]; p; p=p->next) p->sent = 0 ; } /* * The routine which looks up a font name. */ struct resfont * lookup(name) char *name ; { struct resfont *p ; for (p=reshash[hash(name)]; p!=NULL; p=p->next) if (strcmp(p->TeXname, name)==0) return(p) ; return(NULL) ; } /* * This routine adds an entry. */ void add_entry(Keyname, TeXname, PSname, specinfo, downloadinfo) char *Keyname, *TeXname, *PSname, *specinfo, *downloadinfo ; { struct resfont *p ; int h ; if (PSname == NULL) PSname = TeXname ; else if (strcmp(PSname, TeXname) && Keyname != PSname) add_entry(PSname, TeXname, PSname, specinfo, downloadinfo) ; p = (struct resfont *)malloc((unsigned int)sizeof(struct resfont)) ; if (p==NULL) error("! out of memory") ; p->Keyname = Keyname ; p->PSname = PSname ; p->TeXname = TeXname ; p->specialinstructions = specinfo ; p->downloadheader = downloadinfo ; h = hash(Keyname) ; p->next = reshash[h] ; p->sent = 0 ; reshash[h] = p ; } /* * Now our residentfont routine. */ Boolean residentfont(curfnt) register TeXfontdesctype *curfnt ; { register shalfword i ; struct resfont *p ; /* * First we determine if we can find this font in the resident list. */ if (*curfnt->name) return 0 ; /* resident fonts never have a nonstandard font area */ if ((p=lookup(curfnt->name+1))==NULL) return 0 ; /* * We clear out some pointers: */ curfnt->loaded->resfont = p ; for (i=0; i<256; i++) { curfnt->loaded->chardesc[i].TFMwidth = 0 ; curfnt->loaded->chardesc[i].pixelwidth = 0 ; } tfmload(curfnt, 0) ; return(1) ; } static char was_inline[100] ; void bad_config() { error("Error in config file:") ; error(was_inline) ; } char *psinfoname = "psfonts.map" ; void getpsinfo(name) char *name ; { FILE *deffile ; char *p ; char *specinfo, *downloadinfo ; char downbuf[200] ; if (name == 0) name = psinfoname ; if ((deffile=search(CONFIGPATH,"psfonts.map"))!=NULL) { while (fgets(was_inline, 100, deffile)!=NULL) { p = was_inline ; if (*p > ' ' && *p != '*' && *p != '#' && *p != ';') { char *TeXname = NULL ; char *PSname = NULL ; specinfo = NULL ; downloadinfo = NULL ; downbuf[0] = 0 ; p = was_inline ; while (*p) { while (*p && *p <= ' ') p++ ; if (*p) { if (*p == '"') specinfo = p + 1 ; else if (*p == '<') { if (downloadinfo) { strcat(downbuf, downloadinfo) ; strcat(downbuf, " ") ; } downloadinfo = p + 1 ; } else if (TeXname) PSname = p ; else TeXname = p ; if (*p == '"') { p++ ; while (*p != '"' && *p) p++ ; } else while (*p > ' ') p++ ; if (*p) *p++ = 0 ; } } if (downloadinfo) strcat(downbuf, downloadinfo) ; if (TeXname) { TeXname = newstring(TeXname) ; specinfo = newstring(specinfo) ; PSname = newstring(PSname) ; if (downbuf[0]) downloadinfo = newstring(downbuf) ; add_entry(TeXname, TeXname, PSname, specinfo, downloadinfo) ; } } } (void)fclose(deffile) ; } } /* * Now we have the getdefaults routine. */ void getdefaults(s) char *s ; { FILE *deffile ; char PSname[100] ; register char *p ; int i, j ; static int again = 0 ; char *d = CONFIGPATH ; if (s) { strcpy(PSname, s) ; } else { d = "~" ; strcpy(PSname, ".dvipsrc") ; } if ((deffile=search(d,PSname))!=NULL) { while (fgets(was_inline, 300, deffile)!=NULL) { switch (was_inline[0]) { case 'T' : if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ; else tfmpath = newstring(PSname) ; break ; case 'p' : p = was_inline + 1 ; while (*p && *p <= ' ') p++ ; if (*p == '+') { if (sscanf(p+1, "%s", PSname) != 1) bad_config() ; getpsinfo(PSname) ; } else { if (sscanf(p, "%s", PSname) != 1) bad_config() ; psinfoname = newstring(PSname) ; } break ; case 'P' : if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ; else pkpath = newstring(PSname) ; break ; case 'V' : case 'v' : if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ; else vfpath = newstring(PSname) ; break ; /* case 's' : if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ; else figpath = newstring(PSname) ; break ; */ /* * This case is for last resort font scaling; I hate this, but enough * people have in no uncertain terms demanded it that I'll go ahead and * add it. * * This line must have numbers on it, resolutions, to search for the * font as a last resort, and then the font will be scaled. These * resolutions should be in increasing order. * * For most machines, just `300' is sufficient here; on the NeXT, * `300 400' may be more appropriate. */ case 'R': i = 0 ; p = was_inline + 1 ; while (*p) { while (*p && *p <= ' ') p++ ; if ('0' <= *p && *p <= '9') { j = 0 ; while ('0' <= *p && *p <= '9') j = 10 * j + (*p++ - '0') ; if (i > 0) if (lastresortsizes[i-1] > j) { error("last resort sizes (R) must be sorted") ; bad_config() ; } lastresortsizes[i++] = j ; } else { if (*p == 0) break ; error("! only numbers expected on `R' line in config!") ; } } lastresortsizes[i] = 32000 ; break ; case 'h' : if (sscanf(was_inline+1, "%s", PSname) != 1) bad_config() ; else add_header(PSname) ; break ; default: break ; } } (void)fclose(deffile) ; } if (again) { return ; } else again = 1 ; getpsinfo(0) ; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.