Metropoli BBS
VIEWER: readlog.c MODE: TEXT (ASCII)
#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;
}
[ RETURN TO DIRECTORY ]