SRC/ReadLine.c File Reference

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "util.h"
#include "ReadLine.h"
Include dependency graph for ReadLine.c:

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)

Function Documentation

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 }

Here is the caller graph for this function:

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 }

Here is the caller graph for this function:

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 }

Here is the call graph for this function:

Here is the caller graph for this function:


Generated on Tue Jan 5 15:26:02 2010 for VPR5.0 by  doxygen 1.6.1