📄 scanfont.c
字号:
/* $XConsortium: scanfont.c,v 1.9 92/07/07 17:14:56 gildea Exp $ *//* Copyright International Business Machines,Corp. 1991 * All Rights Reserved * * License to use, copy, modify, and distribute this software * and its documentation for any purpose and without fee is * hereby granted, provided that the above copyright notice * appear in all copies and that both that copyright notice and * this permission notice appear in supporting documentation, * and that the name of IBM not be used in advertising or * publicity pertaining to distribution of the software without * specific, written prior permission. * * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. *//* Author: Katherine A. Hitchcock IBM Almaden Research Laboratory */ #include <string.h>#include "t1stdio.h"#include "util.h"#include "token.h"#include "fontfcn.h"#include "blues.h"/* #define DEBUG_SCANFONT */ static int rc;static boolean InPrivateDict;static boolean WantFontInfo;static boolean TwoSubrs;static psobj inputFile;static psobj filterFile;static psobj *inputP;extern int T1Getc(F_FILE * );extern int T1Ungetc( int,F_FILE *);extern int SearchDictName( psdict *dictP, psobj *keyP);extern void T1io_setblocklen( long len); /* functions from util.c */extern void objFormatInteger(psobj *objP, int value);extern void objFormatReal(psobj *objP, float value); extern void objFormatBoolean(psobj *objP, boolean value);extern void objFormatEncoding( psobj *objP, int length, psobj *valueP);extern void objFormatArray( psobj *objP, int length, psobj *valueP);extern void objFormatString( psobj *objP, int length, char *valueP);extern void objFormatName( psobj *objP, int length, char *valueP);extern void objFormatFile( psobj *objP, FILE *valueP);/**********************************************************************//* Init_BuiltInEncoding() *//* *//* Initializes the StandardEncoding. *//* *//**********************************************************************/typedef struct /* Builtin Standard Encoding */{ int index; char *name;} EncodingTable;char not_def[]=".notdef";static EncodingTable StdEnc[] = { {040 , "space"}, {041 , "exclam"}, {042 , "quotedbl"}, {043 , "numbersign"}, {044 , "dollar"}, {045 , "percent"}, {046 , "ampersand"}, {047 , "quoteright"}, {050 , "parenleft"}, {051 , "parenright"}, {052 , "asterisk"}, {053 , "plus"}, {054 , "comma"}, {055 , "hyphen"}, {056 , "period"}, {057 , "slash"}, {060 , "zero"}, {061 , "one"}, {062 , "two"}, {063 , "three"}, {064 , "four"}, {065 , "five"}, {066 , "six"}, {067 , "seven"}, {070 , "eight"}, {071 , "nine"}, {072 , "colon"}, {073 , "semicolon"}, {074 , "less"}, {075 , "equal"}, {076 , "greater"}, {077 , "question"}, {0100 , "at"}, {0101 , "A"}, {0102 , "B"}, {0103 , "C"}, {0104 , "D"}, {0105 , "E"}, {0106 , "F"}, {0107 , "G"}, {0110 , "H"}, {0111 , "I"}, {0112 , "J"}, {0113 , "K"}, {0114 , "L"}, {0115 , "M"}, {0116 , "N"}, {0117 , "O"}, {0120 , "P"}, {0121 , "Q"}, {0122 , "R"}, {0123 , "S"}, {0124 , "T"}, {0125 , "U"}, {0126 , "V"}, {0127 , "W"}, {0130 , "X"}, {0131 , "Y"}, {0132 , "Z"}, {0133 , "bracketleft"}, {0134 , "backslash"}, {0135 , "bracketright"}, {0136 , "asciicircum"}, {0137 , "underscore"}, {0140 , "quoteleft"}, {0141 , "a"}, {0142 , "b"}, {0143 , "c"}, {0144 , "d"}, {0145 , "e"}, {0146 , "f"}, {0147 , "g"}, {0150 , "h"}, {0151 , "i"}, {0152 , "j"}, {0153 , "k"}, {0154 , "l"}, {0155 , "m"}, {0156 , "n"}, {0157 , "o"}, {0160 , "p"}, {0161 , "q"}, {0162 , "r"}, {0163 , "s"}, {0164 , "t"}, {0165 , "u"}, {0166 , "v"}, {0167 , "w"}, {0170 , "x"}, {0171 , "y"}, {0172 , "z"}, {0173 , "braceleft"}, {0174 , "bar"}, {0175 , "braceright"}, {0176 , "asciitilde"}, {0241 , "exclamdown"}, {0242 , "cent"}, {0243 , "sterling"}, {0244 , "fraction"}, {0245 , "yen"}, {0246 , "florin"}, {0247 , "section"}, {0250 , "currency"}, {0251 , "quotesingle"}, {0252 , "quotedblleft"}, {0253 , "guillemotleft"}, {0254 , "guilsinglleft"}, {0255 , "guilsinglright"}, {0256 , "fi"}, {0257 , "fl"}, {0261 , "endash"}, {0262 , "dagger"}, {0263 , "daggerdbl"}, {0264 , "periodcentered"}, {0266 , "paragraph"}, {0267 , "bullet"}, {0270 , "quotesinglbase"}, {0271 , "quotedblbase"}, {0272 , "quotedblright"}, {0273 , "guillemotright"}, {0274 , "ellipsis"}, {0275 , "perthousand"}, {0277 , "questiondown"}, {0301 , "grave"}, {0302 , "acute"}, {0303 , "circumflex"}, {0304 , "tilde"}, {0305 , "macron"}, {0306 , "breve"}, {0307 , "dotaccent"}, {0310 , "dieresis"}, {0312 , "ring"}, {0313 , "cedilla"}, {0315 , "hungarumlaut"}, {0316 , "ogonek"}, {0317 , "caron"}, {0320 , "emdash"}, {0341 , "AE"}, {0343 , "ordfeminine"}, {0350 , "Lslash"}, {0351 , "Oslash"}, {0352 , "OE"}, {0353 , "ordmasculine"}, {0361 , "ae"}, {0365 , "dotlessi"}, {0370 , "lslash"}, {0371 , "oslash"}, {0372 , "oe"}, {0373 , "germandbls"}, { 0, 0 }};/* Encodings changed from static to global since they must be accessible by T1_LoadFont() when reallocating memory. */psobj *StdEncArrayP = NULL;static psobj *MakeEncodingArrayP(encodingTable) EncodingTable *encodingTable;{ int i; psobj *encodingArrayP; encodingArrayP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!encodingArrayP) return NULL; /* initialize everything to .notdef */ for (i=0; i<256;i++) objFormatName(&(encodingArrayP[i]),7, not_def); for (i=0; encodingTable[i].name; i++) { objFormatName(&(encodingArrayP[encodingTable[i].index]), strlen(encodingTable[i].name), encodingTable[i].name); } return(encodingArrayP);} boolean Init_BuiltInEncoding(){ StdEncArrayP = MakeEncodingArrayP(StdEnc); if (StdEncArrayP==NULL) return( FALSE); else return( TRUE);} /********************************************************************//***================================================================***/static int getNextValue(valueType) int valueType;{ scan_token(inputP); if (tokenType != valueType) { return(SCAN_ERROR); } return(SCAN_OK); }/***================================================================***//* This routine will set the global rc if there is an error *//***================================================================***/static int getInt(){ scan_token(inputP); if (tokenType != TOKEN_INTEGER) { rc = SCAN_ERROR; return(0); } else { return( tokenValue.integer); } }/***================================================================***//* * See Sec 10.3 of ``Adobe Type 1 Font Format'' v1.1, * for parsing Encoding. */static int getEncoding(arrayP) psobj *arrayP;{ scan_token(inputP); if ((tokenType == TOKEN_NAME) && ((tokenLength==16) && (!strncmp(tokenStartP,"StandardEncoding",16))) ) { /* Adobe Standard Encoding */ if (tokenLength == 16) arrayP->data.valueP = (char *) StdEncArrayP; else return(SCAN_ERROR); arrayP->len = 256; return(SCAN_OK); } else if ( (tokenType == TOKEN_LEFT_BRACE) || (tokenType == TOKEN_LEFT_BRACKET) ) { /* Array of literal names */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++, objP++) { scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP,tokenLength,tokenStartP); } scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) return(SCAN_OK); } else { /* Must be sequences of ``dup <index> <charactername> put" */ psobj *objP; int i; objP = (psobj *)vm_alloc(256*(sizeof(psobj))); if (!(objP)) return(SCAN_OUT_OF_MEMORY); arrayP->data.valueP = (char *) objP; arrayP->len = 256; for (i=0; i<256; i++) objFormatName(objP + i, 7, not_def); while (TRUE) { scan_token(inputP); switch (tokenType) { case TOKEN_NAME: if (tokenLength == 3) { if (strncmp(tokenStartP,"dup",3) == 0) { /* get <index> */ scan_token(inputP); if (tokenType != TOKEN_INTEGER || tokenValue.integer < 0 || tokenValue.integer > 255) return (SCAN_ERROR); i = tokenValue.integer; /* get <characer_name> */ scan_token(inputP); if (tokenType != TOKEN_LITERAL_NAME) return(SCAN_ERROR); if (!(vm_alloc(tokenLength)) ) return(SCAN_OUT_OF_MEMORY); objFormatName(objP + i,tokenLength,tokenStartP); /* get "put" */ scan_token(inputP); if (tokenType != TOKEN_NAME) return(SCAN_ERROR); } else if (strncmp(tokenStartP,"def",3) == 0) return (SCAN_OK); } break; case TOKEN_EOF: case TOKEN_NONE: case TOKEN_INVALID: return (SCAN_ERROR); } } } return (SCAN_ERROR);}/***================================================================***/static int getArray(arrayP) psobj *arrayP;{ int N; /* count the items in the array */ psobj *objP; scan_token(inputP); if ( (tokenType != TOKEN_LEFT_BRACE) && (tokenType != TOKEN_LEFT_BRACKET) ) { return(SCAN_ERROR); } /* format the array in memory, save pointer to the beginning */ arrayP->data.valueP = tokenStartP; /* loop, picking up next object, until right BRACE or BRACKET */ N = 0; do { scan_token(inputP); if ( (tokenType == TOKEN_RIGHT_BRACE) || (tokenType == TOKEN_RIGHT_BRACKET) ) { /* save then number of items in the array */ arrayP->len = N; return(SCAN_OK); } /* allocate the space for the object */ objP = (psobj *)vm_alloc(sizeof(psobj)); if (!(objP)) return(SCAN_OUT_OF_MEMORY); /* array is an array of numbers, (real or integer) */ if (tokenType == TOKEN_REAL) { objFormatReal(objP, tokenValue.real); } else if (tokenType == TOKEN_INTEGER) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -