Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mmxavg.c

Go to the documentation of this file.
00001 /*
00002   mmxavg.c
00003 
00004   Min-max-average code
00005 
00006   Modification history:
00007 
00008   14-Jun-2001 WPS put in checks for NULL pointers and paranoid index checks.
00009   13-Mar-2000 WPS added unused attribute to pid_h to avoid 'defined but not used' compiler warning.
00010   10-Oct-1997  FMP created
00011   */
00012 
00013 #include "mmxavg.h"             /* these declarations */
00014 
00015 /* ident tag */
00016 #ifndef __GNUC__
00017 #ifndef __attribute__
00018 #define __attribute__(x)
00019 #endif
00020 #endif
00021 
00022 static char __attribute__((unused)) ident[] = "$Id: mmxavg.c,v 1.3 2001/06/25 15:04:11 wshackle Exp $";
00023 
00024 #ifndef MAIN
00025 /* MAIN not defined-- compile functions only, no main() */
00026 
00027 int mmxavgInit(MMXAVG_STRUCT *mmxavg, double *space, int size)
00028 {
00029   if(0 == mmxavg)
00030     {
00031       return -1;
00032     }
00033   mmxavg->nums = space;
00034   mmxavg->size = size;
00035 
00036   return mmxavgReset(mmxavg);
00037 }
00038 
00039 int mmxavgReset(MMXAVG_STRUCT *mmxavg)
00040 {
00041   if(0 == mmxavg)
00042     {
00043       return -1;
00044     }
00045   mmxavg->sum = 0;
00046   mmxavg->index = 0;
00047   mmxavg->in = 0;
00048   mmxavg->inited = 0;
00049   mmxavg->min = 0.0;
00050   mmxavg->max = 0.0;
00051 
00052   return 0;
00053 }
00054 
00055 int mmxavgAdd(MMXAVG_STRUCT *mmxavg, double num)
00056 {
00057   if(0 == mmxavg)
00058     {
00059       return -1;
00060     }
00061   if(mmxavg->index >= mmxavg->size ||
00062      mmxavg->index < 0 )
00063     {
00064       return -1;
00065     }
00066   if (mmxavg->in == mmxavg->size)
00067     {
00068       /* already full-- knock off oldest */
00069       mmxavg->sum -= mmxavg->nums[mmxavg->index];
00070     }
00071   else
00072     {
00073       mmxavg->in++;
00074     }
00075 
00076   mmxavg->nums[mmxavg->index] = num;
00077   mmxavg->sum += num;
00078   mmxavg->index++;
00079   if (mmxavg->index == mmxavg->size)
00080     {
00081       mmxavg->index = 0;
00082     }
00083 
00084   if (! mmxavg->inited)
00085     {
00086       mmxavg->min = num;
00087       mmxavg->max = num;
00088       mmxavg->inited = 1;
00089     }
00090   else if (num < mmxavg->min)
00091     {
00092       mmxavg->min = num;
00093     }
00094   else if (num > mmxavg->max)
00095     {
00096       mmxavg->max = num;
00097     }
00098 
00099   return 0;
00100 }
00101 
00102 double mmxavgMin(MMXAVG_STRUCT *mmxavg)
00103 {
00104   if(0 == mmxavg)
00105     {
00106       return -1;
00107     }
00108   return mmxavg->min;
00109 }
00110 
00111 double mmxavgMax(MMXAVG_STRUCT *mmxavg)
00112 {
00113   if(0 == mmxavg)
00114     {
00115       return -1;
00116     }
00117   return mmxavg->max;
00118 }
00119 
00120 double mmxavgAvg(MMXAVG_STRUCT *mmxavg)
00121 {
00122   if(0 == mmxavg)
00123     {
00124       return -1;
00125     }
00126   if (mmxavg->in > 0)
00127     {
00128       return mmxavg->sum / mmxavg->in;
00129     }
00130   else
00131     {
00132       return 0.0;
00133     }
00134 }
00135 
00136 #else
00137 /* MAIN defined */
00138 
00139 #include <stdio.h>
00140 #include <string.h>
00141 #include <stdlib.h>
00142 
00143 /*
00144   syntax: mmx <size> {"min" | "max"}
00145   size is number of entries over which to average
00146   optional "min", "max" literals tell which to print, default is avg
00147   */
00148 int main(int argc, char *argv[])
00149 {
00150   MMXAVG_STRUCT mmxavg;
00151   int size;
00152   double *space;
00153   double num;
00154   int count = 0;
00155   int which = 3;                /* 1=min, 2=max, 3=avg printed */
00156 
00157   /* check args */
00158   if (argc < 2)
00159     {
00160       fprintf(stderr, "syntax: %s <size> {\"min\" | \"max\"}\n",
00161               argv[0]);
00162       exit(1);
00163     }
00164 
00165   /* read first mandatory arg */
00166   if (1 != sscanf(argv[1], "%d", &size) ||
00167       size < 1)
00168     {
00169       fprintf(stderr, "size arg must be > 0\n");
00170       exit(1);
00171     }
00172 
00173   /* read optional args */
00174   if (argc > 2)
00175     {
00176       if (!strcmp(argv[2], "min"))
00177         {
00178           which = 1;
00179         }
00180       else if (!strcmp(argv[2], "max"))
00181         {
00182           which = 2;
00183         }
00184       else
00185         {
00186           fprintf(stderr, "printing arg must be \"min\" or \"max\"\n");
00187           exit(1);
00188         }
00189     }
00190 
00191   /* get space */
00192   space = (double *) malloc(size * sizeof(double));
00193   mmxavgInit(&mmxavg, space, size);
00194 
00195   while (! feof(stdin))
00196     {
00197       if (1 != scanf("%lf", &num))
00198         {
00199           break;
00200         }
00201 
00202       mmxavgAdd(&mmxavg, num);
00203 
00204       if (which == 1)
00205         printf("%d\t%f\n", count++, mmxavgMin(&mmxavg));
00206       else if (which == 2)
00207         printf("%d\t%f\n", count++, mmxavgMax(&mmxavg));
00208       else
00209         printf("%d\t%f\n", count++, mmxavgAvg(&mmxavg));
00210     }
00211 
00212   /* release space */
00213   free(space);
00214 
00215   exit(0);
00216 }
00217 
00218 #endif /* MAIN defined */

Generated on Sun Dec 2 15:27:41 2001 for EMC by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001