home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / KAND / GED2HTML.ZIP / GED2HTML.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-01  |  13.3 KB  |  387 lines

  1. #define MAX 2048
  2. #define MAXPOSTER 33000
  3.  
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <malloc.h>
  7.  
  8. enum {BIRT, DEAT} ForrigeTilstand;
  9.  
  10. char Referanse[200];
  11. int  IDX[MAXPOSTER];
  12. int SistePost;
  13.  
  14. struct {
  15.    char IBruk;
  16.    char IBrukSomFamilie;
  17.    int  FFar;
  18.    int  FMor;
  19.    int  BarnAvFamilie;
  20.    int  AntGangerGift;
  21.    int  LederAvFamilie[10];
  22.    int  FAntBarn;
  23.    int  FBarn[25];
  24.    char Kjoenn;
  25.    char Etternavn[100];
  26.    char Fornavn[100];
  27.    char FoedtDato[100];
  28.    char FoedtSted[200];
  29.    char DoedDato[100];
  30.    char DoedSted[200];
  31.    char AntNotes;
  32.    char *Note[30];
  33. } Post[MAXPOSTER];
  34.  
  35.  
  36. int main(int argc, char **argv){
  37. FILE *In, *Ut, *Index;
  38. char Buff[MAX], *Peker, *Peker2, Denne, szBuff[1000];
  39. int Nr, Nummer, Forrige,i,j, ii, jj, kk;
  40.  
  41. if(argc != 2){
  42.    printf("USAGE: ged2html <GEDCOM-file>\n");
  43.    printf("Program by Frode Kvam (frode@ifi.unit.no)\n");
  44.    return(-1);
  45. }
  46. SistePost = 0;
  47. printf("Whom to contact (Your email-address): ");
  48. gets(Referanse);
  49.  
  50.    for(i=0;i<MAXPOSTER;i++){
  51.       Post[i].IBruk = 0;
  52.       Post[i].IBrukSomFamilie = 0;
  53.       Post[i].FFar = -1;
  54.       Post[i].FMor = -1;
  55.       Post[i].FAntBarn = 0;
  56.       Post[i].AntGangerGift = 0;
  57.       Post[i].BarnAvFamilie = -1;
  58.       Post[i].Etternavn[0] = '\0';
  59.       Post[i].Fornavn[0] = '\0';
  60.       Post[i].FoedtDato[0] = '\0';
  61.       Post[i].FoedtSted[0] = '\0';
  62.       Post[i].DoedDato[0] = '\0';
  63.       Post[i].DoedSted[0] = '\0';
  64.       Post[i].AntNotes = 0;
  65.    }
  66.  
  67.    if((In = fopen(argv[1], "rt")) == NULL){
  68.       printf("Cannot open input file %s\n", argv[1]);
  69.       return(-1);
  70.    }  
  71.    if((Index = fopen("index.html", "wt")) == NULL){
  72.       printf("Cannot open output file index.html\n");
  73.       return(-1);
  74.    }
  75.    
  76.    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){
  77.       printf("Cannot write to index.html!  Disk full?\n");
  78.       return(-1);
  79.    }
  80.  
  81.    Denne = 0;
  82.  
  83.    do{
  84.        if(fgets(Buff, MAX-1, In) == NULL){
  85.           printf("Error on read!!!\n");
  86.       return (-1);
  87.        }
  88.        Peker2 = Buff+strlen(Buff);
  89.        while(isspace((int)(char) *Peker2))
  90.       *Peker2 = '\0';
  91.        Peker = Buff;
  92.        while(isspace((int)(char) *Peker))
  93.           Peker++;
  94.        Nr = atoi(Peker);
  95.        Peker++;
  96.        while(isspace((int)(char) *Peker)) 
  97.           Peker++;
  98.  
  99.        if(Nr == 0){  /* Ny post, den forrige kan skrives ut! */
  100.           if(Denne == 'I'){  /* Skrive ut individ */
  101.          Post[Nummer].IBruk = 1;
  102.  
  103.          /* Lage individets egen side! */
  104.          
  105.       } else
  106.       if(Denne == 'F'){ /* Skrive ut familie */
  107.          Post[Nummer].IBrukSomFamilie = 1;
  108.       }
  109.           if(*Peker == '@'){
  110.          Peker++;
  111.          Denne = *Peker;
  112.          Peker++;
  113.          Nummer = atoi(Peker);
  114.          if(Nummer > SistePost)
  115.            SistePost = Nummer;
  116.       }
  117.        }
  118.  
  119.        if(Nr == 2){
  120.       if(Denne == 'I'){
  121.            if(!strncmp(Peker, "PLAC", 4)){
  122.              if(ForrigeTilstand == BIRT){
  123.                 while(!isspace((int)(char) *Peker))
  124.                    Peker++;
  125.                 Peker++;
  126.                 Peker2 = Peker + strlen(Peker)-2;
  127.                 *Peker2 = '\0';
  128.                 strcpy(Post[Nummer].FoedtSted, Peker);
  129.           }
  130.              if(ForrigeTilstand == DEAT){
  131.                 while(!isspace((int)(char) *Peker))
  132.                    Peker++;
  133.                 Peker++;
  134.                 Peker2 = Peker + strlen(Peker)-2;
  135.                 *Peker2 = '\0';
  136.                 strcpy(Post[Nummer].DoedSted, Peker);
  137.               }
  138.        }
  139.  
  140.       if(!strncmp(Peker, "DATE", 4)){
  141.          if(ForrigeTilstand == BIRT){
  142.             while(!isspace((int)(char) *Peker))
  143.                    Peker++;
  144.         Peker++;
  145.         Peker2 = Peker + strlen(Peker)-2;
  146.         *Peker2 = '\0';
  147.         strcpy(Post[Nummer].FoedtDato, Peker);
  148.          }
  149.              if(ForrigeTilstand == DEAT){
  150.                 while(!isspace((int)(char) *Peker))
  151.                    Peker++;
  152.                 Peker++;
  153.                 Peker2 = Peker + strlen(Peker)-2;
  154.                 *Peker2 = '\0';
  155.                 strcpy(Post[Nummer].DoedDato, Peker);
  156.           }
  157.       }
  158.     }
  159.        }
  160.        if(Nr == 1){
  161.       if(Denne == 'F'){
  162.          if((!strncmp(Peker, "HUSB",4))){
  163.                 while(!isspace((int)(char) *Peker))
  164.                    Peker++;
  165.                 while(isspace((int)(char) *Peker))
  166.                    Peker++;
  167.                 if(!strncmp(Peker, "@I", 2)){
  168.                    Peker += 2;
  169.                    Post[Nummer].FFar = atoi(Peker);
  170.             }
  171.          }  
  172.              if((!strncmp(Peker, "WIFE",4))){
  173.                 while(!isspace((int)(char) *Peker))
  174.                    Peker++;
  175.                 while(isspace((int)(char) *Peker))
  176.                    Peker++;
  177.                 if(!strncmp(Peker, "@I", 2)){
  178.                    Peker += 2;
  179.                    Post[Nummer].FMor = atoi(Peker);
  180.          }
  181.           }
  182.              if((!strncmp(Peker, "CHIL",4))){
  183.                 while(!isspace((int)(char) *Peker))
  184.                    Peker++;
  185.                 while(isspace((int)(char) *Peker))
  186.                    Peker++;
  187.                 if(!strncmp(Peker, "@I", 2)){
  188.                    Peker += 2;
  189.                    Post[Nummer].FBarn[Post[Nummer].FAntBarn++] = atoi(Peker);
  190.                  }
  191.               }
  192.       }
  193.           if((!strncmp(Peker, "BIRT",4)) && (Denne == 'I')){
  194.          ForrigeTilstand = BIRT;
  195.       }
  196.           if((!strncmp(Peker, "DEAT",4)) && (Denne == 'I')){
  197.              ForrigeTilstand = DEAT;
  198.       }
  199.       if(!strncmp(Peker, "FAMC", 4)){
  200.              while(!isspace((int)(char) *Peker))
  201.                 Peker++;
  202.              while(isspace((int)(char) *Peker))
  203.                 Peker++;
  204.          if(!strncmp(Peker, "@F", 2)){
  205.             Peker += 2;
  206.         Post[Nummer].BarnAvFamilie = atoi(Peker);
  207.          }
  208.       }
  209.       if(!strncmp(Peker, "FAMS", 4)){
  210.              while(!isspace((int)(char) *Peker))
  211.                 Peker++;
  212.              while(isspace((int)(char) *Peker))
  213.                 Peker++;
  214.              if(!strncmp(Peker, "@F", 2)){
  215.                 Peker += 2;
  216.         Post[Nummer].LederAvFamilie[(Post[Nummer].AntGangerGift)++] = atoi(Peker);
  217.           }
  218.  
  219.       }
  220.       if(!strncmp(Peker, "NOTE", 4)){
  221.              while(!isspace((int)(char) *Peker))
  222.                 Peker++;
  223.              while(isspace((int)(char) *Peker))
  224.                 Peker++;
  225.          Post[Nummer].Note[(Post[Nummer].AntNotes)] = (char *) malloc(strlen(Peker)+3);
  226.          strcpy(Post[Nummer].Note[(Post[Nummer].AntNotes)++],Peker);
  227.       }
  228.  
  229.  
  230.       if(!strncmp(Peker, "SEX",3)){
  231.              while(!isspace((int)(char) *Peker))      
  232.                 Peker++;          
  233.          while(isspace((int)(char) *Peker))
  234.             Peker++;  
  235.          Post[Nummer].Kjoenn = *Peker;
  236.       } 
  237.           if(!strncmp(Peker, "NAME",4)){            
  238.              while(!isspace((int)(char) *Peker))
  239.                 Peker++;
  240.              while(isspace((int)(char) *Peker))
  241.                 Peker++;
  242.          Peker2 = Peker + strlen(Peker)-3;
  243.          if(*Peker2 == '/'){
  244.             *Peker2 = '\0';
  245.         while(*Peker2 != '/')
  246.                Peker2--;
  247.         strcpy(Post[Nummer].Etternavn, ++Peker2);
  248.         Peker2 -= 2;
  249.           } else
  250.         *Peker2++;
  251.          *Peker2 = '\0';
  252.          
  253.          strcpy(Post[Nummer].Fornavn, Peker);
  254.        }
  255.        }
  256.    Forrige = Nr;
  257.     }while(strncmp(Peker, "TRLR",4));
  258.  
  259.    for(Nummer=0;Nummer<= SistePost;Nummer++){
  260.       IDX[Nummer] = Nummer;
  261.    }
  262.    printf("Do you want to sort your index-file (May take some time)? (yes/no):");
  263.    gets(szBuff);
  264.    if((szBuff[0] == 'y') || (szBuff[0] == 'Y')){
  265.       /* Sorter postene */
  266.       for(ii=0;ii<=(SistePost-1);ii++){
  267.     for(jj=ii+1;jj<=(SistePost);jj++){
  268.       kk = strcmp(Post[IDX[ii]].Etternavn, Post[IDX[jj]].Etternavn);
  269.       if(kk == 0){  /* Likt etternavn, sjekk fornavn! */
  270.         kk = strcmp(Post[IDX[ii]].Fornavn, Post[IDX[jj]].Fornavn);
  271.         if(kk > 0){   /* Mindre enn */
  272.              j = IDX[ii];
  273.              IDX[ii] = IDX[jj];
  274.              IDX[jj] = j;
  275.        }
  276.       } else
  277.       if(kk > 0){   /* Mindre enn */
  278.          j = IDX[ii];
  279.          IDX[ii] = IDX[jj];
  280.          IDX[jj] = j;
  281.       }
  282.     } 
  283.       }
  284.    }
  285.  
  286.    for(Nummer=0;Nummer <= SistePost;Nummer++){
  287.       if(Post[Nummer].IBruk == 1){
  288.          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);
  289.          if(fputs(szBuff, Index) == NULL){
  290.             printf("Cannot write!  Disk full?\n");
  291.             return (-1);
  292.          }
  293.      sprintf(szBuff, "i%d.html", IDX[Nummer]);
  294.      /* Informasjon om hver enkelt person */
  295.      if((Ut = fopen(szBuff, "wt")) == NULL){
  296.        printf("Cannot open output file %s!\n", szBuff);
  297.        return(-1);
  298.      }
  299.         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);
  300.         if(fputs(szBuff, Ut) == NULL){
  301.           printf("Cannot write to html-file!  Disk full?\n");
  302.           return(-1);
  303.         }        
  304.         for(i=0;i<(Post[IDX[Nummer]].AntNotes);i++){
  305.            sprintf(szBuff, "%s<p>\n", Post[IDX[Nummer]].Note[i]);
  306.            if(fputs(szBuff, Ut) == NULL){
  307.               printf("Cannot write to html-file!  Disk full?\n");
  308.           return(-1);
  309.            }
  310.         }
  311. /*Foreldre*/
  312.        if(Post[Post[IDX[Nummer]].BarnAvFamilie].FFar > 0){
  313.               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);
  314.        } else {
  315.          sprintf(szBuff, "<HR>\nParents:<p>\nFather: Unknown<p>\n");
  316.        }
  317.            if(fputs(szBuff, Ut) == NULL){
  318.               printf("Cannot write to html-file!  Disk full?\n");
  319.               return(-1);
  320.         }
  321.  
  322.            if(Post[Post[IDX[Nummer]].BarnAvFamilie].FMor > 0){      
  323.               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);
  324.         } else {
  325.              sprintf(szBuff, "Mother: Unknown<p>\n");
  326.            }
  327.            if(fputs(szBuff, Ut) == NULL){
  328.               printf("Cannot write to html-file!  Disk full?\n");
  329.               return(-1);
  330.        }
  331.  
  332.         for(i=0;i<(Post[IDX[Nummer]].AntGangerGift);i++){
  333.           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))){
  334.            if(Post[IDX[Nummer]].Kjoenn == 'M'){
  335.                  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);
  336.            } else {
  337.                   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);
  338.            }
  339.            if(fputs(szBuff, Ut) == NULL){
  340.                   printf("Cannot write to html-file!  Disk full?\n");
  341.                   return(-1);
  342.            }
  343.          }
  344.           if(Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn > 0){
  345.         sprintf(szBuff,"Children:<p>\n<UL>\n");
  346.                 if(fputs(szBuff, Ut) == NULL){
  347.                   printf("Cannot write to html-file!  Disk full?\n");
  348.                   return(-1);
  349.         }
  350.           }
  351.            for(j=0;j<Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn;j++){
  352.           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);
  353.         if(fputs(szBuff, Ut) == NULL){
  354.                   printf("Cannot write to html-file!  Disk full?\n");
  355.                   return(-1);
  356.                 }
  357.            }
  358.           if(Post[Post[IDX[Nummer]].LederAvFamilie[i]].FAntBarn > 0){
  359.          sprintf(szBuff, "\n</UL><p>\n<HR>\n");
  360.                 if(fputs(szBuff, Ut) == NULL){
  361.                   printf("Cannot write to html-file!  Disk full?\n");
  362.                   return(-1);
  363.                 }
  364.           }
  365.         }
  366.               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);
  367.               if(fputs(szBuff, Ut) == NULL){
  368.                   printf("Cannot write to html-file!  Disk full?\n");
  369.                   return(-1);
  370.                 }
  371.      fclose(Ut);
  372.       }
  373.        /* Befrir Notes */
  374.        for(i=0;i<Post[IDX[Nummer]].AntNotes;i++){
  375.           free(Post[IDX[Nummer]].Note[i]); 
  376.        }
  377.     }
  378.  
  379.     if(fputs("</UL><p>\n<HR>\n\n</BODY></HTML>\n", Index) == NULL){   
  380.       printf("Cannot write to index.html!  Disk full?\n");
  381.       return(-1);                                    
  382.     }                                               
  383.  
  384.    fclose(In);
  385.    fclose(Index);
  386. }
  387.