/* * Main function * * The return value determines the result length (kept in the target buffer). * However, if the target buffer is too small, the return value is greater * than tlength. The difference to tlength is the number of unconsumed source * characters at the time the buffer was full. In this case you should resize * the target buffer to the return value and call rcssmin again. Repeat as * often as needed. */ static Py_ssize_t rcssmin(const rchar *source, rchar *target, Py_ssize_t slength, Py_ssize_t tlength, int keep_bang_comments) { rcssmin_ctx_t ctx_, *ctx = &ctx_; const rchar *tstart = target; rchar c; ctx->start = source; ctx->sentinel = source + slength; ctx->tsentinel = target + tlength; ctx->at_group = 0; ctx->in_macie5 = 0; ctx->in_rule = 0; ctx->keep_bang_comments = keep_bang_comments; while (source < ctx->sentinel && target < ctx->tsentinel) { c = *source++; if (RCSSMIN_IS_DULL(c)) { *target++ = c; continue; } else if (RCSSMIN_IS_SPACE(c)) { copy_space(&source, &target, ctx, NEED_SPACE_MAYBE); continue; } switch (c) { /* Escape */ case U('\\'): copy_escape(&source, &target, ctx); continue; /* String */ case U('"'): case U('\''): copy_string(&source, &target, ctx); continue; /* URL */ case U('u'): copy_url(&source, &target, ctx); continue; /* IE7hack */ case U('>'): copy_ie7hack(&source, &target, ctx); continue; /* @-group */ case U('@'): copy_at_group(&source, &target, ctx); continue; /* ; */ case U(';'): copy_semicolon(&source, &target, ctx); continue; /* :first-line|letter followed by [{,] */ /* (apparently needed for IE6) */ case U(':'): copy_first(&source, &target, ctx); continue; /* { */ case U('{'): if (ctx->at_group) --ctx->at_group; else ++ctx->in_rule; *target++ = c; continue; /* } */ case U('}'): if (ctx->in_rule) --ctx->in_rule; *target++ = c; continue; /* space starting with comment */ case U('/'): (void)copy_space_comment(&source, &target, ctx, NEED_SPACE_MAYBE); continue; /* Fallback: copy character. Better safe than sorry. Should not be * reached, though */ default: *target++ = c; continue; } } return (Py_ssize_t)(target - tstart) + (Py_ssize_t)(ctx->sentinel - source); }
/********************************************************************** * r e v e r s e * * Create a new list with the elements reversed. The old list is not * destroyed. **********************************************************************/ LIST reverse(LIST list) { LIST newlist = NIL_LIST; iterate (list) copy_first (list, newlist); return (newlist); }
void handle_key(XKeyEvent ke) { FcChar8 buf[32]; int len, n; KeySym keysym = NoSymbol; Status status; option *o; len = XmbLookupString(xic, &ke, buf, sizeof(buf), &keysym, &status); if (status == XBufferOverflow) return; if (ke.state & ControlMask) { switch(keysym) { case XK_a: keysym = XK_Home; break; case XK_e: keysym = XK_End; break; case XK_p: keysym = XK_Up; break; case XK_n: keysym = XK_Down; break; case XK_f: keysym = XK_Right; break; case XK_b: keysym = XK_Left; break; case XK_d: keysym = XK_Delete; break; case XK_bracketleft: keysym = XK_Escape; break; case XK_k: text[cursor] = '\0'; break; case XK_u: for (n = cursor; cursor < MAX_LEN; cursor++) text[cursor - n] = text[cursor]; cursor = 0; update_valid_options(); return; } } if (text_input) { switch(keysym) { default: if (!iscntrl(*buf)) { insert(buf, len); update_valid_options(); } break; case XK_Delete: if (text[cursor] == '\0') break; cursor = nextrune(+1); /* Fall through to backspace */ case XK_BackSpace: if (cursor == 0) exit(0); insert(NULL, nextrune(-1) - cursor); update_valid_options(); break; case XK_Tab: copy_first(); break; case XK_Left: if (cursor != 0) cursor = nextrune(-1); break; case XK_Right: if (text[cursor] != '\0') cursor = nextrune(+1); break; case XK_Home: cursor = 0; break; case XK_End: while (text[cursor] != '\0') cursor = nextrune(+1); } } switch(keysym) { case XK_Up: if (valid->prev) valid = valid->prev; else for (; valid && valid->next; valid = valid->next); break; case XK_Down: if (valid->next) valid = valid->next; else for (; valid && valid->prev; valid = valid->prev); break; case XK_Return: finish(); break; case XK_Escape: exit(1); break; } if (exit_on_one) { for (n = 0, o = valid; o; o = o->next) n++; if (n == 1) finish(); } }