#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;
}