示例#1
0
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();
}