bool highlight_unbalanced_paren(void) { /* if cursor is positioned at close paren, try to find reason for unbalanced expr and highlight it */ int pos; bool success = true; pos = XmTextGetInsertionPosition(listener_text); if (pos > 2) { char *str; str = XmTextGetString(listener_text); if ((str[pos - 1] == ')') && ((str[pos - 2] != '\\') || (str[pos - 3] != '#'))) { int parens; parens = find_matching_paren(str, 2, pos - 1, &paren_pos); if (parens == 0) { XmTextSetHighlight(listener_text, paren_pos, paren_pos + 1, XmHIGHLIGHT_SELECTED); flashes = 4; XtAppAddTimeOut(MAIN_APP(ss), (unsigned long)FLASH_TIME, (XtTimerCallbackProc)flash_unbalanced_paren, NULL); } else success = false; } if (str) XtFree(str); } return(success); }
static void command_motion_callback(Widget w, XtPointer context, XtPointer info) { XmTextVerifyCallbackStruct *cbs = (XmTextVerifyCallbackStruct *)info; int pos; cbs->doit = true; if (dont_check_motion) return; if (last_highlight_position != -1) { XmTextSetHighlight(w, last_highlight_position, last_highlight_position + 1, XmHIGHLIGHT_NORMAL); last_highlight_position = -1; } pos = cbs->newInsert - 1; if (pos > 0) { char *str = NULL; str = XmTextGetString(w); if ((str[pos] == ')') && ((pos <= 1) || (str[pos - 1] != '\\') || (str[pos - 2] != '#'))) { int parens; parens = find_matching_paren(str, 1, pos, &last_highlight_position); if (parens == 0) XmTextSetHighlight(w, last_highlight_position, last_highlight_position + 1, XmHIGHLIGHT_SECONDARY_SELECTED); } if (str) XtFree(str); } }
static int match_paren(int x, int k) { int tmp; fd_set readset; struct timeval timeout; rl_insert(x, k); /* Did we just insert a quoted paren? If so, then don't bounce. */ if (rl_point - 1 >= 1 && rl_line_buffer[rl_point - 2] == '\\') return 0; /* tmp = 200000 */ timeout.tv_sec = 0 /* tmp / 1000000 */ ; timeout.tv_usec = 200000 /* tmp % 1000000 */ ; FD_ZERO(&readset); FD_SET(fileno(rl_instream), &readset); if(rl_point > 1) { tmp = rl_point; rl_point = find_matching_paren(k); if(rl_point > -1) { rl_redisplay(); select(1, &readset, NULL, NULL, &timeout); } rl_point = tmp; } return 0; }