root/asparse2.hpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. asparse

// $Log: asparse2.hpp,v $
// Revision 1.2  2011/04/14 15:13:09  doug
// get ready for release to wiki and server
//
//

// ---------------------------------------------------
// asparse.hpp  21-Feb-11   Running on Mac OS X 10.6.6
// S/n 2011-1042-654321  Written by Douglas W. Goodall
// Copyright(c)2011 Douglas W. Goodall, United States.
// ---------------------------------------------------
// This file is part of Vintage Modern Assembler Plus Tools.
//
// VMAPT is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// VMAPT is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with VMAPT.  If not, see <http://www.gnu.org/licenses/>.
//

static char szAsparseHpp[] = "$Id: asparse2.hpp,v 1.2 2011/04/14 15:13:09 doug Exp $";

void asparse(void)
{
        sprintf(g_szAsparseHpp,"%s %s %s",__FILE__,__TIME__,__DATE__);

        fprintf(g_flog,"\nsrc: %s\n",g_szBuffer);

        memset(g_szLabel,0,sizeof(g_szLabel));
        memset(g_szOpcode,0,sizeof(g_szOpcode));
        memset(g_szParms,0,sizeof(g_szParms));
        memset(g_szComments,0,sizeof(g_szComments));
        int pindex = 0;
        g_iState = 0;
        g_iBytesIndex = 0;
        while(pindex < strlen(g_szBuffer)) {            
                g_cToken = g_szBuffer[pindex++];
                switch(g_iState) {
                        case 0: // looking for label start
                                if(g_bDebug) {
                                        printf("0");
                                }
                                if(' ' == g_cToken) {
                                        g_iState = 2;   // looking for g_szOpcode start
                                        break;
                                }       
                                if(ASCII_TAB == g_cToken) {
                                        g_iState = 2;   // looking for g_szOpcode start
                                        break;
                                }       
                                if(';' == g_cToken) {
                                        g_bComments = 1;
                                        g_iState = 7;                           
                                        g_szComments[strlen(g_szComments)] = g_cToken;
                                        break;
                                }
                                g_iState = 1;
                                g_szLabel[strlen(g_szLabel)] = g_cToken;
                                g_bLabel = 1;
                                break;
                        case 1: // process label character
                                if(g_bDebug) {
                                        printf("1");
                                }
                                if(':' == g_cToken) {
                                        g_iState = 2;   // wait for g_szOpcode
                                        break;
                                }
                                if(' ' == g_cToken) {
                                        g_iState = 2;   // wait for g_szOpcode
                                        break;
                                }
                                if(ASCII_TAB == g_cToken) {
                                        g_iState = 2;   // wait for g_szOpcode
                                                        break;
                                }
                                g_szLabel[strlen(g_szLabel)] = g_cToken;                                
                                g_bLabel = 1;
                                break;
                        case 2: // wait for g_szOpcode
                                if(g_bDebug) {
                                        printf("2");
                                }
                                if(';' == g_cToken) {
                                        g_iState = 6;   // wait for g_szOpcode
                                        break;
                                        g_szComments[strlen(g_szComments)] = g_cToken;
                                        
                                }
                                if(' ' == g_cToken) {
                                        break;
                                }
                                if(ASCII_TAB == g_cToken) {
                                        break;
                                }       
                                g_szOpcode[strlen(g_szOpcode)] = g_cToken;
                                g_bOpcode = 1;
                                g_iState = 3;
                                break;
                        
                        case 3: // process g_szOpcode
                                if(g_bDebug) {
                                        printf("3");
                                }
                                if(' ' == g_cToken) {
                                        g_iState = 4;   // waiting for parm
                                        break;
                                }
                                if(ASCII_TAB == g_cToken) {
                                        g_iState = 4;   // waiting for                  parm
                                        break;
                                }                       
                                g_szOpcode[strlen(g_szOpcode)] = g_cToken;
                                g_bOpcode = 1;
                                break;
                        case 4: // wait for parm
                                if(g_bDebug) {
                                        printf("4");
                                }
                                if(' ' == g_cToken) {
                                        break;          
                                }
                                if(ASCII_TAB == g_cToken) {
                                        break;
                                }                               
                                g_iState = 5;   // process parm
                                g_szParms[strlen(g_szParms)] = g_cToken;
                                g_bParms = 1;
                                break;
                        case 5: // process parm
                                if(g_bDebug) {
                                        printf("5");
                                }
                                if(ASCII_TAB == g_cToken) {
                                        g_iState = 6;
                                        break;
                                }

// tabs are required to separate parms from comments
//                              if(ASCII_SPACE == g_cToken) {
//                                      g_iState = 6;
//                                      break;
//                              }

                                // added 3/12/2011 dwg - 
                                // handle g_szParms succeeded by semicolon
                                // without intervening spaces
                                if(ASCII_SEMI == g_cToken) {
                                  g_iState = 7;
                                  g_szComments[strlen(g_szComments)] = g_cToken;
                                  g_bComments = 1;
                                  break;
                                }

                                g_szParms[strlen(g_szParms)] = g_cToken;
                                g_bParms = 1;
                                break;
                        case 6: // waiting for remark
                                if(g_bDebug) {
                                        printf("6");
                                }
                                if(' ' == g_cToken) {
                                        break;
                                }
                                
                                if(ASCII_TAB == g_cToken) {
                                        break;
                                }
                                g_iState = 7;
                                g_szComments[strlen(g_szComments)] = g_cToken;
                                g_bComments = 1;
                                break;
                        case 7: // process remark
                                if(g_bDebug) {
                                        printf("7");
                                }
                                if('\n' == g_cToken) {
                                        break;
                                }                                       
                                g_szComments[strlen(g_szComments)] = g_cToken;
                                g_bComments = 1;
                                break;
                };
        };

        fprintf(g_flog,"label[%d] g_szOpcode[%d] g_szParms[%d] comments[%d]\n",
                strlen(g_szLabel),strlen(g_szOpcode),strlen(g_szParms),strlen(g_szComments));
}
        
// eof - asparse.hpp

/* [<][>][^][v][top][bottom][index][help] */