Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

PSTokenizer.cc

Go to the documentation of this file.
00001 //========================================================================
00002 //
00003 // PSTokenizer.cc
00004 //
00005 // Copyright 2002 Glyph & Cog, LLC
00006 //
00007 //========================================================================
00008 
00009 #ifdef __GNUC__
00010 #pragma implementation
00011 #endif
00012 
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include "PSTokenizer.h"
00016 
00017 //------------------------------------------------------------------------
00018 
00019 // A '1' in this array means the character is white space.  A '1' or
00020 // '2' means the character ends a name or command.
00021 static char specialChars[256] = {
00022   1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0,   // 0x
00023   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 1x
00024   1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2,   // 2x
00025   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0,   // 3x
00026   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 4x
00027   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 5x
00028   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 6x
00029   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0,   // 7x
00030   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 8x
00031   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // 9x
00032   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ax
00033   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // bx
00034   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // cx
00035   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // dx
00036   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   // ex
00037   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0    // fx
00038 };
00039 
00040 //------------------------------------------------------------------------
00041 
00042 PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
00043   getCharFunc = getCharFuncA;
00044   data = dataA;
00045   charBuf = -1;
00046 }
00047 
00048 PSTokenizer::~PSTokenizer() {
00049 }
00050 
00051 GBool PSTokenizer::getToken(char *buf, int size, int *length) {
00052   GBool comment, backslash;
00053   int c;
00054   int i;
00055 
00056   // skip whitespace and comments
00057   comment = gFalse;
00058   while (1) {
00059     if ((c = getChar()) == EOF) {
00060       buf[0] = '\0';
00061       *length = 0;
00062       return gFalse;
00063     }
00064     if (comment) {
00065       if (c == '\x0a' || c == '\x0d') {
00066         comment = gFalse;
00067       }
00068     } else if (c == '%') {
00069       comment = gTrue;
00070     } else if (specialChars[c] != 1) {
00071       break;
00072     }
00073   }
00074 
00075   // read a token
00076   i = 0;
00077   buf[i++] = c;
00078   if (c == '(') {
00079     backslash = gFalse;
00080     while ((c = lookChar()) != EOF) {
00081       if (i < size - 1) {
00082         buf[i++] = c;
00083       }
00084       getChar();
00085       if (c == '\\') {
00086         backslash = gTrue;
00087       } else if (!backslash && c == ')') {
00088         break;
00089       } else {
00090         backslash = gFalse;
00091       }
00092     }
00093   } else if (c == '<') {
00094     while ((c = lookChar()) != EOF) {
00095       getChar();
00096       if (i < size - 1) {
00097         buf[i++] = c;
00098       }
00099       if (c == '>') {
00100         break;
00101       }
00102     }
00103   } else if (c != '[' && c != ']') {
00104     while ((c = lookChar()) != EOF && !specialChars[c]) {
00105       getChar();
00106       if (i < size - 1) {
00107         buf[i++] = c;
00108       }
00109     }
00110   }
00111   buf[i] = '\0';
00112   *length = i;
00113 
00114   return gTrue;
00115 }
00116 
00117 int PSTokenizer::lookChar() {
00118   if (charBuf < 0) {
00119     charBuf = (*getCharFunc)(data);
00120   }
00121   return charBuf;
00122 }
00123 
00124 int PSTokenizer::getChar() {
00125   int c;
00126 
00127   if (charBuf < 0) {
00128     charBuf = (*getCharFunc)(data);
00129   }
00130   c = charBuf;
00131   charBuf = -1;
00132   return c;
00133 }

Generated on Sat Nov 5 16:18:16 2005 for OPIE by  doxygen 1.4.2