1a10ac7722e6b860c4ac223ffe30aeee39da7a31
[h316.git] / pc-tools / ldc2 / src / config.cpp
1 /*
2 * Program configuration management
3 */
4
5 #include <vector>
6 #include <string>
7
8 #include <stdio.h>
9 #include <unistd.h>
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #include <fcntl.h>
13
14 #include "configuration_manager.hh"
15 #include "tool.hh"
16
17 /* Global configuration data */
18 string cfg_infile;
19 string cfg_outfile;
20 int cfg_infile_set=0;
21 int cfg_outfile_set=0;
22 int cfg_config_file_set=0;
23
24 int cfg_do_help=0;
25 int cfg_output_info=0;
26 int cfg_output_called=0;
27 int cfg_output_exported=0;
28 int cfg_output_unsatisfied=0;
29 int cfg_split_objects=0;
30 int cfg_split_objects_numbered=0;
31 int cfg_ignore_block_errors=0;
32 int cfg_ignore_checksum_errors=0;
33 int cfg_pause_on_checksum_error=0;
34 int cfg_ignore_unknown_block_errors=0;
35 int cfg_ignore_object_integrity_errors=0;
36 int cfg_list_contents=1;
37 int cfg_verbose=0;
38 int cfg_quiet=0;
39
40 int cfg_version=0;
41
42 int in_fd=0; //! File descriptor for data input
43 int out_fd=2; //! File descriptor for text output
44
45 void do_config(int argc, char ** args){
46
47 string cfg_config_file;
48 configuration_manager ar("ldc2");
49
50 /* Here come the configuration switches */
51 ar.add_option_switch("h","help",
52 "Output this help text and exit.",
53 &cfg_do_help,false,true);
54
55 ar.add_option_switch("a","output_info",
56 "Print tape data information",
57 &cfg_output_info,true,true);
58
59 ar.add_option_switch("c","output_called",
60 "Print all called symbols from the object(s).",
61 &cfg_output_called,true,true);
62
63 ar.add_option_switch("e","output_exported",
64 "Print all exported symbols from the object(s).",
65 &cfg_output_exported,true,true);
66
67 ar.add_option_switch("u","output_unsatisfied",
68 "List all unsatisfied symbols.",
69 &cfg_output_unsatisfied,true,true);
70
71 ar.add_option_switch("S","split_objects_numbered",
72 "Split input data into distinct numbered files",
73 &cfg_split_objects_numbered,true,true);
74
75 ar.add_option_switch("s","split_objects",
76 "Split input data into distinct object files.",
77 &cfg_split_objects,true,true);
78
79 ar.add_option_switch("b","ignore_block_errors",
80 "Ignore block integrity errors. This will output broken blocks,too",
81 &cfg_ignore_block_errors,true,true);
82
83 ar.add_option_switch("k","ignore_checksum_errors",
84 "Ignore block checksum errors. Errors will be converted to warnings.",
85 &cfg_ignore_checksum_errors,true,true);
86
87 ar.add_option_switch("p","pause_on_checksum_error",
88 "Wait for user input on checksum error.",
89 &cfg_pause_on_checksum_error,true,true);
90
91 ar.add_option_switch("n","ignore_unknown_block_errors",
92 "Ignore errors caused by unknown block types. Errors will be converted to warnings.",
93 &cfg_ignore_unknown_block_errors,true,true);
94
95 ar.add_option_switch("g","ignore_object_integrity_errors",
96 "Ignore errors caused by objects without proper end block. \
97 Errors will be converted to warnings.",
98 &cfg_ignore_object_integrity_errors,true,true);
99
100 ar.add_option_switch("v","verbose",
101 "Be a bit more verbose. This overrides -q.",
102 &cfg_verbose,true,true);
103
104 ar.add_option_switch("q","quiet",
105 "Be quiet. All warning messages are suppressed.",
106 &cfg_quiet,true,true);
107
108 ar.add_option_switch("V","version",
109 "Output version information and exit.",
110 &cfg_version,false,true);
111
112 ar.add_option_value("i","in_file",
113 "specify input file",
114 &cfg_infile_set,&cfg_infile,
115 "<input-file>",true,false);
116
117 ar.add_option_value("o","out_file",
118 "Specify output file.",
119 &cfg_outfile_set,&cfg_outfile,
120 "<output_file>",true,true);
121
122 ar.add_argument("File from where data is read",
123 &cfg_infile_set,&cfg_infile,
124 "<input-file>");
125
126 ar.add_argument("File to where output is redirected",
127 &cfg_outfile_set,&cfg_outfile,
128 "<output-file>");
129
130 ar.add_option_value("F","cfg_config_file",
131 "Use the specified configuration file.",
132 &cfg_config_file_set,&cfg_config_file,
133 "<file-name>",false,true);
134
135
136 // If there's a config file mentioned in the environment, take it!
137 char * env_ldc_config=getenv("LDC_CONFIG");
138 if(env_ldc_config){
139 if (cfg_verbose) fprintf(stderr,"Using config file: \"%s\"\n",env_ldc_config);
140 if(dump_vector_fp(ar.read_file(env_ldc_config),stderr)){
141 dump_vector_fp(ar.get_help(),stderr);
142 exit(1);
143 }
144 }
145
146 // Process command line first time
147 if(dump_vector_fp(ar.read_args(argc,args),stderr)){
148 dump_vector_fp(ar.get_help(),stderr);
149 exit(7);
150 }
151
152 if (cfg_do_help) {
153 dump_vector_fp(ar.get_help(),stderr);
154 exit(0);
155 }
156
157 // If user has a config file, use it.
158 if (cfg_config_file_set){
159 if (cfg_verbose)
160 fprintf(stderr,"Using config file: \"%s\"\n",cfg_config_file.c_str());
161 if(dump_vector_fp(ar.read_file(cfg_config_file),stderr)){
162 dump_vector_fp(ar.get_help(),stderr);
163 exit(7);
164 }
165
166 // Process command line a second time to override values from config file.
167 if(dump_vector_fp(ar.read_args(argc,args),stderr)||cfg_do_help){
168 dump_vector_fp(ar.get_help(),stderr);
169 exit(7);
170 }
171 }
172
173 if (cfg_infile_set==1){
174 if (cfg_verbose)
175 fprintf(stderr,"Opening file for input: \"%s\"\n",cfg_infile.c_str());
176 in_fd=open(cfg_infile.c_str(),O_RDONLY);
177 if (in_fd<0){
178 fprintf(stderr,"Error: could not open file \"%s\" for reading!\n",
179 cfg_infile.c_str());
180 exit (1);
181 }
182 }
183
184 if (cfg_outfile_set==1){
185 if (cfg_verbose)
186 fprintf(stderr,"Opening file for output: \"%s\"\n",cfg_outfile.c_str());
187 out_fd=open(cfg_outfile.c_str(),O_CREAT|O_WRONLY|O_TRUNC,0666);
188 if (out_fd<0){
189 fprintf(stderr,"Error: could not open file \"%s\" for writing!\n",
190 cfg_outfile.c_str());
191 exit (1);
192 }
193 }
194
195 // Verbose overrides quiet:
196 if (cfg_verbose)cfg_quiet=0;
197
198 // The configuration implications according to /cfg007/
199 if (in_fd==0) cfg_pause_on_checksum_error=0;
200 if (cfg_pause_on_checksum_error==1) cfg_ignore_checksum_errors=1;
201
202 if (cfg_output_info||cfg_output_called||cfg_output_exported||
203 cfg_output_unsatisfied||
204 cfg_split_objects||cfg_split_objects_numbered)
205 cfg_list_contents=0;
206 }
207
208