00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <stdlib.h>
00004 #include <assert.h>
00005 #include "util.h"
00006 #include "ReadLine.h"
00007
00008
00009
00010 void
00011 FreeTokens(INOUT char ***TokensPtr)
00012 {
00013 assert(*TokensPtr);
00014 assert(**TokensPtr);
00015
00016 free(**TokensPtr);
00017 free(*TokensPtr);
00018 *TokensPtr = NULL;
00019 }
00020
00021
00022
00023 int
00024 CountTokens(IN char **Tokens)
00025 {
00026 int count = 0;
00027
00028 if(NULL == Tokens)
00029 {
00030 return 0;
00031 };
00032 while(Tokens[count])
00033 {
00034 ++count;
00035 };
00036 return count;
00037 }
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 char **
00048 ReadLineTokens(INOUT FILE * InFile,
00049 INOUT int *LineNum)
00050 {
00051
00052 enum
00053 { BUFFSIZE = 65536 };
00054 char Buffer[BUFFSIZE];
00055 char *Res;
00056 char *Last;
00057 char *Cur;
00058 char *Dst;
00059 char **Tokens;
00060 int TokenCount;
00061 int Len;
00062 int CurToken;
00063 boolean InToken;
00064
00065 do
00066 {
00067
00068 Res = fgets(Buffer, BUFFSIZE, InFile);
00069 if(NULL == Res)
00070 {
00071 if(feof(InFile))
00072 {
00073 return NULL;
00074 }
00075 else
00076 {
00077 printf(ERRTAG "Unexpected error reading file\n");
00078 exit(1);
00079 }
00080 }
00081 ++(*LineNum);
00082
00083
00084 Last = Buffer + strlen(Buffer);
00085 if((Last > Buffer) && ('\n' == Last[-1]))
00086 {
00087 --Last;
00088 }
00089 if((Last > Buffer) && ('\r' == Last[-1]))
00090 {
00091 --Last;
00092 }
00093
00094
00095 while((Last > Buffer) && ('\\' == Last[-1]))
00096 {
00097
00098 --Last;
00099
00100
00101 Res = fgets(Last, (BUFFSIZE - (Last - Buffer)), InFile);
00102 if(NULL == Res)
00103 {
00104 if(feof(InFile))
00105 {
00106 return NULL;
00107 }
00108 else
00109 {
00110 printf(ERRTAG
00111 "Unexpected error reading file\n");
00112 exit(1);
00113 }
00114 }
00115 ++(*LineNum);
00116
00117
00118 Last = Buffer + strlen(Buffer);
00119 if((Last > Buffer) && ('\n' == Last[-1]))
00120 {
00121 --Last;
00122 }
00123 if((Last > Buffer) && ('\r' == Last[-1]))
00124 {
00125 --Last;
00126 }
00127 }
00128
00129
00130 Cur = Buffer;
00131 while(Cur < Last)
00132 {
00133 if('#' == *Cur)
00134 {
00135 Last = Cur;
00136 break;
00137 }
00138 ++Cur;
00139 }
00140
00141
00142 assert(Last < (Buffer + BUFFSIZE));
00143 Len = 0;
00144 TokenCount = 0;
00145 Cur = Buffer;
00146 InToken = FALSE;
00147 while(Cur < Last)
00148 {
00149 if(InToken)
00150 {
00151 if((' ' == *Cur) || ('\t' == *Cur))
00152 {
00153 InToken = FALSE;
00154 }
00155 else
00156 {
00157 ++Len;
00158 }
00159 }
00160 else
00161 {
00162 if((' ' != *Cur) && ('\t' != *Cur))
00163 {
00164 ++TokenCount;
00165 ++Len;
00166 InToken = TRUE;
00167 }
00168 }
00169 ++Cur;
00170 }
00171 }
00172 while(0 == TokenCount);
00173
00174
00175
00176 Len = (sizeof(char) * Len) +
00177 (sizeof(char) * TokenCount);
00178
00179
00180
00181 Tokens = (char **)my_malloc(sizeof(char *) * (TokenCount + 1));
00182 *Tokens = (char *)my_malloc(sizeof(char) * Len);
00183
00184
00185 Cur = Buffer;
00186 Dst = *Tokens;
00187 InToken = FALSE;
00188 CurToken = 0;
00189 while(Cur < Last)
00190 {
00191 if(InToken)
00192 {
00193 if((' ' == *Cur) || ('\t' == *Cur))
00194 {
00195 InToken = FALSE;
00196 *Dst = '\0';
00197 ++Dst;
00198 ++CurToken;
00199 }
00200 else
00201 {
00202 *Dst = *Cur;
00203 ++Dst;
00204 }
00205 }
00206 else
00207 {
00208 if((' ' != *Cur) && ('\t' != *Cur))
00209 {
00210 Tokens[CurToken] = Dst;
00211 *Dst = *Cur;
00212 ++Dst;
00213 InToken = TRUE;
00214 }
00215 }
00216 ++Cur;
00217 }
00218 if(InToken)
00219 {
00220 *Dst = '\0';
00221 ++Dst;
00222 ++CurToken;
00223 }
00224 assert(CurToken == TokenCount);
00225
00226
00227 Tokens[CurToken] = NULL;
00228
00229
00230 return Tokens;
00231 }