#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "util.h"
#include "ReadLine.h"
Go to the source code of this file.
Functions | |
void | FreeTokens (INOUT char ***TokensPtr) |
int | CountTokens (IN char **Tokens) |
char ** | ReadLineTokens (INOUT FILE *InFile, INOUT int *LineNum) |
int CountTokens | ( | IN char ** | Tokens | ) |
Definition at line 24 of file ReadLine.c.
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 }
void FreeTokens | ( | INOUT char *** | TokensPtr | ) |
Definition at line 11 of file ReadLine.c.
00012 { 00013 assert(*TokensPtr); 00014 assert(**TokensPtr); 00015 00016 free(**TokensPtr); /* Free the string data */ 00017 free(*TokensPtr); /* Free token list */ 00018 *TokensPtr = NULL; /* Invalidate pointer since mem is gone */ 00019 }
char** ReadLineTokens | ( | INOUT FILE * | InFile, | |
INOUT int * | LineNum | |||
) |
Definition at line 48 of file ReadLine.c.
00050 { 00051 00052 enum 00053 { BUFFSIZE = 65536 }; /* This is much more than enough */ 00054 char Buffer[BUFFSIZE]; /* Must match 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 /* Read the string */ 00068 Res = fgets(Buffer, BUFFSIZE, InFile); 00069 if(NULL == Res) 00070 { 00071 if(feof(InFile)) 00072 { 00073 return NULL; /* Return NULL on EOF */ 00074 } 00075 else 00076 { 00077 printf(ERRTAG "Unexpected error reading file\n"); 00078 exit(1); 00079 } 00080 } 00081 ++(*LineNum); 00082 00083 /* Strip newline if any */ 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 /* Handle continued lines */ 00095 while((Last > Buffer) && ('\\' == Last[-1])) 00096 { 00097 /* Strip off the backslash */ 00098 --Last; 00099 00100 /* Read next line by giving pointer to null-char as start for next */ 00101 Res = fgets(Last, (BUFFSIZE - (Last - Buffer)), InFile); 00102 if(NULL == Res) 00103 { 00104 if(feof(InFile)) 00105 { 00106 return NULL; /* Return NULL on EOF */ 00107 } 00108 else 00109 { 00110 printf(ERRTAG 00111 "Unexpected error reading file\n"); 00112 exit(1); 00113 } 00114 } 00115 ++(*LineNum); 00116 00117 /* Strip newline */ 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 /* Strip comment if any */ 00130 Cur = Buffer; 00131 while(Cur < Last) 00132 { 00133 if('#' == *Cur) 00134 { 00135 Last = Cur; 00136 break; 00137 } 00138 ++Cur; 00139 } 00140 00141 /* Count tokens and find size */ 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; /* Advance pointer */ 00170 } 00171 } 00172 while(0 == TokenCount); 00173 00174 /* Find the size of mem to alloc. Use a contiguous block so is 00175 * easy to deallocate */ 00176 Len = (sizeof(char) * Len) + /* Length of actual data */ 00177 (sizeof(char) * TokenCount); /* Null terminators */ 00178 00179 /* Alloc the pointer list and data list. Count the final 00180 * empty string we will use as list terminator */ 00181 Tokens = (char **)my_malloc(sizeof(char *) * (TokenCount + 1)); 00182 *Tokens = (char *)my_malloc(sizeof(char) * Len); 00183 00184 /* Copy tokens to result */ 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'; /* Null term token */ 00197 ++Dst; 00198 ++CurToken; 00199 } 00200 else 00201 { 00202 *Dst = *Cur; /* Copy char */ 00203 ++Dst; 00204 } 00205 } 00206 else 00207 { 00208 if((' ' != *Cur) && ('\t' != *Cur)) 00209 { 00210 Tokens[CurToken] = Dst; /* Set token start pointer */ 00211 *Dst = *Cur; /* Copy char */ 00212 ++Dst; 00213 InToken = TRUE; 00214 } 00215 } 00216 ++Cur; /* Advance pointer */ 00217 } 00218 if(InToken) 00219 { 00220 *Dst = '\0'; /* Null term final token */ 00221 ++Dst; 00222 ++CurToken; 00223 } 00224 assert(CurToken == TokenCount); 00225 00226 /* Set the final empty string entry */ 00227 Tokens[CurToken] = NULL; 00228 00229 /* Return the string list */ 00230 return Tokens; 00231 }