222 {
223 SCANNED_ARG *scArg;
224 long iArg, imageColumns = 0, i, ip;
225 char **imageColumn = NULL;
226 char *ixName, *iyName, *IntensityName;
227 short xyzMode = 0;
228 unsigned long pipeFlags = 0, ROIFlags = 0, spotROIFlags = 0, blankOutFlags = 0;
229 int32_t intensityLevels = 256, saturationLevel = 254, backgroundHalfWidth = 3, lonerThreshold = 1, lonerPasses = 1;
230 long despike = 0;
233 short hotpixelFilter = 0;
234 char *inputFile = NULL, *outputFile = NULL;
235 int32_t ROI[4] = {-1, -1, -1, -1};
236 int32_t spotROISize[2] = {-1, -1};
237 char *ROIParameter[4] = {NULL, NULL, NULL, NULL};
238 int32_t blankOut[4] = {-1, -1, -1, -1};
239 char *blankOutParameter[4] = {NULL, NULL, NULL, NULL};
240 char *spotROISizeParameter[2] = {NULL, NULL};
242 long readStatus, nx, ny, outputRow, maxPages = 0;
243 double **image;
245 unsigned long sizeLinesFlags = 0, dummyFlags = 0, backgroundFlags = 0, centerFlags = 0, majorOrderFlag;
246 int32_t sizeLines[2] = {-1, -1};
247 char *sizeLinesParameter[2] = {NULL, NULL};
248 char *centerParameter[2] = {NULL, NULL};
249 double centerValue[2];
250 char **copyParamName;
251 long copyParamNames, copyBuffer[32];
252 char *spotImageFile = NULL;
253 short columnMajorOrder = -1;
255
256 if (argc < 2) {
257 fprintf(stderr, "%s%s%s", USAGE1, USAGE2, USAGE3);
258 exit(EXIT_FAILURE);
259 }
260
261 ixName = iyName = IntensityName = NULL;
262
264 for (iArg = 1; iArg < argc; iArg++) {
265 if (scArg[iArg].arg_type == OPTION) {
267
268 switch (
match_string(scArg[iArg].list[0], option, N_OPTIONS, 0)) {
269 case SET_MAJOR_ORDER:
270 majorOrderFlag = 0;
271 scArg[iArg].n_items--;
272 if (scArg[iArg].n_items > 0 &&
273 (!
scanItemList(&majorOrderFlag, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
274 "row", -1, NULL, 0, SDDS_ROW_MAJOR_ORDER,
275 "column", -1, NULL, 0, SDDS_COLUMN_MAJOR_ORDER, NULL)))
276 SDDS_Bomb(
"invalid -majorOrder syntax/values");
277 if (majorOrderFlag & SDDS_COLUMN_MAJOR_ORDER)
278 columnMajorOrder = 1;
279 else if (majorOrderFlag & SDDS_ROW_MAJOR_ORDER)
280 columnMajorOrder = 0;
281 break;
282 case SET_IMAGECOLUMNS:
283 if (scArg[iArg].n_items < 2)
284 SDDS_Bomb(
"invalid -imagecolumns syntax");
285 if (imageColumns)
286 SDDS_Bomb(
"give one and only one -imagecolumns option");
287 imageColumns = scArg[iArg].n_items - 1;
288 imageColumn =
tmalloc(
sizeof(*imageColumn) * imageColumns);
289 for (i = 0; i < imageColumns; i++)
290 imageColumn[i] = scArg[iArg].list[i + 1];
291 xyzMode = 0;
292 break;
293 case SET_ROI:
294 if (ROIFlags & OPTGIVEN)
296 ROIFlags = OPTGIVEN;
297 scArg[iArg].n_items--;
298 if (scArg[iArg].n_items < 1 ||
299 (!
scanItemList(&ROIFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
300 "x0value",
SDDS_LONG, ROI + 0, 1, X0VALUE,
301 "x1value",
SDDS_LONG, ROI + 1, 1, X1VALUE,
302 "y0value",
SDDS_LONG, ROI + 2, 1, Y0VALUE,
303 "y1value",
SDDS_LONG, ROI + 3, 1, Y1VALUE,
304 "x0parameter",
SDDS_STRING, ROIParameter + 0, 1, X0PARAM,
305 "x1parameter",
SDDS_STRING, ROIParameter + 1, 1, X1PARAM,
306 "y0parameter",
SDDS_STRING, ROIParameter + 2, 1, Y0PARAM,
307 "y1parameter",
SDDS_STRING, ROIParameter + 3, 1, Y1PARAM,
308 NULL) ||
309 ((ROIFlags & X0VALUE) && ROI[0] < 0) || ((ROIFlags & X1VALUE) && ROI[1] < 0) ||
310 ((ROIFlags & Y0VALUE) && ROI[2] < 0) || ((ROIFlags & Y1VALUE) && ROI[3] < 0) ||
311 ((ROIFlags & X0PARAM) && (!ROIParameter[0] || !strlen(ROIParameter[0]))) ||
312 ((ROIFlags & X1PARAM) && (!ROIParameter[1] || !strlen(ROIParameter[1]))) ||
313 ((ROIFlags & Y0PARAM) && (!ROIParameter[2] || !strlen(ROIParameter[2]))) ||
314 ((ROIFlags & Y1PARAM) && (!ROIParameter[3] || !strlen(ROIParameter[3])))))
316 break;
317 case SET_BLANKOUT:
318 if (blankOutFlags & OPTGIVEN)
320 blankOutFlags = OPTGIVEN;
321 scArg[iArg].n_items--;
322 if (scArg[iArg].n_items < 1 ||
323 (!
scanItemList(&blankOutFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
324 "x0value",
SDDS_LONG, blankOut + 0, 1, X0VALUE,
325 "x1value",
SDDS_LONG, blankOut + 1, 1, X1VALUE,
326 "y0value",
SDDS_LONG, blankOut + 2, 1, Y0VALUE,
327 "y1value",
SDDS_LONG, blankOut + 3, 1, Y1VALUE,
328 "x0parameter",
SDDS_STRING, blankOutParameter + 0, 1, X0PARAM,
329 "x1parameter",
SDDS_STRING, blankOutParameter + 1, 1, X1PARAM,
330 "y0parameter",
SDDS_STRING, blankOutParameter + 2, 1, Y0PARAM,
331 "y1parameter",
SDDS_STRING, blankOutParameter + 3, 1, Y1PARAM,
332 NULL) ||
333 ((blankOutFlags & X0VALUE) && blankOut[0] < 0) || ((blankOutFlags & X1VALUE) && blankOut[1] < 0) ||
334 ((blankOutFlags & Y0VALUE) && blankOut[2] < 0) || ((blankOutFlags & Y1VALUE) && blankOut[3] < 0) ||
335 ((blankOutFlags & X0PARAM) && (!blankOutParameter[0] || !strlen(blankOutParameter[0]))) ||
336 ((blankOutFlags & X1PARAM) && (!blankOutParameter[1] || !strlen(blankOutParameter[1]))) ||
337 ((blankOutFlags & Y0PARAM) && (!blankOutParameter[2] || !strlen(blankOutParameter[2]))) ||
338 ((blankOutFlags & Y1PARAM) && (!blankOutParameter[3] || !strlen(blankOutParameter[3])))))
339 SDDS_Bomb(
"invalid -blankOut syntax/values");
340 break;
341 case SET_SPOTROISIZE:
342 if (spotROIFlags & OPTGIVEN)
343 SDDS_Bomb(
"give -spotROIsize only once");
344 spotROIFlags = OPTGIVEN;
345 scArg[iArg].n_items--;
346 if (scArg[iArg].n_items < 1 ||
347 (!
scanItemList(&spotROIFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
348 "xvalue",
SDDS_LONG, spotROISize + 0, 1, X0VALUE,
349 "yvalue",
SDDS_LONG, spotROISize + 1, 1, Y0VALUE,
350 "xparameter",
SDDS_STRING, spotROISizeParameter + 0, 1, X0PARAM,
351 "yparameter",
SDDS_STRING, spotROISizeParameter + 1, 1, Y0PARAM,
352 NULL) ||
353 ((spotROIFlags & X0VALUE) && spotROISize[0] < 0) ||
354 ((spotROIFlags & Y0VALUE) && spotROISize[1] < 0) ||
355 ((spotROIFlags & X0PARAM) && (!spotROISizeParameter[0] || !strlen(spotROISizeParameter[0]))) ||
356 ((spotROIFlags & Y0PARAM) && (!spotROISizeParameter[1] || !strlen(spotROISizeParameter[1])))))
357 SDDS_Bomb(
"invalid -spotROIsize syntax/values");
358 break;
359 case SET_SIZELINES:
360 if (sizeLinesFlags & OPTGIVEN)
362 sizeLinesFlags = OPTGIVEN;
363 scArg[iArg].n_items--;
364 if (scArg[iArg].n_items < 1 ||
365 (!
scanItemList(&sizeLinesFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
366 "xvalue",
SDDS_LONG, sizeLines + 0, 1, X0VALUE,
367 "yvalue",
SDDS_LONG, sizeLines + 1, 1, Y0VALUE,
368 "xparameter",
SDDS_STRING, sizeLinesParameter + 0, 1, X0PARAM,
369 "yparameter",
SDDS_STRING, sizeLinesParameter + 1, 1, Y0PARAM,
370 NULL) ||
371 ((sizeLinesFlags & X0VALUE) && sizeLines[0] < 0) ||
372 ((sizeLinesFlags & Y0VALUE) && sizeLines[1] < 0) ||
373 ((sizeLinesFlags & X0PARAM) && (!sizeLinesParameter[0] || !strlen(sizeLinesParameter[0]))) ||
374 ((sizeLinesFlags & Y0PARAM) && (!sizeLinesParameter[1] || !strlen(sizeLinesParameter[1])))))
375 SDDS_Bomb(
"invalid -sizeLines syntax/values");
376 break;
377 case SET_DESPIKE:
378 scArg[iArg].n_items--;
379 despikeSettings.neighbors = 4;
380 despikeSettings.passes = 1;
381 despikeSettings.threshold = 0;
382 despikeSettings.averageOf = 2;
383 despikeSettings.flags = 0;
384 if (scArg[iArg].n_items > 0 &&
385 (!
scanItemList(&despikeSettings.flags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
386 "neighbors",
SDDS_LONG, &despikeSettings.neighbors, 1, 0,
387 "passes",
SDDS_LONG, &despikeSettings.passes, 1, 0,
388 "averageOf",
SDDS_LONG, &despikeSettings.averageOf, 1, DESPIKE_AVERAGEOF,
389 "threshold",
SDDS_DOUBLE, &despikeSettings.threshold, 1, 0,
390 "keep", -1, NULL, 0, DESPIKE_KEEP, NULL) ||
391 despikeSettings.neighbors < 2 || despikeSettings.passes < 1 ||
392 despikeSettings.averageOf < 2 || despikeSettings.threshold < 0))
393 SDDS_Bomb(
"invalid -despike syntax/values");
394 if (!(despikeSettings.flags & DESPIKE_AVERAGEOF))
395 despikeSettings.averageOf = despikeSettings.neighbors;
396 if (despikeSettings.averageOf > despikeSettings.neighbors)
397 SDDS_Bomb(
"invalid -despike syntax/values: averageOf>neighbors");
398 despike = 1;
399 break;
400 case SET_HOTPIXELS:
401 scArg[iArg].n_items--;
402 hotpixelSettings.passes = 1;
403 hotpixelSettings.distance = 1;
404 hotpixelSettings.fraction = -1;
405 if (scArg[iArg].n_items > 0 &&
406 (!
scanItemList(&hotpixelSettings.flags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
407 "fraction",
SDDS_DOUBLE, &hotpixelSettings.fraction, 1, 0,
408 "passes",
SDDS_LONG, &hotpixelSettings.passes, 1, 0,
409 "distance",
SDDS_LONG, &hotpixelSettings.distance, 1, 0, NULL) ||
410 hotpixelSettings.fraction <= 0 || hotpixelSettings.passes < 1 || hotpixelSettings.distance < 1))
411 SDDS_Bomb(
"invalid -hotpixelFilter syntax/values");
412 hotpixelFilter = 1;
413 break;
414 case SET_PIPE:
415 if (!
processPipeOption(scArg[iArg].list + 1, scArg[iArg].n_items - 1, &pipeFlags))
417 break;
418 case SET_LEVELS:
419 scArg[iArg].n_items--;
420 if (scArg[iArg].n_items < 1 ||
421 !
scanItemList(&dummyFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
422 "intensityLevels",
SDDS_LONG, &intensityLevels, 1, 0,
423 "saturationLevel",
SDDS_LONG, &saturationLevel, 1, 0, NULL) ||
424 intensityLevels <= 10 || saturationLevel <= 0)
425 SDDS_Bomb(
"invalid -levels syntax/values");
426 break;
427 case SET_BACKGROUND:
428 scArg[iArg].n_items--;
429 if (scArg[iArg].n_items < 1 ||
430 !
scanItemList(&backgroundFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
431 "halfwidth",
SDDS_LONG, &backgroundHalfWidth, 1, 0,
432 "symmetric", -1, NULL, 0, SYMMETRIC_BGREMOVAL,
433 "antihalo", -1, NULL, 0, ANTIHALO_BGREMOVAL,
434 "antiloner", -1, NULL, 0, REMOVE_LONERS,
435 "lonerthreshold",
SDDS_LONG, &lonerThreshold, 1, 0,
436 "lonerpasses",
SDDS_LONG, &lonerPasses, 1, 0, NULL) ||
437 backgroundHalfWidth < 0)
438 SDDS_Bomb(
"invalid -background syntax/values");
439 break;
440 case SET_SINGLESPOT:
441 if (scArg[iArg].n_items != 1)
442 SDDS_Bomb(
"invalid -singleSpot syntax/values");
443 backgroundFlags |= SINGLE_SPOT;
444 break;
445 case SET_SPOTIMAGE:
446 if (scArg[iArg].n_items != 2 || !(spotImageFile = scArg[iArg].list[1]))
447 SDDS_Bomb(
"invalid -spotImage syntax/values");
448 break;
449 case SET_CLIP_NEGATIVE:
450 backgroundFlags |= CLIP_NEGATIVE;
451 break;
452 case SET_CENTERON:
453 scArg[iArg].n_items--;
454
455 if (scArg[iArg].n_items < 1 ||
456 !
scanItemList(¢erFlags, scArg[iArg].list + 1, &scArg[iArg].n_items, 0,
457 "xcentroid", -1, NULL, 0, XCENTER_CENTROID,
458 "ycentroid", -1, NULL, 0, YCENTER_CENTROID,
459 "xpeak", -1, NULL, 0, XCENTER_PEAK,
460 "ypeak", -1, NULL, 0, YCENTER_PEAK,
461 "xparameter",
SDDS_STRING, centerParameter + 0, 1, XCENTER_PARAM,
462 "yparameter",
SDDS_STRING, centerParameter + 1, 1, YCENTER_PARAM, NULL) ||
463 bitsSet(centerFlags & (XCENTER_CENTROID + XCENTER_PEAK + XCENTER_PARAM)) != 1 ||
464 bitsSet(centerFlags & (YCENTER_CENTROID + YCENTER_PEAK + YCENTER_PARAM)) != 1)
466 break;
467 case SET_XYZ:
468 if (scArg[iArg].n_items != 4 ||
469 !strlen(ixName = scArg[iArg].list[1]) ||
470 !strlen(iyName = scArg[iArg].list[2]) ||
471 !strlen(IntensityName = scArg[iArg].list[3]))
473 xyzMode = 1;
474 break;
475 default:
476 fprintf(stderr, "unknown option %s given\n", scArg[iArg].list[0]);
477 exit(EXIT_FAILURE);
478 break;
479 }
480 } else {
481
482 if (!inputFile) {
483 inputFile = scArg[iArg].list[0];
484 } else if (!outputFile) {
485 outputFile = scArg[iArg].list[0];
486 } else
488 }
489 }
490
491 processFilenames(
"sddsspotanalysis", &inputFile, &outputFile, pipeFlags, 0, NULL);
492
493 if (!imageColumns && !IntensityName)
494 SDDS_Bomb(
"you must give either the -imageColumns or -xyz option");
495 if (imageColumns && IntensityName)
496 SDDS_Bomb(
"you must give either the -imageColumns or -xyz option, not both");
497
500 exit(EXIT_FAILURE);
501 }
502
503 if (spotImageFile &&
504 (!
SDDS_InitializeOutput(&SDDSspim, SDDS_BINARY, 0, NULL,
"sddsspotanalysis spot image", spotImageFile) ||
513 exit(EXIT_FAILURE);
514 }
515
516 if (!xyzMode) {
517 if ((imageColumns = expandColumnPairNames(&SDDSin, &imageColumn, NULL, imageColumns, NULL, 0, FIND_NUMERIC_TYPE, 0)) <= 0) {
519 SDDS_Bomb(
"No quantities selected to analyze");
520 }
521 ny = imageColumns;
522 outputRow = 0;
523 if (!(image = calloc(ny, sizeof(*image))))
525 nx = 0;
526 } else
527 ny = nx = 0;
528
529 if (!SetUpOutputFile(&SDDSout, outputFile, &SDDSin, ©ParamName, ©ParamNames, columnMajorOrder) ||
531 SDDS_Bomb(
"Problem setting up output file.");
532
534 if (readStatus > maxPages) {
536 SDDS_Bomb(
"Problem lengthening output file.");
537 maxPages += 10;
538 }
539
540
541
542 if (!xyzMode) {
543 if (!GetImageData(&nx, &image, imageColumn, ny, &SDDSin))
544 SDDS_Bomb(
"Problem getting image data.");
545 if (!nx)
546 continue;
547 } else {
548 if (!GetXYZImageData(&nx, &ny, &image, ixName, iyName, IntensityName, &SDDSin))
549 SDDS_Bomb(
"Problem getting image data.");
550 if (!nx || !ny)
551 continue;
552 }
553 if (!DetermineQuadLongValues(ROI, ROIFlags, ROIParameter, &SDDSin, nx, ny, 1)) {
555 SDDS_Bomb(
"Problem determining region of interest---verify that you gave sufficient information.");
556 }
557 if (blankOutFlags && !DetermineQuadLongValues(blankOut, blankOutFlags, blankOutParameter, &SDDSin, nx, ny, 0))
558 SDDS_Bomb(
"Problem determining blankout region---verify that you gave sufficient information.");
559 if (!DetermineDualLongValues(spotROISize, spotROIFlags, spotROISizeParameter, &SDDSin, 150))
560 SDDS_Bomb(
"Problem determine size of spot region of interest---verify that you gave sufficient information.");
561 if (!DetermineDualLongValues(sizeLines, sizeLinesFlags, sizeLinesParameter, &SDDSin, 3))
562 SDDS_Bomb(
"Problem determine size of number of lines to use for spot size computation---verify that you gave sufficient information.");
563 centerValue[0] = centerValue[1] = -1;
565 SDDS_Bomb(
"Problem getting center parameter value for x.");
567 SDDS_Bomb(
"Problem getting center parameter value for y.");
568 if (blankOutFlags)
569 BlankOutImageData(image, nx, ny, blankOut);
570 if (!AnalyzeImageData(image, nx, ny, ROI, spotROISize, sizeLines,
571 despike ? &despikeSettings : NULL, hotpixelFilter ? &hotpixelSettings : NULL, intensityLevels,
572 saturationLevel, backgroundHalfWidth, lonerThreshold, lonerPasses, backgroundFlags | centerFlags,
573 &analysisResults, spotImageFile ? &SDDSspim : NULL, centerValue))
574 continue;
575 for (ip = 0; ip < copyParamNames; ip++) {
577 SDDS_Bomb(
"Problem reading parameter data from input file.");
578 if (!
SDDS_SetRowValues(&SDDSout, SDDS_SET_BY_NAME | SDDS_PASS_BY_REFERENCE, outputRow, copyParamName[ip], copyBuffer, NULL)) {
579 SDDS_Bomb(
"Problem copying parameter data from input file.");
580 }
581 }
582 if (!
SDDS_SetRowValues(&SDDSout, SDDS_SET_BY_NAME | SDDS_PASS_BY_VALUE, outputRow++,
583 "ImageIndex", readStatus - 1,
584 "xROILower", analysisResults.ROI[0],
585 "xROIUpper", analysisResults.ROI[1],
586 "yROILower", analysisResults.ROI[2],
587 "yROIUpper", analysisResults.ROI[3],
588 "xSpotROILower", analysisResults.spotROI[0],
589 "xSpotROIUpper", analysisResults.spotROI[1],
590 "ySpotROILower", analysisResults.spotROI[2],
591 "ySpotROIUpper", analysisResults.spotROI[3],
592 "xSpotCenter", analysisResults.spotCenter[0],
593 "ySpotCenter", analysisResults.spotCenter[1],
594 "xSpotCentroid", analysisResults.spotCentroid[0],
595 "ySpotCentroid", analysisResults.spotCentroid[1],
596 "xSpotSigma", analysisResults.spotSigma[0],
597 "xSpotRange50", analysisResults.spotRange50[0],
598 "xSpotRange65", analysisResults.spotRange65[0],
599 "xSpotRange80", analysisResults.spotRange80[0],
600 "ySpotSigma", analysisResults.spotSigma[1],
601 "ySpotRange50", analysisResults.spotRange50[1],
602 "ySpotRange65", analysisResults.spotRange65[1],
603 "ySpotRange80", analysisResults.spotRange80[1],
604 "BackgroundLevel", analysisResults.backgroundLevel,
605 "BackgroundKilledPositive", analysisResults.backgroundKilledPositive,
606 "BackgroundKilledNegative", analysisResults.backgroundKilledNegative,
607 "IntegratedSpotIntensity", analysisResults.integratedSpotIntensity,
608 "PeakSpotIntensity", analysisResults.peakSpotIntensity,
609 "SaturationCount", analysisResults.saturationCount,
610 "phi", analysisResults.phi,
611 "rmsCrossProduct", analysisResults.rmsCrossProduct,
612 "majorAxis", analysisResults.majorAxis,
613 "minorAxis", analysisResults.minorAxis,
614 "S11", analysisResults.S11,
615 "S33", analysisResults.S33,
616 "S13", analysisResults.rmsCrossProduct, NULL)) {
619 }
620 }
625 for (i = 0; i < ny; i++)
626 free(image[i]);
627 if (!xyzMode) {
628 for (i = 0; i < ny; i++)
629 free(imageColumn[i]);
630 free(imageColumn);
631 }
632 for (i = 0; i < copyParamNames; i++)
633 free(copyParamName[i]);
634 free(copyParamName);
635 free(image);
636 return EXIT_SUCCESS;
637}
int32_t SDDS_LengthenTable(SDDS_DATASET *SDDS_dataset, int64_t n_additional_rows)
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_DefineColumn(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, int32_t field_length)
Defines a data column within the SDDS dataset.
int32_t SDDS_WriteLayout(SDDS_DATASET *SDDS_dataset)
Writes the SDDS layout header to the output file.
int32_t SDDS_DefineParameter(SDDS_DATASET *SDDS_dataset, const char *name, const char *symbol, const char *units, const char *description, const char *format_string, int32_t type, char *fixed_value)
Defines a data parameter with a fixed string value.
void SDDS_PrintErrors(FILE *fp, int32_t mode)
Prints recorded error messages to a specified file stream.
#define SDDS_STRING
Identifier for the string data type.
#define SDDS_LONG
Identifier for the signed 32-bit integer data type.
#define SDDS_SHORT
Identifier for the signed short integer data type.
#define SDDS_DOUBLE
Identifier for the double data type.
long bitsSet(unsigned long data)
Counts the number of set bits (1s) in the given data.
char * delete_chars(char *s, char *t)
Removes all occurrences of characters found in string t from string s.
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 scanargsg(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.