コード例 #1
0
ファイル: MoviesMainForm.cpp プロジェクト: kjk/moriarty-palm
bool MoviesMainForm::handleKeyPress(const EventType& event)
{
    if (showTheatres == displayMode_ || showMovies == displayMode_)
    {
        ExtendedList& list = (showTheatres==displayMode()?theatresList_:moviesList_);
        int option = ExtendedList::optionScrollPagesWithLeftRight;
        if (application().runningOnTreo600())
            option = 0;
        if (list.handleKeyDownEvent(event, option | ExtendedList::optionFireListSelectOnCenter))
            return true;
        if (isAlNum(event.data.keyDown.chr) && 256 > event.data.keyDown.chr)
        {
            if (showMovies == displayMode_)
            {
                Movie m;
                m.title.assign(1, event.data.keyDown.chr);
                int pos = std::lower_bound(movies.begin(), movies.end(), &m, MovieTitleFirstLetterLess()) - movies.begin();
                if (pos == movies.size())
                    --pos;
                moviesList_.setSelection(pos, ExtendedList::redraw);
            }
            else 
                scrollTheatresListToLetter(event.data.keyDown.chr);
            return true;
        }
    }
    return false;
}
コード例 #2
0
ファイル: lex.c プロジェクト: LADSoft/Simple-MSIL-Compiler
void lex(const char *srcfile)
{
	char linebuf[256], buf[128], op2[4], *p, *pBgn;
	FILE *fpSrc = fopen(srcfile, "r");
	if (fpSrc == NULL) 
		printf("file '%s' can't be opened", srcfile);
	while (fgets(linebuf, sizeof(linebuf), fpSrc) != NULL)
	{
		for (p = linebuf; *p != '\0'; )
		{
			if (*p <= ' ')
			{
				p++;
				continue;
			}
			if (p[0] == '/' && p[1] == '/') break;
			pBgn = p;
			if (*p == '"')
			{
				for (p++; *p != '\0' && *p != '"'; p++)
				{
					if (*p == '\\' && strchr("rn\"t", p[1]) != NULL)  // '\r','\n','\"','\t'
					{
						*p = p[1] == 'r' ? '\r' : p[1] == 'n' ? '\n' : p[1] == '"' ? '\"' : '\t';
						strcpy(p + 1, p + 2);
					}
					else if (*p == '\\')
					{
						p++;
					}
				}
				if (*p++ != '"') 
					printf("Expected '\"' <%s>", pBgn);
			}
			else if (isdigit(*p))
			{
				strtoul(p, &p, 10); 
			}
			else if (strncmp(pBgn, "char*", 5) == 0)  	// char*
			{
				p += 5;
			}
			else if (isAlpha(*p))
			{
				for (p++; *p != '\0' && isAlNum(*p); ) 
					p++;
			}
			else
			{
				sprintf(op2, "%c%c ", p[0], p[1]);
				p += strstr(OPERATOR2, op2) != NULL ? 2 : 1;
			}
			sprintf(buf, "%.*s", p - pBgn, pBgn);
			if (nToken == SIZETOKEN)
				printf("Token is to big");
			Token[nToken++] = strdup(buf);
			if (fToken) 
				printf(strchr(";{}", *buf) != NULL ? "%s\n" : "%s ", buf);
		} 
	}
	fclose(fpSrc);
}
コード例 #3
0
ファイル: zs_lex.c プロジェクト: FreeFromItAll/Zombie
static z_token lex_scan(z_lexstate *ls)
{
	if(ls->cur.eof) {
		lex_save(ls);
		return lex_newToken(ls, T_EOF, 0);
	}

	if(isWhite(nc)) {
		while(isWhite(nc)) {
			if(isNewLine(nc)) {
				lex_scanNewLine(ls);
				return lex_newToken(ls, T_NL, tk_generic);
			}
			else
				lex_nextchar(ls);
		}
		return lex_scan(ls);
	}

	/* line comment */
	if(nc == '/') {
		if(nnc == '/') {
			while(!isNewLine(nc))
				lex_nextchar(ls);
			return lex_scan(ls);
		}
	}

	/* multi line comment */
	if(nc == '/') {
		if(nnc == '*') {
			lex_nextchar(ls);
			lex_nextchar(ls);
			for(;;) {
				if(ls->cur.eof) {
					syntaxError(ls, "unterminated comment reached end of file");
					break;
				}
				else if(nc == '*') {
					lex_nextchar(ls);
					if(nc == '/') {
						lex_nextchar(ls);
						return lex_scan(ls);
					}
				}
				else if(isNewLine(nc)) {
					lex_scanNewLine(ls);
				}
				else
					lex_nextchar(ls);
			}
		}
	}

	lex_save(ls);

	/* numerical constants */
	if(isDigit(nc)) {
parse_number:
		while(isDigit(nc))
			lex_nextchar(ls);
		if(nc == '.') {
			lex_nextchar(ls);
			while(isDigit(nc))
				lex_nextchar(ls);
			if(nc == '.')
				syntaxError(ls, "invalid numerical constant");
		}
		return lex_newToken(ls, T_NUMBER, tk_numeric);
	}

	/* identifiers */
	else if(isAlpha(nc)) {
parse_ident:
		while(isAlNum(nc) || nc == '_')
			lex_nextchar(ls);
		
		/* check if it matches a keyword token */
		z_token tk = lex_newToken(ls, T_IDENT, tk_identifier);
		lex_matchKeyword(ls, &tk);

		return tk;
	}

	/* string literals */
	else if(nc == '"' || nc == '\''){
//parse_string:
		char q = nc;
		lex_nextchar(ls);
		while(nc != q) {
			if(ls->cur.eof) {
				syntaxError(ls, "unterminated string literal reached end of file");
				break;
			}
			/* skip escaped chars */
			if(nc == '\\') {
				lex_nextchar(ls);
				continue;
			}
			if(isNewLine(nc)) {
				lex_scanNewLine(ls);
			}
			lex_nextchar(ls);
		}
		lex_nextchar(ls);	// skip the closing cc
		return lex_newToken(ls, T_STRING, tk_string);
	}

	/* other multi char tokens */
	switch(nc)
	{
		case '.':	// may be numeric?
			lex_nextchar(ls);
			if(isDigit(nc))
				goto parse_number;
			return lex_newToken(ls, '.', 0);
		case '_':	// may be ident?
			lex_nextchar(ls);
			if(isAlNum(nc))
				goto parse_ident;
			return lex_newToken(ls, '_', 0);
		case '+':
			lex_nextchar(ls);
			if(nc == '+') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_INC, tk_op);
			}
			else if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_AA, tk_op);
			}
			return lex_newToken(ls, '+', tk_op);
		case '-':
			lex_nextchar(ls);
			if(nc == '-') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_DEC, tk_op);
			}
			else if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_SA, tk_op);
			}
			return lex_newToken(ls, '-', tk_op);
		case '*':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_MA, tk_op);
			}
			return lex_newToken(ls, '*', tk_op);
		case '/':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_DA, tk_op);
			}
			return lex_newToken(ls, '/', tk_op);
		case '>':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_GTE, tk_op);
			}
			return lex_newToken(ls, '>', tk_op);
		case '<':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_LTE, tk_op);
			}
			else if(nc == '>') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_NE, tk_op);
			}
			return lex_newToken(ls, '<', tk_op);
		case '=':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_EQ, tk_op);
			}
			return lex_newToken(ls, '=', tk_op);
		case '&':
			lex_nextchar(ls);
			if(nc == '&') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_AND, tk_op);
			}
			return lex_newToken(ls, '&', tk_op);
		case '|':
			lex_nextchar(ls);
			if(nc == '|') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_OR, tk_op);
			}
			return lex_newToken(ls, '|', tk_op);
		case '^':
			lex_nextchar(ls);
			if(nc == '^') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_XOR, tk_op);
			}
			return lex_newToken(ls, '^', tk_op);
		case '!':
			lex_nextchar(ls);
			return lex_newToken(ls, T_NOT, tk_op);
		case ':':
			lex_nextchar(ls);
			if(nc == '=') {
				lex_nextchar(ls);
				return lex_newToken(ls, T_DE, tk_op);
			}
			return lex_newToken(ls, ':', 0);
	}

	char c = nc;
	lex_nextchar(ls);

	return lex_newToken(ls, c, 0);
}