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; }
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; }