/* * Take the full line (lf) including the command and split it into a * sub-line (returned) and a completion context (cmplarray). */ static LineInfo * split_line(const char **cmplarray, const LineInfo *lf) { static LineInfo li; const struct cmd *c; char *cmdname; char line[LINESIZE]; char *cp; size_t len; len = lf->cursor - lf->buffer; if (len + 1 > sizeof(line)) return NULL; (void)strlcpy(line, lf->buffer, len + 1); li.cursor = line + len; li.lastchar = line + len; cp = skip_WSP(line); cmdname = get_cmdname(cp); cp += strlen(cmdname); if (cp == li.cursor) { *cmplarray = "c"; li.buffer = cmdname; return &li; } c = lex(cmdname); if (c == NULL) return NULL; *cmplarray = c->c_complete; if (c->c_pipe) { char *cp2; if ((cp2 = shellpr(cp)) != NULL) { cp = cp2; # define XX(a) ((a) + ((a)[1] == '>' ? 2 : 1)) while ((cp2 = shellpr(XX(cp))) != NULL) cp = cp2; if (*cp == '|') { *cmplarray = "xF"; cp = skip_WSP(cp + 1); } else { assert(*cp == '>'); cp = skip_WSP(XX(cp)); *cmplarray = "f"; } # undef XX } } li.buffer = cp; return &li; }
void draw_UI(void){ int i; wclear(ui.plane_list); wclear(ui.cmds); wclear(ui.map); wclear(ui.score); for (i = 0; i < state.airports_num; i++){ mvwprintw(ui.map, (state.airports[i].y/(float)MAX_HEIGHT)*(MAP_HEIGHT), (state.airports[i].x/(float)MAX_LEN)*(MAP_WIDTH), "@"); } for (i = 0; i < state.planes_num; i++){ mvwprintw(ui.map, (state.planes[i].y/(float)MAX_HEIGHT)*(MAP_HEIGHT), (state.planes[i].x/(float)MAX_LEN)*(MAP_WIDTH), "%d", i); if (i >= ui.cur_page*PLANES_PER_PAGE && i < PLANES_PER_PAGE*(ui.cur_page+1)){ mvwprintw(ui.plane_list, (i%PLANES_PER_PAGE)*2, 0, "%d: %s (%d, %d, %d)", i, state.planes[i].id, state.planes[i].x, state.planes[i].y, state.planes[i].z); mvwchgat(ui.plane_list, (i%PLANES_PER_PAGE)*2, 0, -1, A_BOLD, 0, NULL); if (ui.cur_plane >= 0 && i == ui.cur_page*PLANES_PER_PAGE+ui.cur_plane){ mvwchgat(ui.plane_list, (i%PLANES_PER_PAGE)*2, 0, -1, A_REVERSE, 0, NULL); } mvwprintw(ui.plane_list, (i%PLANES_PER_PAGE)*2+1, 0, "%s E:%d S:%d H:%d", get_status(state.planes[i].status), state.planes[i].elevation, (state.planes[i].speed/14)*50, state.planes[i].heading); } } for (i = 0; i < CMDS_NUM; i++){ mvwprintw(ui.cmds, i, 0, "%d: %s", i, get_cmdname(i)); if (ui.cur_cmd != -1){ mvwchgat(ui.cmds, ui.cur_cmd, 0, -1, A_REVERSE, 0, NULL); } } mvwprintw(ui.score, 0, 0, "Landed:%d Crashed:%d", state.landed_planes, state.crashed_planes); wrefresh(ui.map); wrefresh(ui.cmds); wrefresh(ui.plane_list); wrefresh(ui.score); }