char *getline_int(char *prompt) { int c, loc, tmp; int sig; gl_init(); gl_prompt = (prompt)? prompt : ""; gl_buf[0] = 0; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, -2, BUF_SIZE); while ((c = gl_getc()) >= 0) { gl_extent = 0; /* reset to full extent */ if (isprint(c)) { if (gl_search_mode) search_addchar(c); else gl_addchar(c); } else { if (gl_search_mode) { if (c == '\033' || c == '\016' || c == '\020') { search_term(); c = 0; /* ignore the character */ } else if (c == '\010' || c == '\177') { search_addchar(-1); /* unwind search string */ c = 0; } else if (c != '\022' && c != '\023') { search_term(); /* terminate and handle char */ } } switch (c) { case '\n': case '\r': /* newline */ gl_newline(); gl_cleanup(); return gl_buf; /*NOTREACHED*/ break; case '\001': gl_fixup(gl_prompt, -1, 0); /* ^A */ break; case '\002': gl_fixup(gl_prompt, -1, gl_pos-1); /* ^B */ break; case '\004': /* ^D */ if (gl_cnt == 0) { gl_buf[0] = 0; gl_cleanup(); gl_putc('\n'); return gl_buf; } else { gl_del(0); } break; case '\005': gl_fixup(gl_prompt, -1, gl_cnt); /* ^E */ break; case '\006': gl_fixup(gl_prompt, -1, gl_pos+1); /* ^F */ break; case '\010': case '\177': gl_del(-1); /* ^H and DEL */ break; case '\t': /* TAB */ if (gl_tab_hook) { tmp = gl_pos; loc = gl_tab_hook(gl_buf, gl_strlen(gl_prompt), &tmp); if (loc >= 0 || tmp != gl_pos) gl_fixup(gl_prompt, loc, tmp); } break; case '\013': gl_kill(gl_pos); /* ^K */ break; case '\014': gl_redraw(); /* ^L */ break; case '\016': /* ^N */ strcpy(gl_buf, hist_next()); if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case '\017': gl_overwrite = !gl_overwrite; /* ^O */ break; case '\020': /* ^P */ strcpy(gl_buf, hist_prev()); if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case '\022': search_back(1); /* ^R */ break; case '\023': search_forw(1); /* ^S */ break; case '\024': gl_transpose(); /* ^T */ break; case '\025': gl_kill(0); /* ^U */ break; case '\031': gl_yank(); /* ^Y */ break; case '\033': /* ansi arrow keys */ c = gl_getc(); if (c == '[') { switch(c = gl_getc()) { case 'A': /* up */ strcpy(gl_buf, hist_prev()); if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case 'B': /* down */ strcpy(gl_buf, hist_next()); if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case 'C': gl_fixup(gl_prompt, -1, gl_pos+1); /* right */ break; case 'D': gl_fixup(gl_prompt, -1, gl_pos-1); /* left */ break; default: gl_putc('\007'); /* who knows */ break; } } else if (c == 'f' || c == 'F') { gl_word(1); } else if (c == 'b' || c == 'B') { gl_word(-1); } else gl_putc('\007'); break; default: /* check for a terminal signal */ if (c > 0) { /* ignore 0 (reset above) */ sig = 0; #ifdef SIGINT if (c == gl_intrc) sig = SIGINT; #endif #ifdef SIGQUIT if (c == gl_quitc) sig = SIGQUIT; #endif #ifdef SIGTSTP if (c == gl_suspc || c == gl_dsuspc) sig = SIGTSTP; #endif if (sig != 0) { gl_cleanup(); kill(0, sig); gl_init(); gl_redraw(); c = 0; } } if (c > 0) gl_putc('\007'); break; } } } gl_cleanup(); gl_buf[0] = 0; return gl_buf; }
static struct ccl_rpn_node *qualifiers_order(CCL_parser cclp, ccl_qualifier_t *ap, char *attset) { int rel = 0; struct ccl_rpn_node *p; if (cclp->look_token->len == 1) { if (cclp->look_token->name[0] == '<') rel = 1; else if (cclp->look_token->name[0] == '=') rel = 3; else if (cclp->look_token->name[0] == '>') rel = 5; } else if (cclp->look_token->len == 2) { if (!memcmp(cclp->look_token->name, "<=", 2)) rel = 2; else if (!memcmp(cclp->look_token->name, ">=", 2)) rel = 4; else if (!memcmp(cclp->look_token->name, "<>", 2)) rel = 6; } if (!rel) { cclp->error_code = CCL_ERR_BAD_RELATION; return NULL; } ADVANCE; /* skip relation */ if (rel == 3 && qual_val_type(ap, CCL_BIB1_REL, CCL_BIB1_REL_PORDER, 0)) { /* allow - inside term and treat it as range _always_ */ /* relation is =. Extract "embedded" - to separate terms */ if (KIND == CCL_TOK_TERM) { size_t i; for (i = 0; i<cclp->look_token->len; i++) { if (cclp->look_token->name[i] == '-') break; } if (cclp->look_token->len > 1 && i == 0) { /* -xx*/ struct ccl_token *ntoken = ccl_token_add(cclp->look_token); ntoken->kind = CCL_TOK_TERM; ntoken->name = cclp->look_token->name + 1; ntoken->len = cclp->look_token->len - 1; cclp->look_token->len = 1; cclp->look_token->name = "-"; } else if (cclp->look_token->len > 1 && i == cclp->look_token->len-1) { /* xx- */ struct ccl_token *ntoken = ccl_token_add(cclp->look_token); ntoken->kind = CCL_TOK_TERM; ntoken->name = "-"; ntoken->len = 1; (cclp->look_token->len)--; } else if (cclp->look_token->len > 2 && i < cclp->look_token->len) { /* xx-yy */ struct ccl_token *ntoken1 = ccl_token_add(cclp->look_token); struct ccl_token *ntoken2 = ccl_token_add(ntoken1); ntoken1->kind = CCL_TOK_TERM; /* generate - */ ntoken1->name = "-"; ntoken1->len = 1; ntoken2->kind = CCL_TOK_TERM; /* generate yy */ ntoken2->name = cclp->look_token->name + (i+1); ntoken2->len = cclp->look_token->len - (i+1); cclp->look_token->len = i; /* adjust xx */ } else if (i == cclp->look_token->len && cclp->look_token->next && cclp->look_token->next->kind == CCL_TOK_TERM && cclp->look_token->next->len > 1 && cclp->look_token->next->name[0] == '-') { /* xx -yy */ /* we _know_ that xx does not have - in it */ struct ccl_token *ntoken = ccl_token_add(cclp->look_token); ntoken->kind = CCL_TOK_TERM; /* generate - */ ntoken->name = "-"; ntoken->len = 1; (ntoken->next->name)++; /* adjust yy */ (ntoken->next->len)--; } } } if (rel == 3 && KIND == CCL_TOK_TERM && cclp->look_token->next && cclp->look_token->next->len == 1 && cclp->look_token->next->name[0] == '-') { struct ccl_rpn_node *p1; if (!(p1 = search_term(cclp, ap))) return NULL; ADVANCE; /* skip '-' */ if (KIND == CCL_TOK_TERM) /* = term - term ? */ { struct ccl_rpn_node *p2; if (!(p2 = search_term(cclp, ap))) { ccl_rpn_delete(p1); return NULL; } p = ccl_rpn_node_create(CCL_RPN_AND); p->u.p[0] = p1; ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4); p->u.p[1] = p2; ccl_add_attr_numeric(p2, attset, CCL_BIB1_REL, 2); return p; } else /* = term - */ { ccl_add_attr_numeric(p1, attset, CCL_BIB1_REL, 4); return p1; } } else if (rel == 3 && cclp->look_token->len == 1 && cclp->look_token->name[0] == '-') /* = - term ? */ { ADVANCE; if (!(p = search_term(cclp, ap))) return NULL; ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, 2); return p; } else { if (!(p = search_terms(cclp, ap))) return NULL; ccl_add_attr_numeric(p, attset, CCL_BIB1_REL, rel); return p; } cclp->error_code = CCL_ERR_TERM_EXPECTED; return NULL; }
int getline(const char *prompt, char *buf, int buflen) { int c, loc, tmp; int mb_len; mbstate_t mb_st; int i; wchar_t wc; BUF_SIZE = buflen; gl_buf = buf; gl_buf[0] = '\0'; if (setjmp(gl_jmp)) { gl_newline(); gl_cleanup(); return 0; } gl_init(); gl_pos = 0; gl_prompt = (prompt)? prompt : ""; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, -2, BUF_SIZE); while ((c = gl_getc()) >= 0) { gl_extent = 0; /* reset to full extent */ if (!iscntrl(c)) { if (gl_search_mode) search_addchar(c); else gl_addchar(c); } else { if (gl_search_mode) { if (c == '\033' || c == '\016' || c == '\020') { search_term(); c = 0; /* ignore the character */ } else if (c == '\010' || c == '\177') { search_addchar(-1); /* unwind search string */ c = 0; } else if (c != '\022' && c != '\023') { search_term(); /* terminate and handle char */ } } switch (c) { case '\n': case '\r': /* newline */ gl_newline(); gl_cleanup(); return 0; /*NOTREACHED*/ break; case '\001': gl_fixup(gl_prompt, -1, 0); /* ^A */ break; case '\002': /* ^B */ if(mbcslocale) { mb_len = 0; mbs_init(&mb_st); for(i = 0; i < gl_pos ;) { mbrtowc(&wc, gl_buf+i, MB_CUR_MAX, &mb_st); mb_len = Ri18n_wcwidth(wc); i += (wc==0) ? 0 : mb_len; } gl_fixup(gl_prompt, -1, gl_pos - mb_len); } else gl_fixup(gl_prompt, -1, gl_pos-1); break; case '\003': /* ^C */ gl_fixup(gl_prompt, -1, gl_cnt); gl_puts("^C\n"); gl_kill(0); gl_fixup(gl_prompt, -2, BUF_SIZE); break; case '\004': /* ^D */ if (gl_cnt == 0) { gl_buf[0] = 0; gl_cleanup(); gl_putc('\n'); return 0; } else { gl_del(0); } break; case '\005': gl_fixup(gl_prompt, -1, gl_cnt); /* ^E */ break; case '\006': /* ^F */ if(mbcslocale) { if(gl_pos >= gl_cnt) break; mb_len = 0; mbs_init(&mb_st); for(i = 0; i<= gl_pos ;){ mbrtowc(&wc, gl_buf+i, MB_CUR_MAX, &mb_st); mb_len = Ri18n_wcwidth(wc); i += (wc==0) ? 0 : mb_len; } gl_fixup(gl_prompt, -1, gl_pos + mb_len); } else gl_fixup(gl_prompt, -1, gl_pos+1); break; case '\010': case '\177': gl_del(-1); /* ^H and DEL */ break; case '\t': /* TAB */ if (gl_tab_hook) { tmp = gl_pos; loc = gl_tab_hook(gl_buf, gl_strlen(gl_prompt), &tmp); if (loc != -1 || tmp != gl_pos) gl_fixup(gl_prompt, loc, tmp); } break; case '\013': gl_kill(gl_pos); /* ^K */ break; case '\014': gl_redraw(); /* ^L */ break; case '\016': /* ^N */ strncpy(gl_buf, gl_hist_next(), BUF_SIZE-2); gl_buf[BUF_SIZE-2] = '\0'; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case '\017': gl_overwrite = !gl_overwrite; /* ^O */ break; case '\020': /* ^P */ strncpy(gl_buf, gl_hist_prev(),BUF_SIZE-2); gl_buf[BUF_SIZE-2] = '\0'; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case '\022': search_back(1); /* ^R */ break; case '\023': search_forw(1); /* ^S */ break; case '\024': gl_transpose(); /* ^T */ break; case '\025': gl_kill(0); /* ^U */ break; case '\027': gl_killword(-1); /* ^W */ break; case '\031': gl_yank(); /* ^Y */ break; case '\032': /* ^Z */ gl_newline(); gl_cleanup(); return 1; /*NOTREACHED*/ break; case '\033': /* ansi arrow keys */ c = gl_getc(); if (c == '[') { switch(c = gl_getc()) { case 'A': /* up */ strncpy(gl_buf, gl_hist_prev(), BUF_SIZE-2); gl_buf[BUF_SIZE-2] = '\0'; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case 'B': /* down */ strncpy(gl_buf, gl_hist_next(), BUF_SIZE-2); gl_buf[BUF_SIZE-2] = '\0'; if (gl_in_hook) gl_in_hook(gl_buf); gl_fixup(gl_prompt, 0, BUF_SIZE); break; case 'C': /* right */ if(mbcslocale) { mb_len = 0; mbs_init(&mb_st); for(i = 0; i <= gl_pos ;) { mbrtowc(&wc, gl_buf+i, MB_CUR_MAX, &mb_st); mb_len = Ri18n_wcwidth(wc); i += (wc==0) ? 0 : mb_len; } gl_fixup(gl_prompt, -1, gl_pos + mb_len); } else gl_fixup(gl_prompt, -1, gl_pos+1); break; case 'D': /* left */ if(mbcslocale) { mb_len = 0; mbs_init(&mb_st); for(i = 0; i <= gl_pos ;) { mbrtowc(&wc, gl_buf+i, MB_CUR_MAX, &mb_st); mb_len = Ri18n_wcwidth(wc); i += (wc==0) ? 0 :mb_len; } gl_fixup(gl_prompt, -1, gl_pos - mb_len); } else gl_fixup(gl_prompt, -1, gl_pos-1); break; default: gl_putc('\007'); /* who knows */ break; } } else if (c == 'f' || c == 'F') { gl_word(1); } else if (c == 'b' || c == 'B') { gl_word(-1); } else gl_putc('\007'); break; default: /* check for a terminal signal */ if (c > 0) gl_putc('\007'); break; } } } gl_newline(); gl_cleanup(); return 0; }