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