86 {
89 long label_parameters = 0;
92 char *inputfile = NULL;
93 char *rootname = NULL;
94 char filename[200];
95 long outputs = 0;
97 long i, i_arg;
98 int64_t n_rows;
99 long page_number, separate_pages = 0;
100 long announce_openings = 0;
101 SCANNED_ARG *s_arg;
102 char *ptr;
103 void *data[4];
104 double param[4];
105 long data_present = 0;
106 unsigned long pipe_flags = 0;
107
108 argc =
scanargs(&s_arg, argc, argv);
109 if (argc < 3) {
110 fputs(usage, stderr);
111 exit(EXIT_FAILURE);
112 }
113
114 for (i_arg = 1; i_arg < argc; i_arg++) {
115 if (s_arg[i_arg].arg_type == OPTION) {
117 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
118 case SET_ROOTNAME:
119 if (s_arg[i_arg].n_items != 2)
121 rootname = s_arg[i_arg].list[1];
122 break;
123 case SET_OUTPUT:
124 if (s_arg[i_arg].n_items < 4 || s_arg[i_arg].n_items > 6)
126 output =
trealloc(output,
sizeof(*output) * (outputs + 1));
127 if (!(output[outputs] = process_output_request(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, outputs ? output[outputs - 1] : NULL)))
129 outputs++;
130 break;
131 case SET_SEPARATE_PAGES:
132 separate_pages = 1;
133 break;
134 case SET_LABEL_PARAMETERS:
135 if (s_arg[i_arg].n_items < 2)
136 SDDS_Bomb(
"Invalid -labelparameters syntax");
137 label_parameter =
trealloc(label_parameter,
sizeof(*label_parameter) * (label_parameters + s_arg[i_arg].n_items));
138 for (i = 1; i < s_arg[i_arg].n_items; i++)
139 scan_label_parameter(label_parameter + i - 1, s_arg[i_arg].list[i]);
140 label_parameters += s_arg[i_arg].n_items - 1;
141 break;
142 case SET_ANNOUNCE_OPENINGS:
143 announce_openings = 1;
144 break;
145 case SET_PIPE:
146 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipe_flags))
148 break;
149 default:
151 break;
152 }
153 } else {
154 if (!inputfile)
155 inputfile = s_arg[i_arg].list[0];
156 else
158 }
159 }
160
161 if (!inputfile && !(pipe_flags & USE_STDIN))
163
164 if (!rootname) {
165 if (!inputfile)
166 SDDS_Bomb(
"You must give a rootname if you don't give an input filename");
168 if ((ptr = strrchr(rootname, '.')))
169 *ptr = '\0';
170 }
171
172 if (outputs <= 0)
173 SDDS_Bomb(
"No output specifications given");
174
177 exit(EXIT_FAILURE);
178 }
179
180 for (i = 0; i < outputs; i++) {
181 if (!output[i]->parameter_output) {
186 fprintf(stderr, "Error: unrecognized column name given\n");
188 exit(EXIT_FAILURE);
189 }
190 } else {
195 fprintf(stderr, "Error: unrecognized parameter name given\n");
197 exit(EXIT_FAILURE);
198 }
199 }
200 }
201
203 data_present = 1;
206 exit(EXIT_FAILURE);
207 }
209 fprintf(stderr, "Warning: no rows selected for page %" PRId32 "\n", sdds_dataset.page_number);
212 }
213 for (i = 0; i < outputs; i++) {
214 if (!output[i]->fp) {
215 if (separate_pages && !output[i]->parameter_output)
216 snprintf(filename, sizeof(filename), "%s_%03ld_%s_%s.out", rootname, output[i]->counter++, output[i]->item[0], output[i]->item[1]);
217 else
218 snprintf(filename, sizeof(filename), "%s_%s_%s.out", rootname, output[i]->item[0], output[i]->item[1]);
219 set_up_output(filename, output[i], label_parameter, label_parameters, separate_pages, announce_openings, &sdds_dataset);
220 }
221 if (!output[i]->parameter_output) {
223 data[2] = data[3] = NULL;
224 if (!(data[0] =
SDDS_GetColumn(&sdds_dataset, output[i]->item[0])) ||
226 (output[i]->columns > 2 && !(data[2] =
SDDS_GetColumn(&sdds_dataset, output[i]->item[2]))) ||
227 (output[i]->columns > 3 && !(data[3] =
SDDS_GetColumn(&sdds_dataset, output[i]->item[3])))) {
229 exit(EXIT_FAILURE);
230 }
231 for (int64_t j = 0; j < n_rows; j++) {
232 for (long k = 0; k < output[i]->columns; k++) {
233 SDDS_PrintTypedValue((
char *)data[k], j, coldef[k]->type, coldef[k]->format_string, output[i]->fp, 0);
234 if (k < output[i]->columns - 1)
235 fputc(' ', output[i]->fp);
236 }
237 fputc('\n', output[i]->fp);
238 }
239 output[i]->points += n_rows;
240 for (long k = 0; k < output[i]->columns; k++) {
241 free(data[k]);
242 }
243 } else {
245 for (long k = 0; k < output[i]->columns; k++) {
248 exit(EXIT_FAILURE);
249 }
250 }
251 output[i]->points += 1;
252 for (long k = 0; k < output[i]->columns; k++) {
253 SDDS_PrintTypedValue((
char *)¶m[k], 0, pardef[k]->type, pardef[k]->format_string, output[i]->fp, 0);
254 if (k < output[i]->columns - 1)
255 fputc(' ', output[i]->fp);
256 }
257 fputc('\n', output[i]->fp);
258 }
259 if (separate_pages && !output[i]->parameter_output) {
260 fclose(output[i]->fp);
261 output[i]->fp = NULL;
262 output[i]->points = 0;
263 }
264 }
265 }
266
267 if (page_number == 0) {
269 exit(EXIT_FAILURE);
270 }
271 if (page_number == -1 && !data_present) {
274 exit(EXIT_FAILURE);
275 }
276 fprintf(stderr, "Error: input data file is empty\n");
277 exit(EXIT_FAILURE);
278 }
279
280 for (i = 0; i < outputs; i++) {
281 if (output[i]->fp)
282 fclose(output[i]->fp);
283 }
284
285 for (i = 0; i < outputs; i++) {
286 if (!separate_pages || output[i]->parameter_output) {
287 snprintf(filename, sizeof(filename), "%s_%s_%s.out", rootname, output[i]->item[0], output[i]->item[1]);
288 fixcount(filename, output[i]->points);
289 }
290 }
291 return 0;
292}
int32_t SDDS_GetParameterIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named parameter in the SDDS dataset.
int32_t SDDS_GetColumnIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named column in the SDDS dataset.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
int32_t SDDS_NumberOfErrors()
Retrieves the number of errors recorded by SDDS library routines.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
int32_t SDDS_CopyString(char **target, const char *source)
Copies a source string to a target string with memory allocation.
int32_t SDDS_PrintTypedValue(void *data, int64_t index, int32_t type, char *format, FILE *fp, uint32_t mode)
Prints a data value of a specified type using an optional printf format string.
void * trealloc(void *old_ptr, uint64_t size_of_block)
Reallocates a memory block to a new size.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
int fixcount(char *filename, long n_points)
Updates the data point count in a specified file.
long match_string(char *string, char **option, long n_options, long mode)
Matches a given string against an array of option strings based on specified modes.
int scanargs(SCANNED_ARG **scanned, int argc, char **argv)
long processPipeOption(char **item, long items, unsigned long *flags)