home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 1996 January / SOFM_Jan1996.bin / pc / os2 / zoc / install.fil / SCRIPT / OTHER / COST / READLOG / READLOG.C next >
Encoding:
C/C++ Source or Header  |  1994-12-13  |  2.6 KB  |  137 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. int d0,m0,y0;
  6. int d1,m1,y1;
  7.  
  8. FILE *f;
  9.  
  10. int date (char *s, int *d, int *m, int *y)
  11. {    if (!sscanf(s,"%d.%d.%d",d,m,y)==3)
  12.     {   fprintf(stderr,"Date format error in %s\n",s);
  13.         return 0;
  14.     }
  15.     return 1;
  16. }
  17.  
  18. char *getstring (char *dest, char *p)
  19. {    while (*p && *p!='\n' && *p!=' ' && *p!=9)
  20.     {    *dest++=*p++;
  21.     }
  22.     *dest=0;
  23.     while (*p==' ' || *p==9) p++;
  24.     return p;
  25. }
  26.  
  27. void nlstrip (char *s)
  28. {    int n=strlen(s);
  29.     if (s[n-1]=='\n') s[n-1]=0;
  30. }
  31.  
  32. int less (int d, int m, int y, int dd, int mm, int yy)
  33. {    if (y<yy) return 1;
  34.     if (y>yy) return 0;
  35.     if (m<mm) return 1;
  36.     if (m>mm) return 0;
  37.     if (d<dd) return 1;
  38.     return 0;
  39. }
  40.  
  41. int more (int d, int m, int y, int dd, int mm, int yy)
  42. {    if (y>yy) return 1;
  43.     if (y<yy) return 0;
  44.     if (m>mm) return 1;
  45.     if (m<mm) return 0;
  46.     if (d>dd) return 1;
  47.     return 0;
  48. }
  49.  
  50. int inbounds (char *s)
  51. {   int d,m,y;
  52.     if (!date(s,&d,&m,&y)) exit(1);
  53.     if (less(d,m,y,d0,m0,y0)) return 0;
  54.     if (more(d,m,y,d1,m1,y1)) return 0;
  55.     return 1;
  56. }
  57.  
  58. typedef struct liststruct
  59. {    char name[128];
  60.     double m;
  61.     struct liststruct *next;
  62. } list;
  63. list *l=0;
  64.  
  65. void addlist (char *name, double m)
  66. {    list *p=l,*n;
  67.     while (p)
  68.     {    if (!strcmp(name,p->name))
  69.         {    p->m+=m;
  70.             return;
  71.         }
  72.         p=p->next;
  73.     }
  74.     n=malloc(sizeof(list));
  75.     n->next=l;
  76.     strcpy(n->name,name);
  77.     n->m=m;
  78.     l=n;
  79. }
  80.  
  81. void scanlog (void)
  82. {    char line[1024],*p;
  83.     char date[32],value[128],name[128]="???";
  84.     double money;
  85.     list *pl;
  86.     while (!feof(f))
  87.     {    if (!fgets(line,1022,f)) break;
  88.         p=line;
  89.         p=getstring(date,p);
  90.         if (!inbounds(date)) continue;
  91.         p=getstring(value,p); /* time */
  92.         p=getstring(value,p);
  93.         if (!strcmp(value,"C+:"))
  94.         {    strcpy(name,p);
  95.             nlstrip(name);
  96.         }
  97.         else if (!strcmp(value,"C-:"))
  98.         {    p=getstring(value,p);
  99.             p=getstring(value,p);
  100.             sscanf(value,"%lg",&money);
  101.             printf("%s %6.2f  %s\n",
  102.                 date,money,name);
  103.             addlist(name,money);
  104.         }
  105.     }
  106.     printf("\nSummary for each number:\n\n");
  107.     pl=l;
  108.     money=0;
  109.     while (pl)
  110.     {    printf("%6.2f %s\n",pl->m,pl->name);
  111.         money+=pl->m;
  112.         pl=pl->next;
  113.     }
  114.     printf("\nTotal cost: %6.2f\n",money);
  115. }
  116.  
  117. void usage (void)
  118. {    fprintf(stderr,
  119.         "Use:\ndate filename dd.mm.yyyy dd.mm.yyyy\n");
  120.     exit(1);
  121. }
  122.  
  123. int main (int argc, char *argv[])
  124. {    if (argc!=4) usage();
  125.     if (!date(argv[2],&d0,&m0,&y0) ||
  126.             !date(argv[3],&d1,&m1,&y1)) usage();
  127.     printf("Log von %d.%d.%d bis %d.%d.%d:\n\n",
  128.         d0,m0,y0,d1,m1,y1);
  129.     f=fopen(argv[1],"r");
  130.     if (!f)
  131.     {   fprintf(stderr,"Could not open file %s\n",argv[1]);
  132.         usage();
  133.     }
  134.     scanlog();
  135.     fclose(f);
  136.     return 0;
  137. }