Main Page   Modules   Alphabetical List   Data Structures   File List   Data Fields  

ToyParseCmd.c

00001 /***************************************************************************
00002                           ToyParseCmd.c  -  Code to parse Toy Memory
00003     Manager command files.
00004                              -------------------
00005     begin                : Sat Jan 25 2003
00006     copyright            : (C) 2003 by Tyler Montbriand
00007     student #            : 200200370
00008     class                : CS330
00009     email                : monttyle@heavyspace.ca
00010 ***************************************************************************/
00011 
00012 #include <stdio.h>
00013 #include <string.h>
00014 
00015 #include "ToyMem.h"
00016 #include "ToyMemPage.h"
00017 #include "ToySegment.h"
00018 #include "ToyMem_Internal.h"
00019 #include "toyparse.h"
00020 #include "ToyMemType.h"
00021 #include "ToyLoad.h"
00022 #include "ToyParseCmd.h"
00023 #include "ToyMemPage.h"
00024 
00025 /*  These lists of strings are carefully crafted to
00026     match their enumerated types.  So searching the
00027     tree of strings will return the proper value. */
00028 
00030 const char *ArgType_Process[]={"P%u",NULL};
00032 const char *ArgType_String[]={"\"%s",NULL};
00034 const char *ArgType_Address[]={"@%u","@H%u","@D%u","@S%u","@C%u",NULL};
00036 const char *ArgType_Integer[]={"#%u",NULL};
00038 const char *ArgType_Command[]={ "LoadFile"              ,
00039                                 "PrintProcessTable"     ,
00040                                 "PrintProcessMemory"    ,
00041                                 "STORE"                 ,
00042                                 "TerminateProcess"      ,
00043                                 "PrintAllMemory"        ,
00044                                 "END"                   ,
00045                                 "AllocateHeap"          ,
00046                                 "ReallocateHeap"        ,
00047                                 "FreeHeap"              ,
00048                                 "PrintProcessHeap"      ,
00049                                 "EnablePaging"          ,
00050                                 "PrintInvertedPageTable",
00051                                 "PrintPageTable"        ,
00052                                 "WatchPaging"           ,
00053                                 "PrintFrames"           ,
00054                                 "PrintPages"            ,
00055                                 NULL                                  };
00057 const char **Arguments[]={  ArgType_Process,ArgType_Command,ArgType_Address,
00058                             ArgType_Integer,ArgType_String,NULL               };
00059 
00060 
00061 
00068 int ReadFromType(ToyMM *tmm, int process, ArgType_e type, const char *str, void *buffer)
00069 {
00070   int subtype=DetermineSubType(type,str,Arguments);
00071 
00072   if(buffer==NULL)  return(-1);
00073 
00074   switch(type)
00075   {
00076   case TYPE_STRING:
00077     if(strlen(str+1)>MAX_STRLEN)  return -1;
00078     strcpy((char *)buffer,str+1);
00079     return(0);
00080 
00081     /* All the same kind of integer - unsigned 32 bit */
00082   case TYPE_PROCESS:
00083   case TYPE_INTEGER:
00084     sscanf(str+1,"%d",(int *)buffer);
00085     return(0);
00086 
00087   case TYPE_ADDRESS:
00088   switch(subtype)
00089   {
00090   int relpos;
00091 
00092   case ADDRESS_ABSOLUTE:  /* Absolute address - @130*/
00093     /* sscanf should read one value */
00094     if(sscanf(str+1,"%d",(int *)buffer)!=1)
00095     {
00096       return(-1);
00097     }
00098     else
00099     {
00100       return(0);
00101     }
00102 
00103   case ADDRESS_HEAP:      /* Address relative to heap - @H30 */
00104     relpos=TMM_GetSegmentAddr(tmm,process,SEG_HEAP);
00105 
00106     if(relpos<0)
00107     {   return(-1); }
00108     /* sscanf should read one value */
00109     else if(sscanf(str+2,"%u",(unsigned int *)buffer)!=1)
00110     {   return(-1);  }
00111 
00112     (*(unsigned int *)buffer)+=relpos;
00113     return(0);
00114 
00115   case ADDRESS_CODE:       /* Address relative to code - @C3 */
00116     relpos=TMM_GetSegmentAddr(tmm,process,SEG_CODE);
00117 
00118     if(relpos<0)
00119     {   return(-1);    }
00120     /* sscanf should read one value */
00121     else if(sscanf(str+2,"%u",(unsigned int *)buffer)!=1)
00122     {   return(-1);    }
00123 
00124     (*(unsigned int *)buffer)+=relpos;
00125     return(0);
00126 
00127   case ADDRESS_STACK:     /* Address relative to stack - @S4 */
00128     relpos=TMM_GetSegmentAddr(tmm,process,SEG_STACK);
00129     if(relpos<0)
00130     {   return(-1);   }
00131     /* sscanf should read one value */
00132     else if(sscanf(str+2,"%u",(unsigned int *)buffer)!=1)
00133     {   return(-1);   }
00134 
00135     (*(unsigned int *)buffer)+=relpos;
00136     return(0);
00137 
00138   case ADDRESS_DATA:     /* Address relative to data - @S5 */
00139     relpos=TMM_GetSegmentAddr(tmm,process,SEG_DATA);
00140     if(relpos<0)
00141     {   return(-1);   }
00142     /* sscanf should read one value */
00143     else if(sscanf(str+2,"%u",(unsigned int *)buffer)!=1)
00144     {   return(-1);   }
00145 
00146     (*(unsigned int *)buffer)+=relpos;
00147     return(0);
00148 
00149   default:
00150     return(-1);
00151   }
00152 
00153   default:
00154     return(-1);
00155   }
00156 }
00157 
00159 ErrMessage_t TMM_ParseLine(const char *strIn, ToyMM *tm, int line)
00160 {
00161   int process=-1,n=-1;
00162   TokenType *tarray=NULL;
00163 
00164   /*  Generate array of types from line of text */
00165   tarray=LineToTypes(strIn,Arguments);
00166 
00167   /*  Print the input, and Count # of arguments  */
00168   if(tarray[0].token!=NULL)
00169   {
00170     printf(LINE_NUMBER_FORMAT" ",line);    
00171     printf("%s",tarray[0].token);
00172     for(n=1; tarray[n].token!=NULL; n++) printf(" %s",tarray[n].token);
00173   }
00174   if(n>0) printf("\n");
00175 
00176 
00177   if(CheckLineSyntax(tarray,TYPE_PROCESS,-1,TYPE_COMMAND,-1,TYPE_ENDOPEN)<0)
00178   {
00179     FreeType(tarray);
00180     return(ERR_INVALIDINPUT);
00181   }
00182 
00183   ReadFromType(tm,-1,TYPE_PROCESS,tarray[0].token,&process);
00184 
00185   if((process>=MAX_PROCESSES)||(process<0))
00186   {   /*  Can't command nonexistent processes */
00187     FreeType(tarray);
00188     return(ERR_INVALIDINPUT);
00189   }
00190 
00191   switch(tarray[1].subtype)
00192   {
00193     /*  Scratchpad values */
00194     char string[100];
00195     int addr;
00196     int val;
00197 
00198     case COMMAND_PRINTPAGES:
00199       FreeType(tarray);
00200       return(TMM_PrintPages(tm,process));
00201 
00202     case COMMAND_PRINTFRAMES:
00203       FreeType(tarray);
00204       return(TMM_PrintFrames(tm));
00205 
00206     case COMMAND_WATCHPAGING:
00207       if(CheckLineSyntax(tarray+2,TYPE_INTEGER,-1,TYPE_ENDCLOSE)<0)
00208       {
00209         FreeType(tarray);
00210         return(ERR_INVALIDINPUT);
00211       }
00212       else if(ReadFromType(tm,process,TYPE_INTEGER,tarray[2].token,&val)<0)
00213       {
00214         FreeType(tarray);
00215         return(ERR_UNKNOWN);
00216       }
00217       else
00218       {
00219         FreeType(tarray);
00220         return(TMM_WatchPaging(tm,process,val));
00221       }
00222     
00223 
00224     case COMMAND_ENABLEPAGING:
00225       if(CheckLineSyntax(tarray+2,TYPE_INTEGER,-1,TYPE_ENDCLOSE)<0)
00226       {
00227         FreeType(tarray);
00228         return(ERR_INVALIDINPUT);
00229       }
00230       else if(ReadFromType(tm,process,TYPE_INTEGER,tarray[2].token,&val)<0)
00231       {
00232         FreeType(tarray);
00233         return(ERR_INVALIDINPUT);        
00234       }      
00235       FreeType(tarray);
00236       return(TMM_EnablePaging(tm,process,val));      
00237 
00238     case COMMAND_PRINTINVERTEDPAGETABLE:
00239       FreeType(tarray);
00240       return(TMM_PrintInvertedPageTable(tm,process));
00241 
00242     case COMMAND_PRINTPAGETABLE:
00243       FreeType(tarray);
00244       return(TMM_PrintPageTable(tm,process));
00245 
00246     case COMMAND_ALLOCATE:
00247       if(CheckLineSyntax(tarray+2,TYPE_INTEGER,-1,TYPE_ENDCLOSE)<0)
00248       {
00249         FreeType(tarray);
00250         return(ERR_INVALIDINPUT);
00251       }
00252 
00253       val=-1;
00254 
00255       if(ReadFromType(tm,process,TYPE_INTEGER,tarray[2].token,&val)<0)
00256       {
00257         FreeType(tarray);
00258         return(ERR_INVALIDINPUT);
00259       }
00260 
00261       {
00262         ErrMessage_t retval=TMM_AllocateHeap(tm,process,val);
00263         return(retval);
00264       }
00265 
00266     case COMMAND_REALLOCATE:
00267       if(CheckLineSyntax(tarray+2,TYPE_ADDRESS,-1,TYPE_INTEGER,-1,TYPE_ENDCLOSE)<0)
00268       {
00269         FreeType(tarray);
00270         return(ERR_INVALIDINPUT);
00271       }
00272 
00273       ReadFromType(tm,process,TYPE_ADDRESS,tarray[2].token,&addr);
00274       ReadFromType(tm,process,TYPE_INTEGER,tarray[3].token,&val);
00275       FreeType(tarray);
00276       return(TMM_ReallocateHeap(tm,process,addr,val));
00277 
00278     case COMMAND_FREE:
00279       if(CheckLineSyntax(tarray+2,TYPE_ADDRESS,-1,TYPE_ENDCLOSE)<0)
00280       {
00281         FreeType(tarray);
00282         return(ERR_INVALIDINPUT);
00283       }
00284       ReadFromType(tm,process,TYPE_ADDRESS,tarray[2].token,&addr);
00285       FreeType(tarray);
00286       return(TMM_FreeHeap(tm,process,addr));
00287       
00288     case COMMAND_PRINTHEAP:
00289       if(tarray[2].token!=NULL)
00290       {
00291         FreeType(tarray);
00292         return(ERR_INVALIDINPUT);
00293       }
00294       else
00295       {
00296         FreeType(tarray);
00297         return(TMM_PrintHeap(tm,process));
00298       }
00299 
00300     case COMMAND_END:
00301       if(tarray[2].token!=NULL)
00302       {
00303         FreeType(tarray);
00304         return(ERR_INVALIDINPUT);
00305       }
00306       else
00307       {
00308         FreeType(tarray);
00309         return(ERR_PARSEEND);
00310       }
00311       
00312     case COMMAND_PRINTALLMEMORY:
00313       FreeType(tarray);
00314       /*  Should be only 2 arguments - process #, and command */
00315       if(n!=2)            return(ERR_INVALIDINPUT);
00316       else if(process!=0) return(ERR_NOPRIVILEGE);
00317       else                return(TMM_PrintAllMemory(tm));
00318 
00319     case COMMAND_LOADFILE:
00320       if(CheckLineSyntax(tarray+2,TYPE_ADDRESS,-1,TYPE_STRING,-1,TYPE_ENDCLOSE)<0)
00321       {
00322         FreeType(tarray);
00323         return(ERR_INVALIDINPUT);
00324       }
00325 
00326       /*  Read data from these types  */
00327       else if(ReadFromType(tm,process,TYPE_ADDRESS,tarray[2].token,&addr))
00328       {
00329         FreeType(tarray);
00330         return(ERR_INVALIDINPUT);
00331       }
00332       else if(ReadFromType(tm,process,TYPE_STRING,tarray[3].token,string)<0)
00333       {
00334         FreeType(tarray);
00335         return(ERR_INVALIDINPUT);
00336       }
00337 
00338       FreeType(tarray);
00339 
00340       /*  Out-of-range means a syntax error, not a memory one for some reason.  */
00341       if(addr>=tm->memSize) return(ERR_INVALIDINPUT);
00342       else                  return(TMM_Load(tm,process,string,addr));
00343 
00344 
00345     case COMMAND_PRINTPROCESSTABLE:
00346       FreeType(tarray);
00347       /*  Exactly 2 parameters - process ID, and the  command */
00348       if(n!=2)  return(ERR_INVALIDINPUT);
00349       else      return(TMM_PrintProcessTable(tm,process));
00350 
00351     case COMMAND_PRINTPROCESSMEMORY:
00352       FreeType(tarray);
00353       /*  Exactly 2 paramegers - process ID, and command  */
00354       if(n!=2)  return(ERR_INVALIDINPUT);
00355       else      return(TMM_PrintProcessMemory(tm,process));
00356 
00357     case COMMAND_STORE:
00358       /*  Exactly 4 parameters - process ID, command, address, and data */
00359       if(CheckLineSyntax(tarray+2,TYPE_ADDRESS,-1,TYPE_INTEGER,-1,TYPE_ENDCLOSE)==0)
00360       {
00361          if(ReadFromType(tm,process,TYPE_ADDRESS,tarray[2].token,&addr)<0)
00362          {
00363            FreeType(tarray);
00364            return(ERR_INVALIDINPUT);
00365          }
00366          else if(ReadFromType(tm,process,TYPE_INTEGER,tarray[3].token,&val)<0)
00367          {
00368            FreeType(tarray);
00369            return(ERR_INVALIDINPUT);
00370          }
00371          FreeType(tarray);
00372 
00373          if(addr>=tm->memSize)
00374          {
00375            FreeType(tarray);
00376            return(ERR_INVALIDINPUT);
00377          }
00378          else
00379          {
00380            return(TMM_StoreInteger(tm,process,addr,val));
00381          }
00382       }
00383       else if(CheckLineSyntax(tarray+2,TYPE_ADDRESS,-1,TYPE_STRING,-1,TYPE_ENDCLOSE)==0)
00384       {
00385          if(ReadFromType(tm,process,TYPE_ADDRESS,tarray[2].token,&addr)<0)
00386          {
00387            FreeType(tarray);
00388            return(ERR_INVALIDINPUT);
00389          }
00390          else if(ReadFromType(tm,process,TYPE_STRING,tarray[3].token,string)<0)
00391          {
00392            FreeType(tarray);
00393            return(ERR_INVALIDINPUT);
00394          }
00395 
00396          FreeType(tarray);
00397 
00398          if(addr>=tm->memSize)
00399          {
00400            FreeType(tarray);
00401            return(ERR_INVALIDINPUT);
00402          }
00403          else
00404          {
00405            return(TMM_StoreString(tm,process,addr,string));
00406          }
00407       }
00408       else
00409       {
00410         FreeType(tarray);
00411         return(ERR_INVALIDINPUT);
00412       }
00413 
00414     case COMMAND_TERMINATEPROCESS:
00415       /*  Must be precisely 2 parameters - process ID and command */
00416       FreeType(tarray);
00417       if(n!=2)  return(ERR_INVALIDINPUT);
00418       else      return(TMM_TerminateProcess(tm,process));
00419 
00420     default:
00421       /*  This should not happen under any circumstances. */
00422       printf("Email me @ monttyle@heavyspace.ca and tell me what you did please!\n");
00423       FreeType(tarray);
00424       return(ERR_UNKNOWN);
00425   }
00426 }
00427 

Generated on Fri Apr 4 14:29:07 2003 for ToyMem by doxygen1.3-rc3