📄 bwb_dio.c
字号:
} 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 + -