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