void recognizeAlphabet(int size){ //recognize alphabet char line[2048]; unsigned char *c; int lenptr; unsigned int codepoint; int blockIndex = 0; while(fgets(line, 2048, stdin) != NULL){ c = line; while(*c != '\0' && *c != '\n'){ codepoint = utf8_to_codepoint(c, &lenptr); if(codepoint > 0){ int blockIndex = findMatch(codepoint, size); if(blockIndex != -1){ blocks[blockIndex].counter += 1; } c = c + lenptr; } if(codepoint == 0){c++;} } } }
extern void generate_index(void) { sqlite3_stmt *stmt = (sqlite3_stmt *)NULL; char *ztail = (char *)NULL; char initial = '\0'; char prevword[MAX_WORD_LEN]; char *w; char *d; // deck char *s; // slide list char *p; int slast; // Slide or page number int sn = 0; // Slide or page number short range; char last_out; int rc; short kw; char keyword; char rtf = get_mode() & OPT_RTF; unsigned int codepoint; int len; if ((sqlite3_prepare(G_db, "select case ? when 0 then word" " else replace(word,'\\','\\\\') end," " shortname,slidenum,kw" " from(select x.word,x.shortname," " group_concat(x.slidenum) as slidenum," " case x.kw when 'Y' then 1 else 0 end as kw" " from (select distinct coalesce(w.stem, w.word)" " as word, d.shortname," " case ?" " when 0 then s.slidenum" " when 1 then s.slidenum" " else cast(round((s.slidenum" " - 1)/?)+1 as int)" " end as slidenum," " w.kw" " from words w" " join slides s" " on s.slideid = w.slideid" " join decks d" " on d.deckid = s.deckid" " where length(trim(word))>0" " order by 1, 2, 3) x" " group by x.word,x.shortname,x.kw) y" " order by case when substr(upper(word),1,1)" " between 'A' and 'Z' then 1 else 0 end," " upper(word),shortname", -1, &stmt, (const char **)&ztail) != SQLITE_OK) || (sqlite3_bind_int(stmt, 1, (int)rtf)!= SQLITE_OK) || (sqlite3_bind_int(stmt, 2, (int)get_pages())!= SQLITE_OK) || (sqlite3_bind_int(stmt, 3, (int)get_pages())!= SQLITE_OK)) { fprintf(stderr, "generate_index 0: %s\n", (char *)sqlite3_errmsg(G_db)); (void)sqlite3_close(G_db); exit(1); } if (rtf) { printf("{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n"); printf("{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\fnil\\fcharset0 Consolas-Bold;}\n"); printf("{\\colortbl;\\red255\\green255\\blue255;\\red59\\green0\\blue164;}\n"); printf("\\margl1440\\margr1440\\vieww18540\\viewh14540\\viewkind0\n"); printf("\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n"); printf("\n\\f0\\fs24 \\cf0 \\\n"); } prevword[0] = '\0'; while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) { w = (char *)sqlite3_column_text(stmt, 0); kw = (char)sqlite3_column_int(stmt, 3); if ((toupper(*w) != initial) && isalpha(*w)) { if (rtf) { printf("\\\n\\\n\\b\\fs44 \\cf2 %c\n\\b0\\fs24 \\cf0 \\\n", toupper(*w)); } else { printf("\n\n--- %c ---", toupper(*w)); } initial = toupper(*w); } w = index_entry(w, &kw); keyword = (kw == 1); if (strncmp(w, prevword, MAX_WORD_LEN)) { if (rtf && autokw() && !keyword) { keyword = lowercase_word(w); } if (rtf) { if (keyword) { printf("\\\n\\f1\\b %s\n\\f0\\b0 \\\n", w); } else { printf("\\\n"); p = w; while (*p) { codepoint = utf8_to_codepoint((const unsigned char *)p, &len); if (len == 1) { putchar(*p); } else { printf("\\u%ld?", (long)codepoint); } p += len; } printf("\\\n"); } } else { printf("\n%s\n", w); } strncpy(prevword, w, MAX_WORD_LEN); } else { if (rtf) { putchar('\\'); } putchar('\n'); } d = (char *)sqlite3_column_text(stmt, 1); printf(" %s%-30.30s%s %s ", (rtf ? "\\i ":""), d, (rtf ? "\n\\i0":""), (get_pages() ? "p." : "")); s = strdup((char *)sqlite3_column_text(stmt, 2)); // Try to condense by replacing three or more consecutive // page or slide values with a n-m range range = 0; slast = -1; p = strtok(s, ","); last_out = 0; while (p) { if (sscanf(p, "%d", &sn)) { if (sn == 1 + slast) { range++; last_out = 0; } else { // Not in the same range of values if (slast > 0) { if (range) { if (range > 1) { printf("-%d,%d", slast, sn); last_out = 1; } else { if (slast > 0) { if (!last_out) { printf(",%d", slast); } printf(",%d", sn); } else { printf("%d", sn); } last_out = 1; } range = 0; } else { printf(",%d", sn); last_out = 1; } } else { printf("%d", sn); last_out = 1; } } slast = sn; } p = strtok(NULL, ","); } if (!last_out) { if (range > 1) { printf("-%d", sn); } else { printf(",%d", sn); } } if (s) { free(s); } } if (rtf) { putchar('\\'); } putchar('\n'); fflush(stdout); if (rc != SQLITE_DONE) { fprintf(stderr, "generate_index 1: %s\n", (char *)sqlite3_errmsg(G_db)); (void)sqlite3_close(G_db); exit(1); } else { (void)sqlite3_finalize(stmt); } if (rtf) { printf("}\n"); } }