1 #include <stdio.h>
2 #include <string.h>
3 #include "lib/mlrutil.h"
4 #include "lib/context.h"
5 #include "cli/mlrcli.h"
6 
7 // ----------------------------------------------------------------
context_init_from_first_file_name(context_t * pctx,char * first_file_name)8 void context_init_from_first_file_name(context_t* pctx, char* first_file_name) {
9 	memset(pctx, 0, sizeof(context_t));
10 	pctx->nr       = 0;
11 	pctx->fnr      = 0;
12 	pctx->filenum  = 1;
13 	pctx->filename = first_file_name;
14 	// Line-termination is by default autodetected from input, and the first output
15 	// record is produced after the first is read ... except when there *are* no inputs,
16 	// e.g. with 'mlr seqgen' or 'mlr put' with (perhaps looped) emit statements. For
17 	// those cases, where there is no file input from which to autodetect, we default
18 	// the line-termination to the platform-specific default.
19 	pctx->auto_line_term = "\n"; // xxx default to "\r\n" on Windows
20 	pctx->auto_line_term_detected = FALSE;
21 }
22 
23 // ----------------------------------------------------------------
context_init_from_opts(context_t * pctx,void * pvopts)24 void context_init_from_opts(context_t* pctx, void* pvopts) {
25 	cli_opts_t* popts = pvopts;
26 
27 	pctx->nr        = 0;
28 	pctx->fnr       = 0;
29 	pctx->filenum   = 0;
30 	pctx->filename  = NULL;
31 	pctx->force_eof = 0;
32 
33 	pctx->ips       = popts->reader_opts.ips;
34 	pctx->ifs       = popts->reader_opts.ifs;
35 	pctx->irs       = popts->reader_opts.irs;
36 	pctx->ops       = popts->writer_opts.ops;
37 	pctx->ofs       = popts->writer_opts.ofs;
38 	pctx->ors       = popts->writer_opts.ors;
39 	pctx->auto_line_term = "\n"; // xxx Windows default "\r\n"; libify
40 	pctx->auto_line_term_detected = FALSE;
41 }
42 
43 // ----------------------------------------------------------------
context_set_autodetected_crlf(context_t * pctx)44 void context_set_autodetected_crlf(context_t* pctx) {
45 	if (!pctx->auto_line_term_detected) {
46 		pctx->auto_line_term = "\r\n";
47 		pctx->auto_line_term_detected = TRUE;
48 	}
49 }
50 
context_set_autodetected_lf(context_t * pctx)51 void context_set_autodetected_lf(context_t* pctx) {
52 	if (!pctx->auto_line_term_detected) {
53 		pctx->auto_line_term = "\n";
54 		pctx->auto_line_term_detected = TRUE;
55 	}
56 }
57 
context_set_autodetected_line_term(context_t * pctx,char * line_term)58 void context_set_autodetected_line_term(context_t* pctx, char* line_term) {
59 	if (!pctx->auto_line_term_detected) {
60 		pctx->auto_line_term = line_term;
61 		pctx->auto_line_term_detected = TRUE;
62 	}
63 }
64 
65 // ----------------------------------------------------------------
context_print(context_t * pctx,char * indent)66 void context_print(context_t* pctx, char* indent) {
67 	printf("%spctx at %p:\n", indent, pctx);
68 	printf("%s  nr       = %lld\n", indent, pctx->nr);
69 	printf("%s  fnr      = %lld\n", indent, pctx->fnr);
70 	printf("%s  filenum  = %d\n", indent, pctx->filenum);
71 	if (pctx->filename == NULL) {
72 		printf("%s  filename = null\n", indent);
73 	} else {
74 		printf("%s  filename = \"%s\"\n", indent, pctx->filename);
75 	}
76 }
77