1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #macro get( _parms_[] ):
_curparm_, _pType_, _arg_, _id_, _fVar_;
?_curparm_:uns32 := 0;
?_fVar_:text := @LastObject;
// Save important registers that the "GET" macro uses.
push( eax );
push( esi );
push( edi );
// The following loop repeats once for each GET parameter
// we process.
#while( _curparm_ < @elements( _parms_ ))
// If this parameter begins with an identifier,
// there are some problems to deal with.
// The symbol table functions (e.g., @ptype) don't
// allow address expression components after the
// symbol name. Named constants, however, do allow
// such entities. The following code determines
// (1) is this a symbol? (2) if it is a symbol, is
// it a constant?
//
// For non-constant symbols, we need to strip any
// trailing non-symbol characters from the string
// (e.g., "[0]" ).
?_arg_ := @trim( _parms_[ _curparm_ ], 0 );
#if( char( _arg_ ) in stdio._idchars_ )
// If this parameter begins with an id character,
// then strip away any non-ID symbols from the
// end of the string. Then determine if we've
// got a constant or some other class (e.g.,
// variable or procedure). If not a constant,
// keep only the name. If a constant, we need
// to keep all trailing characters as well.
?_id_ := stdio._GetID_( _arg_ );
#if
(
@class( _id_ ) = hla.cConstant
| @class( _id_ ) = hla.cValue
)
?_id_ := _arg_;
#endif
#else
// If it's not an ID, we need to keep everything.
?_id_ := _arg_;
#endif
// Determine the type of this parameter so we can
// call the appropriate routine to input it.
?_pType_ := @pType( @text( _id_ ));
#if( _pType_ = hla.ptArray )
?_pType_ :=
@pType( @text( @typename( @text( _id_ ))));
#endif
// Based on the type, call the appropriate library
// routine to print this value.
#if( _pType_ = hla.ptBoolean )
#error( "Boolean input is not supported" );
#elseif( _pType_ = hla.ptUns8 )
_fVar_.getu8();
mov( al, @text( _arg_ ));
#elseif( _pType_ = hla.ptUns16 )
_fVar_.getu16();
mov( ax, @text( _arg_ ));
#elseif( _pType_ = hla.ptUns32 )
_fVar_.getu32();
mov( eax, @text( _arg_ ));
#elseif( _pType_ = hla.ptByte )
_fVar_.getb();
mov( al, @text( _arg_ ));
#elseif( _pType_ = hla.ptWord )
.....
#else
#error
(
"stdin.get: Unknown data type (" +
_parms_[ _curparm_ ] +
":" +
@typename( @text( _id_ )) +
")"
);
#endif
?_curparm_ := _curparm_ + 1;
#endwhile
// Restore the registers pushed earlier for this
// call to the GET macro.
pop( edi );
pop( esi );
pop( eax );
#endmacro |
Partager