home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / vrac / ged2ht23.zip / TAGS.C < prev    next >
C/C++ Source or Header  |  1995-06-23  |  12KB  |  369 lines

  1. /*
  2.  * Copyright (c) 1995 Eugene W. Stark
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by Eugene W. Stark.
  16.  * 4. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  * 5. No copying or redistribution in any form for commercial purposes is
  19.  *    permitted without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY EUGENE W. STARK (THE AUTHOR) ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
  25.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  26.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  27.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #include <stdio.h>
  35. #include <stdlib.h>
  36. #include <string.h>
  37.  
  38. #include "tags.h"
  39.  
  40. /*
  41.  * Change the following initialization for the default output language
  42.  */
  43. #ifdef ENGLISH
  44. int default_language = ENGLISH_LANGUAGE;
  45. #endif
  46.  
  47. struct tag gedcom_tags[] = {
  48.   {"ADDR", ADDR, "ADDRESS"},
  49.   {"ADOP", ADOP, "ADOPTION"},
  50.   {"AFN", AFN, "AFN"},
  51.   {"AGE", AGE, "AGE"},
  52.   {"AGNC", AGNC, "AGENCY"},
  53.   {"ALIA", ALIA, "ALIAS"},
  54.   {"ANCI", ANCI, "ANCI"},
  55.   {"ANUL", ANUL, "ANNULMENT"},
  56.   {"ARVL", ARVL, "ARRIVAL"},
  57.   {"ASSO", ASSO, "ASSOCIATES"},
  58.   {"AUTH", AUTH, "AUTHOR"},
  59.   {"BAPL", BAPL, "BAPTISM-LDS"},
  60.   {"BAPM", BAPM, "BAPTISM"},
  61.   {"BARM", BARM, "BAR MITZVAH"},
  62.   {"BASM", BASM, "BAS MITZVAH"},
  63.   {"BIRT", BIRT, "BIRTH"},
  64.   {"BLES", BLES, "BLESSING"},
  65.   {"BROT", BROT, "BROTHER"},
  66.   {"BURI", BURI, "BURIAL"},
  67.   {"BUYR", BUYR, "BUYER"},
  68.   {"CALN", CALN, "CALL NUMBER"},
  69.   {"CAST", CAST, "CASTE"},
  70.   {"CAUS", CAUS, "CAUSE"},
  71.   {"CEME", CEME, "CEMETERY"},
  72.   {"CENS", CENS, "CENSUS"},
  73.   {"CHAN", CHAN, "CHANGE"},
  74.   {"CHAR", CHAR, "CHARACTER"},
  75.   {"CHIL", CHIL, "CHILD"},
  76.   {"CHR", CHR, "CHRISTENING"},
  77.   {"CHRA", CHRA, "ADULT CHRISTENING"},
  78.   {"CLAS", CLAS, "CLASSIFICATION"},
  79.   {"COMM", COMM, "CONTACT PERSON"},
  80.   {"CONC", CONC, "CONCATENATION"},
  81.   {"CONF", CONF, "CONFIRMATION"},
  82.   {"CONL", CONL, "CONFIRMATION LDS"},
  83.   {"CONT", CONT, "CONTINUED"},
  84.   {"COPR", COPR, "COPYRIGHT"},
  85.   {"CORP", CORP, "CORPORATION"},
  86.   {"CPLR", CPLR, "COMPILER"},
  87.   {"DATA", DATA, "DATA"},
  88.   {"DATE", DATE, "DATE"},
  89.   {"DEAT", DEAT, "DEATH"},
  90.   {"DEFN", DEFN, "DEFINITION"},
  91.   {"DESI", DESI, "DESI"},
  92.   {"DEST", DEST, "DESTINATION"},
  93.   {"DIV", DIV, "DIVORCE"},
  94.   {"DIVF", DIVF, "DIVORCE FILED"},
  95.   {"DPRT", DPRT, "DEPARTURE"},
  96.   {"DSCR", DSCR, "DESCRIPTION"},
  97.   {"EDTR", EDTR, "EDITOR"},
  98.   {"EDUC", EDUC, "EDUCATION"},
  99.   {"EMIG", EMIG, "EMIGRATION"},
  100.   {"ENDL", ENDL, "ENDOWMENT LDS"},
  101.   {"ENGA", ENGA, "ENGAGEMENT"},
  102.   {"EVEN", EVEN, "EVENT"},
  103.   {"FAM", FAM, "FAMILY"},
  104.   {"FAMC", FAMC, "FAMILY CHILD"},
  105.   {"FAMS", FAMS, "FAMILY SPOUSE"},
  106.   {"FATH", FATH, "FATHER"},
  107.   {"FIDE", FIDE, "FIDELITY"},
  108.   {"FILE", FYLE, "FILE"},
  109.   {"FILM", FILM, "FILM"},
  110.   {"FORM", FORM, "FORMAT"},
  111.   {"GEDC", GEDC, "GEDCOM"},
  112.   {"GODP", GODP, "GODPARENT"},
  113.   {"GRAD", GRAD, "GRAD"},
  114.   {"HDOH", HDOH, "HEAD OF HOUSEHOLD"},
  115.   {"HEAD", HEAD, "HEADER"},
  116.   {"HEIR", HEIR, "HEIR"},
  117.   {"HFAT", HFAT, "HUSBAND FATHER"},
  118.   {"HMOT", HMOT, "HUSBAND MOTHER"},
  119.   {"HUSB", HUSB, "HUSBAND"},
  120.   {"IDNO", IDNO, "IDENT NUMBER"},
  121.   {"IMMI", IMMI, "IMMIGRATION"},
  122.   {"INDI", INDI, "INDIVIDUAL"},
  123.   {"INDX", INDX, "INDEXED"},
  124.   {"INFT", INFT, "INFORMANT"},
  125.   {"INTV", INTV, "INTERVIEWER"},
  126.   {"ISA", ISA, "IS A"},
  127.   {"ISSUE", ISSUE, "ISSUE"},
  128.   {"ITEM", ITEM, "ITEM"},
  129.   {"LABL", LABL, "LABEL"},
  130.   {"LANG", LANG, "LANGUAGE"},
  131.   {"LCCN", LCCN, "LCCN"},
  132.   {"LGTE", LGTE, "LEGATEE"},
  133.   {"MARB", MARB, "MARRIAGE BANN"},
  134.   {"MARC", MARC, "MARRIAGE CONTRACT"},
  135.   {"MARL", MARL, "MARRIAGE LICENSE"},
  136.   {"MARR", MARR, "MARRIAGE"},
  137.   {"MARS", MARS, "MARRIAGE SETTLEMENT"},
  138.   {"MBR", MBR, "MEMBER"},
  139.   {"MEDI", MEDI, "MEDIA"},
  140.   {"MOTH", MOTH, "MOTHER"},
  141.   {"NAME", NAME, "NAME"},
  142.   {"NAMR", NAMR, "NAMR"},
  143.   {"NAMS", NAMS, "NAMESAKE"},
  144.   {"NATI", NATI, "NATIONALITY"},
  145.   {"NATU", NATU, "NATURALIZATION"},
  146.   {"NCHI", NCHI, "NO. OF CHILDREN"},
  147.   {"NMR", NMR, "NO. OF MARRIAGES"},
  148.   {"NOTE", NOTE, "NOTE"},
  149.   {"NUMB", NUMB, "NUMBER"},        /* This one's not official */
  150.   {"OCCU", OCCU, "OCCUPATION"},
  151.   {"OFFI", OFFI, "OFFICIATOR"},
  152.   {"ORDN", ORDN, "ORDINATION"},
  153.   {"ORIG", ORIG, "ORIGINATION"},
  154.   {"OWNR", OWNR, "OWNER"},
  155.   {"PAGE", PAGE, "PAGE"},
  156.   {"PARI", PARI, "PERIOD"},
  157.   {"PHON", PHON, "PHONE"},
  158.   {"PHOTO", PHOTO, "PHOTO"},
  159.   {"PHUS", PHUS, "PREVIOUS HUSBAND"},
  160.   {"PLAC", PLAC, "PLACE"},
  161.   {"PORT", PORT, "PORT"},
  162.   {"PROB", PROB, "PROBATE"},
  163.   {"PROP", PROP, "PROPERTY"},
  164.   {"PUBL", PUBL, "PUBLICATION"},
  165.   {"PUBR", PUBR, "PUBLISHER"},
  166.   {"PWIF", PWIF, "PREVIOUS WIFE"},
  167.   {"QUAY", QUAY, "QUALITY"},
  168.   {"RECO", RECO, "RECORDER"},
  169.   {"REFN", REFN, "REFERENCE"},
  170.   {"REFS", REFS, "REFERENCED SOURCE"},
  171.   {"RELI", RELI, "RELIGION"},
  172.   {"REPO", REPO, "REPOSITORY"},
  173.   {"RETI", RETI, "RETIREMENT"},
  174.   {"RFN", RFN, "RFN"},
  175.   {"ROLE", ROLE, "ROLE"},
  176.   {"SCHEMA", SCHEMA, "SCHEMA"},
  177.   {"SELR", SELR, "SELLER"},
  178.   {"SEQU", SEQU, "SEQUENCE"},
  179.   {"SERS", SERS, "SERIES"},
  180.   {"SEX", SEX, "SEX"},
  181.   {"SIBL", SIBL, "SIBLING"},
  182.   {"SIGN", SIGN, "SIGNATURE"},
  183.   {"SIST", SIST, "SISTER"},
  184.   {"SITE", SITE, "SITE"},
  185.   {"SLGC", SLGC, "SLGC"},
  186.   {"SLGS", SLGS, "SLGS"},
  187.   {"SOUND", SOUND, "SOUND"},
  188.   {"SOUR", SOUR, "SOURCE"},
  189.   {"SPOU", SPOU, "SPOUSE"},
  190.   {"SSN", SSN, "SSN"},
  191.   {"STAT", STAT, "STATUS"},
  192.   {"SUBM", SUBM, "SUBMITTER"},
  193.   {"SUBN", SUBN, "SUBN"},
  194.   {"TEMP", TEMP, "TEMPLE"},
  195.   {"TEXT", TEXT, "TEXT"},
  196.   {"TIME", TIME, "TIME"},
  197.   {"TITL", TITL, "TITLE"},
  198.   {"TRLR", TRLR, "TRAILER"},
  199.   {"TXPY", TXPY, "TAXPAYER"},
  200.   {"TYPE", TYPE, "TYPE"},
  201.   {"VERS", VERS, "VERSION"},
  202.   {"WFAT", WFAT, "WIFE FATHER"},
  203.   {"WIFE", WIFE, "WIFE"},
  204.   {"WILL", WILL, "WILL"},
  205.   {"WITN", WITN, "WITNESS"},
  206.   {"WMOT", WMOT, "WIFE MOTHER"},
  207.   {"XLTR", XLTR, "TRANSLATOR"},
  208. };
  209.  
  210. int gedcom_tags_size = sizeof(gedcom_tags)/sizeof(struct tag);
  211.  
  212. struct tag gedcom_special[] = {
  213.   {"ABSTRACTOR", ABSTRACTOR, "ABSTRACTOR"},
  214.   {"ABT", ABT, "ABOUT"},
  215.   {"ACTIVE", ACTIVE, "ACTIVE"},
  216.   {"AFT", AFT, "AFTER"},
  217.   {"AND", AND, "AND"},
  218.   {"AUDIO", AUDIO, "AUDIO"},
  219.   {"AUTHOR", AUTHOR, "AUTHOR"},
  220.   {"BC", BC, "BC"},
  221.   {"BEF", BEF, "BEFORE"},
  222.   {"BET", BET, "BETWEEN"},
  223.   {"BIC", BIC, "BIC"},
  224.   {"BOOK", BOOK, "BOOK"},
  225.   {"BUSINESS", BUSINESS, "BUSINESS"},
  226.   {"CANCELED", CANCELED, "CANCELED"},
  227.   {"CARD", CARD, "CARD"},
  228.   {"CENSUS", CENSUS, "CENSUS"},
  229.   {"CHURCH", CHURCH, "CHURCH"},
  230.   {"COMPILER", COMPILER, "COMPILER"},
  231.   {"COMPLETED", COMPLETED, "COMPLETED"},
  232.   {"COPY", COPY, "COPY"},
  233.   {"COURT", COURT, "COURT"},
  234.   {"CTNC", CTNC, "CTNC"},
  235.   {"DIVORCED", DIVORCED, "DIVORCED"},
  236.   {"DNS", DNS, "DNS"},
  237.   {"DONE", DONE, "DONE"},
  238.   {"DWEL", DWEL, "DWELLING"},
  239.   {"EDITOR", EDITOR, "EDITOR"},
  240.   {"EDTN", EDTN, "EDITION"},
  241.   {"ELECTRONIC", ELECTRONIC, "ELECTRONIC"},
  242.   {"EST", EST, "EST"},
  243.   {"EXTRACT", EXTRACT, "EXTRACT"},
  244.   {"F", FEMALE, "FEMALE"},
  245.   {"FAMN", FAMN, "FAMILY NUMBER"},
  246.   {"FICHE", FICHE, "FICHE"},
  247.   {"FOUND", FOUND, "FOUND"},
  248.   {"FROM", FROM, "FROM"},
  249.   {"GOVERNMENT", GOVERNMENT, "GOVERNMENT"},
  250.   {"HDOG", HDOG, "HDOG"},
  251.   {"HISTORY", HISTORY, "HISTORY"},
  252.   {"INFANT", INFANT, "INFANT"},
  253.   {"INFORMANT", INFORMANT, "INFORMANT"},
  254.   {"INTERVIEW", INTERVIEW, "INTERVIEW"},
  255.   {"INTERVIEWER", INTERVIEWER, "INTERVIEWER"},
  256.   {"ISSU", ISSU, "ISSUE"},
  257.   {"JOURNAL", JOURNAL, "JOURNAL"},
  258.   {"LAND", LAND, "LAND"},
  259.   {"LEGA", LEGA, "LEGAL"},
  260.   {"LETTER", LETTER, "LETTER"},
  261.   {"M", MALE, "MALE"},
  262.   {"MAGAZINE", MAGAZINE, "MAGAZINE"},
  263.   {"MANUSCRIPT", MANUSCRIPT, "MANUSCRIPT"},
  264.   {"MAP", MAP, "MAP"},
  265.   {"MARRIED", MARRIED, "MARRIED"},
  266.   {"MEMBER", MEMBER, "MEMBER"},
  267.   {"MILITARY", MILITARY, "MILITARY"},
  268.   {"MSTAT", MSTAT, "MSTAT"},
  269.   {"NEWSPAPER", NEWSPAPER, "NEWSPAPER"},
  270.   {"NO", NO, "NO"},
  271.   {"NUMBER", NUMBER, "NUMBER"},
  272.   {"ORDERED", ORDERED, "ORDERED"},
  273.   {"ORGANIZATION", ORGANIZATION, "ORGANIZATION"},
  274.   {"ORIGINAL", ORIGINAL, "ORIGINAL"},
  275.   {"PARE", PARE, "PARENT"},
  276.   {"PERI", PERI, "PERIOD"},
  277.   {"PERIODICAL", PERIODICAL, "PERIODICAL"},
  278.   {"PERSONAL", PERSONAL, "PERSONAL"},
  279.   {"PHOTOCOPY", PHOTOCOPY, "PHOTOCOPY"},
  280.   {"PLACE", PLACE, "PLACE"},
  281.   {"PLANNED", PLANNED, "PLANNED"},
  282.   {"PLOT", PLOT, "PLOT"},
  283.   {"PROVED", PROVED, "PROVED"},
  284.   {"RECITED", RECITED, "RECITED"},
  285.   {"REL", REL, "REL"},
  286.   {"SHEE", SHEE, "SHEET"},
  287.   {"SINGLE", SINGLE, "SINGLE"},
  288.   {"STILLBORN", STILLBORN, "STILLBORN"},
  289.   {"SUBMITTED", SUBMITTED, "SUBMITTED"},
  290.   {"TO", TO, "TO"},
  291.   {"TOMBSTONE", TOMBSTONE, "TOMBSTONE"},
  292.   {"TRADITION", TRADITION, "TRADITION"},
  293.   {"TRANSCRIBER", TRANSCRIBER, "TRANSCRIBER"},
  294.   {"TRANSCRIPT", TRANSCRIPT, "TRANSCRIPT"},
  295.   {"UNPUBLISHED", UNPUBLISHED, "UNPUBLISHED"},
  296.   {"USB", USB, "USB"},
  297.   {"VIDEO", VIDEO, "VIDEO"},
  298.   {"VITAL", VITAL, "VITAL"},
  299.   {"WAC", WAC, "WAC"},
  300.   {"WIDOWED", WIDOWED, "WIDOWED"},
  301.   {"YES", YES, "YES"},
  302. };
  303.  
  304. int gedcom_special_size = sizeof(gedcom_special)/sizeof(struct tag);
  305.  
  306. struct tag gedcom_other[] = {
  307.   {"ANSEL", ANSEL, "ANSEL"},
  308.   {"BEGIN", BEGIN, "BEGIN"},
  309.   {"COLON", COLON, "COLON"},
  310.   {"END", END, "END"},
  311.   {"ESCAPE_SEQUENCE", ESCAPE_SEQUENCE, "ESCAPE SEQUENCE"},
  312.   {"IBMPC", ANSEL, "IBMPC"}, /* Output by Family Scrapbook */
  313.   {"LINE", LINE, "LINE"},
  314.   {"LINEAGE-LINKED", LINEAGE_LINKED, "LINEAGE LINKED"},
  315.   {"LINEAGE_LINKED", LINEAGE_LINKED, "LINEAGE LINKED"},
  316.   {"OTHER_BANG", OTHER_BANG, "OTHER BANG"},
  317.   {"SLASH", SLASH, "SLASH"},
  318.   {"TOKEN", TOKEN, "TOKEN"},
  319.   {"UNDERSCORE", UNDERSCORE, "UNDERSCORE"},
  320.   {"UNICODE", UNICODE, "UNICODE"},
  321.   {"XREF", XREF, "XREF"},
  322. };
  323.  
  324. int gedcom_other_size = sizeof(gedcom_other)/sizeof(struct tag);
  325.  
  326. int mystrcmp(char *a, struct tag *b)
  327. {
  328.   return(strcmp(a, b->name));
  329. }
  330.  
  331. struct tag *findtag(char *s, struct tag *tab, int nmemb)
  332. {
  333.   struct tag *t;
  334.   t = bsearch(s, tab, nmemb, sizeof(struct tag),
  335.          (int (*)(const void *, const void *))mystrcmp);
  336.   return(t);
  337. }
  338.  
  339. struct tag *validate_tags_table(struct tag *tab, int nmemb)
  340. {
  341.   struct tag *prev = NULL;
  342.   while(nmemb--) {
  343.     if(prev && strcmp(prev->name, tab->name) >= 0)
  344.       return(tab);
  345.     prev = tab++;
  346.   }
  347.   return(NULL);
  348. }
  349.  
  350. void validate_tags_tables()
  351. {
  352.   struct tag *tab;
  353.   if((tab = validate_tags_table(gedcom_tags, gedcom_tags_size))) {
  354.     fprintf(stderr, "Internal error: GEDCOM tag table out of order at tag '%s'.\n",
  355.         tab->name);
  356.     exit(1);
  357.   }
  358.   if((tab = validate_tags_table(gedcom_special, gedcom_special_size))) {
  359.     fprintf(stderr, "Internal error: special tag table out of order at tag '%s'.\n",
  360.         tab->name);
  361.     exit(1);
  362.   }
  363.   if((tab = validate_tags_table(gedcom_other, gedcom_other_size))) {
  364.     fprintf(stderr, "Internal error: 'other' tag table out of order at tag '%s'.\n",
  365.         tab->name);
  366.     exit(1);
  367.   }
  368. }
  369.