static void skip_chars_backward (char *range, int invert) { SLwchar_Lut_Type *lut; int ignore_combining = 1; int no_newline; if (*range == '^') { invert = !invert; range++; } if (NULL == (lut = SLwchar_strtolut ((SLuchar_Type *)range, 1, 1))) return; no_newline = (0 == SLwchar_in_lut (lut, '\n')); if (invert) no_newline = !no_newline; do { unsigned char *p = CLine->data + Point; unsigned char *pmin = CLine->data; p = SLwchar_bskip_range (lut, pmin, p, ignore_combining, invert); if (p == NULL) { SLwchar_free_lut (lut); return; } jed_position_point (p); if (p > pmin) { SLwchar_free_lut (lut); return; } if (no_newline) { SLwchar_free_lut (lut); return; } } while (jed_up (1)); SLwchar_free_lut (lut); bob (); }
static void skip_chars_forward (char *range, int invert) { SLwchar_Lut_Type *lut; int ignore_combining = 1; if (*range == '^') { invert = !invert; range++; } if (NULL == (lut = SLwchar_strtolut ((SLuchar_Type *)range, 1, 1))) return; do { unsigned char *p = CLine->data + Point; unsigned char *pmax = CLine->data + CLine->len; p = SLwchar_skip_range (lut, p, pmax, ignore_combining, invert); if (p == NULL) { SLwchar_free_lut (lut); return; } if (p < pmax) { jed_position_point (p); SLwchar_free_lut (lut); return; } } while (jed_down (1)); SLwchar_free_lut (lut); eob(); }
SLwchar_Lut_Type *SLwchar_create_lut (unsigned int num_entries) { SLwchar_Lut_Type *r; r = (SLwchar_Lut_Type *)SLcalloc (sizeof (SLwchar_Lut_Type), 1); if (r == NULL) return NULL; r->chmin = (SLwchar_Type *) _SLcalloc (num_entries, sizeof(SLwchar_Type)); r->chmax = (SLwchar_Type *) _SLcalloc (num_entries, sizeof(SLwchar_Type)); if ((r->chmin == NULL) || (r->chmax == NULL)) { SLwchar_free_lut (r); return NULL; } r->malloced_len = num_entries; r->utf8_mode = _pSLinterp_UTF8_Mode; return r; }
SLwchar_Lut_Type *SLwchar_strtolut (SLuchar_Type *u, int allow_range, int allow_charclass) { SLuchar_Type *umax; SLwchar_Lut_Type *r; Lexical_Element_Type lex; r = SLwchar_create_lut (32); if (r == NULL) return NULL; umax = u + strlen ((char *) u); while (u < umax) { if (NULL == (u = get_lexical_element (u, umax, allow_range, allow_charclass, &lex))) goto return_error; switch (lex.lexical_type) { case LEXICAL_CHAR_TYPE: if (-1 == SLwchar_add_range_to_lut (r, lex.e.wch, lex.e.wch)) goto return_error; break; case LEXICAL_RANGE_TYPE: if (-1 == SLwchar_add_range_to_lut (r, lex.e.range[0], lex.e.range[1])) goto return_error; break; case LEXICAL_CLASS_TYPE: add_char_class (r, lex.e.char_class); break; } } return r; return_error: SLwchar_free_lut (r); return NULL; }