slls_t* mlr_copy_keys_from_record(lrec_t* prec) { slls_t* plist = slls_alloc(); for (lrece_t* pe = prec->phead; pe != NULL; pe = pe->pnext) { slls_add_with_free(plist, strdup(pe->key)); } return plist; }
// ---------------------------------------------------------------- static char* test_lrec_xtab_api() { char* line_1 = strdup("w 2"); char* line_2 = strdup("x 3"); char* line_3 = strdup("y 4"); char* line_4 = strdup("z 5"); slls_t* pxtab_lines = slls_alloc(); slls_add_with_free(pxtab_lines, line_1); slls_add_with_free(pxtab_lines, line_2); slls_add_with_free(pxtab_lines, line_3); slls_add_with_free(pxtab_lines, line_4); lrec_t* prec = lrec_parse_stdio_xtab(pxtab_lines, ' ', TRUE); mu_assert_lf(prec->field_count == 4); mu_assert_lf(streq(lrec_get(prec, "w"), "2")); mu_assert_lf(streq(lrec_get(prec, "x"), "3")); mu_assert_lf(streq(lrec_get(prec, "y"), "4")); mu_assert_lf(streq(lrec_get(prec, "z"), "5")); lrec_remove(prec, "w"); mu_assert_lf(prec->field_count == 3); mu_assert_lf(lrec_get(prec, "w") == NULL); // Non-replacing-rename case //lrec_dump_titled("Before rename", prec); lrec_rename(prec, "x", "u"); //lrec_dump_titled("After rename", prec); mu_assert_lf(prec->field_count == 3); mu_assert_lf(lrec_get(prec, "x") == NULL); mu_assert_lf(streq(lrec_get(prec, "u"), "3")); // Replacing-rename case //lrec_dump_titled("Before rename", prec); lrec_rename(prec, "y", "z"); //lrec_dump_titled("After rename", prec); mu_assert_lf(prec->field_count == 2); mu_assert_lf(streq(lrec_get(prec, "u"), "3")); mu_assert_lf(lrec_get(prec, "y") == NULL); mu_assert_lf(streq(lrec_get(prec, "z"), "4")); lrec_free(prec); return NULL; }
// ---------------------------------------------------------------- static lrec_t* lrec_reader_stdio_xtab_process(void* pvstate, void* pvhandle, context_t* pctx) { FILE* input_stream = pvhandle; lrec_reader_stdio_xtab_state_t* pstate = pvstate; if (pstate->at_eof) return NULL; slls_t* pxtab_lines = slls_alloc(); while (TRUE) { char* line = (pstate->ifslen == 1) ? mlr_get_cline(input_stream, pstate->ifs[0]) : mlr_get_sline(input_stream, pstate->ifs, pstate->ifslen); if (line == NULL) { // EOF // EOF or blank line terminates the stanza. pstate->at_eof = TRUE; if (pxtab_lines->length == 0) { slls_free(pxtab_lines); return NULL; } else { return (pstate->ipslen == 1) ? lrec_parse_stdio_xtab_single_ips(pxtab_lines, pstate->ips[0], pstate->allow_repeat_ips) : lrec_parse_stdio_xtab_multi_ips(pxtab_lines, pstate->ips, pstate->ipslen, pstate->allow_repeat_ips); } } else if (*line == '\0') { free(line); if (pxtab_lines->length > 0) { return (pstate->ipslen == 1) ? lrec_parse_stdio_xtab_single_ips(pxtab_lines, pstate->ips[0], pstate->allow_repeat_ips) : lrec_parse_stdio_xtab_multi_ips(pxtab_lines, pstate->ips, pstate->ipslen, pstate->allow_repeat_ips); } } else { slls_add_with_free(pxtab_lines, line); } } }
// ---------------------------------------------------------------- slls_t* slls_single_with_free(char* value) { slls_t* pslls = slls_alloc(); slls_add_with_free(pslls, value); return pslls; }
// ---------------------------------------------------------------- slls_t* slls_copy(slls_t* pold) { slls_t* pnew = slls_alloc(); for (sllse_t* pe = pold->phead; pe != NULL; pe = pe->pnext) slls_add_with_free(pnew, strdup(pe->value)); return pnew; }