00001
00002
00003
00004
00005
00006
00007
00008
00009
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
00026
00027
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
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:
00093
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:
00104 relpos=TMM_GetSegmentAddr(tmm,process,SEG_HEAP);
00105
00106 if(relpos<0)
00107 { return(-1); }
00108
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:
00116 relpos=TMM_GetSegmentAddr(tmm,process,SEG_CODE);
00117
00118 if(relpos<0)
00119 { return(-1); }
00120
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:
00128 relpos=TMM_GetSegmentAddr(tmm,process,SEG_STACK);
00129 if(relpos<0)
00130 { return(-1); }
00131
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:
00139 relpos=TMM_GetSegmentAddr(tmm,process,SEG_DATA);
00140 if(relpos<0)
00141 { return(-1); }
00142
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
00165 tarray=LineToTypes(strIn,Arguments);
00166
00167
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 {
00187 FreeType(tarray);
00188 return(ERR_INVALIDINPUT);
00189 }
00190
00191 switch(tarray[1].subtype)
00192 {
00193
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
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
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
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
00348 if(n!=2) return(ERR_INVALIDINPUT);
00349 else return(TMM_PrintProcessTable(tm,process));
00350
00351 case COMMAND_PRINTPROCESSMEMORY:
00352 FreeType(tarray);
00353
00354 if(n!=2) return(ERR_INVALIDINPUT);
00355 else return(TMM_PrintProcessMemory(tm,process));
00356
00357 case COMMAND_STORE:
00358
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
00416 FreeType(tarray);
00417 if(n!=2) return(ERR_INVALIDINPUT);
00418 else return(TMM_TerminateProcess(tm,process));
00419
00420 default:
00421
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