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

📄 bwb_dio.c

📁 这是一个简易的basic语言解释器, 可供我们学习和改进.
💻 C
📖 第 1 页 / 共 3 页
字号:
         }      length = (int) exp_getnval( e );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_field(): device <%d> length <%d> buf <%s>",         dev_number, length, &( l->buffer[ l->position ] ) );      bwb_debug( bwb_ebuf );#endif      /* read the AS */      adv_element( l->buffer, &( l->position ), atbuf );	/* get element */      bwb_strtoupper( atbuf );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_field(): AS element <%s>", atbuf );      bwb_debug( bwb_ebuf );#endif      if ( strncmp( atbuf, "AS", 2 ) != 0 )         {#if PROG_ERRORS         bwb_error( "in bwb_field(): AS statement not found" );#else         bwb_error( err_syntax );#endif         return bwb_zline( l );         }      /* read the string variable name */      adv_element( l->buffer, &( l->position ), atbuf );	/* get element */      v = var_find( atbuf );      if ( v->type != STRING )         {#if PROG_ERRORS         bwb_error( "in bwb_field(): string variable name not found" );#else         bwb_error( err_syntax );#endif         return bwb_zline( l );         }#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_field(): device <%d> var <%s> length <%d>",         dev_number, v->name, length );      bwb_debug( bwb_ebuf );#endif      /* check for overflow of record length */      if ( ( current_pos + length ) > dev_table[ dev_number ].reclen )         {#if PROG_ERRORS         bwb_error( "in bwb_field(): record length exceeded" );#else         bwb_error( err_overflow );#endif         return bwb_zline( l );         }      /* set buffer */      b = var_findsval( v, v->array_pos );#if DONTDOTHIS      if ( b->sbuffer != NULL )	 {         /* Revised to FREE pass-thru call by JBV */	 FREE( b->sbuffer, "bwb_field" );	 b->sbuffer = NULL; /* JBV */	 }#endif      b->sbuffer = dev_table[ dev_number ].buffer + current_pos;      b->length = (unsigned char) length;      b->rab = TRUE;      current_pos += length;#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_field(): buffer <%lXh> var <%s> buffer <%lXh>",         (long) dev_table[ dev_number ].buffer, v->name, (long) b->sbuffer );      bwb_debug( bwb_ebuf );#endif      /* eat up any remaining whitespace */      adv_ws( l->buffer, &( l->position ) );      }   while ( l->buffer[ l->position ] == ',' );   /* return */   return bwb_zline( l );   }/***************************************************************        FUNCTION:       bwb_lset()        DESCRIPTION:	This C function implements the BASIC			LSET command.	SYNTAX:		LSET string-variable$ = expression***************************************************************/#if ANSI_Cstruct bwb_line *bwb_lset( struct bwb_line *l )#elsestruct bwb_line *bwb_lset( l )   struct bwb_line *l;#endif   {   return dio_lrset( l, FALSE );   }/***************************************************************        FUNCTION:       bwb_rset()        DESCRIPTION:	This C function implements the BASIC			RSET command.	SYNTAX:		RSET string-variable$ = expression***************************************************************/#if ANSI_Cstruct bwb_line *bwb_rset( struct bwb_line *l )#elsestruct bwb_line *bwb_rset( l )   struct bwb_line *l;#endif   {   return dio_lrset( l, TRUE );   }/***************************************************************        FUNCTION:       dio_lrset()        DESCRIPTION:	This C function implements the BASIC			RSET and LSET commands.***************************************************************/#if ANSI_Cstatic struct bwb_line *dio_lrset( struct bwb_line *l, int rset )#elsestatic struct bwb_line *dio_lrset( l, rset )   struct bwb_line *l;   int rset;#endif   {   char varname[ MAXVARNAMESIZE + 1 ];   bstring *d, *s;   int *pp;   int n_params;   int p;   register int n, i;   int startpos;   struct exp_ese *e;   /* find the variable name */   bwb_getvarname( l->buffer, varname, &( l->position ));   v = var_find( varname );   if ( v == NULL )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in dio_lrset(): failed to find variable" );      bwb_error( bwb_ebuf );#else      bwb_error( err_syntax );#endif      }   if ( v->type != STRING )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in dio_lrset(): assignment must be to string variable" );      bwb_error( bwb_ebuf );#else      bwb_error( err_syntax );#endif      }   /* read subscripts */   pos = 0;   if ( ( v->dimensions == 1 ) && ( v->array_sizes[ 0 ] == 1 ))      {#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in dio_lrset(): variable <%s> has 1 dimension",         v->name );      bwb_debug( bwb_ebuf );#endif      n_params = 1;      pp = &p;      pp[ 0 ] = dim_base;      }   else      {#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in dio_lrset(): variable <%s> has > 1 dimensions",         v->name );      bwb_debug( bwb_ebuf );#endif      dim_getparams( l->buffer, &( l->position ), &n_params, &pp );      }   CURTASK exps[ CURTASK expsc ].pos_adv = pos;   for ( n = 0; n < v->dimensions; ++n )      {      v->array_pos[ n ] = pp[ n ];      }   /* get bstring pointer */   d = var_findsval( v, pp );   /* find equals sign */   adv_ws( l->buffer, &( l->position ));   if ( l->buffer[ l->position ] != '=' )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in dio_lrset(): failed to find equal sign" );      bwb_error( bwb_ebuf );#else      bwb_error( err_syntax );#endif      }   ++( l->position );   adv_ws( l->buffer, &( l->position ));   /* read remainder of line to get value */   e = bwb_exp( l->buffer, FALSE, &( l->position ) );   s = exp_getsval( e );   /* set starting position */   startpos = 0;   if ( rset == TRUE )      {      if ( s->length < d->length )         {         startpos = d->length - s->length;         }      }#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in dio_lrset(): startpos <%d> buffer <%lX>",      startpos, (long) d->sbuffer );   bwb_debug( bwb_ebuf );#endif   /* write characters to new position */   i = 0;   for ( n = startpos; ( i < (int) s->length ) && ( n < (int) d->length ); ++n )      {      d->sbuffer[ n ] = s->sbuffer[ i ];      ++i;      }   /* return */   return bwb_zline( l );   }/***************************************************************        FUNCTION:       bwb_get()        DESCRIPTION:	This C function implements the BASIC			GET command.	SYNTAX:		GET [#] device-number [, record-number]***************************************************************/#if ANSI_Cstruct bwb_line *bwb_get( struct bwb_line *l )#elsestruct bwb_line *bwb_get( l )   struct bwb_line *l;#endif   {   int dev_number;   int rec_number;   register int i;   struct exp_ese *e;   char atbuf[ MAXSTRINGSIZE + 1 ];   long offset; /* JBV */   /* first read device number */   adv_ws( l->buffer, &( l->position ) );   if ( l->buffer[ l->position ] =='#' )      {      ++( l->position );      }   adv_element( l->buffer, &( l->position ), atbuf );   pos = 0;   e = bwb_exp( atbuf, FALSE, &pos );   if ( e->type != NUMBER )      {#if PROG_ERRORS      bwb_error( "in bwb_get(): Number was expected for device number" );#else      bwb_error( err_syntax );#endif      return bwb_zline( l );      }   dev_number = (int) exp_getnval( e );#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_get(): device <%d>", dev_number );   bwb_debug( bwb_ebuf );#endif   /* be sure that the requested device is open */   if ( ( dev_table[ dev_number ].mode == DEVMODE_CLOSED ) ||      ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )      {#if PROG_ERRORS      bwb_error( "in bwb_get(): Requested device number is not in use." );#else      bwb_error( err_devnum );#endif      return bwb_zline( l );      }   /* see if there is a comma (and record number) */   adv_ws( l->buffer, &( l->position ) );   if ( l->buffer[ l->position ] == ',' )	/* yes, there is a comma */      {      ++( l->position );      /* get the record number element */      adv_element( l->buffer, &( l->position ), atbuf );      pos = 0;      e = bwb_exp( atbuf, FALSE, &pos );      rec_number = (int) exp_getnval( e );      }   else				/* no record number given */      {      rec_number = dev_table[ dev_number ].next_record;      }#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_get(): record number <%d>", rec_number );   bwb_debug( bwb_ebuf );#endif   /* wind the c file up to the proper point */   /* Added by JBV */   offset = (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen);   if ( fseek( dev_table[ dev_number ].cfp, offset, SEEK_SET ) != 0 )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in bwb_get(): fseek() failed, rec number <%d> offset <%ld>",        rec_number, (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ) );      bwb_error( bwb_ebuf );#else      bwb_error( err_dev );#endif      return bwb_zline( l );      }   /* read the requested bytes into the buffer */   dev_table[ dev_number ].loc = offset; /* Slight bug fix (JBV) */   for ( i = 0; i < dev_table[ dev_number ].reclen; ++i )      {      dev_table[ dev_number ].buffer[ i ] =         (char) fgetc( dev_table[ dev_number ].cfp );      ++( dev_table[ dev_number ].loc );      }   /* increment (or reset) the current record */   dev_table[ dev_number ].next_record = rec_number + 1;   return bwb_zline( l );   }/***************************************************************        FUNCTION:       bwb_put()        DESCRIPTION:	This C function implements the BASIC			PUT command.	SYNTAX:		PUT [#] device-number [, record-number]***************************************************************/#if ANSI_Cstruct bwb_line *bwb_put( struct bwb_line *l )#elsestruct bwb_line *bwb_put( l )   struct bwb_line *l;#endif   {   int dev_number;   int rec_number;   register int i;   struct exp_ese *e;   char atbuf[ MAXSTRINGSIZE + 1 ];   long offset; /* JBV */   /* first read device number */   adv_ws( l->buffer, &( l->position ) );   if ( l->buffer[ l->position ] =='#' )      {      ++( l->position );      }   adv_element( l->buffer, &( l->position ), atbuf );/*   dev_number = atoi( atbuf ); */  /* Not quite right (JBV) */   /* Added by JBV */   pos = 0;   e = bwb_exp( atbuf, FALSE, &pos );   if ( e->type != NUMBER )      {#if PROG_ERRORS      bwb_error( "in bwb_put(): Number was expected for device number" );#else      bwb_error( err_syntax );#endif      return bwb_zline( l );      }   dev_number = (int) exp_getnval( e );#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_put(): device <%d>", dev_number );   bwb_debug( bwb_ebuf );#endif   /* be sure that the requested device is open */   if ( ( dev_table[ dev_number ].mode == DEVMODE_CLOSED ) ||      ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )      {#if PROG_ERRORS      bwb_error( "in bwb_put(): Requested device number is not in use." );#else      bwb_error( err_devnum );#endif      return bwb_zline( l );      }   /* see if there is a comma (and record number) */   adv_ws( l->buffer, &( l->position ) );   if ( l->buffer[ l->position ] == ',' )	/* yes, there is a comma */      {      ++( l->position );      /* get the record number element */      adv_element( l->buffer, &( l->position ), atbuf );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_put(): rec no buffer <%s>", atbuf );      bwb_debug( bwb_ebuf );#endif      pos = 0;      e = bwb_exp( atbuf, FALSE, &pos );#if INTENSIVE_DEBUG      sprintf( bwb_ebuf, "in bwb_put(): return type <%c>", e->type );      bwb_debug( bwb_ebuf );#endif      rec_number = (int) exp_getnval( e );      }   else				/* no record number given */      {      rec_number = dev_table[ dev_number ].next_record;      }#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_put(): record number <%d>", rec_number );   bwb_debug( bwb_ebuf );#endif   /* wind the c file up to the proper point */   /* Added by JBV */   offset = (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen);   if ( fseek( dev_table[ dev_number ].cfp, offset, SEEK_SET ) != 0 )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in bwb_get(): fseek() failed, rec number <%d> offset <%ld>",        rec_number, (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ) );      bwb_error( bwb_ebuf );#else      bwb_error( err_dev );#endif      return bwb_zline( l );      }#if INTENSIVE_DEBUG   sprintf( bwb_ebuf, "in bwb_put(): ready to write to file, buffer <%lXh>",      (long) dev_table[ dev_number ].buffer );   bwb_debug( bwb_ebuf );   prn_xprintf( stderr, "Buffer: <" );#endif   /* write the requested bytes to the file */   dev_table[ dev_number ].loc = offset; /* Slight bug fix (JBV) */   for ( i = 0; i < dev_table[ dev_number ].reclen; ++i )      {      fputc( dev_table[ dev_number ].buffer[ i ],         dev_table[ dev_number ].cfp );#if INTENSIVE_DEBUG      xputc( stderr, dev_table[ dev_number ].buffer[ i ] );#endif      ++( dev_table[ dev_number ].loc );      }#if INTENSIVE_DEBUG   prn_xprintf( stderr, ">\n" );   sprintf( bwb_ebuf, "in bwb_put(): write to file complete" );   bwb_debug( bwb_ebuf );#endif   /* flush the buffer */   dio_flush( dev_number );   /* increment (or reset) the current record */   dev_table[ dev_number ].next_record = rec_number + 1;   return bwb_zline( l );   }/***************************************************************        FUNCTION:       dio_flush()        DESCRIPTION:    This C function flushes the random-access			buffer associated with file dev_number.***************************************************************/#if ANSI_Cstatic intdio_flush( int dev_number )#elsestatic intdio_flush( dev_number )   int dev_number;#endif   {   register int n;   if ( dev_table[ dev_number ].mode != DEVMODE_RANDOM )      {#if PROG_ERRORS      sprintf( bwb_ebuf, "in dio_flush(): only random-access buffers can be flushed" );      bwb_error( bwb_ebuf );#else      bwb_error( err_dev );#endif      }   /* fill buffer with blanks (or 'X' for test) */   for ( n = 0; n < dev_table[ req_devnumber ].reclen; ++n )      {      dev_table[ req_devnumber ].buffer[ n ] = RANDOM_FILLCHAR;      }   return TRUE;   }#endif				/* COMMON_CMDS */

⌨️ 快捷键说明

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