Beispiel #1
0
static LONToken *lex(LONLexState *state)
{
	LONToken *t = TOK_NEW();
	int c;

	state->type = LEX_DEFAULT;

	for (;;) {
		if (t->type != TOK_NONE) {
			t->line = state->line;
			t->col = state->col; // TODO: Fix this. It's broken.
			return t;
		}

		// XXX: Token position may not be saved properly.
		c = LONInputPeek(state->input);

		if (c == '\n') {
			state->line++;
			LONInputRead(state->input); // TODO: improve
		}

		if (c == EOF) {
			t->type = TOK_EOF;
			return t;
		}

		// Macro soup!
		switch (state->type) {
		case LEX_DEFAULT:
			if (isalpha(c)) {
				state->type = LEX_NAME;
			} else if (isdigit(c)) {
				state->type = LEX_NUMBER;
			} else if (c == '"') {
				state->type = LEX_STRING;
				LEX_EAT_ONE()
			} else if (c == '-') {
				if (LONInputPeek(state->input) == '-') {
					state->type = LEX_SLCOMMENT;
				}
			}
			LEX_SINGLE('{', TOK_LBRACE)
			LEX_SINGLE('}', TOK_RBRACE)
			LEX_SINGLE('[', TOK_LBRACKET)
			LEX_SINGLE(']', TOK_RBRACKET)
			LEX_SINGLE(',', TOK_COMMA)
			LEX_SINGLE(';', TOK_SEMICOLON)
			LEX_SINGLE('=', TOK_EQ)
			else {
				LONInputRead(state->input);
			}
			break;
		case LEX_NAME:
			if (isalpha(c)) {
				LEX_EAT_ONE()
			} else {
				if (strcmp(BUF_STR(t->buf), "true") == 0) {
Beispiel #2
0
R_API char *r_anal_esil_to_sdb(char *str) {
// tokenize string 
#define TOK_NEW(x,y) (x<<24|(y+1))
#define TOK_OP(x) (x>>24)
#define TOK_ARG(x) str+(x&0xffffff)
	char *p = str;
	int tok[4096], i = 0, t = 0;
	tok[0] = 0;
	for (i=0; p[i]; i++) {
		char ch = p[i];
		switch (ch) {
		case '[': // TODO
		case ']': // TODO
		case '!':
		case ',':
		case ';':
		case '(':
		case ')':
		case '<':
		case '>':
		case '*':
		case '+':
		case '-':
		case '/':
		case '=':
			p[i] = 0;
			tok[t++] = TOK_NEW(ch, i);
			break;
		}
	}
// build sdb
	{
		char *a = str;
		char *b;
		int idx = 0;
		int top = 0;
		int level = 0;
		int stack[32];
		int store = 0;
		stack[0] = 0;
		for (i=0; i<t; i++) {
			char op = TOK_OP(tok[i]);
			b = TOK_ARG(tok[i]);
			switch (op) {
			case ',':
			case ';':
				idx = 0;
				stack[0] = 0;
				level = 0;
				a = TOK_ARG (tok[i]);
				continue;
			case '=':
				if (TOK_OP (tok[i+1])=='=') {
					printf ("TODO: cmp\n");
					return NULL;
				}
				break;
			case '(':
				level++;
				if (level>=(sizeof(stack)/sizeof(*stack))) {
					printf ("ERROR: too many open parenthesis\n");
					return NULL;
				}
				stack[level] = i;
				a = TOK_ARG(tok[i]);
				continue;
			case ')':
				level--;
				if (level<0) {
					printf ("ERROR: too many closing parenthesis\n");
					return NULL;
				}
				top = stack[level];
				continue;
			default:
				if ( TOK_OP(tok[i+1]) == '=') {
			//		printf ("TODO: %c= syntax sugar not yet supported\n", op);
					//printf ("[]%d=%s,%s,&%d\n", idx, "str", a, idx);
a="&0";
					store = 0;
					continue;
				}
			}
			if (store) {
				if (op=='=') {
eprintf ("SET\n");
					op='[';
				}
				store = 0;
			}
			//if (!a || (!*a) || *a==' ')
			//if (*a==' ') a ="8"; // for mem ref only
			if (*b) printf ("[]%d=%s,%s,%s\n", idx, chstr (op), a, b);
			else   printf ("[]%d=%s,%s,&%d\n", idx, chstr (op), a, idx+1);
			a = b;
			stack[level] = top = idx;
			if (i>0) {
				int sl = stack[level];
				if (sl>0) 
					printf ("[2]%d=&%d\n", sl-1, idx);
				stack[level] = top = idx;
			}
			idx++;
		}
	}
	return NULL;
}