home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char sccsid[] = "@(#)refer2hc.c 1.2 (Stanford CSLI) 9/87";
- #endif
-
- /*
- * Convert refer format into hypercard input.
- * Bill Croft and Bill Palmer
- */
-
- #include <stdio.h>
-
- /* refer lettered fields. */
- char fa[200];
- char fb[200];
- char fc[200];
- char fd[200];
- char fe[200];
- char fi[200];
- char fj[200];
- char fk[200];
- char fn[200];
- char fp[200];
- char fr[200];
- char ft[200];
- char fv[200];
- char Line[512];
- char buf[2048];
- char revbuf[200];
-
- int wasj, wasb, wasr;
-
-
- _main()
- {
- int c;
- char *revauth();
-
- resetcard();
- for (;;) {
- if (gets(Line) == NULL) {
- printcard();
- exit(0);
- }
- if (strlen(Line) == 0) {
- printcard();
- resetcard();
- continue;
- }
- if (Line[0] == '%') {
- strcpy(buf, Line);
- } else {
- strcat(buf, " ");
- strcat(buf, Line);
- }
- c = getchar();
- ungetc(c, stdin);
- if (c != EOF && c != '%' && c != '\n')
- continue;
-
- switch (buf[1]) {
- case 'A':
- if (fa[0] != 0) {
- strcat(fa, ", ");
- strcat(fa, revauth(&buf[3],revbuf));
- } else {
- strcpy(fa, revauth(&buf[3],revbuf));
- }
- break;
-
- case 'B':
- wasb++;
- field(fb);
- break;
-
- case 'C': field(fc); break;
- case 'D': field(fd); break;
- case 'E': field(fe); break;
- case 'I': field(fi); break;
-
- case 'J':
- wasj++;
- field(fj);
- break;
-
- case 'K': field(fk); break;
- case 'N': field(fn); break;
- case 'P': field(fp); break;
-
- case 'R':
- wasr++;
- field(fr);
- break;
-
- case 'T': field(ft); break;
- case 'V': field(fv); break;
- }
- }
- }
-
- resetcard()
- {
- fa[0] = fc[0] = fd[0] = fe[0] = fi[0] = fk[0] = 0;
- fn[0] = fp[0] = fv[0] = 0;
- fj[0] = ft[0] = fr[0] = fb[0] = 0;
- wasj = wasr = wasb = 0;
- }
-
- field(s)
- char *s;
- {
- strcpy(s, &buf[3]);
- }
-
- printcard()
- {
- if (ft[0] == 0 && fr[0] == 0 && fb[0] == 0)
- return;
- printf("%s (%s).\t%s\t", fa, fd, ft);
- if (wasj) {
- printf("%s", fj);
- if (fv[0])
- printf(" V%s", fv);
- if (fn[0])
- printf(" N%s", fn);
- if (fp[0])
- printf(" pg %s", fp);
- printf("\t");
- } else { /* must be book or report */
- if (fb[0]) { /* this is a book containing an article*/
- if (fe[0]) {/* if there is an editor */
- printf("In %s (ed.), %s, ",fe,fb);
- } else { /* no editor */
- printf("In %s, ",ft);
- }
- printf("pages %s. ",fp);
- } /* this is a report or book (with no article), no extra stuff */
- if (fc[0]) { /* is there a city? */
- printf("%s: %s.\t",fc,fi);
- } else {
- printf("%s.\t",fi);
- }
- }
- #if 0
- if (fr[0])
- strcpy(fb, fr);
- if (fb[0] == 0)
- strcpy(fb, ft);
- if (fe[0])
- printf("In %s (Ed.), ", fe);
- printf("%s. %s:%s\t", fb, fc, fi);
- }
- #endif
- printf("\t%s\t", fk);
- }
-
- char *revauth(s,b)
- char *s,*b;
- {
- char *init, *name, *jr, *p, *bcop;
-
- bcop = b;
- init = name = s;
- while (*name)
- name++;
- jr = name;
- while (name > init && *name!= ' ')
- name--;
- if (name[-1] == ',' || name[-1]== '(' ) {
- jr = --name;
- while (name>init && *name != ' ')
- name--;
- }
- if (*name = ' ') name++; /* added */
- p = name;
- while (p < jr)
- *b++ = *p++;
- *b++ = ',';
- *b++ = ' '; /* added */
- while (init < name)
- *b++ = *init++;
- if (*jr)
- jr++;
- while(*jr)
- *b++ = *jr++;
- *b++ = 0;
- return(bcop);
- }
-
-