1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "lib/mlrutil.h"
4 #include "lib/mlr_globals.h"
5 #include "input/file_reader_stdio.h"
6 #include "input/lrec_readers.h"
7 #include "containers/sllv.h"
8 
9 // lrec_reader_t impl for unit-test.
10 typedef struct _lrec_reader_in_memory_state_t {
11 	sllv_t* precords;
12 } lrec_reader_in_memory_state_t;
13 
14 static void    lrec_reader_in_memory_free(lrec_reader_t* preader);
15 static void    lrec_reader_in_memory_sof(void* pvstate, void* pvhandle);
16 static lrec_t* lrec_reader_in_memory_process(void* pvstate, void* pvhandle, context_t* pctx);
17 static void*   lrec_reader_in_memory_vopen(void* pvstate, char* prepipe, char* filename);
18 static void    lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle, char* prepipe);
19 
20 // ----------------------------------------------------------------
lrec_reader_in_memory_alloc(sllv_t * precords)21 lrec_reader_t* lrec_reader_in_memory_alloc(sllv_t* precords) {
22 	lrec_reader_t* plrec_reader = mlr_malloc_or_die(sizeof(lrec_reader_t));
23 
24 	lrec_reader_in_memory_state_t* pstate = mlr_malloc_or_die(sizeof(lrec_reader_in_memory_state_t));
25 	pstate->precords = precords;
26 
27 	plrec_reader->pvstate       = (void*)pstate;
28 	plrec_reader->popen_func    = lrec_reader_in_memory_vopen;
29 	plrec_reader->pclose_func   = lrec_reader_in_memory_vclose;
30 	plrec_reader->pprocess_func = lrec_reader_in_memory_process;
31 	plrec_reader->psof_func     = lrec_reader_in_memory_sof;
32 	plrec_reader->pfree_func    = lrec_reader_in_memory_free;
33 
34 	return plrec_reader;
35 }
36 
lrec_reader_in_memory_free(lrec_reader_t * preader)37 static void lrec_reader_in_memory_free(lrec_reader_t* preader) {
38 	lrec_reader_in_memory_state_t* pstate = preader->pvstate;
39 	sllv_free(pstate->precords);
40 	free(pstate);
41 	free(preader);
42 }
43 
44 // No-op for stateless readers such as this one.
lrec_reader_in_memory_sof(void * pvstate,void * pvhandle)45 static void lrec_reader_in_memory_sof(void* pvstate, void* pvhandle) {
46 }
47 
48 // ----------------------------------------------------------------
lrec_reader_in_memory_process(void * pvstate,void * pvhandle,context_t * pctx)49 static lrec_t* lrec_reader_in_memory_process(void* pvstate, void* pvhandle, context_t* pctx) {
50 	lrec_reader_in_memory_state_t* pstate = pvstate;
51 
52 	if (pstate->precords->phead == NULL)
53 		return NULL;
54 	else
55 		return sllv_pop(pstate->precords);
56 }
57 
lrec_reader_in_memory_vopen(void * pvstate,char * prepipe,char * filename)58 static void* lrec_reader_in_memory_vopen(void* pvstate, char* prepipe, char* filename) {
59 	// popen is a stdio construct, not an mmap construct, and it can't be supported here.
60 	if (prepipe != NULL) {
61 		fprintf(stderr, "%s: coding error detected in file %s at line %d.\n",
62 			MLR_GLOBALS.bargv0, __FILE__, __LINE__);
63 		exit(1);
64 	}
65 
66 	return NULL;
67 }
68 
lrec_reader_in_memory_vclose(void * pvstate,void * pvhandle,char * prepipe)69 static void lrec_reader_in_memory_vclose(void* pvstate, void* pvhandle, char* prepipe) {
70 }
71