58 {
59 SCANNED_ARG *scanned;
60 long i_arg;
61 unsigned long pipe_flags = 0;
62 char *input = NULL, *output = NULL;
63 FILE *fd;
65
66 long points;
67 double *i_wave;
68 double *q_wave;
69 double max_amp = 0;
70 double min_amp = 0;
71 int i;
72 double scale;
73 short *waveform = NULL;
74 char buf;
75 char *p_char;
76
78 argc =
scanargs(&scanned, argc, argv);
79 if (argc < 2) {
80 fprintf(stderr, "%s", usage);
81 return 1;
82 }
83 for (i_arg = 1; i_arg < argc; i_arg++) {
84 if (scanned[i_arg].arg_type == OPTION) {
85 switch (
match_string(scanned[i_arg].list[0], option, N_OPTIONS, 0)) {
86 case SET_PIPE:
88 scanned[i_arg].n_items - 1, &pipe_flags)) {
89 fprintf(stderr, "invalid -pipe syntax\n");
90 return 1;
91 }
92 break;
93 default:
94 fprintf(stderr, "invalid option seen\n");
95 fprintf(stderr, "%s", usage);
96 return 1;
97 }
98 } else {
99 if (!input)
100 input = scanned[i_arg].list[0];
101 else if (!output)
102 output = scanned[i_arg].list[0];
103 else {
104 fprintf(stderr, "too many filenames\n");
105 fprintf(stderr, "%s", usage);
106 return 1;
107 }
108 }
109 }
111
114 }
116 NULL)) != SDDS_CHECK_OKAY) {
117 fprintf(stderr, "error: Floating type column named I does not exist\n");
118 return 1;
119 }
121 NULL)) != SDDS_CHECK_OKAY) {
122 fprintf(stderr, "error: Floating type column named Q does not exist\n");
123 return 1;
124 }
125
126 if (SDDS_ReadTable(&sdds_dataset) != 1) {
127 fprintf(stderr, "error: No data found in SDDS file\n");
128 return 1;
129 }
130 points = SDDS_RowCount(&sdds_dataset);
131
136 exit(1);
137 }
138
139 max_amp = i_wave[0];
140 min_amp = i_wave[0];
141 for (i = 0; i < points; i++) {
142 if (max_amp < i_wave[i])
143 max_amp = i_wave[i];
144 else if (min_amp > i_wave[i])
145 min_amp = i_wave[i];
146 if (max_amp < q_wave[i])
147 max_amp = q_wave[i];
148 else if (min_amp > q_wave[i])
149 min_amp = q_wave[i];
150 }
151 max_amp = fabs(max_amp);
152 min_amp = fabs(min_amp);
153 if (min_amp > max_amp)
154 max_amp = min_amp;
155
156 scale = 32767 / max_amp;
157 waveform = malloc(sizeof(short) * points * 2);
158 for (i = 0; i < points; i++) {
159 waveform[2 * i] = (short)floor(i_wave[i] * scale + 0.5);
160 waveform[2 * i + 1] = (short)floor(q_wave[i] * scale + 0.5);
161 }
162 free(i_wave);
163 free(q_wave);
164
166 p_char = (char *)&waveform[0];
167 for (i = 0; i < 2 * points; i++) {
168 buf = *p_char;
169 *p_char = *(p_char + 1);
170 *(p_char + 1) = buf;
171 p_char += 2;
172 }
173 }
174
175 if (!output) {
176#if defined(_WIN32)
177 if (_setmode(_fileno(stdout), _O_BINARY) == -1) {
178 fprintf(stderr, "error: unable to set stdout to binary mode\n");
179 exit(1);
180 }
181#endif
182 fd = stdout;
183 } else {
184 fd = fopen(output, "wb");
185 }
186 if (fd == NULL) {
187 fprintf(stderr, "unable to open output file for writing\n");
188 exit(1);
189 }
190 fwrite((void *)waveform, sizeof(short), points * 2, fd);
191 fclose(fd);
192 if (waveform)
193 free(waveform);
195
196 return 0;
197}
int32_t SDDS_CheckColumn(SDDS_DATASET *SDDS_dataset, char *name, char *units, int32_t type, FILE *fp_message)
Checks if a column exists in the SDDS dataset with the specified name, units, and type.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
void SDDS_RegisterProgramName(const char *name)
Registers the executable program name for use in error messages.
int32_t SDDS_IsBigEndianMachine()
Determines whether the current machine uses big-endian byte ordering.
#define SDDS_ANY_FLOATING_TYPE
Special identifier used by SDDS_Check*() routines to accept any floating-point type.
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)
void free_scanargs(SCANNED_ARG **scanned, int argc)