home *** CD-ROM | disk | FTP | other *** search
- #include <ctype.h>
- #include <stdio.h>
- #include <string.h>
- #include <Types.h>
- #include "obstack.h"
- #include "tm.h"
-
- #define obstack_chunk_alloc xmalloc
- #define obstack_chunk_free free
-
- extern int xmalloc ();
- extern void free ();
-
- static struct obstack thestack;
- static struct obstack *paramob;
-
- extern FILE *finput;
-
- static int c;
-
- static parameter *thelast = NULL;
-
- void
- initparameter(void)
- {
- paramob=&thestack;
- obstack_init (paramob);
- thelast = NULL;
- }
-
- void
- printreg( pregs r )
- {
- switch( r ) {
- case noreg:
- fprintf( stderr, "noreg\n" );
- break;
- case pd0:
- fprintf( stderr, "d0\n" );
- break;
- case pd1:
- fprintf( stderr, "d1\n" );
- break;
- case pd2:
- fprintf( stderr, "d2\n" );
- break;
- case pa0:
- fprintf( stderr, "a0\n" );
- break;
- case pa1:
- fprintf( stderr, "a1\n" );
- break;
- default:
- fprintf( stderr, "unknown\n" );
- break;
- }
- }
-
-
- void
- printparameter(parameter *p)
- {
- int i;
-
- fprintf( stderr, "%s\n", p->name );
- fprintf( stderr, "function result: " );
- printreg( p->funcreturn );
-
- for( i=0; i<MAXPARAMS; i++ ) {
- fprintf( stderr, "parameter %d: ", i );
- printreg( p->params[i] );
- }
- }
-
-
- pregs
- parsereg( void )
- {
- c = getc( finput );
- if( c == 'a' || c == 'A' ) {
- c = getc( finput );
- switch( c ) {
- case '0':
- return( pa0 );
- case '1':
- return( pa1 );
- default:
- warning( "Illegal register in parameter pragma.\n" );
- return( noreg );
- }
- }
-
- if( c == 'd' || c == 'D' ) {
- c = getc( finput );
- switch( c ) {
- case '0':
- return( pd0 );
- case '1':
- return( pd1 );
- case '2':
- return( pd2 );
- default:
- warning( "Illegal register in parameter pragma.\n" );
- return( noreg );
- }
- }
- }
- #if 1
- int
- parseparam(void)
- {
- int i;
- char symbol[512];
- char *s;
- parameter p;
- parameter *tp;
-
- s = symbol;
-
- for( i=0; i<MAXPARAMS; i++ )
- p.params[i] = noreg;
-
- p.funcreturn = noreg;
-
- do {
- c = getc( finput );
- } while( !(isalnum(c) || c == '_') );
-
- if( c == '_' )
- {
- c = getc( finput );
- if( c == '_' )
- p.funcreturn = parsereg();
- else
- {
- *s++ = '_' ;
- *s++ = c ;
- }
-
- }
- else
- *s++ = c ;
-
- do {
- c = getc( finput );
- } while( !(isalnum(c) || c == '_' ) );
-
- while( isalnum(c) || c == '_' ) {
- *s++ = c ;
- c = getc( finput );
- }
- *s++ = '\0' ;
-
- if( c == '\n' ) {
- //printparameter(&p);
- tp = (void *)malloc( sizeof( parameter ) + strlen( symbol ) + 1);
- *tp = p;
- strcpy( tp->name, symbol );
- tp->last = thelast;
- thelast = tp;
- return(c);
- }
-
- for( i=0; i < MAXPARAMS; i++ ) {
- do {
- c = getc( finput );
- } while( !(isalnum(c)|| c == '_' || c == '\n' ) );
- if( c == '_' ){
- c = getc( finput );
- if( c == '_' )
- p.params[i] = parsereg();
- }
- if( c == '\n' ) {
- //printparameter(&p);
- tp = (void *)malloc( sizeof( parameter ) + strlen( symbol ) + 1 );
- *tp = p;
- strcpy( tp->name, symbol );
- tp->last = thelast;
- thelast = tp;
- return(c);
- }
- }
- }
- #else
- {
- int i;
- parameter *p;
-
- p = (parameter *)obstack_base( paramob );
- obstack_blank( paramob, sizeof( parameter ) );
-
- for( i=0; i<MAXPARAMS; i++ )
- p->params[i] = noreg;
-
- p->funcreturn = noreg;
-
- p->last = thelast;
-
- do {
- c = getc( finput );
- } while( !(isalnum(c) || c == '_') );
-
- if( c == '_' )
- {
- c = getc( finput );
- if( c == '_' )
- p->funcreturn = parsereg();
- else
- {
- obstack_1grow( paramob, '_' );
- obstack_1grow( paramob, c );
- }
-
- }
- else
- obstack_1grow( paramob, c );
-
- do {
- c = getc( finput );
- } while( !(isalnum(c) || c == '_' ) );
-
- while( isalnum(c) || c == '_' ) {
- obstack_1grow( paramob, c );
- c = getc( finput );
- }
- obstack_1grow( paramob, 0 );
-
- if( c == '\n' ) {
- p=(parameter *)obstack_finish( paramob );
- //printparameter(p);
- thelast = p;
- return(c);
- }
-
- for( i=0; i < MAXPARAMS; i++ ) {
- do {
- c = getc( finput );
- } while( !(isalnum(c)|| c == '_' || c == '\n' ) );
- if( c == '_' ){
- c = getc( finput );
- if( c == '_' )
- p->params[i] = parsereg();
- }
- if( c == '\n' ) {
- p=(parameter *)obstack_finish( paramob );
- //printparameter(p);
- thelast = p;
- return(c);
- }
- }
- }
- #endif
- parameter *
- lookupparameter( const char *name )
- {
- parameter *temp;
-
- //fprintf( stderr, "looking up:%s\n", name );
-
- for( temp = thelast; temp != NULL; temp = temp->last ) {
- if( strcmp( name, temp->name ) == 0 ) {
- //fprintf( stderr, "found:%s\n", name );
- return( temp );
- }
- }
-
- return( NULL );
- }