⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bwb_inp.c

📁 这是一个简易的basic语言解释器, 可供我们学习和改进.
💻 C
📖 第 1 页 / 共 4 页
字号:
        FUNCTION:       inp_str()        DESCRIPTION:    This function does INPUT processing                        from a determined string of input                        data and a determined variable list                        (both in memory).  This presupposes			that input has been taken from stdin,			not from a disk file or device.***************************************************************/#if ANSI_Cstatic struct bwb_line *inp_str( struct bwb_line *l, char *input_buffer, char *var_list, int *vl_position )#elsestatic struct bwb_line *inp_str( l, input_buffer, var_list, vl_position )   struct bwb_line *l;   char *input_buffer;   char *var_list;   int *vl_position;#endif   {   int i;   register int n;   struct bwb_variable *v;   int loop;   int *pp;   int n_params;   char ttbuf[ MAXSTRINGSIZE + 1 ];		/* build element */   char varname[ MAXSTRINGSIZE + 1 ];		/* build element */#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in inp_str(): received line <%s>",      l->buffer );   bwb_debug( bwb_ebuf );   sprintf( bwb_ebuf, "in inp_str(): received variable list <%s>.",      &( var_list[ *vl_position ] ) );   bwb_debug( bwb_ebuf );   sprintf( bwb_ebuf, "in inp_str(): received input buffer  <%s>.",      input_buffer );   bwb_debug( bwb_ebuf );#endif   /* Read elements, and assign them to variables */   i = 0;   loop = TRUE;   while ( loop == TRUE )      {      /* get a variable name from the list */      bwb_getvarname( var_list, varname, vl_position );    /* get name */      v = var_find( varname );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in inp_str(): found variable buffer <%s> name <%s>",         varname, v->name );      bwb_debug( bwb_ebuf );#endif      /* read subscripts if appropriate */      adv_ws( var_list, vl_position );      if ( var_list[ *vl_position ] == '(' )         {#if INTENSIVE_DEBUG	 sprintf( bwb_ebuf, "in inp_str(): variable <%s> has dimensions",	    v->name );	 bwb_debug( bwb_ebuf );#endif         dim_getparams( var_list, vl_position, &n_params, &pp );         for ( n = 0; n < v->dimensions; ++n )            {            v->array_pos[ n ] = pp[ n ];            }         }      /* build string from input buffer in ttbuf */      n = 0;      ttbuf[ 0 ] = '\0';      while ( ( input_buffer[ i ] != ',' )         &&   ( input_buffer[ i ] != '\0' ))         {         ttbuf[ n ] = input_buffer[ i ];         ++n;         ++i;         ttbuf[ n ] = '\0';         }#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in inp_str(): string for input <%s>",         ttbuf );      bwb_debug( bwb_ebuf );#endif      /* perform type-specific input */      inp_assign( ttbuf, v );      /* check for commas in variable list and input list and advance */      adv_ws( var_list, vl_position );      switch( var_list[ *vl_position ] )	 {	 case '\n':	 case '\r':	 case '\0':	 case ':':	    loop = FALSE;	    break;	 case ',':	    ++( *vl_position );	    break;         }      adv_ws( var_list, vl_position );      adv_ws( input_buffer, &i );      switch ( input_buffer[ i ] )	 {	 case '\n':	 case '\r':	 case '\0':	 case ':':	    loop = FALSE;	    break;	 case ',':	    ++i;	    break;	 }      adv_ws( input_buffer, &i );      }#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in inp_str(): exit, line buffer <%s>",      &( l->buffer[ l->position ] ) );   bwb_debug( bwb_ebuf );#endif   /* return */   return bwb_zline( l );   }/***************************************************************        FUNCTION:       inp_assign()        DESCRIPTION:    This function assigns the value of a                        numerical or string constant to a                        variable.***************************************************************/#if ANSI_Cstatic intinp_assign( char *b, struct bwb_variable *v )#elsestatic intinp_assign( b, v )   char *b;   struct bwb_variable *v;#endif   {   switch( v->type )      {      case STRING:         str_ctob( var_findsval( v, v->array_pos ), b );         break;      case NUMBER:         if ( strlen( b ) == 0 )            {            *( var_findnval( v, v->array_pos )) = (bnumber) 0.0;            }         else            {            /*------------------------------------------------------------*/            /* atof call replaced by inp_numconst, gets all input formats */            /* (JBV, 10/95)                                               */            /*------------------------------------------------------------*/            /* *( var_findnval( v, v->array_pos )) = (bnumber) atof( b ); */            *( var_findnval( v, v->array_pos )) = inp_numconst( b );            }         break;      default:#if PROG_ERRORS         sprintf( bwb_ebuf, "in inp_assign(): variable <%s> of unknown type",            v->name );         bwb_error( bwb_ebuf );#else         bwb_error( err_mismatch );#endif         return FALSE;      }   return FALSE;   }/***************************************************************        FUNCTION:       inp_adv()        DESCRIPTION:    This function advances the string pointer                        past whitespace and the item delimiter                        (comma).***************************************************************/#if ANSI_Cintinp_adv( char *b, int *c )#elseintinp_adv( b, c )   char *b;   int *c;#endif   {   int rval;   rval = FALSE;   while( TRUE )      {      switch( b[ *c ] )         {         case ' ':              /* whitespace */         case '\t':         case ';':              /* semicolon, end of prompt string */            ++*c;            break;         case ',':              /* comma, variable delimiter */            rval = TRUE;            ++*c;            break;         case '\0':		/* end of line */         case ':': 		/* end of line segment */            rval = TRUE;            last_inp_adv_rval = rval; /* JBV */            return rval;         default:            last_inp_adv_rval = rval; /* JBV */            return rval;         }      }   }/***************************************************************        FUNCTION:       inp_const()        DESCRIPTION:    This function reads a numerical or string                        constant from <m_buffer> into <s_buffer>,                        incrementing <position> appropriately.***************************************************************/#if ANSI_Cstatic intinp_const( char *m_buffer, char *s_buffer, int *position )#elsestatic intinp_const( m_buffer, s_buffer, position )   char *m_buffer;   char *s_buffer;   int *position;#endif   {   int string;   int s_pos;   int loop;#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in inp_const(): received argument <%s>.",      &( m_buffer[ *position ] ) );   bwb_debug( bwb_ebuf );#endif   string = FALSE;   /* first detect string constant */   if ( m_buffer[ *position ] == '\"' )      {      string = TRUE;      ++( *position );      }   else      {      string = FALSE;      }   /* build the constant string */   s_buffer[ 0 ] = '\0';   s_pos = 0;   loop = TRUE;   while ( loop == TRUE )      {      switch ( m_buffer[ *position ] )         {         case '\0':                     /* end of string */         case '\n':         case '\r':            return TRUE;         case ' ':                      /* whitespace */         case '\t':         case ',':                      /* or end of argument */            if ( string == FALSE )               {               return TRUE;               }            else               {               s_buffer[ s_pos ] = m_buffer[ *position ];               ++( *position );               ++s_buffer;               s_buffer[ s_pos ] = '\0';               }            break;         case '\"':            if ( string == TRUE )               {               ++( *position );                 /* advance beyond quotation mark */               inp_adv( m_buffer, position );               return TRUE;               }            else               {#if PROG_ERRORS               sprintf( bwb_ebuf, "Unexpected character in numerical constant." );               bwb_error( bwb_ebuf );#else               bwb_error( err_syntax );#endif               return FALSE;               }         default:            s_buffer[ s_pos ] = m_buffer[ *position ];            ++( *position );            ++s_buffer;            s_buffer[ s_pos ] = '\0';            break;         }      }   return FALSE;   }#if COMMON_CMDS/***************************************************************        FUNCTION:       bwb_line()        DESCRIPTION:    This function implements the BASIC LINE                        INPUT statement.	SYNTAX:         LINE INPUT [[#] device-number,]["prompt string";] string-variable$***************************************************************/#if ANSI_Cstruct bwb_line *bwb_line( struct bwb_line *l )#elsestruct bwb_line *bwb_line( l )   struct bwb_line *l;#endif   {   int dev_no;   struct bwb_variable *v;   FILE *inp_device;   char tbuf[ MAXSTRINGSIZE + 1 ];   char pstring[ MAXSTRINGSIZE + 1 ];   struct exp_ese *e; /* JBV */   int pos; /* JBV */   /* assign default values */   inp_device = stdin;   pstring[ 0 ] = '\0';   /* advance to first element (INPUT statement) */   adv_element( l->buffer, &( l->position ), tbuf );   bwb_strtoupper( tbuf );   if ( strcmp( tbuf, "INPUT" ) != 0 )      {      bwb_error( err_syntax );      return bwb_zline( l );      }   adv_ws( l->buffer, &( l->position ) );   /* check for semicolon in first position */   if ( l->buffer[ l->position ] == ';' )      {      ++l->position;      adv_ws( l->buffer, &( l->position ) );      }   /* else check for# for file number in first position */   else if ( l->buffer[ l->position ] == '#' )      {      ++l->position;      adv_element( l->buffer, &( l->position ), tbuf );      adv_ws( l->buffer, &( l->position ));      /* dev_no = atoi( tbuf ); */  /* We really need more, added next (JBV) */      pos = 0;      e = bwb_exp( tbuf, FALSE, &pos );      dev_no = (int) exp_getnval( e );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_line(): file number requested <%d>", dev_no );      bwb_debug( bwb_ebuf );#endif      if ( dev_table[ dev_no ].cfp == NULL )         {         bwb_error( err_dev );         return bwb_zline( l );         }      else         {         inp_device = dev_table[ dev_no ].cfp;         }      }   /* check for comma */   if ( l->buffer[ l->position ] == ',' )      {      ++( l->position );      adv_ws( l->buffer, &( l->position ));      }   /* check for quotation mark indicating prompt */   if ( l->buffer[ l->position ] == '\"' )      {      inp_const( l->buffer, pstring, &( l->position ) );      }   /* read the variable for assignment */#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_line(): tbuf <%s>",       tbuf );   bwb_debug( bwb_ebuf );   sprintf( bwb_ebuf, "in bwb_line(): line buffer <%s>",       &( l->buffer[ l->position ] ) );   bwb_debug( bwb_ebuf );#endif   adv_element( l->buffer, &( l->position ), tbuf );#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_line(): variable buffer <%s>", tbuf );   bwb_debug( bwb_ebuf );#endif   v = var_find( tbuf );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -