⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanfont.c

📁 source code: Covert TXT to PDF
💻 C
📖 第 1 页 / 共 3 页
字号:
/* $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 + -