#define about "tibtobib 0.3, 1989 by uf" #include #include #define maxlines 50 #define linelen 256 #define ntypes 8 #define ntags 18 #define article 0 #define conference 1 #define inbook 2 #define mastersthesis 3 #define phdthesis 4 #define techreport 5 #define book 6 #define misc 7 #define HELP 0 #define NOREF 10 #define NOBIB 11 #define BIGITEM 12 #define NOCONT1 13 #define NOCONT2 14 #define BIGLINE 15 #define BADTAG 16 #define MEMFULL 17 char RCSHeader[]="$Header: /home/tex/local/ttb.c,v 1.3 90/02/15 14:55:30 sk Rel $"; static char *inputtype[]={"ARTICLE","CONFERENCE","INBOOK","MASTERSTHESIS", "PHDTHESIS","TECHREPORT","BOOK","MISC"}, *recordtype[]={"AUTHOR","BOOKTITLE","ADDRESS","YEAR","EDITOR", "PUBLISHER","JOURNAL","KEY","NUMBER","NOTE","PAGES", "TYPE","SERIES","TITLE","VOLUME","COMMENT","ANNOTE", "ABSTRACT"}, allowedtag[]={'A','B','C','D','E','I','J','K','N','O','P','R','S','T','V', '%','x','X'}, organization[]="ORGANIZATION"; char *item[maxlines],buffer[maxlines*linelen], reffile[linelen],bibfile[linelen]; int curline=0,type,ilines; FILE *ref,*bib,*fopen(); main(argc,argv) int argc; char **argv; { int notready; if (argc != 2) { fprintf(stderr,"%s, usage: ttb \n",about); exit(HELP); } strcpy(reffile,argv[1]); if ((ref=fopen(reffile,"r")) == NULL) { sprintf(reffile,"%s.ref",argv[1]); if ((ref=fopen(reffile,"r")) == NULL) { fprintf(stderr,"ttb: can open neither %s nor %s\n",argv[1],reffile); exit(NOREF); } } if (!strcmp(argv[1]+strlen(argv[1])-4,".ref")) argv[1][strlen(argv[1])-4]='\0'; sprintf(bibfile,"%s.bib",argv[1]); if ((bib=fopen(bibfile,"w")) == NULL) { fprintf(stderr,"ttb: can't open %s\n",bibfile); exit(NOBIB); } /* main loop */ do { notready=getitem(); type=classifyitem(); /* printitem(); */ putitem(); } while(notready); /* exit */ fclose(ref); fclose(bib); } getitem() { char firstchar,secondchar; int i,j,k,ok,ilm1,space,used,ignored=0; ilines = 0; space = maxlines*linelen-1; *item = buffer; while(!feof(ref)) { if (space<=0) { fprintf(stderr,"ttb: %s, %d: buffer space exhausted\n",reffile,curline); exit(MEMFULL); } fgets(item[ilines++],space,ref); ilm1 = ilines-1; for (k=strlen(item[ilm1])-1; k>-1 && isspace(item[ilm1][k]); item[ilm1][k--]=0) ; /* printf("%s\n",item[ilm1]); */ curline++; if (ilines>maxlines) { fprintf(stderr,"ttb: %s, line %d: too many lines for this item, line ignored\n",reffile,curline); ilines--; continue; } if (strlen(item[ilm1]) == 0) { /* blank line */ ilines--; ignored=0; break; } if ((firstchar=item[ilm1][0]) != '%') { /* continuation line */ if (ilines == 1) { fprintf(stderr,"ttb: %s, line %d: leading continuation line ignored\n",reffile,curline); ilines--; continue; } if (ignored) { fprintf(stderr,"ttb: %s, line %d: continuation line ignored\n",reffile,curline); ilines--; continue; } ilines--; *(item[ilines]-1) = '\n'; used = strlen(item[ilines])+1; item[ilines] += used; continue; } secondchar = item[ilm1][1]; ok = 0; for (i=0; i 4) { strcpy(author,item[p-1]+3); author[i-4]=0; } else { for (k=strlen(item[p-1]); k>2 && item[p-1][k] != ' ' && item[p-1][k] != '.'; k--) ; strcpy(author,item[p-1]+k+1); } } else strcpy(author,"Mr.X"); if (p=test('D')) strcpy(year,item[p-1]+strlen(item[p-1])-2); else strcpy(year,"??"); if (p=test('P')) { for (i=3; i0 ? ',' : ' '); else fprintf(bib,"@%s{%s%s:%s%c\n",inputtype[type],author,year,page,ilines>0 ? ',' : ' '); /* special cases: several authors, editors */ first = !0; strcpy(author,""); if (test('A')) { for (i=0; i