#include #include #include "dates.h" #include "gscal.h" char *days[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "Septemeber", "October", "November", "December" }; int days_in_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; NSString *read_line(FILE *fp) { char buf[81]; if(!fgets(buf,81,fp)) { return [[NSString alloc] initWithString:@" "]; } buf[strlen(buf)-1] = '\0'; return [[NSString alloc] initWithCString:buf length:strlen(buf)]; } NSComparisonResult compare(NSString *a, NSString *b, void *c) { return [a compare:b]; } int findMonth(int month, int year) { struct tm t; t.tm_mday = 1; t.tm_mon = month; t.tm_year = year - 1900; t.tm_hour = t.tm_min = t.tm_sec = t.tm_isdst = 0; mktime(&t); return t.tm_wday; } char* referenceLetter(int i) { char c, *ret; ret = malloc(sizeof(*ret) * 2); c = 'A'; ret[0] = c + i; ret[1] = 0; return ret; } id findToday(id arrayOfDates, int month, int day, int year) { int i; id aString, newString; newString = [[NSMutableString alloc] init]; for(i=0;i<[arrayOfDates count];i++) { if(aString = [[arrayOfDates objectAtIndex:i] isToday:month day:day year:year]) { newString = [newString stringByAppendingString:[NSString stringWithCString:referenceLetter(i)]]; } } return newString; } @implementation GSCalendar -initWithFile: (NSString*)fname { FILE *fp; NSString *aString; fp = fopen([fname cString],"r");; fileContents = [[NSMutableArray alloc] init]; while(aString = read_line(fp)) { if([aString isEqualToString:@" "]) { break; } [fileContents addObject:aString]; } [aString release]; fclose(fp); return self; } -drawCalendar:(NSString*)fname month:(int)month year:(int)year { [self writeTitle:fname month:month year:year]; [self drawWeeks:fname month:month year:year]; [self printReferenceTable:fname month:month year:year]; return self; } -writeTitle:(NSString*)fname month:(int)month year:(int)year { FILE *fp; int i=0; fp = fopen([fname cString],"a"); for(i=0;i<71;i++) { fprintf(fp,"-"); } fprintf(fp,"\n"); fprintf(fp,"|%-10s",months[month]); for(i=0;i<55;i++) { fprintf(fp," "); } fprintf(fp,"%4i|\n",year); for(i=0;i<71;i++) { fprintf(fp,"-"); } fprintf(fp,"\n"); fclose(fp); return self; } -writeWeek:(NSString*)fname { FILE *fp; int i=0, isDay=MONDAY; char ch[11], num[3]; fp = fopen([fname cString],"a"); while(i<70){ snprintf(num,3,"%i",i); if((num[1] == '0') || (strcmp(num,"0")==0)) { strncpy(ch,"|",3); } else if((num[1] == '1') || (strcmp(num,"1")==0)) { strncpy(ch,days[isDay++],11); } else { strncpy(ch," ",3); } i+=strlen(ch); fprintf(fp,"%s",ch); } fprintf(fp,"|\n"); for(i=0;i<71;i++) { fprintf(fp,"-"); } fprintf(fp,"\n"); fclose(fp); return self; } -sortData { [fileContents sortUsingFunction:compare context:NULL]; return self; } -printReferenceTable:(NSString*)fname month:(int)month year:(int)year { int i; id anObject, arrayOfDates, date, parsedStrings, enumerator; FILE *fp; fp = fopen([fname cString],"a"); enumerator = [fileContents objectEnumerator]; arrayOfDates = [[NSMutableArray alloc] init]; while(anObject = [enumerator nextObject]) { parsedStrings = [anObject componentsSeparatedByString:@":"]; date = [[DateEntry alloc] initWithString:[parsedStrings objectAtIndex:0] descr:[parsedStrings objectAtIndex:1]]; [arrayOfDates addObject:date]; } for(i=0;i<[arrayOfDates count];i++) { fprintf(fp,"%s: %s %i, %i\n\t\%s\n", referenceLetter(i), months[[[arrayOfDates objectAtIndex:i] getMonth]-1], [[arrayOfDates objectAtIndex:i] getDay], [[arrayOfDates objectAtIndex:i] getYear], [[[arrayOfDates objectAtIndex:i] getDescription] cString]); } fclose(fp); } -drawWeeks:(NSString*)fname month:(int)month year:(int)year { FILE *fp; int monthStartsOn, i, day=1, j, k; BOOL monthStarted = NO; id anObject; DateEntry *date; NSArray *parsedStrings; NSMutableArray *arrayOfDates; NSEnumerator *enumerator = [fileContents objectEnumerator]; fp = fopen([fname cString],"a"); [self sortData]; monthStartsOn = findMonth(month,year); arrayOfDates = [[NSMutableArray alloc] init]; while(anObject = [enumerator nextObject]) { parsedStrings = [anObject componentsSeparatedByString:@":"]; date = [[DateEntry alloc] initWithString:[parsedStrings objectAtIndex:0] descr:[parsedStrings objectAtIndex:1]]; [arrayOfDates addObject:date]; } anObject = [NSString stringWithString:@" "]; for(i=0;i<6;i++) { for(j=0;j<7;j++) { fprintf(fp,"|"); if(j==monthStartsOn) { monthStarted = YES; } if(day>days_in_month[month]) { monthStarted = NO; anObject = [NSString stringWithString:@" "]; } if(monthStarted) { anObject = [NSString stringWithFormat:@"%i:%s",day++,[findToday(arrayOfDates,month+1,day,year) cString]]; } fprintf(fp,"%-9s",[anObject cString]); } fprintf(fp,"|\n"); for(k=0;k<71;k++) { fprintf(fp,"-"); } fprintf(fp,"\n"); } [arrayOfDates release]; fclose(fp); return self; } @end