80 {
82 char *inputfile = NULL, *outputfile = NULL;
83 int64_t rows, irow;
84 long i, no_warnings = 0;
85 SCANNED_ARG *s_arg;
86 unsigned long pipe_flags = 0, major_order_flag;
87 void **data = NULL;
88 SourceData *column_source = NULL, *parameter_source = NULL;
89 int32_t column_sources, parameter_sources;
90 char **name;
91 char buffer[32];
92 short column_major_order = -1;
93
94
96
97
99 if (argc < 2)
101
102
103 for (int i_arg = 1; i_arg < argc; i_arg++) {
104 if (s_arg[i_arg].arg_type == OPTION) {
105
106 switch (
match_string(s_arg[i_arg].list[0], option, N_OPTIONS, 0)) {
107 case SET_MAJOR_ORDER:
108 major_order_flag = 0;
109 s_arg[i_arg].n_items--;
110 if (s_arg[i_arg].n_items > 0 && (!
scanItemList(&major_order_flag, s_arg[i_arg].list + 1, &s_arg[i_arg].n_items, 0,
111 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
112 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL))) {
113 SDDS_Bomb(
"invalid -majorOrder syntax/values");
114 }
115 column_major_order = (major_order_flag & SDDS_COLUMN_MAJOR_ORDER) ? 1 : 0;
116 break;
117 case SET_PIPE:
118 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipe_flags))
120 break;
121 case SET_NOWARNINGS:
122 no_warnings = 1;
123 break;
124 default:
125 fprintf(stderr, "error: unknown switch: %s\n", s_arg[i_arg].list[0]);
126 exit(EXIT_FAILURE);
127 }
128 } else {
129
130 if (!inputfile)
131 inputfile = s_arg[i_arg].list[0];
132 else if (!outputfile)
133 outputfile = s_arg[i_arg].list[0];
134 else
136 }
137 }
138
139
140 processFilenames(
"sddsexpand", &inputfile, &outputfile, pipe_flags, no_warnings, NULL);
141
145 }
146
147
148 SDDS_output.layout.data_mode.column_major = (column_major_order != -1) ? column_major_order : SDDS_input.layout.data_mode.column_major;
149
150
152 !(column_source =
SDDS_Malloc(
sizeof(*column_source) * column_sources))) {
154 }
155
156
157 for (i = 0; i < column_sources; i++) {
158 column_source[i].name = name[i];
162 }
164 }
165
166
168 !(parameter_source =
SDDS_Malloc(
sizeof(*parameter_source) * parameter_sources))) {
170 }
171
172
173 for (i = 0; i < parameter_sources; i++) {
174 parameter_source[i].name = name[i];
176 if (!no_warnings)
177 fprintf(stderr, "Warning (sddsexpand): name %s used for parameter and column in input file. Column data used.\n", parameter_source[i].name);
178 parameter_source[i].do_copy = 0;
179 continue;
180 }
181 parameter_source[i].do_copy = 1;
185 }
187 }
188
189
191 !(data =
SDDS_Malloc(
sizeof(*data) * column_sources))) {
193 }
194
195
197 if ((rows = SDDS_RowCount(&SDDS_input)) < 0)
198 continue;
199
200
201 for (i = 0; i < column_sources; i++) {
204 }
205 }
206
207
208 for (irow = 0; irow < rows; irow++) {
211 }
212
213
214 for (i = 0; i < parameter_sources; i++) {
215 if (!parameter_source[i].do_copy)
216 continue;
218 !
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, parameter_source[i].index, buffer, -1)) {
220 }
221 }
222
223
224 for (i = 0; i < column_sources; i++) {
225 if (!
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, column_source[i].index, (((
char *)data[i]) + irow * column_source[i].size), -1)) {
227 }
228 }
229
230
233 }
234 }
235 }
236
237
240 exit(EXIT_FAILURE);
241 }
242
243
244 free(column_source);
245 free(parameter_source);
246 return 0;
247}
int32_t SDDS_StartPage(SDDS_DATASET *SDDS_dataset, int64_t expected_n_rows)
int32_t SDDS_SetParameters(SDDS_DATASET *SDDS_dataset, int32_t mode,...)
int32_t SDDS_InitializeOutput(SDDS_DATASET *SDDS_dataset, int32_t data_mode, int32_t lines_per_row, const char *description, const char *contents, const char *filename)
Initializes the SDDS output dataset.
int32_t SDDS_WritePage(SDDS_DATASET *SDDS_dataset)
Writes the current data table to the output file.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_DefineParameterLikeColumn(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Defines a parameter in the target dataset based on a column definition from the source dataset.
int32_t SDDS_TransferParameterDefinition(SDDS_DATASET *target, SDDS_DATASET *source, char *name, char *newName)
Transfers a parameter definition from a source dataset to a target dataset.
int32_t SDDS_GetParameterType(SDDS_DATASET *SDDS_dataset, int32_t index)
Retrieves the data type of a parameter in the SDDS dataset by its index.
char ** SDDS_GetParameterNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all parameters in the SDDS dataset.
int32_t SDDS_GetParameterIndex(SDDS_DATASET *SDDS_dataset, char *name)
Retrieves the index of a named parameter in the SDDS dataset.
char ** SDDS_GetColumnNames(SDDS_DATASET *SDDS_dataset, int32_t *number)
Retrieves the names of all columns in the SDDS dataset.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void * SDDS_Malloc(size_t size)
Allocates memory of a specified size.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_GetTypeSize(int32_t type)
Retrieves the size in bytes of a specified SDDS data type.
void SDDS_Bomb(char *message)
Terminates the program after printing an error message and recorded errors.
void bomb(char *error, char *usage)
Reports error messages to the terminal and aborts the program.
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)
void processFilenames(char *programName, char **input, char **output, unsigned long pipeFlags, long noWarnings, long *tmpOutputUsed)
long scanItemList(unsigned long *flags, char **item, long *items, unsigned long mode,...)
Scans a list of items and assigns values based on provided keywords and types.