- if(!filter){
- filter="";
- }
- if(!strncmp("COUNT(", filter, 6)){
- io->items[i].calc_type=CALC_TYPE_COUNT;
- io->items[i].hf_index=get_calc_field(filter+6, &flt);
- } else if (!strncmp("SUM(", filter, 4)){
- io->items[i].calc_type=CALC_TYPE_SUM;
- io->items[i].hf_index=get_calc_field(filter+4, &flt);
- switch(proto_registrar_get_nth(io->items[i].hf_index)->type){
- case FT_UINT8:
- case FT_UINT16:
- case FT_UINT24:
- case FT_UINT32:
- case FT_INT8:
- case FT_INT16:
- case FT_INT24:
- case FT_INT32:
+ field=NULL;
+ hfi=NULL;
+ for(j=0; calc_type_table[j].func_name; j++){
+ namelen=strlen(calc_type_table[j].func_name);
+ if(filter
+ && strncmp(filter, calc_type_table[j].func_name, namelen) == 0
+ && *(filter+namelen)=='('){
+ io->items[i].calc_type=calc_type_table[j].calc_type;
+
+ p=filter+namelen+1;
+ parenp=strchr(p, ')');
+ if(!parenp){
+ fprintf(stderr, "tshark: Closing parenthesis missing from calculated expression.\n");
+ exit(10);
+ }
+ /* bail out if there was no field specified */
+ if(parenp==p){
+ fprintf(stderr, "tshark: You didn't specify a field name for %s(*).\n",
+ calc_type_table[j].func_name);
+ exit(10);
+ }
+ field=g_malloc(parenp-p+1);
+ if(!field){
+ fprintf(stderr, "tshark: Out of memory.\n");
+ exit(10);
+ }
+ memcpy(field, p, parenp-p);
+ field[parenp-p] = '\0';
+ flt=parenp + 1;
+
+ hfi=proto_registrar_get_byname(field);
+ if(!hfi){
+ fprintf(stderr, "tshark: There is no field named '%s'.\n",
+ field);
+ g_free(field);
+ exit(10);
+ }
+
+ io->items[i].hf_index=hfi->id;