Example #1
0
/*-------------------------------------------*/
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);	
}	
Example #2
0
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);	
}	
Example #3
0
/*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*/
}
Example #4
0
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;
}
Example #5
0
/*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;
}
Example #6
0
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;
}
Example #7
0
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*/
}