52static char *option[N_OPTIONS] = {
60 "sddsexpand [<SDDSinputfile>] [<SDDSoutputfile>]\n"
61 " [-pipe=[input][,output]]\n"
63 " [-majorOrder=row|column]\n\n"
64 "sddsexpand is the partial inverse of sddscollapse.\n"
65 "All columns of the input file are turned into parameters in the output file.\n"
66 "For each row of each page in the input file, sddsexpand emits a new page\n"
67 "with parameter values equal to the column values for that page and row.\n\n"
68 "Program by Michael Borland. (" __DATE__
" " __TIME__
", SVN revision: " SVN_VERSION
")\n";
70#define ROW_INCREMENT 100
80int main(
int argc,
char **argv) {
82 char *inputfile = NULL, *outputfile = NULL;
84 long i, no_warnings = 0;
86 unsigned long pipe_flags = 0, major_order_flag;
88 SourceData *column_source = NULL, *parameter_source = NULL;
89 int32_t column_sources, parameter_sources;
92 short column_major_order = -1;
103 for (
int i_arg = 1; i_arg < argc; i_arg++) {
104 if (s_arg[i_arg].arg_type == OPTION) {
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");
115 column_major_order = (major_order_flag & SDDS_COLUMN_MAJOR_ORDER) ? 1 : 0;
118 if (!
processPipeOption(s_arg[i_arg].list + 1, s_arg[i_arg].n_items - 1, &pipe_flags))
125 fprintf(stderr,
"error: unknown switch: %s\n", s_arg[i_arg].list[0]);
131 inputfile = s_arg[i_arg].list[0];
132 else if (!outputfile)
133 outputfile = s_arg[i_arg].list[0];
140 processFilenames(
"sddsexpand", &inputfile, &outputfile, pipe_flags, no_warnings, NULL);
148 SDDS_output.layout.data_mode.column_major = (column_major_order != -1) ? column_major_order : SDDS_input.layout.data_mode.column_major;
152 !(column_source =
SDDS_Malloc(
sizeof(*column_source) * column_sources))) {
157 for (i = 0; i < column_sources; i++) {
158 column_source[i].name = name[i];
168 !(parameter_source =
SDDS_Malloc(
sizeof(*parameter_source) * parameter_sources))) {
173 for (i = 0; i < parameter_sources; i++) {
174 parameter_source[i].name = name[i];
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;
181 parameter_source[i].do_copy = 1;
191 !(data =
SDDS_Malloc(
sizeof(*data) * column_sources))) {
197 if ((rows = SDDS_RowCount(&SDDS_input)) < 0)
201 for (i = 0; i < column_sources; i++) {
208 for (irow = 0; irow < rows; irow++) {
214 for (i = 0; i < parameter_sources; i++) {
215 if (!parameter_source[i].do_copy)
218 !
SDDS_SetParameters(&SDDS_output, SDDS_SET_BY_INDEX | SDDS_PASS_BY_REFERENCE, parameter_source[i].index, buffer, -1)) {
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)) {
245 free(parameter_source);
SDDS (Self Describing Data Set) Data Types Definitions and Function Prototypes.
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.