void gt_string_matching_shift_and(const char *s, unsigned long n, const char *p, unsigned long m, ProcessMatch process_match, void *data) { GtBittab *D, *B[UCHAR_MAX] = { NULL }; unsigned long i, j; gt_assert(s && p); if (m > n || !m || !n) /* no match possible */ return; /* preprocessing */ for (j = 0; j < m; j++) { if (!B[(unsigned) p[j]]) B[(unsigned) p[j]] = gt_bittab_new(m); gt_bittab_set_bit(B[(unsigned) p[j]], j); } /* searching */ D = gt_bittab_new(m); for (i = 0; i < n; i++) { gt_bittab_shift_left_equal(D); gt_bittab_set_bit(D, 0); if (B[(unsigned) s[i]]) gt_bittab_and_equal(D, B[(unsigned) s[i]]); else gt_bittab_unset(D); if (gt_bittab_bit_is_set(D, m - 1) && process_match) { if (process_match(i - m + 1, data)) break; } } /* free */ for (i = 0; i < UCHAR_MAX; i++) gt_bittab_delete(B[i]); gt_bittab_delete(D); }
int gt_canvas_cairo_visit_line_pre(GtCanvas *canvas, GtLine *line, GtError *err) { int had_err = 0; double lheight, bar_vspace = BAR_VSPACE_DEFAULT, theight = gt_graphics_get_text_height(canvas->pvt->g), captionspace = CAPTION_BAR_SPACE_DEFAULT; bool show_block_captions = true; gt_assert(canvas && line); if (gt_style_get_num(canvas->pvt->sty, "format", "block_caption_space", &captionspace, NULL, err) == GT_STYLE_QUERY_ERROR) { return -1; } if (gt_style_get_bool(canvas->pvt->sty, "format", "show_block_captions", &show_block_captions, NULL, err) == GT_STYLE_QUERY_ERROR) { return -1; } had_err = gt_line_get_height(line, &lheight, canvas->pvt->sty, err); if (!had_err) { if (gt_style_get_num(canvas->pvt->sty, "format", "bar_vspace", &bar_vspace, NULL, err) == GT_STYLE_QUERY_ERROR) { return -1; } if (gt_style_get_num(canvas->pvt->sty, "format", "block_caption_font_size", &theight, NULL, err) == GT_STYLE_QUERY_ERROR) { return -1; } if (gt_line_has_captions(line) && show_block_captions) canvas->pvt->y += theight + captionspace; canvas->pvt->bt = gt_bittab_new(canvas->pvt->width); gt_bittab_unset(canvas->pvt->bt); canvas->pvt->y += lheight/2; } return had_err; }