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; }
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); }
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); }