tokenInfo* getNextToken(FILE *fp) { int state=0,currBuffPos=-1; char cur=0; char buff[MAX_LENGTH]; while(true) { cur = NextCharacter(fp); if(cur==26) { return InitializeToken("$1",TK_DOLLAR); } currBuffPos++; buff[currBuffPos]=cur; switch(state) { case 0: switch(cur) { case '\n': lineNo++; case '\t': case '\r': case ' ': currBuffPos=-1; break; case '<': state=1; break; case '>': state=5; break; case '=': state = 8; break; case '!': state=10; break; case '&': state=12; break; case '@': state=15; break; case '#': state=18; break; case '_': state=20; break; case ']': return InitializeToken("]",TK_SQR); case '[': return InitializeToken("[",TK_SQL); case '/': return InitializeToken("/",TK_DIV); case '-': return InitializeToken("-",TK_MINUS); case '*': return InitializeToken("*",TK_MUL); case '(': return InitializeToken("(",TK_OP); case ')': return InitializeToken(")",TK_CL); case '.': return InitializeToken(".",TK_DOT); case ',': return InitializeToken(",",TK_COMMA); case ':': return InitializeToken(":",TK_COLON); case '+': return InitializeToken("+",TK_PLUS); case ';': return InitializeToken(";",TK_SEM); case '~': return InitializeToken("~",TK_NOT); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': state=23; break; case 'b': case 'c': case 'd': state=26; break; case 'a': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': state=29; break; case '%': state=42; break; default: buff[currBuffPos+1]='\0'; sprintf(errormsg, "ERROR_2: Unknown Symbol <%s> at line number %llu", buff, lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_ERROR); } break; case 1: switch(cur) { case '-': state=2; break; case '=': return InitializeToken("<=",TK_LE); default: bufferPos--; return InitializeToken("<",TK_LT); } break; case 2: if(cur=='-')state=3; else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '-' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_ASSIGNOP); } break; case 3: if(cur=='-')return InitializeToken("<---",TK_ASSIGNOP); else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '-' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_ASSIGNOP); } break; case 5: if(cur=='=')return InitializeToken(">=",TK_GE); //else return InitializeToken("ERROR: = expected",TK_ERROR); else { bufferPos--; return InitializeToken(">",TK_GT); } break; case 8: if(cur=='=')return InitializeToken("==",TK_EQ); else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '=' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_EQ); } break; case 10: if(cur=='=')return InitializeToken("!=",TK_NE); else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '=' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_NE); } break; case 12: if(cur=='&')state=13; else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '&' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_AND); } break; case 13: if(cur=='&')return InitializeToken("&&&",TK_AND); else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '&' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_AND); } break; case 15: if(cur=='@')state=16; else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '@' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_OR); } break; case 16: if(cur=='@')return InitializeToken("@@@",TK_OR); else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected '@' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_OR); } case 18: switch(cur) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': state=19; break; default: bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s> ,a-z expected at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_RECORDID); break; } case 19: if(cur<'a'||cur>'z'){ bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_RECORDID); } break; case 20: if((cur>='a'&&cur<='z')||(cur>='A'&&cur<='Z')) state=21; else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected alphabet at line %llu",buff, lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_FUNID); } break; case 21: if((cur>='a'&&cur<='z')||(cur>='A'&&cur<='Z')); else if(cur=='0'||cur=='1'||cur=='2'||cur=='3'||cur=='4'||cur=='5'||cur=='6'||cur=='7'||cur=='8'||cur=='9') state=22; else { bufferPos--; buff[currBuffPos]='\0'; if(strcmp(buff,"_main")==0) return InitializeToken(buff,TK_MAIN); return InitializeToken(buff,TK_FUNID); } break; case 22: if(cur=='0'||cur=='1'||cur=='2'||cur=='3'||cur=='4'||cur=='5'||cur=='6'||cur=='7'||cur=='8'||cur=='9'); else { bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_FUNID); } break; case 23: if(cur=='0'||cur=='1'||cur=='2'||cur=='3'||cur=='4'||cur=='5'||cur=='6'||cur=='7'||cur=='8'||cur=='9'); else if(cur=='.') state=24; else { bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_NUM); } break; case 24: if(cur=='0'||cur=='1'||cur=='2'||cur=='3'||cur=='4'||cur=='5'||cur=='6'||cur=='7'||cur=='8'||cur=='9') state=25; else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s>, expected atleast one digit after '.' at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_RNUM); } break; case 25: if(cur=='0'||cur=='1'||cur=='2'||cur=='3'||cur=='4'||cur=='5'||cur=='6'||cur=='7'||cur=='8'||cur=='9') { buff[currBuffPos+1]='\0'; return InitializeToken(buff,TK_RNUM); } else { bufferPos--; buff[currBuffPos]='\0'; sprintf(errormsg,"ERROR_3: Unknown pattern <%s> at line %llu",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_RNUM); } break; case 26: if(cur>='2'&&cur<='7') state=27; else if(cur>='a'&&cur<='z') state=29; else { bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_FIELDID); } break; case 27: if(currBuffPos==20) { while(cur>='b'&&cur<='d')cur = NextCharacter(fp); while(cur>='2'&&cur<='7')cur = NextCharacter(fp); bufferPos--; buff[20]='\0'; sprintf(errormsg,"ERROR_1: identifier: %s at line %llu is longer than the prescribed length of 20 characters",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_ID); } else if(cur>='2'&&cur<='7') state=28; else if(cur>='b'&&cur<='d'); else { bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_ID); } break; case 28: if(currBuffPos==20) { while(cur>='2'&&cur<='7')cur = NextCharacter(fp); bufferPos--; buff[20]='\0'; sprintf(errormsg,"ERROR_1: identifier: %s at line %llu is longer than the prescribed length of 20 characters",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_ID); } else if(cur>='2'&&cur<='7'); else { bufferPos--; buff[currBuffPos]='\0'; return InitializeToken(buff,TK_ID); } break; case 29: if(currBuffPos==20) { while(cur>='a'&&cur<='z')cur = NextCharacter(fp); bufferPos--; buff[20]='\0'; sprintf(errormsg,"ERROR_1: identifier: %s at line %llu is longer than the prescribed length of 20 characters",buff,lineNo); return InitializeErrorToken(errormsg,TK_ERROR,TK_FIELDID); } else if(cur>='a'&&cur<='z'); else { bufferPos--; buff[currBuffPos]='\0'; if(strcmp(buff,"with")==0) return InitializeToken(buff,TK_WITH); else if(strcmp(buff,"parameters")==0) return InitializeToken(buff,TK_PARAMETERS); else if(strcmp(buff,"end")==0) return InitializeToken(buff,TK_END); else if(strcmp(buff,"while")==0) return InitializeToken(buff,TK_WHILE); else if(strcmp(buff,"int")==0) return InitializeToken(buff,TK_INT); else if(strcmp(buff,"real")==0) return InitializeToken(buff,TK_REAL); else if(strcmp(buff,"type")==0) return InitializeToken(buff,TK_TYPE); else if(strcmp(buff,"global")==0) return InitializeToken(buff,TK_GLOBAL); else if(strcmp(buff,"parameter")==0) return InitializeToken(buff,TK_PARAMETER); else if(strcmp(buff,"list")==0) return InitializeToken(buff,TK_LIST); else if(strcmp(buff,"input")==0) return InitializeToken(buff,TK_INPUT); else if(strcmp(buff,"output")==0) return InitializeToken(buff,TK_OUTPUT); else if(strcmp(buff,"endwhile")==0) return InitializeToken(buff,TK_ENDWHILE); else if(strcmp(buff,"if")==0) return InitializeToken(buff,TK_IF); else if(strcmp(buff,"endif")==0) return InitializeToken(buff,TK_ENDIF); else if(strcmp(buff,"then")==0) return InitializeToken(buff,TK_THEN); else if(strcmp(buff,"read")==0) return InitializeToken(buff,TK_READ); else if(strcmp(buff,"write")==0) return InitializeToken(buff,TK_WRITE); else if(strcmp(buff,"return")==0) return InitializeToken(buff,TK_RETURN); else if(strcmp(buff,"record")==0) return InitializeToken(buff,TK_RECORD); else if(strcmp(buff,"endrecord")==0) return InitializeToken(buff,TK_ENDRECORD); else if(strcmp(buff,"call")==0) return InitializeToken(buff,TK_CALL); else if(strcmp(buff,"else")==0) return InitializeToken(buff,TK_ELSE); else return InitializeToken(buff,TK_FIELDID); } break; case 42: currBuffPos=-1; if(cur=='\n') { lineNo++; state=0; } break; default: printf("WRONG STATE\n"); ; } } }
int main(int argc, char **argv) { int i, rc; #if defined(_WIN32) && defined(_DEBUG) atexit((void(*)(void))_CrtDumpMemoryLeaks); #endif if (argc < 2) return Usage(); if (strcmp(argv[1], "--get-pin-status") == 0) { rc = GetPinStatus(); printf("get-pin-status returns: 0x%4x\n", rc); return 0; } if (strcmp(argv[1], "--save-files") == 0) { DumpAllFiles(argc >= 3 ? argv[2] : 0); return 0; } if (argc < 3) return Usage(); if (strcmp(argv[1], "--restore-files") == 0) { int rc = SC_Open(argv[2], 0); if (rc < 0) return rc; for (i = 3; i < argc; i++) { const char *name = argv[i]; int dataLen, off; uint8 *pData; uint8 afid[2]; uint16 fid; if (strlen(name) != 8 || strcmp(name + 4, ".asn") || Hex2Bin(name, 4, afid)) { printf("filename '%s' must be 'abcd.asn' where abcd is a valid hex number\n", name); continue; } fid = afid[0] << 8 | afid[1]; if (fid == 0x2f02) { printf("filename '%s' skipped, EF_DevAut is readonly\n", name); continue; } ReadFromFile(name, pData, dataLen); if (pData == NULL) { printf("cant read file '%s'\n", name); continue; } if (dataLen == 0) { free(pData); printf("file '%s' empty\n", name); continue; } rc = 0; for (off = 0; off < dataLen;) { int len = dataLen - off; if (len > MAX_OUT_IN - 6) len = MAX_OUT_IN - 6; rc = SC_WriteFile(fid, off, pData + off, len); if (rc < 0) break; off += len; } free(pData); if (rc < 0) { printf("write error %d file '%s'\n", rc, name); continue; } printf("file '%s' successfully restored\n", name); } SC_Close(); return 0; } if (strcmp(argv[1], "--init-token") == 0) { int len; uint8* buf; switch (argc) { default: return Usage(); case 3: rc = InitializeToken(argv[2], NULL, 0, NULL); break; case 4: rc = InitializeToken(argv[2], argv[3], 0, NULL); break; case 5: ReadFromFile(argv[4], buf, len); if (buf == NULL) { printf("file '%s' not found\n", argv[4]); return ERR_INVALID; } if (len < 32 || (len & 31)) { free(buf); printf("file length of '%s' must be a positive multiple of 32\n", argv[4]); return ERR_INVALID; } rc = InitializeToken(argv[2], argv[3], len / 32, buf); free(buf); break; } printf("init-token returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--unlock-pin") == 0) { if (!(3 <= argc && argc <= 3)) return Usage(); rc = UnlockPin(argv[2]); printf("unlock-pin returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--set-pin") == 0) { if (!(3 <= argc && argc <= 4)) return Usage(); rc = SetPin(argv[2], argc == 3 ? NULL : argv[3]); printf("set-pin returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--change-pin") == 0) { if (!(4 <= argc && argc <= 4)) return Usage(); rc = ChangePin(argv[2], argv[3]); printf("change-pin returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--change-so-pin") == 0) { if (!(4 <= argc && argc <= 4)) return Usage(); rc = ChangeSoPin(argv[2], argv[3]); printf("change-pin returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--wrap-key") == 0) { if (!(5 <= argc && argc <= 5)) return Usage(); rc = WrapKey(argv[2], atoi(argv[3]), argv[4]); printf("wrap-key returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } if (strcmp(argv[1], "--unwrap-key") == 0) { if (!(5 <= argc && argc <= 5)) return Usage(); rc = UnwrapKey(argv[2], atoi(argv[3]), argv[4]); printf("unwrap-key returns: 0x%4x\n", rc); return rc == 0x9000 ? 0 : rc; } return Usage(); }