home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- int d0,m0,y0;
- int d1,m1,y1;
-
- FILE *f;
-
- int date (char *s, int *d, int *m, int *y)
- { if (!sscanf(s,"%d.%d.%d",d,m,y)==3)
- { fprintf(stderr,"Date format error in %s\n",s);
- return 0;
- }
- return 1;
- }
-
- char *getstring (char *dest, char *p)
- { while (*p && *p!='\n' && *p!=' ' && *p!=9)
- { *dest++=*p++;
- }
- *dest=0;
- while (*p==' ' || *p==9) p++;
- return p;
- }
-
- void nlstrip (char *s)
- { int n=strlen(s);
- if (s[n-1]=='\n') s[n-1]=0;
- }
-
- int less (int d, int m, int y, int dd, int mm, int yy)
- { if (y<yy) return 1;
- if (y>yy) return 0;
- if (m<mm) return 1;
- if (m>mm) return 0;
- if (d<dd) return 1;
- return 0;
- }
-
- int more (int d, int m, int y, int dd, int mm, int yy)
- { if (y>yy) return 1;
- if (y<yy) return 0;
- if (m>mm) return 1;
- if (m<mm) return 0;
- if (d>dd) return 1;
- return 0;
- }
-
- int inbounds (char *s)
- { int d,m,y;
- if (!date(s,&d,&m,&y)) exit(1);
- if (less(d,m,y,d0,m0,y0)) return 0;
- if (more(d,m,y,d1,m1,y1)) return 0;
- return 1;
- }
-
- typedef struct liststruct
- { char name[128];
- double m;
- struct liststruct *next;
- } list;
- list *l=0;
-
- void addlist (char *name, double m)
- { list *p=l,*n;
- while (p)
- { if (!strcmp(name,p->name))
- { p->m+=m;
- return;
- }
- p=p->next;
- }
- n=malloc(sizeof(list));
- n->next=l;
- strcpy(n->name,name);
- n->m=m;
- l=n;
- }
-
- void scanlog (void)
- { char line[1024],*p;
- char date[32],value[128],name[128]="???";
- double money;
- list *pl;
- while (!feof(f))
- { if (!fgets(line,1022,f)) break;
- p=line;
- p=getstring(date,p);
- if (!inbounds(date)) continue;
- p=getstring(value,p); /* time */
- p=getstring(value,p);
- if (!strcmp(value,"C+:"))
- { strcpy(name,p);
- nlstrip(name);
- }
- else if (!strcmp(value,"C-:"))
- { p=getstring(value,p);
- p=getstring(value,p);
- sscanf(value,"%lg",&money);
- printf("%s %6.2f %s\n",
- date,money,name);
- addlist(name,money);
- }
- }
- printf("\nSummary for each number:\n\n");
- pl=l;
- money=0;
- while (pl)
- { printf("%6.2f %s\n",pl->m,pl->name);
- money+=pl->m;
- pl=pl->next;
- }
- printf("\nTotal cost: %6.2f\n",money);
- }
-
- void usage (void)
- { fprintf(stderr,
- "Use:\ndate filename dd.mm.yyyy dd.mm.yyyy\n");
- exit(1);
- }
-
- int main (int argc, char *argv[])
- { if (argc!=4) usage();
- if (!date(argv[2],&d0,&m0,&y0) ||
- !date(argv[3],&d1,&m1,&y1)) usage();
- printf("Log von %d.%d.%d bis %d.%d.%d:\n\n",
- d0,m0,y0,d1,m1,y1);
- f=fopen(argv[1],"r");
- if (!f)
- { fprintf(stderr,"Could not open file %s\n",argv[1]);
- usage();
- }
- scanlog();
- fclose(f);
- return 0;
- }