int cangjie_get_characters_by_shortcode(Cangjie *cj, char *input_code, CangjieCharList **l) { CangjieCharList *tmp = NULL; sqlite3_stmt *stmt; int ret; char *query = sqlite3_mprintf(cj->shortcode_query, 0, input_code); if (query == NULL) { return CANGJIE_NOMEM; } ret = sqlite3_prepare_v2(cj->db, query, -1, &stmt, 0); if (ret != SQLITE_OK) { // FIXME: Unhandled error codes return ret; } sqlite3_free(query); while (1) { ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { char *chchar = (char *)sqlite3_column_text(stmt, 0); uint32_t frequency = (uint32_t)sqlite3_column_int(stmt, 2); CangjieChar *c; int ret = cangjie_char_new(&c, chchar, input_code, frequency); ret = cangjie_char_list_prepend(&tmp, c); } else if(ret == SQLITE_DONE) { // All rows finished sqlite3_finalize(stmt); break; } else { // Some error encountered return CANGJIE_DBERROR; } } if (tmp == NULL) { return CANGJIE_NOCHARS; } *l = tmp; return CANGJIE_OK; }
void test_cangjie_char_zh() { char *chchar = "\xE5\xBE\x8C"; // 後 char *simpchar = "\xE5\x90\x8E"; // 后 char *code = "abc"; uint32_t frequency = 123; CangjieChar *c; int ret = cangjie_char_new(&c, chchar, simpchar, code, frequency); assert(ret == CANGJIE_OK); assert(strcmp(c->chchar, chchar) == 0); assert(strcmp(c->simpchar, simpchar) == 0); assert(strcmp(c->code, code) == 0); assert(c->frequency == frequency); cangjie_char_free(c); }
void test_cangjie_char_a() { char *chchar = "a"; char *simpchar = "b"; char *code = "abc"; uint32_t frequency = 123; CangjieChar *c; int ret = cangjie_char_new(&c, chchar, simpchar, code, frequency); assert(ret == CANGJIE_OK); assert(strcmp(c->chchar, chchar) == 0); assert(strcmp(c->simpchar, simpchar) == 0); assert(strcmp(c->code, code) == 0); assert(c->frequency == frequency); cangjie_char_free(c); }
int cangjie_get_characters(Cangjie *cj, char *input_code, CangjieCharList **l) { CangjieCharList *tmp = NULL; sqlite3_stmt *stmt; char *cj_query; char *query_code; char *star_ptr; char *query; int ret; if (input_code == NULL || strlen(input_code) == 0 || strlen(input_code) > 5) { return CANGJIE_INVALID; } if (input_code[0] == '*' || input_code[strlen(input_code) - 1] == '*') { return CANGJIE_INVALID; } // Start with the Cangjie instance's cj_query cj_query = calloc(strlen(cj->cj_query) + MAX_LEN_CODE_QUERY + 1, sizeof(char)); if (cj_query == NULL) { return CANGJIE_NOMEM; } strcpy(cj_query, cj->cj_query); query_code = calloc(6, sizeof(char)); if (query_code == NULL) { free(cj_query); return CANGJIE_NOMEM; } strncpy(query_code, input_code, 5); // Handle optional wildcards star_ptr = strchr(query_code, '*'); if (star_ptr == NULL) { strcat(cj_query, "AND code = '%q';"); } else { strcat(cj_query, "AND code GLOB '%q';"); } query = sqlite3_mprintf(cj_query, cj->version, query_code); free(query_code); free(cj_query); if (query == NULL) { return CANGJIE_NOMEM; } ret = sqlite3_prepare_v2(cj->db, query, -1, &stmt, 0); if (ret != SQLITE_OK) { // FIXME: Unhandled error codes return ret; } sqlite3_free(query); while (1) { ret = sqlite3_step(stmt); if (ret == SQLITE_ROW) { char *chchar = (char *)sqlite3_column_text(stmt, 0); char *code = (char *)sqlite3_column_text(stmt, 1); uint32_t frequency = (uint32_t)sqlite3_column_int(stmt, 2); CangjieChar *c; int ret = cangjie_char_new(&c, chchar, code, frequency); if (ret != CANGJIE_OK) { return ret; } ret = cangjie_char_list_prepend(&tmp, c); if (ret != CANGJIE_OK) { return ret; } } else if(ret == SQLITE_DONE) { // All rows finished sqlite3_finalize(stmt); break; } else { // Some error encountered return CANGJIE_DBERROR; } } if (tmp == NULL) { return CANGJIE_NOCHARS; } *l = tmp; return CANGJIE_OK; }