home *** CD-ROM | disk | FTP | other *** search
Wrap
#define MAX 2048 #define MAXPOSTER 33000 #include <stdio.h> #include <string.h> #include <malloc.h> enum {BIRT, DEAT} ForrigeTilstand; char Referanse[200]; int IDX[MAXPOSTER]; int SistePost; struct { char IBruk; char IBrukSomFamilie; int FFar; int FMor; int BarnAvFamilie; int AntGangerGift; int LederAvFamilie[10]; int FAntBarn; int FBarn[25]; char Kjoenn; char Etternavn[100]; char Fornavn[100]; char FoedtDato[100]; char FoedtSted[200]; char DoedDato[100]; char DoedSted[200]; char AntNotes; char *Note[30]; } Post[MAXPOSTER]; int main(int argc, char **argv){ FILE *In, *Ut, *Index; char Buff[MAX], *Peker, *Peker2, Denne, szBuff[1000]; int Nr, Nummer, Forrige,i,j, ii, jj, kk; if(argc != 2){ printf("USAGE: ged2html <GEDCOM-file>\n"); printf("Program by Frode Kvam (frode@ifi.unit.no)\n"); return(-1); } SistePost = 0; printf("Whom to contact (Your email-address): "); gets(Referanse); for(i=0;i<MAXPOSTER;i++){ Post[i].IBruk = 0; Post[i].IBrukSomFamilie = 0; Post[i].FFar = -1; Post[i].FMor = -1; Post[i].FAntBarn = 0; Post[i].AntGangerGift = 0; Post[i].BarnAvFamilie = -1; Post[i].Etternavn[0] = '\0'; Post[i].Fornavn[0] = '\0'; Post[i].FoedtDato[0] = '\0'; Post[i].FoedtSted[0] = '\0'; Post[i].DoedDato[0] = '\0'; Post[i].DoedSted[0] = '\0'; Post[i].AntNotes = 0; } if((In = fopen(argv[1], "rt")) == NULL){ printf("Cannot open input file %s\n", argv[1]); return(-1); } if((Index = fopen("index.html", "wt")) == NULL){ printf("Cannot open output file index.html\n"); return(-1); } if(fputs("<HTML>\n<title>Index to people</title>\n\n<BODY>\n<H3><b>Index to people:</b></H3><p>\n<HR>\n<UL>\n", Index) == NULL){ printf("Cannot write to index.html! Disk full?\n"); return(-1); } Denne = 0; do{ if(fgets(Buff, MAX-1, In) == NULL){ printf("Error on read!!!\n"); return (-1); } Peker2 = Buff+strlen(Buff); while(isspace((int)(char) *Peker2)) *Peker2 = '\0'; Peker = Buff; while(isspace((int)(char) *Peker)) Peker++; Nr = atoi(Peker); Peker++; while(isspace((int)(char) *Peker)) Peker++; if(Nr == 0){ /* Ny post, den forrige kan skrives ut! */ if(Denne == 'I'){ /* Skrive ut individ */ Post[Nummer].IBruk = 1; /* Lage individets egen side! */ } else if(Denne == 'F'){ /* Skrive ut familie */ Post[Nummer].IBrukSomFamilie = 1; } if(*Peker == '@'){ Peker++; Denne = *Peker; Peker++; Nummer = atoi(Peker); if(Nummer > SistePost) SistePost = Nummer; } } if(Nr == 2){ if(Denne == 'I'){ if(!strncmp(Peker, "PLAC", 4)){ if(ForrigeTilstand == BIRT){ while(!isspace((int)(char) *Peker)) Peker++; Peker++; Peker2 = Peker + strlen(Peker)-2; *Peker2 = '\0'; strcpy(Post[Nummer].FoedtSted, Peker); } if(ForrigeTilstand == DEAT){ while(!isspace((int)(char) *Peker)) Peker++; Peker++; Peker2 = Peker + strlen(Peker)-2; *Peker2 = '\0'; strcpy(Post[Nummer].DoedSted, Peker); } } if(!strncmp(Peker, "DATE", 4)){ if(ForrigeTilstand == BIRT){ while(!isspace((int)(char) *Peker)) Peker++; Peker++; Peker2 = Peker + strlen(Peker)-2; *Peker2 = '\0'; strcpy(Post[Nummer].FoedtDato, Peker); } if(ForrigeTilstand == DEAT){ while(!isspace((int)(char) *Peker)) Peker++; Peker++; Peker2 = Peker + strlen(Peker)-2; *Peker2 = '\0'; strcpy(Post[Nummer].DoedDato, Peker); } } } } if(Nr == 1){ if(Denne == 'F'){ if((!strncmp(Peker, "HUSB",4))){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; if(!strncmp(Peker, "@I", 2)){ Peker += 2; Post[Nummer].FFar = atoi(Peker); } } if((!strncmp(Peker, "WIFE",4))){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; if(!strncmp(Peker, "@I", 2)){ Peker += 2; Post[Nummer].FMor = atoi(Peker); } } if((!strncmp(Peker, "CHIL",4))){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; if(!strncmp(Peker, "@I", 2)){ Peker += 2; Post[Nummer].FBarn[Post[Nummer].FAntBarn++] = atoi(Peker); } } } if((!strncmp(Peker, "BIRT",4)) && (Denne == 'I')){ ForrigeTilstand = BIRT; } if((!strncmp(Peker, "DEAT",4)) && (Denne == 'I')){ ForrigeTilstand = DEAT; } if(!strncmp(Peker, "FAMC", 4)){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; if(!strncmp(Peker, "@F", 2)){ Peker += 2; Post[Nummer].BarnAvFamilie = atoi(Peker); } } if(!strncmp(Peker, "FAMS", 4)){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; if(!strncmp(Peker, "@F", 2)){ Peker += 2; Post[Nummer].LederAvFamilie[(Post[Nummer].AntGangerGift)++] = atoi(Peker); } } if(!strncmp(Peker, "NOTE", 4)){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; Post[Nummer].Note[(Post[Nummer].AntNotes)] = (char *) malloc(strlen(Peker)+3); strcpy(Post[Nummer].Note[(Post[Nummer].AntNotes)++],Peker); } if(!strncmp(Peker, "SEX",3)){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; Post[Nummer].Kjoenn = *Peker; } if(!strncmp(Peker, "NAME",4)){ while(!isspace((int)(char) *Peker)) Peker++; while(isspace((int)(char) *Peker)) Peker++; Peker2 = Peker + strlen(Peker)-3; if(*Peker2 == '/'){ *Peker2 = '\0'; while(*Peker2 != '/') Peker2--; strcpy(Post[Nummer].Etternavn, ++Peker2); Peker2 -= 2; } else *Peker2++; *Peker2 = '\0'; strcpy(Post[Nummer].Fornavn, Peker); } } Forrige = Nr; }while(strncmp(Peker, "TRLR",4)); for(Nummer=0;Nummer<= SistePost;Nummer++){ IDX[Nummer] = Nummer; } printf("Do you want to sort your index-file (May take some time)? (yes/no):"); gets(szBuff); if((szBuff[0] == 'y') || (szBuff[0] == 'Y')){ /* Sorter postene */ for(ii=0;ii<=(SistePost-1);ii++){ for(jj=ii+1;jj<=(SistePost);jj++){ kk = strcmp(Post[IDX[ii]].Etternavn, Post[IDX[jj]].Etternavn); if(kk == 0){ /* Likt etternavn, sjekk fornavn! */ kk = strcmp(Post[IDX[ii]].Fornavn, Post[IDX[jj]].Fornavn); if(kk > 0){ /* Mindre enn */ j = IDX[ii]; IDX[ii] = IDX[jj]; IDX[jj] = j; } } else if(kk > 0){ /* Mindre enn */ j = IDX[ii]; IDX[ii] = IDX[jj]; IDX[jj] = j; } } } } for(Nummer=0;Nummer <= SistePost;Nummer++){ if(Post[Nummer].IBruk == 1){ sprintf(szBuff," <LI><A href=\"http:i%d.html\">%s, %s b:%s</A>\n", IDX[Nummer], Post[IDX[Nummer]].Etternavn, Post[IDX[Nummer]].Fornavn, Post[IDX[Nummer]].FoedtDato); if(fputs(szBuff, Index) == NULL){ printf("Cannot write! Disk full?\n"); return (-1); } sprintf(szBuff, "i%d.html", IDX[Nummer]); /* Informasjon om hver enkelt person */ if((Ut = fopen(szBuff, "wt")) == NULL){ printf("Cannot open output file %s!\n", szBuff); return(-1); } sprintf(szBuff, "<HTML>\n<title>%s, %s</title>\n\n<BODY>\n<H3><b>\n%s %s<p>\nBorn: %s %s<p>\nDead: %s %s<p>\n<HR>\nInfo:<p>\n", Post[IDX[Nummer]].Etternavn, Post[IDX[Nummer]].Fornavn, Post[IDX[Nummer]].Fornavn, Post[IDX[Nummer]].Etternavn, Post[IDX[Nummer]].FoedtDato, Post[IDX[Nummer]].FoedtSted, Post[IDX[Nummer]].DoedDato, Post[IDX[Nummer]].DoedSted); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } for(i=0;i<(Post[IDX[Nummer]].AntNotes);i++){ sprintf(szBuff, "%s<p>\n", Post[IDX[Nummer]].Note[i]); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } } /*Foreldre*/ if(Post[Post[IDX[Nummer]].BarnAvFamilie].FFar > 0){ sprintf(szBuff, "<HR>\nParents:<p>\nFather: <A href=\"http:i%d.html\">%s, %s b:%s</A><p>\n", Post[Post[IDX[Nummer]].BarnAvFamilie].FFar, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FFar].Etternavn, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FFar].Fornavn, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FFar].FoedtDato); } else { sprintf(szBuff, "<HR>\nParents:<p>\nFather: Unknown<p>\n"); } if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } if(Post[Post[IDX[Nummer]].BarnAvFamilie].FMor > 0){ sprintf(szBuff, "Mother: <A href=\"http:i%d.html\">%s, %s b:%s</A><p>\n", Post[Post[IDX[Nummer]].BarnAvFamilie].FMor, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FMor].Etternavn, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FMor].Fornavn, Post[Post[Post[IDX[Nummer]].BarnAvFamilie].FMor].FoedtDato); } else { sprintf(szBuff, "Mother: Unknown<p>\n"); } if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } for(i=0;i<(Post[IDX[Nummer]].AntGangerGift);i++){ if(((Post[IDX[Nummer]].Kjoenn == 'M') && (Post[Post[IDX[Nummer]].LederAvFamilie[i]].FMor != -1)) || ((Post[IDX[Nummer]].Kjoenn == 'F') && (Post[Post[IDX[Nummer]].LederAvFamilie[i]].FFar != -1))){ if(Post[IDX[Nummer]].Kjoenn == 'M'){ sprintf(szBuff,"<HR>\nMarried to <A href=\"http:i%d.html\">%s, %s b:%s</A><p>\n", Post[Post[IDX[Nummer]].LederAvFamilie[i]].FMor, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FMor].Etternavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FMor].Fornavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FMor].FoedtDato); } else { sprintf(szBuff,"<HR>\nMarried to <A href=\"http:i%d.html\">%s, %s b:%s</A><p>\n", Post[Post[IDX[Nummer]].LederAvFamilie[i]].FFar, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FFar].Etternavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FFar].Fornavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FFar].FoedtDato); } if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } } if(Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn > 0){ sprintf(szBuff,"Children:<p>\n<UL>\n"); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } } for(j=0;j<Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn;j++){ sprintf(szBuff," <LI><A href=\"http:i%d.html\">%s, %s b: %s</A>\n", Post[Post[IDX[Nummer]].LederAvFamilie[i]].FBarn[j], Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FBarn[j]].Etternavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FBarn[j]].Fornavn, Post[Post[Post[IDX[Nummer]].LederAvFamilie[i]].FBarn[j]].FoedtDato); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } } if(Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn > 0){ sprintf(szBuff, "\n</UL><p>\n<HR>\n"); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } } } sprintf(szBuff, "<HR>\n<PRE></b><i>For more information about this person, contact <b>%s</b>.</i></PRE>\n<PRE><i>Press <A href=\"http:index.html\">here</A> for index page.<p>\n", Referanse); if(fputs(szBuff, Ut) == NULL){ printf("Cannot write to html-file! Disk full?\n"); return(-1); } fclose(Ut); } /* Befrir Notes */ for(i=0;i<Post[IDX[Nummer]].AntNotes;i++){ free(Post[IDX[Nummer]].Note[i]); } } if(fputs("</UL><p>\n<HR>\n\n</BODY></HTML>\n", Index) == NULL){ printf("Cannot write to index.html! Disk full?\n"); return(-1); } fclose(In); fclose(Index); }