// ---------------------------------------------------------------- lrec_t* lrec_parse_stdio_nidx(char* line, char ifs, int allow_repeat_ifs) { lrec_t* prec = lrec_nidx_alloc(line); int idx = 0; char* key = NULL; char* value = line; char free_flags = 0; for (char* p = line; *p; ) { if (*p == ifs) { *p = 0; idx++; key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); p++; if (allow_repeat_ifs) { while (*p == ifs) p++; } value = p; } else { p++; } } idx++; key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); return prec; }
lrec_t* lrec_parse_mmap_nidx(file_reader_mmap_state_t *phandle, char irs, char ifs, int allow_repeat_ifs) { lrec_t* prec = lrec_unbacked_alloc(); char* line = phandle->sol; int idx = 0; char free_flags = 0; char* p = line; if (allow_repeat_ifs) { while (*p == ifs) p++; } char* key = NULL; char* value = p; for ( ; p < phandle->eof && *p; ) { if (*p == irs) { *p = 0; phandle->sol = p+1; break; } else if (*p == ifs) { *p = 0; idx++; key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); p++; if (allow_repeat_ifs) { while (*p == ifs) p++; } value = p; } else { p++; } } if (p >= phandle->eof) phandle->sol = p+1; idx++; if (allow_repeat_ifs && *value == 0) { ; // OK } else { key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); } return prec; }
// ---------------------------------------------------------------- lrec_t* lrec_parse_stdio_csvlite_data_line_single_ifs_implicit_header(header_keeper_t* pheader_keeper, char* filename, long long ilno, char* data_line, char ifs, int allow_repeat_ifs) { lrec_t* prec = lrec_csvlite_alloc(data_line); char* p = data_line; if (allow_repeat_ifs) { while (*p == ifs) p++; } char* key = NULL; char free_flags; char* value = p; int idx = 0; for ( ; *p; ) { if (*p == ifs) { *p = 0; key = make_nidx_key(++idx, &free_flags); lrec_put(prec, key, value, free_flags); p++; if (allow_repeat_ifs) { while (*p == ifs) p++; } value = p; } else { p++; } } if (allow_repeat_ifs && *value == 0) { ; // OK } else { key = make_nidx_key(++idx, &free_flags); lrec_put(prec, key, value, NO_FREE); lrec_put(prec, key, value, free_flags); } return prec; }
// ---------------------------------------------------------------- lrec_t* lrec_parse_stdio_nidx_multi_sep(char* line, char* ifs, int ifslen, int allow_repeat_ifs) { lrec_t* prec = lrec_nidx_alloc(line); int idx = 0; char free_flags = 0; char* p = line; if (allow_repeat_ifs) { while (streqn(p, ifs, ifslen)) p += ifslen; } char* key = NULL; char* value = p; for ( ; *p; ) { if (streqn(p, ifs, ifslen)) { *p = 0; idx++; key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); p += ifslen; if (allow_repeat_ifs) { while (streqn(p, ifs, ifslen)) p += ifslen; } value = p; } else { p++; } } idx++; if (allow_repeat_ifs && *value == 0) { ; // OK } else { key = make_nidx_key(idx, &free_flags); lrec_put(prec, key, value, free_flags); } return prec; }
// ---------------------------------------------------------------- static lrec_t* paste_indices_and_data(lrec_reader_mmap_csv_state_t* pstate, rslls_t* pdata_fields, context_t* pctx) { int idx = 0; lrec_t* prec = lrec_unbacked_alloc(); for (rsllse_t* pd = pdata_fields->phead; idx < pdata_fields->length && pd != NULL; pd = pd->pnext) { idx++; char free_flags = pd->free_flag; char* key = make_nidx_key(idx, &free_flags); // Transfer pointer-free responsibility from the rslls to the lrec object lrec_put(prec, key, pd->value, free_flags); pd->free_flag = 0; } return prec; }
lrec_t* lrec_parse_mmap_dkvp(file_reader_mmap_state_t *phandle, char irs, char ifs, char ips, int allow_repeat_ifs) { lrec_t* prec = lrec_unbacked_alloc(); char* line = phandle->sol; int idx = 0; char* p = line; if (allow_repeat_ifs) { while (*p == ifs) p++; } char* key = p; char* value = p; int saw_ps = FALSE; for ( ; p < phandle->eof && *p; ) { if (*p == irs) { *p = 0; phandle->sol = p+1; break; } else if (*p == ifs) { saw_ps = FALSE; *p = 0; if (*key == 0) { // xxx to do: get file-name/line-number context in here. fprintf(stderr, "Empty key disallowed.\n"); exit(1); } idx++; if (value <= key) { // E.g the pair has no equals sign: "a" rather than "a=1" or // "a=". Here we use the positional index as the key. This way // DKVP is a generalization of NIDX. char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put_no_free(prec, key, value); } p++; if (allow_repeat_ifs) { while (*p == ifs) p++; } key = p; value = p; } else if (*p == ips && !saw_ps) { *p = 0; p++; value = p; saw_ps = TRUE; } else { p++; } } if (p >= phandle->eof) phandle->sol = p+1; idx++; if (allow_repeat_ifs && *key == 0 && *value == 0) { ; // OK } else { if (*key == 0) { // xxx to do: get file-name/line-number context in here. fprintf(stderr, "Empty key disallowed.\n"); exit(1); } if (value <= key) { char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put_no_free(prec, key, value); } } return prec; }
lrec_t* lrec_parse_stdio_dkvp_multi_sep(char* line, char* ifs, char* ips, int ifslen, int ipslen, int allow_repeat_ifs) { lrec_t* prec = lrec_dkvp_alloc(line); // It would be easier to split the line on field separator (e.g. ","), then // split each key-value pair on pair separator (e.g. "="). But, that // requires two passes through the data. Here we do it in one pass. int idx = 0; char* p = line; if (allow_repeat_ifs) { // xxx memneq while (strncmp(p, ifs, ifslen) == 0) p += ifslen; } char* key = p; char* value = p; int saw_ps = FALSE; for ( ; *p; ) { if (strncmp(p, ifs, ifslen) == 0) { saw_ps = FALSE; *p = 0; if (*key == 0) { // xxx to do: get file-name/line-number context in here. fprintf(stderr, "Empty key disallowed.\n"); exit(1); } idx++; if (value <= key) { // E.g the pair has no equals sign: "a" rather than "a=1" or // "a=". Here we use the positional index as the key. This way // DKVP is a generalization of NIDX. char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put_no_free(prec, key, value); } p += ifslen; if (allow_repeat_ifs) { while (strncmp(p, ifs, ifslen) == 0) p += ifslen; } key = p; value = p; } else if (!strncmp(p, ips, ipslen) && !saw_ps) { *p = 0; p += ipslen; value = p; saw_ps = TRUE; } else { p++; } } idx++; if (allow_repeat_ifs && *key == 0 && *value == 0) { ; // OK } else { if (*key == 0) { // xxx to do: get file-name/line-number context in here. fprintf(stderr, "Empty key disallowed.\n"); exit(1); } if (value <= key) { char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put_no_free(prec, key, value); } } return prec; }
lrec_t* lrec_parse_stdio_dkvp_single_sep(char* line, char ifs, char ips, int allow_repeat_ifs, context_t* pctx) { lrec_t* prec = lrec_dkvp_alloc(line); // It would be easier to split the line on field separator (e.g. ","), then // split each key-value pair on pair separator (e.g. "="). But, that // requires two passes through the data. Here we do it in one pass. int idx = 0; char* p = line; if (allow_repeat_ifs) { while (*p == ifs) p++; } char* key = p; char* value = p; int saw_ps = FALSE; for ( ; *p; ) { if (*p == ifs) { saw_ps = FALSE; *p = 0; idx++; if (*key == 0 || value <= key) { // E.g the pair has no equals sign: "a" rather than "a=1" or // "a=". Here we use the positional index as the key. This way // DKVP is a generalization of NIDX. char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put(prec, key, value, NO_FREE); } p++; if (allow_repeat_ifs) { while (*p == ifs) p++; } key = p; value = p; } else if (*p == ips && !saw_ps) { *p = 0; p++; value = p; saw_ps = TRUE; } else { p++; } } idx++; if (allow_repeat_ifs && *key == 0 && *value == 0) { ; // OK } else { if (*key == 0 || value <= key) { char free_flags = 0; lrec_put(prec, make_nidx_key(idx, &free_flags), value, free_flags); } else { lrec_put(prec, key, value, NO_FREE); } } return prec; }