/*-------------------------------------------*/ int ReadSpaceString(char Word[],int maxlength,FILE *THEFILE) /* Add in by William Wen, for reading space-allowed path/file name * read through the string, includs all intermediate spaces, terminate * reading at "//" sign or new line. */ { char next; char last=0; int length = 0; /* int white; */ /* 1 if next is whitespace*/ int temp_length; while (length<maxlength-1) { next = fgetc(THEFILE); if (next==EOF) break; /*break if EOF*/ if(last=='/'&&next=='/'){ length--; break; } if(last==0&&isspace(next)) continue; if (next!='\n'&&next!='\r') { Word[length] = next; length++; last = next; } else if (length>0) break; /*break if new whitespace*/ } temp_length=length-1; while(isspace(Word[temp_length])) temp_length--; length= temp_length+1; if (length>0) /*add end position*/ { Word[length] = '\0'; length++; } if (length==maxlength) /*move cursor to next whitespace*/ { do next = fgetc(THEFILE); while ((next != EOF) && (!(Whitespace(next)))); } return (length); }
int ReadString(char Word[],int maxlength,FILE *THEFILE) /*returns the length of the string. The next word (continuous non-whitespace characters) is put into Word. Returns 0 if EOF if reached before any words. If string is too long, moves cursor to next whitespace anyway.*/ { char next; int length = 0; int white; /* 1 if next is whitespace*/ while (length<maxlength-1) { next = fgetc(THEFILE); if (next==EOF) break; /*break if EOF*/ white = Whitespace(next); if (!(white)) { Word[length] = next; length++; } else if (length>0) break; /*break if new whitespace*/ } if (length>0) /*add end position*/ { Word[length] = '\0'; length++; } if (length==maxlength) /*move cursor to next whitespace*/ { do next = fgetc(THEFILE); while ((next != EOF) && (!(Whitespace(next)))); } return (length); }
/*ARGSUSED*/ Object Read_Char (Object port, int chr, int konst) { int c, str; FILE *f; char buf[10], *p = buf; f = PORT(port)->file; str = PORT(port)->flags & P_STRING; Reader_Getc; if (c == EOF) Reader_Sharp_Eof; *p++ = c; while (1) { Reader_Getc; if (c == EOF) Reader_Sharp_Eof; if (Whitespace (c) || Delimiter (c)) break; if (p == buf+9) Reader_Error (port, "syntax error in character constant"); *p++ = c; } Reader_Ungetc; if (p == buf+1) return Make_Char (*buf); *p = '\0'; if (p == buf+3) { for (c = 0, p = buf; p < buf+3 && Octal (*p); p++) c = c << 3 | (*p - '0'); if (p == buf+3) return Make_Char (c); } for (p = buf; *p; p++) if (isupper (*p)) *p = tolower (*p); if (strcmp (buf, "space") == 0) return Make_Char (' '); if (strcmp (buf, "newline") == 0) return Make_Char ('\n'); if (strcmp (buf, "return") == 0) return Make_Char ('\r'); if (strcmp (buf, "tab") == 0) return Make_Char ('\t'); if (strcmp (buf, "formfeed") == 0) return Make_Char ('\f'); if (strcmp (buf, "backspace") == 0) return Make_Char ('\b'); Reader_Error (port, "syntax error in character constant"); /*NOTREACHED*/ }
Object General_Read (Object port, int konst) { register FILE *f; register int c, str; Object ret; Check_Input_Port (port); Flush_Output (Curr_Output_Port); f = PORT(port)->file; str = PORT(port)->flags & P_STRING; while (1) { Reader_Getc; if (c == EOF) { ret = Eof; break; } if (Whitespace (c)) continue; if (c == ';') { comment: if (Skip_Comment (port) == EOF) { ret = Eof; break; } continue; } if (c == '(' || c == '[') { ret = Read_Sequence (port, 0, konst, c); } else if (c == '#') { ret = Read_Sharp (port, konst); if (TYPE(ret) == T_Special) /* it was a #! */ goto comment; } else { Reader_Ungetc; ret = Read_Atom (port, konst); } break; } Reader_Tweak_Stream; return ret; }
/*ARGSUSED*/ Object Read_Radix (Object port, int chr, int konst) { int c, str; FILE *f; Object ret; Read_Reset (); f = PORT(port)->file; str = PORT(port)->flags & P_STRING; Read_Store ('#'); Read_Store (chr); while (1) { Reader_Getc; if (c == EOF) Reader_Sharp_Eof; if (Whitespace (c) || Delimiter (c)) break; Read_Store (c); } Reader_Ungetc; Read_Store ('\0'); ret = Parse_Number (port, Read_Buf, 10); if (Nullp (ret)) Reader_Error (port, "radix not followed by a valid number"); return ret; }
int ConfigRead( const char *filename, cConfigEntry *entries, void *data ) { unsigned char *dp = (unsigned char *)data; // initialize data cConfigEntry *e; for( e = entries; e->m_type != eConfigTypeUnknown; e++ ) switch( e->m_type ) { case eConfigTypeBool: *(int *)(void *)(dp + e->m_offset) = e->m_default.m_bool; break; case eConfigTypeInt: *(int *)(void *)(dp + e->m_offset) = e->m_default.m_int; break; case eConfigTypeString: if ( e->m_default.m_string ) strcpy( (char *)dp + e->m_offset, e->m_default.m_string ); else *(char *)(dp + e->m_offset) = 0; break; default: assert( 0 ); break; } FILE *fd = fopen( filename, "r" ); if ( fd == 0 ) return 1; int line = 0; int rv = 0; while( 1 ) { line++; char buf[dConfigStringMaxLength]; if ( !fgets( buf, dConfigStringMaxLength, fd ) ) break; int l = strlen( buf ); if ( l && buf[l-1] == '\n' ) buf[l-1] = 0; char *p = Whitespace( buf ); // comment or empty line if ( *p == 0 || *p == '#' ) continue; char name[dConfigStringMaxLength]; char *n = name; while( *p && *p != ' ' && *p != '\t' && *p != '=' ) *n++ = *p++; *n = 0; if ( name[0] == 0 ) { fprintf( stderr, "%s.%d: missing entriy !\n", filename, line ); rv = 1; continue; } // find entry cConfigEntry *e = FindEntry( entries, name ); if ( !e ) { fprintf( stderr, "%s.%d: unknown entry '%s' !\n", filename, line, name ); rv = 1; continue; } p = Whitespace( p ); if ( *p != '=' ) { fprintf( stderr, "%s.%d: missing '=' !\n", filename, line ); rv = 1; continue; } p++; p = Whitespace( p ); if ( *p ) { // remove whitespace at the end of the line char *q = p + strlen( p ); q--; while( q > p && (*q == ' ' || *q == '\t' ) ) q--; q++; *q = 0; } switch( e->m_type ) { case eConfigTypeBool: if ( !strcasecmp( p, "false" ) ) *(int *)(void *)(dp + e->m_offset) = 0; else if ( !strcasecmp( p, "true" ) ) *(int *)(void *)(dp + e->m_offset) = 1; else { fprintf( stderr, "%s.%d: expecting 'true' or 'false' !\n", filename, line ); rv = 1; } break; case eConfigTypeInt: { char *q; *(int *)(void *)(dp + e->m_offset) = strtol( p, &q, 0 ); q = Whitespace( q ); if ( *q ) { fprintf( stderr, "%s.%d: expecting integer value !\n", filename, line ); rv = 1; } } break; case eConfigTypeString: strcpy( (char *)dp + e->m_offset, p ); break; default: assert( 0 ); break; } } fclose( fd ); return rv; }
Object Read_Special (Object port, int konst) { Object ret; register int c, str; register FILE *f; #define READ_QUOTE(sym) \ ( ret = Read_Atom (port, konst),\ konst ? (ret = Const_Cons (ret, Null), Const_Cons (sym, ret))\ : (ret = Cons (ret, Null), Cons (sym, ret))) f = PORT(port)->file; str = PORT(port)->flags & P_STRING; again: Reader_Getc; switch (c) { case EOF: eof: Reader_Tweak_Stream; Reader_Error (port, "premature end of file"); case ';': if (Skip_Comment (port) == EOF) goto eof; goto again; case ']': case ')': SET(ret, T_Special, c); return ret; case '[': case '(': return Read_Sequence (port, 0, konst, c); case '\'': return READ_QUOTE(Sym_Quote); case '`': return READ_QUOTE(Sym_Quasiquote); case ',': Reader_Getc; if (c == EOF) goto eof; if (c == '@') { return READ_QUOTE(Sym_Unquote_Splicing); } else { Reader_Ungetc; return READ_QUOTE(Sym_Unquote); } case '"': return Read_String (port, konst); case '#': ret = Read_Sharp (port, konst); if (TYPE(ret) == T_Special) goto again; return ret; default: if (Whitespace (c)) goto again; Read_Reset (); if (c == '.') { Reader_Getc; if (c == EOF) goto eof; if (Whitespace (c)) { Reader_Ungetc; SET(ret, T_Special, '.'); return ret; } Read_Store ('.'); } while (!Whitespace (c) && !Delimiter (c) && c != EOF) { if (c == '\\') { Reader_Getc; if (c == EOF) break; } Read_Store (c); Reader_Getc; } Read_Store ('\0'); if (c != EOF) Reader_Ungetc; ret = Parse_Number (port, Read_Buf, 10); if (Nullp (ret)) ret = Intern (Read_Buf); return ret; } /*NOTREACHED*/ }