deffile.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,067 行 · 第 1/3 页

C
1,067
字号
                    SET_ERROR;
                } else {
                    exportsGotResident = 1;
                    mergeNow = 1;
                }
                state = STATE_EXPORTS;
                break;
              case STATE_COMMA:
                if( !exportsGotEntryName ) {
                    SET_ERROR;
                }
                state = STATE_EXPORTS;
                break;
              default:
                break;
            }
            break;
          case STATE_LIBRARY:           /* LIBRARY [library][BASE=address] */
            state = next_token(STATE_LIBRARY, &mergeNow, NULL, TRUE, FALSE );
            if( mergeNow )  break;
            switch( state ) {
              case STATE_STRING:
                strip_quotes( curToken );
                if( info->internalDllName != NULL )  FreeMem( info->internalDllName );
                info->internalDllName = DupStrMem( curToken );
                state = STATE_LIBRARY;
                break;
              case STATE_BASE:
                state = next_token(STATE_LIBRARY, NULL, NULL, FALSE, FALSE );
                switch( state ) {
                  case STATE_EQUAL:
                    state = next_token(STATE_LIBRARY, NULL, NULL, FALSE, FALSE );
                    switch( state ) {
                      case STATE_STRING:
                        if( info->baseAddr != NULL )  FreeMem( info->baseAddr );
                        info->baseAddr = DupStrMem( curToken );
                        break;
                      default:
                        break;
                    }
                  default:
                    break;
                }
                state = STATE_LIBRARY;
                break;
              default:
                break;
            }
            break;
          case STATE_NAME:      /* NAME [application][BASE=address] */
            state = next_token(STATE_NAME, &mergeNow, NULL, TRUE, FALSE );
            if( mergeNow )  break;
            switch( state ) {
              case STATE_STRING:
                strip_quotes( curToken );
                if( info->name != NULL )  FreeMem( info->name );
                info->name = DupStrMem( curToken );
                state = STATE_NAME;
                break;
              case STATE_BASE:
                state = next_token(STATE_NAME, NULL, NULL, FALSE, FALSE );
                switch( state ) {
                  case STATE_EQUAL:
                    state = next_token(STATE_NAME, NULL, NULL, FALSE, FALSE );
                    switch( state ) {
                      case STATE_STRING:
                        if( info->baseAddr != NULL )  FreeMem( info->baseAddr );
                        info->baseAddr = DupStrMem( curToken );
                        break;
                      default:
                        break;
                    }
                  default:
                    break;
                }
                state = STATE_NAME;
                break;
              default:
                break;
            }
            break;
          case STATE_SECTIONS:  /* SECTIONS definitions */
            UnsupportedOptsMessage( "SECTIONS" );
            state=STATE_STRING;
            mergeNow2 = 0;
            mergeNow = 0;
            for( ; ; ) {
                state=next_token( STATE_STRING, &mergeNow, NULL, FALSE, FALSE );
                if ( (state<STATE_AT) && mergeNow2 ) break;
                mergeNow2 = mergeNow;
                mergeNow = 0;
            }
            mergeNow = 0;
            break;
          case STATE_STACKSIZE: /* STACKSIZE reserve[,commit] */
            state = next_token(STATE_STACKSIZE, &mergeNow, NULL, FALSE, FALSE );
            if( mergeNow && !stackGotReserve )  SET_ERROR;
            switch( state ) {
              case STATE_STRING:
                if( stackGotCommit ) {
                    SET_ERROR;
                } else if (stackGotReserve){
                    stackCommit = DupStrMem( curToken );
                    stackGotCommit = 1;
                    state = STATE_CLEAR;
                    break;
                } else {
                    stackReserve = DupStrMem( curToken );
                    stackGotReserve = 1;
                    mergeType = STATE_STACKSIZE;
                }
                state = STATE_STACKSIZE;
                break;
              case STATE_COMMA:
                state = next_token(STATE_STACKSIZE, NULL, NULL, FALSE, FALSE );
                switch( state ) {
                  case STATE_STRING:
                    stackCommit = DupStrMem( curToken );
                    stackGotCommit = 1;
                    state = STATE_CLEAR;
                    break;
                  default:
                    SET_ERROR;
                    break;
                }
                break;
              case STATE_EOF:
                break;
              default:
                if( !stackGotReserve )  SET_ERROR;
                break;
            }
            break;
          case STATE_STUB:      /* STUB "newfilename" */
            if (stubGotFile) {
                FreeMem(info->stub);
                info->stub=NULL;
            }
            state = next_token(STATE_STUB, NULL, NULL, TRUE, FALSE );
            switch( state ) {
              case STATE_STRING:
                stubGotFile = TRUE;
                str = string_convert( curToken );
                info->stub = DupStrMem(str);
                state = STATE_CLEAR;
                break;
              default:
                SET_ERROR;
                break;
            }
            break;
          case STATE_HEAPSIZE:  /* HEAPSIZE reserve[,commit] */
            state = next_token( STATE_HEAPSIZE, &mergeNow, NULL, FALSE, FALSE );
            if( mergeNow && !heapGotReserve )  SET_ERROR;
            switch( state ) {
              case STATE_STRING:
                if( heapGotCommit ) {
                    SET_ERROR;
                } else if (heapGotReserve){
                    heapCommit = DupStrMem( curToken );
                    heapGotCommit = 1;
                    state = STATE_CLEAR;
                    break;
                } else {
                    heapReserve = DupStrMem( curToken );
                    heapGotReserve = 1;
                    mergeType = STATE_HEAPSIZE;
                }
                state = STATE_HEAPSIZE;
                break;
              case STATE_COMMA:
                state = next_token( STATE_HEAPSIZE, NULL, NULL, FALSE, FALSE );
                switch( state ) {
                  case STATE_STRING:
                    heapCommit = DupStrMem( curToken );
                    heapGotCommit = 1;
                    state = STATE_CLEAR;
                    break;
                  default:
                    SET_ERROR;
                    break;
                }
                break;
              case STATE_EOF:
                break;
              default:
                if( !heapGotReserve )  SET_ERROR;
                break;
            }
            break;
          case STATE_VERSION:   /* VERSION major[.minor] */
            state = next_token(STATE_VERSION, &mergeNow, NULL, FALSE, FALSE );
            if( mergeNow && !versionGotMajor )  SET_ERROR;
            switch( state ) {
              case STATE_STRING:
                if( versionGotMajor ) {
                    SET_ERROR;
                } else {
                    versionMajor = DupStrMem( curToken );
                    versionGotMajor = 1;
                    mergeType = STATE_VERSION;
                }
                state = STATE_VERSION;
                break;
              case STATE_PERIOD:
                if( !versionGotMajor ) {
                    SET_ERROR;
                } else {
                    state = next_token(STATE_VERSION, NULL, NULL, FALSE, FALSE );
                    switch( state ) {
                      case STATE_STRING:
                        versionMinor = DupStrMem( curToken );
                        versionGotMinor = 1;
                        state = STATE_CLEAR;
                        break;
                      default:
                        SET_ERROR;
                        break;
                    }
                }
                break;
              case STATE_EOF:
                break;
              default:
                SET_ERROR;
                break;
            }
            break;
          case STATE_PROTMODE:
            /*** ignore this token ***/
            UnsupportedOptsMessage( "PROTMODE" );
            state = STATE_CLEAR;
            break;
          case STATE_CODE:
            /*** ignore this token and the rest of the line ***/
            UnsupportedOptsMessage( "CODE" );
            next_token(STATE_CODE, NULL, &foundNewLine, FALSE, FALSE );
            while( !foundNewLine ) {
                next_token(STATE_CODE, NULL, &foundNewLine, FALSE, FALSE );
            }
            state = STATE_CLEAR;
            break;
          case STATE_EXETYPE:
            /*** ignore this token and the rest of the line ***/
            UnsupportedOptsMessage( "EXETYPE" );
            next_token( STATE_EXETYPE, NULL, &foundNewLine, FALSE, FALSE );
            while( !foundNewLine ) {
                next_token( STATE_EXETYPE, NULL, &foundNewLine, FALSE, FALSE );
            }
            state = STATE_CLEAR;
            break;
          case STATE_DATA:
            /*** ignore this token and the rest of the line ***/
            UnsupportedOptsMessage( "DATA" );
            next_token( STATE_DATA, NULL, &foundNewLine, FALSE, FALSE );
            while( !foundNewLine ) {
                next_token( STATE_DATA, NULL, &foundNewLine, FALSE, FALSE );
            }
            state = STATE_CLEAR;
            break;
          case STATE_EOF:
            alive = FALSE;
            break;
          default:
            SET_ERROR;
        }

        /*** Merge stuff together if necessary ***/
        if( (mergeNow==TRUE)  ||  (state==STATE_CLEAR || state==STATE_EOF) ) {
            switch( mergeType ) {
              case STATE_EXPORTS:
                len = strlen( exportsEntryName );
                if( exportsGotOrdinal ) {
                    len++;                      /* for '.' */
                    len += strlen( exportsOrdinal );
                    if( exportsGotResident ) {
                        len += 9;                   /* for ' RESIDENT' */
                    }
                }
                if( exportsGotInternalName ) {
                    len++;                      /* for '=' */
                    len += strlen( exportsInternalName );
                }
                if( exportsGotPrivate ) {
                    len += 8;                   /* for ' PRIVATE' */
                }
                len++;                  /* for null byte */
                str = AllocMem( len );
                strcpy( str, exportsEntryName );
                if( exportsGotOrdinal ) {
                    strcat( str, "." );
                    strcat( str, exportsOrdinal );
                }
                if( exportsGotInternalName ) {
                    strcat( str, "=" );
                    strcat( str, exportsInternalName );
                }
                if( exportsGotPrivate ) {
                    strcat( str, " PRIVATE" );
                }
                if( exportsGotResident && exportsGotOrdinal ) {
                    strcat( str, " RESIDENT" );
                }
                add_string( &info->exports, str );
                FreeMem( str );
                FreeMem( exportsEntryName );
                if( exportsGotOrdinal ) {
                    FreeMem( exportsOrdinal );
                }
                if( exportsGotInternalName ) {
                    FreeMem( exportsInternalName );
                }
                break;
              case STATE_STACKSIZE:
                state = STATE_CLEAR;
                len = strlen( stackReserve );
                if( stackGotCommit ) {
                    len++;                      /* for ',' */
                    len += strlen( stackCommit );
                }
                len++;                  /* for null byte */
                str = AllocMem( len );
                strcpy( str, stackReserve );
                if( stackGotCommit ) {
                    strcat( str, "," );
                    strcat( str, stackCommit );
                }
                info->stacksize = DupStrMem( str );
                FreeMem( stackReserve );
                if( stackGotCommit ) {
                    FreeMem( stackCommit );
                }
                break;
              case STATE_HEAPSIZE:
                state = STATE_CLEAR;
                len = strlen( heapReserve );
                if( heapGotCommit ) {
                    len++;                      /* for ',' */
                    len += strlen( heapCommit );
                }
                len++;                  /* for null byte */
                str = AllocMem( len );
                strcpy( str, heapReserve );
                if( heapGotCommit ) {
                    strcat( str, "," );
                    strcat( str, heapCommit );
                }
                info->heapsize = DupStrMem( str );
                FreeMem( heapReserve );
                if( heapGotCommit ) {
                    FreeMem( heapCommit );
                }
                break;
              case STATE_VERSION:
                state = STATE_CLEAR;
                len = strlen( versionMajor );

⌨️ 快捷键说明

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