Kvs_t* in(const char* path) { Kvs_t* kvs = init_kvs(); FILE* instream; if ((instream = fopen(path, "rb")) == NULL) { return kvs; } int count; fread(&count, sizeof(int), 1, instream); if(count <= 0) { fclose(instream); return kvs; } Key_t key; size_t size; for(int i = 0; i < count; i++) { fread(&key, sizeof(Key_t), 1, instream); fread(&size, sizeof(size_t), 1, instream); Value_t value = malloc(size); fread(value, size, 1, instream); kvs = add_kv(kvs, make_kv(key, value, size)); } fclose(instream); return kvs; }
void splitter(void) { char *curr_word, *curr_key, curr_ltr; int state = IN_KEY; // For the current word curr_word = input_data; curr_key = input_data; // Teragen creates 10 byte keys int nchar = 0; n_pairs = 0; // Go through the file and update the count for each unique word for (uint64_t i = 0; i < input_len; i++) { // Each word is the same, regardless of case curr_ltr = input_data[i]; switch (state) { case IN_KEY: if (nchar == 0) curr_word = &input_data[i]; if (nchar >= 10) { // End of the current word input_data[i] = 0; state = NOT_IN_WORD; curr_key = curr_word; nchar = 0; } else nchar ++; break; case IN_VALUE: if (curr_ltr == '\n') { // The values end in '\r\n' input_data[i] = 0; input_data[i-1] = 0; // Add key-value add_kv(curr_key, curr_word); // Modify the state state = IN_KEY; } break; default: case NOT_IN_WORD: if (curr_ltr >= '!' && curr_ltr <= '~') { // Start of a new word curr_word = &input_data[i]; state = IN_VALUE; } break; } } // Add the last word //add_kv(curr_key, curr_word); //n_pairs++; }
/** * 添加一个参数 */ Kvs_t* add_param(Kvs_t* kvs, Param_t* pParam) { Kv_t* kv = make_kv(pParam -> id, pParam, sizeof(Param_t)); return add_kv(kvs, kv); }
/** * 添加一条记录 */ Kvs_t* add_record(Kvs_t* kvs, Record_t* pRecord) { Kv_t* kv = make_kv(pRecord -> id, pRecord, sizeof(Record_t)); return add_kv(kvs, kv); }