/*************************************************************************\ * Copyright (c) 2002 The University of Chicago, as Operator of Argonne * National Laboratory. * Copyright (c) 2002 The Regents of the University of California, as * Operator of Los Alamos National Laboratory. * This file is distributed subject to a Software License Agreement found * in the file LICENSE that is included with this distribution. \*************************************************************************/ /* file: SDDSaps.c * contents: routines used by SDDS command-line applications * * M. Borland, 1993. $Log: SDDSaps.c,v $ Revision 1.13 2011/01/11 22:51:02 soliday Changed all the strcpy commands to strcpy_ss because of problems with RedHat Enterprise 6. If a strcpy copies the result to the same memory space you will get unexpected results. Revision 1.12 2005/11/07 22:20:55 soliday Updated to remove compiler warnings on Linux. Revision 1.11 2003/09/02 19:29:27 soliday Cleaned up code for Linux. Revision 1.10 2003/04/14 19:57:20 soliday Fixed problem with last change on Windows. Revision 1.9 2003/04/14 14:45:42 shang added processing time filter definition function Revision 1.8 2002/08/14 17:24:50 soliday Added Open License Revision 1.7 2000/05/16 19:41:34 soliday Cleaned up some Solaris compiler warnings. Revision 1.6 1999/06/03 16:03:53 soliday Removed compiler warnings under linux. Revision 1.5 1998/08/25 15:05:22 borland New version with major changes to allow multiple scales on x and y axes. * Revision 1.4 1996/07/05 16:33:50 borland * Added 0 for new mode argument of SDDS_PrintTypedValue and/or * SDDS_SprintTypedValue. * * Revision 1.3 1996/02/14 00:59:18 borland * Fixed bug in read routines (wasn't resetting row flags between requests). * Changed argument parsing over to scanItemList form scan_item_list. * * Revision 1.2 1995/09/05 21:09:11 saunders * First test release of the SDDS1.5 package. * */ #include "mdb.h" #include "SDDS.h" #include "SDDSaps.h" #include #if !defined(_WIN32) #include #endif #undef DEBUG char *data_class_keyword[DATA_CLASS_KEYWORDS] = { "column", "parameter", "array", }; static long udfCounter = 0; typedef struct { char *name, *description; unsigned long flags; } PROCESS_COLUMN_DATA ; #define PROCMODE_NORMAL 0x0000 #define PROCMODE_FUNCOF_REQUIRED 0x0001 #define PROCMODE_FUNCOF_UNITS 0x0002 #define PROCMODE_WEIGHT_OK 0x0004 #define PROCMODE_POSITION_OK 0x0008 #define PROCMODE_STRING_OK 0x0010 static char *process_column_name[N_PROCESS_COLUMN_MODES] = {NULL}; static PROCESS_COLUMN_DATA process_column_data[N_PROCESS_COLUMN_MODES] = { { "average", "average of ", PROCMODE_NORMAL|PROCMODE_WEIGHT_OK}, { "rms", "rms of ", PROCMODE_NORMAL|PROCMODE_WEIGHT_OK}, { "sum", "sum of ", PROCMODE_NORMAL|PROCMODE_WEIGHT_OK}, { "standarddeviation", "standard deviation of ", PROCMODE_NORMAL|PROCMODE_WEIGHT_OK}, { "mad", "mean absolute deviation of ", PROCMODE_NORMAL|PROCMODE_WEIGHT_OK}, { "minimum", "minimum of ", PROCMODE_NORMAL|PROCMODE_POSITION_OK}, { "maximum", "maximum of ", PROCMODE_NORMAL|PROCMODE_POSITION_OK}, { "smallest", "smallest of ", PROCMODE_NORMAL|PROCMODE_POSITION_OK}, { "largest", "largest of ", PROCMODE_NORMAL|PROCMODE_POSITION_OK}, { "first", "first ", PROCMODE_NORMAL|PROCMODE_STRING_OK}, { "last", "last ", PROCMODE_NORMAL|PROCMODE_STRING_OK}, { "count", "count ", PROCMODE_NORMAL}, { "spread", "spread in ", PROCMODE_NORMAL}, { "median", "median of ", PROCMODE_NORMAL}, { "baselevel", "base level of ", PROCMODE_NORMAL}, { "toplevel", "top level of ", PROCMODE_NORMAL}, { "amplitude", "amplitude of ", PROCMODE_NORMAL}, { "risetime", "risetime of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "falltime", "falltime of", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "fwhm", "fwhm of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "fwtm", "fwtm of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "center", "center of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "zerocrossing", "zero crossing of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "fwha", "fwha of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, { "fwta", "fwta of ", PROCMODE_FUNCOF_REQUIRED|PROCMODE_FUNCOF_UNITS}, } ; void show_process_modes(FILE *fp) { long i, length, maxLength, nPerLine; char format[10]; maxLength = 0; for (i=0; imaxLength) maxLength = length; sprintf(format, "%%%lds%%c", maxLength+1); nPerLine = 80/(maxLength+2); fprintf(fp, "processing modes:\n"); for (i=0; iitems==0) { ifitem->name = NULL; ifitem->type = NULL; } ifitem->name = trealloc(ifitem->name, sizeof(*ifitem->name)*(ifitem->items+names-1)); ifitem->type = trealloc(ifitem->type, sizeof(*ifitem->type)*(ifitem->items+names-1)); if ((type=match_string(name[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0))<0) bomb("invalid -ifnot syntax---column, parameter, or array keyword required", NULL); for (i=1; itype[ifitem->items+i-1] = type; if (!SDDS_CopyStringArray(ifitem->name+ifitem->items, name+1, names-1)) bomb("problem copying names for -ifnot or -ifis option", NULL); ifitem->items += names-1; } long check_ifitems(SDDS_DATASET *SDDS_dataset, IFITEM_LIST *ifitem, long desired) { long i, index; for (i=0; iitems; i++) { switch (ifitem->type[i]) { case COLUMN_BASED: index = SDDS_GetColumnIndex(SDDS_dataset, ifitem->name[i]); break; case PARAMETER_BASED: index = SDDS_GetParameterIndex(SDDS_dataset, ifitem->name[i]); break; case ARRAY_BASED: index = SDDS_GetArrayIndex(SDDS_dataset, ifitem->name[i]); break; default: bomb("internal error---unknown ifitem type", NULL); exit(1); break; } if ((index>=0)!=desired) { if (desired) { fprintf(stderr, "%s %s does not exist--aborting\n", data_class_keyword[ifitem->type[i]], ifitem->name[i]); return 0; } fprintf(stderr, "%s %s exists--aborting\n", data_class_keyword[ifitem->type[i]], ifitem->name[i]); return 0; } } return 1; } FILTER_DEFINITION *process_new_filter_definition(char **argument, long arguments) { FILTER_DEFINITION *defi; if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_filter_definition)", NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; break; case PARAMETER_BASED: defi->is_parameter = 1; break; default: fprintf(stderr, "error: column or parameter must be specified for filter\n"); return(NULL); } if (!(defi->filter_terms= process_filter_request(&(defi->filter_term), argument+1, arguments-1))) return(NULL); return(defi); } TIME_FILTER_DEFINITION *process_new_time_filter_definition(char **argument, long arguments) { TIME_FILTER_DEFINITION *defi; char *before, *after,*year,*month=NULL,*day=NULL,*hour,*minute,*second; short minute_n,second_n,hour_n; double hour_n1; minute_n=second_n=hour_n=0; before=after=NULL; if (!(defi = tmalloc(sizeof(*defi)))) SDDS_Bomb("memory allocation failure (process_new_filter_definition)"); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; break; case PARAMETER_BASED: defi->is_parameter = 1; break; default: fprintf(stderr, "error: column or parameter must be specified for filter\n"); return(NULL); } defi->flags=0; defi->before=defi->after=0; hour=minute=second=0; defi->name=argument[1]; arguments -= 2; argument += 2; if (!scanItemList(&defi->flags, argument, &arguments, 0, "before", SDDS_STRING, &before, 1, TIMEFILTER_BEFORE_GIVEN, "after", SDDS_STRING, &after, 1, TIMEFILTER_AFTER_GIVEN, "invert", -1,NULL, 0, TIMEFILTER_INVERT_GIVEN, NULL)) SDDS_Bomb("invalid -timeFilter syntax"); if (before) { minute_n=second_n=hour_n=0; if (!(year=get_token_tq(before,"","/","","")) || !(month=get_token_tq(before,"/","/","","")) || !(day=get_token_tq(before,"/","@","",""))) SDDS_Bomb("invalid \"before\" date given, the specified data should be YYYY/MM/DD@HH:MM:SS"); if ((hour=get_token_tq(before,"@",":","",""))) hour_n=atol(hour); if ((minute=get_token_tq(before,":",":","",""))) minute_n=atol(minute); if ((second=get_token_tq(before,":","","",""))) second_n=atol(second); hour_n1=hour_n*1.0+minute_n/60.0+second_n/3600.0; if (!TimeBreakdownToEpoch(atol(year),0,atol(month),atol(day),hour_n1,&defi->before)) SDDS_Bomb("invalid -timeFilter before syntax (something wrong with time convert)"); /*fprintf(stderr,"before: hour=%d,minute=%d,second=%d, time=%f\n",hour_n,minute_n,second_n,defi->before);*/ } if (after) { minute_n=second_n=hour_n=0; if (!(year=get_token_tq(after,"","/","","")) || !(month=get_token_tq(after,"/","/","","")) || !(day=get_token_tq(after,"/","@","",""))) SDDS_Bomb("invalid \"after\" date given, the specified data should be YYYY/MM/DD@HH:MM:SS"); if ((hour=get_token_tq(after,"@",":","",""))) hour_n=atol(hour); if ((minute=get_token_tq(after,":",":","",""))) minute_n=atol(minute); if ((second=get_token_tq(after,":","","",""))) second_n=atol(second); hour_n1=hour_n*1.0+minute_n/60.0+second_n/3600.0; if (!TimeBreakdownToEpoch(atol(year),0,atol(month),atol(day),hour_n1,&defi->after)) SDDS_Bomb("invalid -timeFilter after syntax (something wrong with time convert)"); /* fprintf(stderr,"after: hour=%d,minute=%d,second=%d, time=%f\n",hour_n,minute_n,second_n,defi->after); */ } if (before && after && defi->before < defi->after) SDDS_Bomb("Invalid -timeFilter syntx, before date is earlier than the after date!"); if (!before) defi->before=getTimeInSecs()+3600.0; /*no before time is given, accept all the time from the after date to now+3600*/ if (!after) defi->after=-1; /*no after time is given, accept all the time before the before date */ /*fprintf(stderr,"before=%f, after=%f\n",defi->before,defi->after); */ return(defi); } MATCH_DEFINITION *process_new_match_definition(char **argument, long arguments) { MATCH_DEFINITION *defi; if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_match_definition)", NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; break; case PARAMETER_BASED: defi->is_parameter = 1; break; default: fprintf(stderr, "error: column or parameter must be specified for match\n"); return(NULL); } if (!(defi->match_terms= process_match_request(&(defi->match_term), argument+1, arguments-1))) return(NULL); return(defi); } long process_filter_request(FILTER_TERM **filter, char **argument, long arguments) { long i, filters, max_filters; long need_name, need_operation; filters = 0; i = 0; max_filters = (arguments+1)/3+1; *filter = tmalloc(sizeof(**filter)*max_filters); need_name = 1; need_operation = -1; do { if (is_logic_character(argument[i][0])) { if (need_name) return(0); do { /* will come here only for &, |, or ! applying to expressions */ if (need_name) return(0); switch (argument[i][0]) { case '&': if ((*filter)[filters].logic&SDDS_AND || (*filter)[filters].logic&SDDS_OR || (*filter)[filters].logic&SDDS_NEGATE_EXPRESSION) return(0); (*filter)[filters].logic |= SDDS_AND; break; case '|': if ((*filter)[filters].logic&SDDS_AND || (*filter)[filters].logic&SDDS_OR || (*filter)[filters].logic&SDDS_NEGATE_EXPRESSION) return(0); (*filter)[filters].logic |= SDDS_OR; break; case '!': if (!((*filter)[filters].logic&SDDS_AND || (*filter)[filters].logic&SDDS_OR) || (*filter)[filters].logic&SDDS_NEGATE_EXPRESSION) return(0); (*filter)[filters].logic |= SDDS_NEGATE_EXPRESSION; } } while (++i=arguments) break; need_name = 1; } else if (need_operation>0) return(0); /* should have a triplet (name, lower, upper) in argument list now */ if (is_logic_character(argument[i][0])) return(0); if (arguments-i<3) return(0); if (filters+1>=max_filters) *filter = trealloc(*filter, sizeof(**filter)*(max_filters+=2)); (*filter)[filters].name = argument[i++]; if (sscanf(argument[i++], "%lf", &(*filter)[filters].lower)!=1 || sscanf(argument[i++], "%lf", &(*filter)[filters].upper)!=1 || (*filter)[filters].lower>(*filter)[filters].upper ) return(0); (*filter)[filters].logic = 0; if (arguments-i>0 && argument[i][0]=='!') { (*filter)[filters].logic = SDDS_NEGATE_MATCH; i++; } if (++need_operation>0) need_name = 0; else filters++; } while (arguments>i); (*filter)[0].logic |= SDDS_AND; return(filters); } long process_match_request(MATCH_TERM **match, char **argument, long arguments) { long i, matches, max_matches; long need_name, need_operation; char *ptr; matches = 0; i = 0; max_matches = (arguments+1)/3+1; *match = tmalloc(sizeof(**match)*max_matches); need_name = 1; need_operation = -1; do { if (is_logic_character(argument[i][0])) { if (need_name) return(0); do { /* will come here only for &, |, or ! applying to expressions */ if (need_name) return(0); switch (argument[i][0]) { case '&': if ((*match)[matches].logic&SDDS_AND || (*match)[matches].logic&SDDS_OR || (*match)[matches].logic&SDDS_NEGATE_EXPRESSION) return(0); (*match)[matches].logic |= SDDS_AND; break; case '|': if ((*match)[matches].logic&SDDS_AND || (*match)[matches].logic&SDDS_OR || (*match)[matches].logic&SDDS_NEGATE_EXPRESSION) return(0); (*match)[matches].logic |= SDDS_OR; break; case '!': if (!((*match)[matches].logic&SDDS_AND || (*match)[matches].logic&SDDS_OR) || (*match)[matches].logic&SDDS_NEGATE_EXPRESSION) return(0); (*match)[matches].logic |= SDDS_NEGATE_EXPRESSION; } } while (++i=arguments) break; need_name = 1; } else if (need_operation>0) return(0); /* should have a name=string object now */ if (is_logic_character(argument[i][0])) return(0); if (arguments-i<1) return(0); if (matches+1>=max_matches) *match = trealloc(*match, sizeof(**match)*(max_matches+=2)); if (!(ptr=strchr(argument[i], '='))) return(0); *ptr = 0; (*match)[matches].logic = 0; if (*(ptr+1)=='@') { (*match)[matches].logic = SDDS_INDIRECT_MATCH; ptr++; } (*match)[matches].name = argument[i++]; (*match)[matches].string = ptr+1; if (arguments-i>0 && argument[i][0]=='!') { (*match)[matches].logic |= SDDS_NEGATE_MATCH; i++; } if (++need_operation>0) need_name = 0; else matches++; } while (arguments>i); (*match)[0].logic |= SDDS_AND; return(matches); } void scan_label_parameter(LABEL_PARAMETER *label, char *string) { char *ptr; label->format = NULL; if ((ptr=strchr(string, '='))) { *ptr = 0; label->format = ptr+1; } label->name = string; } void show_matches(char *type, MATCH_TERM *match, long matches) { long i; fprintf(stderr, "\n %s matching logic:\n", type); for (i=0; i != ", match[i].name); else fprintf(stderr, " <%s> == ", match[i].name); if (match[i].logic&SDDS_INDIRECT_MATCH) fprintf(stderr, "<%s>\n", match[i].string); else fprintf(stderr, "\"%s\"\n", match[i].string); if (i!=0) { if (match[i].logic&SDDS_AND) fprintf(stderr, "&& "); if (match[i].logic&SDDS_OR) fprintf(stderr, "|| "); } if (match[i].logic&SDDS_NEGATE_EXPRESSION) fputc('!', stderr); fputc('\n', stderr); } } void show_filters(char *type, FILTER_TERM *filter, long filters) { long i; fprintf(stderr, "\n %s filtering logic:\n", type); for (i=0; i:[%22.15e, %22.15e] ) ", filter[i].name, filter[i].lower, filter[i].upper); else fprintf(stderr, " <%s>:[%22.15e, %22.15e] ", filter[i].name, filter[i].lower, filter[i].upper); if (i!=0) { if (filter[i].logic&SDDS_AND) fprintf(stderr, "&& "); if (filter[i].logic&SDDS_OR) fprintf(stderr, "|| "); } if (filter[i].logic&SDDS_NEGATE_EXPRESSION) fputc('!', stderr); fputc('\n', stderr); } } EQUATION_DEFINITION *process_new_equation_definition(char **argument, long arguments) { static char s[SDDS_MAXLINE]; char *ptr, *equation; long i; EQUATION_DEFINITION *defi; if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_equation_definition)", NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; sprintf(s, "&column name=\"%s\", ", argument[1]); break; case PARAMETER_BASED: defi->is_parameter = 1; sprintf(s, "¶meter name=\"%s\", ", argument[1]); break; default: fprintf(stderr, "error: column or parameter must be specified for definition\n"); return(NULL); } defi->name = argument[1]; equation = argument[2]; if (arguments>3) { defi->argv = tmalloc(sizeof(*defi->argv)*(arguments-3)); if (!SDDS_CopyStringArray(defi->argv, argument+3, arguments-3)) bomb("string array copy failed (process_new_equation_definition)", NULL); defi->argc = arguments-3; } else { defi->argc = 0; defi->argv = NULL; } for (i=3; itext, s)) bomb("unable to copy text of scan definition (process_new_scan_definition)", NULL); return(defi); } EDIT_DEFINITION *process_new_edit_definition(char **argument, long arguments) { static char s[SDDS_MAXLINE]; char *ptr; long i; EDIT_DEFINITION *defi; if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_equation_definition)", NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; sprintf(s, "&column name=\"%s\", ", argument[1]); break; case PARAMETER_BASED: defi->is_parameter = 1; sprintf(s, "¶meter name=\"%s\", ", argument[1]); break; default: fprintf(stderr, "error: column or parameter must be specified for edit\n"); return(NULL); } defi->new_name = argument[1]; defi->source = argument[2]; defi->edit_command = argument[3]; for (i=4; ifp); for (j=0; jfp, "%s=", pardefptr->symbol?pardefptr->symbol:label_parameter[j].name); SDDS_PrintTypedValue((void*)¶m, 0, pardefptr->type, (label_parameter[j].format?label_parameter[j].format:pardefptr->format_string), output->fp, 0); if (pardefptr->units) { if (isdigit(pardefptr->units[0])) fputc(' ', output->fp); fprintf(output->fp, "%s%s", pardefptr->units, j==label_parameters-1?"\n":" "); } else fprintf(output->fp, "%s", j==label_parameters-1?"\n":" "); } } else { if (SDDS_GetParameterIndex(SDDS_dataset, "mplTitle")<0) fprintf(output->fp, "\n%s vs %s\n", coldef[1]->description?coldef[1]->description: (coldef[1]->symbol?coldef[1]->symbol:output->item[1]), coldef[0]->description?coldef[0]->description: (coldef[0]->symbol?coldef[0]->symbol:output->item[0])); else { if (!SDDS_GetParameter(SDDS_dataset, "mplTitle", &mplTitle)) { SDDS_SetError("Unable to get value of parameter mplTitle"); SDDS_PrintErrors(stderr, SDDS_EXIT_PrintErrors|SDDS_VERBOSE_PrintErrors); } fprintf(output->fp, "\n%s\n", mplTitle); free(mplTitle); } } } else { pardef = (PARAMETER_DEFINITION**)(output->definitions = tmalloc(sizeof(*pardef)*4)); pardef[0] = pardef[1] = pardef[2] = pardef[3] = NULL; if (!(pardef[0] = SDDS_GetParameterDefinition(SDDS_dataset, output->item[0])) || !(pardef[1] = SDDS_GetParameterDefinition(SDDS_dataset, output->item[1])) || (output->item[2] && !(pardef[2] = SDDS_GetParameterDefinition(SDDS_dataset, output->item[2]))) || (output->item[3] && !(pardef[3] = SDDS_GetParameterDefinition(SDDS_dataset, output->item[3]))) ) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); exit(1); } fputs(pardef[0]->symbol?pardef[0]->symbol:output->item[0], output->fp); if (pardef[0]->units && !is_blank(pardef[0]->units)) fprintf(output->fp, " (%s)", pardef[0]->units); fprintf(output->fp, "\n%s", pardef[1]->symbol?pardef[1]->symbol:output->item[1]); if (pardef[1]->units && !is_blank(pardef[1]->units)) fprintf(output->fp, " (%s)", pardef[1]->units); if (label_parameters) { fputc('\n', output->fp); for (j=0; jfp, "%s=", pardefptr->symbol?pardefptr->symbol:label_parameter[j].name); SDDS_PrintTypedValue((void*)¶m, 0, pardefptr->type, (label_parameter[j].format?label_parameter[j].format:pardefptr->format_string), output->fp, 0); if (pardefptr->units) { if (isdigit(pardefptr->units[0])) fputc(' ', output->fp); fprintf(output->fp, "%s%s", pardefptr->units, j==label_parameters-1?"\n":" "); } else fprintf(output->fp, "%s", j==label_parameters-1?"\n":" "); } } else { if (SDDS_GetParameterIndex(SDDS_dataset, "mplTitle")<0) fprintf(output->fp, "\n%s vs %s\n", pardef[1]->description?pardef[1]->description: (pardef[1]->symbol?pardef[1]->symbol:output->item[1]), pardef[0]->description?pardef[0]->description: (pardef[0]->symbol?pardef[0]->symbol:output->item[0])); else { if (!SDDS_GetParameter(SDDS_dataset, "mplTitle", &mplTitle)) { SDDS_SetError("Unable to get value of parameter mplTitle"); SDDS_PrintErrors(stderr, SDDS_EXIT_PrintErrors|SDDS_VERBOSE_PrintErrors); } fprintf(output->fp, "\n%s\n", mplTitle); free(mplTitle); } } } if (SDDS_GetParameterIndex(SDDS_dataset, "mplTopline")<0) { fprintf(output->fp, "Data extracted from SDDS file %s", SDDS_dataset->layout.filename); if (separate_pages) fprintf(output->fp, ", page %" PRId32, SDDS_dataset->page_number); } else { if (!SDDS_GetParameter(SDDS_dataset, "mplTopline", &mplTopline)) { SDDS_SetError("Unable to get value of parameter mplTopline"); SDDS_PrintErrors(stderr, SDDS_EXIT_PrintErrors|SDDS_VERBOSE_PrintErrors); } fprintf(output->fp, "%s", mplTopline); free(mplTopline); } fprintf(output->fp, "\n%-10" PRId32 "\n", SDDS_dataset->n_rows); } #define DEBUG 0 long process_column(SDDS_DATASET *Dataset, PROCESSING_DEFINITION *processing_ptr, double *result) { double *data, *indepData, *weightData; long i, i1, i2, n_data, mode, imin, imax; double min, max, top, base, point1, point2; long returnValue, count; short *keep; i1 = 0; mode = processing_ptr->mode; #if DEBUG fprintf(stderr, "process_column: column=%s, mode=%s\n", processing_ptr->column_name, process_column_data[mode].name); #endif if ((n_data=SDDS_CountRowsOfInterest(Dataset))<=0 && mode!=PROCESS_COLUMN_COUNT) return(0); if (!(data = SDDS_GetColumnInDoubles(Dataset, processing_ptr->column_name))) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); indepData = weightData = NULL; if (processing_ptr->weightBy && !(weightData=SDDS_GetColumnInDoubles(Dataset, processing_ptr->weightBy))) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); if (processing_ptr->functionOf && !(indepData=SDDS_GetColumnInDoubles(Dataset, processing_ptr->functionOf))) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); keep = NULL; if (processing_ptr->flags&(PROCESSING_LOLIM_GIVEN|PROCESSING_UPLIM_GIVEN|PROCESSING_TAIL_GIVEN|PROCESSING_HEAD_GIVEN| PROCESSING_FTAIL_GIVEN|PROCESSING_FHEAD_GIVEN)) { keep = tmalloc(sizeof(*keep)*n_data); for (i=0; iflags&PROCESSING_LOLIM_GIVEN && indepData) { #if DEBUG fprintf(stderr, "lower limit processing: value %e\n", processing_ptr->lowerLimit); #endif for (i=0; ilowerLimit>indepData[i]) keep[i] = 0; } if (processing_ptr->flags&PROCESSING_UPLIM_GIVEN && indepData) { #if DEBUG fprintf(stderr, "upper limit processing: value %e\n", processing_ptr->upperLimit); #endif for (i=0; iupperLimitflags&PROCESSING_HEAD_GIVEN) { count = 0; #if DEBUG fprintf(stderr, "head processing: %ld points\n", processing_ptr->head); #endif if (processing_ptr->head>0) { /* keep first head points */ for (i=0; ihead; i++) if (keep[i]) count++; for (; ihead; i++) if (keep[i]) { count++; keep[i] = 0; } } } if (processing_ptr->flags&PROCESSING_FHEAD_GIVEN) { long head; count = 0; head = fabs(n_data*processing_ptr->fhead+0.5); if (processing_ptr->fhead>0) { for (i=0; iflags&PROCESSING_TAIL_GIVEN) { count = 0; #if DEBUG fprintf(stderr, "tail processing: %ld points\n", processing_ptr->tail); #endif if (processing_ptr->tail>0) { for (i=n_data-1; i>=0 && counttail; i--) if (keep[i]) count++; for (; i>=0 ; i--) keep[i] = 0; } else for (i=n_data-1; i>=0 && count< -processing_ptr->tail; i--) if (keep[i]) { count++; keep[i] = 0; } } if (processing_ptr->flags&PROCESSING_FTAIL_GIVEN) { long tail; count = 0; tail = fabs(processing_ptr->ftail*n_data+0.5); if (processing_ptr->ftail>0) { for (i=n_data-1; i>=0 && count=0 ; i--) keep[i] = 0; } else for (i=n_data-1; i>=0 && countflags&PROCESSING_OFFSET_GIVEN) { #if DEBUG fprintf(stderr, "offsetting by %f\n", processing_ptr->offset); #endif for (i=0; ioffset; } if (processing_ptr->flags&PROCESSING_FACTOR_GIVEN) { #if DEBUG fprintf(stderr, "multiplying by %f\n", processing_ptr->factor); #endif for (i=0; ifactor; } #if DEBUG fprintf(stderr, "data points:\n"); for (i=0; i=0) || (data[i]>0 && data[i+1]<=0)) break; } if (i!=n_data-1) { if (data[i]==0) *result = indepData[i]; else *result = indepData[i] + (indepData[i+1]-indepData[i])/(data[i+1]-data[i])*(-data[i]); } else returnValue = 0; break; case PROCESS_COLUMN_MEAN: if (weightData) *result = weightedAverage(data, weightData, n_data); else *result = arithmeticAverage(data, n_data); break; case PROCESS_COLUMN_RMS: if (weightData) *result = weightedRMS(data, weightData, n_data); else *result = rmsValue(data, n_data); break; case PROCESS_COLUMN_SUM: if (weightData) { double sum; for (i=sum=0; ifabs(max)) { i1 = imin; *result = fabs(min); } else { i1 = imax; *result = fabs(max); } break; case PROCESS_COLUMN_SPREAD: *result = max-min; break; } if (processing_ptr->flags&PROCESSING_POSITION_GIVEN) *result = indepData[i1]; } break; case PROCESS_COLUMN_FIRST: *result = data[0]; break; case PROCESS_COLUMN_LAST: *result = data[n_data-1]; break; case PROCESS_COLUMN_COUNT: *result = n_data; break; case PROCESS_COLUMN_MEDIAN: if (compute_median(result, data, n_data)<0) returnValue = 0; break; case PROCESS_COLUMN_BASELEVEL: case PROCESS_COLUMN_TOPLEVEL: case PROCESS_COLUMN_AMPLITUDE: case PROCESS_COLUMN_RISETIME: case PROCESS_COLUMN_FALLTIME: case PROCESS_COLUMN_FWHA: case PROCESS_COLUMN_FWTA: case PROCESS_COLUMN_CENTER: case PROCESS_COLUMN_FWHM: case PROCESS_COLUMN_FWTM: if (!findTopBaseLevels(&top, &base, data, n_data, 50, 2.0)) returnValue = 0; else { switch (mode) { case PROCESS_COLUMN_BASELEVEL: *result = base; break; case PROCESS_COLUMN_TOPLEVEL: *result = top ; break; case PROCESS_COLUMN_AMPLITUDE: *result = top-base; break; case PROCESS_COLUMN_RISETIME: if ((i1=findCrossingPoint( 0, data, n_data, base+(top-base)*0.1, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, base+(top-base)*0.9, 1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_FALLTIME: if ((i1=findCrossingPoint( 0, data, n_data, base+(top-base)*0.9, -1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, base+(top-base)*0.1, -1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_FWHA: if ((i1=findCrossingPoint( 0, data, n_data, base+(top-base)*0.5, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, base+(top-base)*0.9, -1, NULL, NULL))<0 || (i2=findCrossingPoint(i2, data, n_data, base+(top-base)*0.5, -1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_FWTA: if ((i1=findCrossingPoint( 0, data, n_data, base+(top-base)*0.1, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, base+(top-base)*0.9, -1, NULL, NULL))<0 || (i2=findCrossingPoint(i2, data, n_data, base+(top-base)*0.1, -1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_FWHM: if ((i1=findCrossingPoint( 0, data, n_data, top*0.5, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, top*0.9, -1, NULL, NULL))<0 || (i2=findCrossingPoint(i2, data, n_data, top*0.5, -1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_FWTM: if ((i1=findCrossingPoint( 0, data, n_data, top*0.1, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, top*0.9, -1, NULL, NULL))<0 || (i2=findCrossingPoint(i2, data, n_data, top*0.1, -1, indepData, &point2))<0 ) returnValue = 0; else *result = point2 - point1; break; case PROCESS_COLUMN_CENTER: if ((i1=findCrossingPoint( 0, data, n_data, base+(top-base)*0.5, 1, indepData, &point1))<0 || (i2=findCrossingPoint(i1, data, n_data, base+(top-base)*0.9, -1, NULL, NULL))<0 || (i2=findCrossingPoint(i2, data, n_data, base+(top-base)*0.5, -1, indepData, &point2))<0 ) returnValue = 0; else *result = (point1 + point2)/2; break; } } break; default: returnValue = 0; break; } free(data); if (indepData) free(indepData); if (weightData) free(weightData); if (keep) free(keep); if (!returnValue) { fprintf(stderr, "warning: processing of %s with mode %s failed--value DBL_MAX returned\n", processing_ptr->column_name, process_column_name[processing_ptr->mode]); *result = DBL_MAX; } return 1; } char *process_string_column(SDDS_DATASET *Dataset, PROCESSING_DEFINITION *processing_ptr) { char **data, *result; long i, n_data, mode; long count; short *keep; mode = processing_ptr->mode; if ((n_data=SDDS_CountRowsOfInterest(Dataset))<=0 && mode!=PROCESS_COLUMN_COUNT) return NULL; if (!(data = SDDS_GetColumn(Dataset, processing_ptr->column_name))) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); keep = NULL; if (processing_ptr->flags&(PROCESSING_TAIL_GIVEN|PROCESSING_HEAD_GIVEN| PROCESSING_FTAIL_GIVEN|PROCESSING_FHEAD_GIVEN)) { keep = tmalloc(sizeof(*keep)*n_data); for (i=0; iflags&PROCESSING_HEAD_GIVEN) { count = 0; for (i=0; ihead; i++) if (keep[i]) count++; for (; iflags&PROCESSING_FHEAD_GIVEN) { long head; count = 0; head = n_data*processing_ptr->fhead+0.5; for (i=0; iflags&PROCESSING_TAIL_GIVEN) { count = 0; for (i=n_data-1; i>=0 && counttail; i--) if (keep[i]) count++; for (; i>=0 ; i--) keep[i] = 0; } if (processing_ptr->flags&PROCESSING_FTAIL_GIVEN) { long tail; count = 0; tail = processing_ptr->ftail*n_data+0.5; for (i=n_data-1; i>=0 && count=0 ; i--) keep[i] = 0; } if (keep) { long j; for (i=j=0; icolumn_name = argument[0]; if (process_column_name[0]==NULL) { long i; for (i=0; imode=match_string(argument[1], process_column_name, N_PROCESS_COLUMN_MODES, 0))<0) { fprintf(stderr, "invalid -process mode: %s\n", argument[1]); show_process_modes(stderr); exit(1); } pd->parameter_name = argument[2]; argument += 3; arguments -= 3; pd->flags = 0; if (!scanItemList(&pd->flags, argument, &arguments, 0, "functionof", SDDS_STRING, &pd->functionOf, 1, PROCESSING_FUNCOF_GIVEN, "weightby", SDDS_STRING, &pd->weightBy, 1, PROCESSING_WEIGHT_GIVEN, "description", SDDS_STRING, &pd->description, 1, PROCESSING_DESCRIP_GIVEN, "symbol", SDDS_STRING, &pd->symbol, 1, PROCESSING_SYMBOL_GIVEN, "lowerlimit", SDDS_DOUBLE, &pd->lowerLimit, 1, PROCESSING_LOLIM_GIVEN, "upperlimit", SDDS_DOUBLE, &pd->upperLimit, 1, PROCESSING_UPLIM_GIVEN, "head", SDDS_LONG, &pd->head, 1, PROCESSING_HEAD_GIVEN, "tail", SDDS_LONG, &pd->tail, 1, PROCESSING_TAIL_GIVEN, "fhead", SDDS_DOUBLE, &pd->fhead, 1, PROCESSING_FHEAD_GIVEN, "ftail", SDDS_DOUBLE, &pd->ftail, 1, PROCESSING_FTAIL_GIVEN, "position", -1, NULL, 0, PROCESSING_POSITION_GIVEN, "offset", SDDS_DOUBLE, &pd->offset, 1, PROCESSING_OFFSET_GIVEN, "factor", SDDS_DOUBLE, &pd->factor, 1, PROCESSING_FACTOR_GIVEN, NULL)) bomb("invalid -process syntax", PROCESSING_USAGE); if (pd->flags&PROCESSING_FACTOR_GIVEN && pd->factor==0) bomb("invalid -process syntax---factor field is zero", NULL); if ((process_column_data[pd->mode].flags&PROCMODE_FUNCOF_REQUIRED) && !(pd->flags&PROCESSING_FUNCOF_GIVEN)) bomb("invalid -process syntax---functionOf option required for given mode", NULL); if (pd->flags&PROCESSING_WEIGHT_GIVEN && !(process_column_data[pd->mode].flags&PROCMODE_WEIGHT_OK)) bomb("invalid -process specification---weightBy option not available for given mode", NULL); if (pd->flags&PROCESSING_POSITION_GIVEN) { if (!(pd->flags&PROCESSING_FUNCOF_GIVEN)) bomb("invalid -process syntax---functionOf required with position option", NULL); if (!(process_column_data[pd->mode].flags&PROCMODE_POSITION_OK)) bomb("invalid -process syntax---position option not permitted for given mode", NULL); } if (pd->flags&PROCESSING_LOLIM_GIVEN && pd->flags&PROCESSING_UPLIM_GIVEN && pd->lowerLimit>=pd->upperLimit) bomb("invalid -process syntax---lowerLimit>=upperLimit", NULL); if (pd->flags&PROCESSING_HEAD_GIVEN && pd->head==0) bomb("invalid -process syntax---head=0", NULL); if (pd->flags&PROCESSING_FHEAD_GIVEN && pd->fhead==0) bomb("invalid -process syntax---fhead=0", NULL); if (pd->flags&PROCESSING_TAIL_GIVEN && pd->tail==0) bomb("invalid -process syntax---tail=0", NULL); if (pd->flags&PROCESSING_FTAIL_GIVEN && pd->ftail==0) bomb("invalid -process syntax---ftail=0", NULL); if (pd->flags&(PROCESSING_LOLIM_GIVEN|PROCESSING_UPLIM_GIVEN) && !(pd->flags&PROCESSING_FUNCOF_GIVEN)) bomb("invalid -process syntax---must give -functionOf with limit options", NULL); return(pd); } void expandProcessingDefinitions(DEFINITION **definition, long *definitions, SDDS_DATASET *SDDS_dataset) { PROCESSING_DEFINITION *procPtr; long names, idef, jdef; char **name; for (idef=0; idef<*definitions; idef++) { if ((*definition)[idef].type!=IS_PROCESSING_DEFINITION) continue; procPtr = (PROCESSING_DEFINITION*)(*definition)[idef].structure; if (!has_wildcards(procPtr->column_name)) continue; if ((names=SDDS_MatchColumns(SDDS_dataset, &name, SDDS_MATCH_STRING, FIND_ANY_TYPE, procPtr->column_name, SDDS_AND|SDDS_1_PREVIOUS))<=0) { fprintf(stderr, "Error: unable to find match to column name %s\n", procPtr->column_name); SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); exit(1); } free(procPtr->column_name); procPtr->column_name = name[0]; if (names>1) { *definition = SDDS_Realloc(*definition, sizeof(**definition)*(*definitions-1+names)); for (jdef= *definitions-1; jdef>idef; jdef--) { (*definition)[jdef+names-1].structure = (*definition)[jdef].structure; (*definition)[jdef+names-1].type = (*definition)[jdef].type; } for (jdef=names-1; jdef>0; jdef--) { procPtr = (*definition)[idef+jdef].structure = copyProcessingDefinition((*definition)[idef].structure); ((PROCESSING_DEFINITION*)(*definition)[idef+jdef].structure)->column_name = name[jdef]; (*definition)[idef+jdef].type = IS_PROCESSING_DEFINITION; } *definitions += names-1; idef += names-1; } free(name); } /* fprintf(stderr, " Final list:\n"); for (jdef=0; jdef<*definitions; jdef++) { if ((*definition)[jdef].type!=IS_PROCESSING_DEFINITION) continue; fprintf(stderr, "%ld: %s -> %s\n", jdef, ((PROCESSING_DEFINITION*)(*definition)[jdef].structure)->column_name, ((PROCESSING_DEFINITION*)(*definition)[jdef].structure)->parameter_name); } */ } PROCESSING_DEFINITION *copyProcessingDefinition(PROCESSING_DEFINITION *source) { PROCESSING_DEFINITION *target; if (!(target = (PROCESSING_DEFINITION *)calloc(1, sizeof(*target)))) { fputs("error: memory allocation failure (copyProcessingDefinition)\n", stderr); exit(1); } memcpy((char*)target, (char*)source, sizeof(*source)); /* allocate private string memory: */ SDDS_CopyString(&target->parameter_name, source->parameter_name); SDDS_CopyString(&target->description, source->description); SDDS_CopyString(&target->symbol, source->symbol); SDDS_CopyString(&target->functionOf, source->functionOf); SDDS_CopyString(&target->weightBy, source->weightBy); return target; } long complete_processing_definitions(PROCESSING_DEFINITION **processing_definition, long processing_definitions, SDDS_DATASET *SDDS_dataset) { static char s[SDDS_MAXLINE], t[SDDS_MAXLINE]; long i, index, index1; PARAMETER_DEFINITION *pardef; index1 = 0; for (i=0; icolumn_name))<0) { sprintf(s, "column %s does not exist", processing_definition[i]->column_name); SDDS_SetError(s); return(0); } switch (processing_definition[i]->type=SDDS_GetColumnType(SDDS_dataset, index)) { case SDDS_STRING: if (!(process_column_data[processing_definition[i]->mode].flags&PROCMODE_STRING_OK)) { fprintf(stderr, "column %s has the wrong type for processing (sddsprocess)\n", processing_definition[i]->column_name); exit(1); } break; case SDDS_LONG: case SDDS_SHORT: case SDDS_FLOAT: case SDDS_DOUBLE: case SDDS_CHARACTER: break; default: fprintf(stderr, "column %s has the wrong type for processing (sddsprocess)\n", processing_definition[i]->column_name); exit(1); break; } if (processing_definition[i]->flags&PROCESSING_DESCRIP_GIVEN) { if (strstr(processing_definition[i]->description, "%s")) { sprintf(s, processing_definition[i]->description, processing_definition[i]->column_name); free(processing_definition[i]->description); SDDS_CopyString(&processing_definition[i]->description, s); } } else { sprintf(s, "%s%s", process_column_data[processing_definition[i]->mode].description, processing_definition[i]->column_name); SDDS_CopyString(&processing_definition[i]->description, s); } if (strstr(processing_definition[i]->parameter_name, "%s")) { sprintf(s, processing_definition[i]->parameter_name, processing_definition[i]->column_name); free(processing_definition[i]->parameter_name); SDDS_CopyString(&processing_definition[i]->parameter_name, s); } if (processing_definition[i]->flags&PROCESSING_WEIGHT_GIVEN && (index1=SDDS_GetColumnIndex(SDDS_dataset, processing_definition[i]->weightBy))<0) { sprintf(s, "column %s does not exist", processing_definition[i]->weightBy); SDDS_SetError(s); return 0; } else if (processing_definition[i]->flags&PROCESSING_FUNCOF_GIVEN && (index1=SDDS_GetColumnIndex(SDDS_dataset, processing_definition[i]->functionOf))<0) { sprintf(s, "column %s does not exist", processing_definition[i]->functionOf); SDDS_SetError(s); return 0; } if (processing_definition[i]->type!=SDDS_STRING) sprintf(s, "¶meter name=\"%s\", type=double, description=\"%s\", ", processing_definition[i]->parameter_name, processing_definition[i]->description); else sprintf(s, "¶meter name=\"%s\", type=string, description=\"%s\", ", processing_definition[i]->parameter_name, processing_definition[i]->description); if (process_column_data[processing_definition[i]->mode].flags&PROCMODE_FUNCOF_UNITS || (processing_definition[i]->flags&PROCESSING_FUNCOF_GIVEN && processing_definition[i]->flags&PROCESSING_POSITION_GIVEN)){ if (SDDS_dataset->layout.column_definition[index1].units) { sprintf(t, "units=\"%s\", ", SDDS_dataset->layout.column_definition[index1].units); strcat(s, t); } } else { if (SDDS_dataset->layout.column_definition[index].units) { sprintf(t, "units=\"%s\", ", SDDS_dataset->layout.column_definition[index].units); strcat(s, t); } } if (processing_definition[i]->symbol) { sprintf(t, "symbol=\"%s\", ", processing_definition[i]->symbol); strcat(s, t); } strcat(s, "&end"); if (!SDDS_ProcessParameterString(SDDS_dataset, s, SDDS_WRITEONLY_DEFINITION) || !(pardef=SDDS_GetParameterDefinition(SDDS_dataset, processing_definition[i]->parameter_name))) return(0); processing_definition[i]->memory_number = pardef->memory_number; SDDS_FreeParameterDefinition(pardef); } return(1); } CONVERSION_DEFINITION *process_conversion_definition(char **argument, long arguments) { CONVERSION_DEFINITION *request; request = tmalloc(sizeof(*request)); if (arguments!=5) return(NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: request->is_parameter = 0; break; case PARAMETER_BASED: request->is_parameter = 1; break; default: return(NULL); } argument++; arguments--; request->name = argument[0]; request->new_units = argument[1]; request->old_units = argument[2]; if (sscanf(argument[3], "%lf", &request->factor)!=1) return(NULL); return(request); } long scan_column_value(SDDS_DATASET *SDDS_dataset, char *target, char *source, char *format) { char **source_value, char_value; long target_type, i, rows, target_index, source_index; float float_value; double double_value; long long_value; short short_value; static char s[SDDS_MAXLINE]; if ((source_index = SDDS_GetColumnIndex(SDDS_dataset, source))<0 || (target_index = SDDS_GetColumnIndex(SDDS_dataset, target))<0 ) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(0); } if (SDDS_GetColumnType(SDDS_dataset, source_index)!=SDDS_STRING) { fprintf(stderr, "error: source column %s has wrong type for scanning--must be string\n", source); return(0); } target_type = SDDS_GetColumnType(SDDS_dataset, target_index); if ((rows = SDDS_CountRowsOfInterest(SDDS_dataset))<0) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(0); } if (!(source_value=SDDS_GetColumn(SDDS_dataset, source))) { SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors); return(0); } for (i=0; iis_parameter = 0; sprintf(s, "&column name=\"%s\", ", argument[1]); break; case PARAMETER_BASED: defi->is_parameter = 1; sprintf(s, "¶meter name=\"%s\", ", argument[1]); break; default: fprintf(stderr, "error: column or parameter must be specified for print\n"); return(NULL); } defi->new_name = argument[1]; defi->source = NULL; defi->sources = 0; defi->printf_string = argument[2]; for (i=3; iis_parameter = 0; break; case PARAMETER_BASED: defi->is_parameter = 1; break; default: fprintf(stderr, "error: column or parameter must be specified for rpntest\n"); return(NULL); } defi->expression = argument[1]; defi->autostop = 0; if (arguments>2) { if (strncmp(argument[2], "autostop", strlen(argument[2]))==0) defi->autostop = 1; else return(NULL); } return(defi); } RPNEXPRESSION_DEFINITION *process_new_rpnexpression_definition(char **argument, long arguments) { RPNEXPRESSION_DEFINITION *defi; if (arguments>2) return(NULL); if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_rpnexpression_definition)", NULL); defi->expression = argument[0]; defi->repeat = 0; if (arguments==2) { if (strncmp(argument[1], "repeat", strlen(argument[1]))==0) defi->repeat = 1; else return NULL; } return(defi); } CLIP_DEFINITION *process_new_clip_definition(char **argument, long arguments) { CLIP_DEFINITION *defi; if (arguments<2 || arguments>3) return(NULL); if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_clip_definition)", NULL); if (sscanf(argument[0], "%ld", &defi->head)!=1 || sscanf(argument[1], "%ld", &defi->tail)!=1 || defi->head<0 || defi->tail<0) return NULL; defi->invert = 0; if (arguments==3) { if (strncmp(argument[2], "invert", strlen(argument[2]))!=0) return NULL; defi->invert = 1; } return(defi); } SPARSE_DEFINITION *process_new_sparse_definition(char **argument, long arguments) { SPARSE_DEFINITION *defi; if (arguments<1 || arguments>2) return(NULL); if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_sparse_definition)", NULL); if (sscanf(argument[0], "%ld", &defi->interval)!=1 || defi->interval<=0 || (arguments==2 && (sscanf(argument[1], "%ld", &defi->offset)!=1 || defi->offset<0))) return NULL; return defi; } SAMPLE_DEFINITION *process_new_sample_definition(char **argument, long arguments) { SAMPLE_DEFINITION *defi; if (arguments<1) return(NULL); if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_sample_definition)", NULL); if (sscanf(argument[0], "%lf", &defi->fraction)!=1) return NULL; return defi; } SYSTEM_DEFINITION *process_new_system_definition(char **argument, long arguments) { static char s[SDDS_MAXLINE]; char *ptr; long i; SYSTEM_DEFINITION *defi; if (!(defi = tmalloc(sizeof(*defi)))) bomb("memory allocation failure (process_new_system_definition)", NULL); switch (match_string(argument[0], data_class_keyword, DATA_CLASS_KEYWORDS, 0)) { case COLUMN_BASED: defi->is_parameter = 0; sprintf(s, "&column name=\"%s\", ", argument[1]); break; case PARAMETER_BASED: defi->is_parameter = 1; sprintf(s, "¶meter name=\"%s\", ", argument[1]); break; default: fprintf(stderr, "error: column or parameter must be specified for system\n"); return(NULL); } defi->new_name = argument[1]; defi->source = argument[2]; for (i=3; i0) { char **column; long rows; if ((rows=SDDS_CountRowsOfInterest(&dataset))<=0) continue; if (!(column=SDDS_GetColumn(&dataset, dataname))) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); argv_got = trealloc(argv_got, sizeof(*argv_got)*(rows+argc_got)); for (j=0; j0) { char *parameter; if (!SDDS_GetParameter(&dataset, dataname, ¶meter)) SDDS_PrintErrors(stderr, SDDS_VERBOSE_PrintErrors|SDDS_EXIT_PrintErrors); argv_got = trealloc(argv_got, sizeof(*argv_got)*(argc_got+1)); argv_got[argc_got] = parameter; argc_got += 1; } break; default: break; } SDDS_Terminate(&dataset); argc_got = scanargsg(&sa_got, argc_got, argv_got); *scanned = trealloc(*scanned, sizeof(**scanned)*(argc+argc_got)); if (argc_got>1) for (j=argc-1; j>iarg; j--) (*scanned)[j+argc_got-1] = (*scanned)[j]; for (j=0; j