-
-/* rcomp - reference comparison routine for qsort utility */
- int rcomp(ap, bp)
- long int *ap, *bp;
-{ char ref1[REFSIZE], ref2[REFSIZE], field1[MAXFIELD], field2[MAXFIELD];
- char *p, *q, *getfield();
- int neg, res;
- int fields_found;
-
- rdref(*ap, ref1);
- rdref(*bp, ref2);
- for (p = sortstr; *p; p = q) {
- if (*p == '-') {
- p++;
- neg = true;
- }
- else
- neg = false;
- q = getfield(p, field1, ref1);
- fields_found = true;
- if (q == 0) {
- res = 1;
- fields_found = false;
- } else if (strcmp (field1, "") == 0) { /* field not found */
- if (*p == 'A') {
- getfield("F", field1, ref1);
- if (strcmp (field1, "") == 0) {
- getfield("I", field1, ref1);
- if (strcmp (field1, "") == 0) {
- res = 1;
- fields_found = false;
- }
- }
- } else {
- res = 1;
- fields_found = false;
- }
- }
-
- if (getfield(p, field2, ref2) == 0) {
- res = -1;
- fields_found = false;
- } else if (strcmp (field2, "") == 0) { /* field not found */
- if (*p == 'A') {
- getfield("F", field2, ref2);
- if (strcmp (field2, "") == 0) {
- getfield("I", field2, ref2);
- if (strcmp (field2, "") == 0) {
- res = -1;
- fields_found = false;
- }
- }
- } else {
- res = -1;
- fields_found = false;
- }
- }
- if (fields_found) {
- if (*p == 'A') {
- if (isupper(field1[0]))
- field1[0] -= 'A' - 'a';
- if (isupper(field2[0]))
- field2[0] -= 'A' - 'a';
- }
- res = strcmp(field1, field2);
- }
- if (neg)
- res = - res;
- if (res != 0)
- break;
- }
- if (res == 0)
- if (ap < bp)
- res = -1;
- else
- res = 1;
- return(res);
-}
-
-/* makecites - make citation strings */
- makecites(citestr)
- char *citestr[];
-{ char ref[REFSIZE], tempcite[100], *malloc();
- int i;
-
- for (i = 0; i <= numrefs; i++) {
- rdref(refspos[i], ref);
- bldcite(tempcite, i, ref);
- citestr[i] = malloc(2 + strlen(tempcite)); /* leave room for disambig */
- if (citestr[i] == NULL)
- error("out of storage");
- strcpy(citestr[i], tempcite);
- }
-}
-
-/* bldcite - build a single citation string */
- bldcite(cp, i, ref)
- char *cp, ref[];
- int i;
-{ char *p, *q, c, *fp, *np, field[REFSIZE], temp[100], *getfield();
- int j;
-
- getfield("F", field, ref);
- if (field[0] != 0)
- for (p = field; *p; p++)
- *cp++ = *p;
- else {
- p = citetemplate;
- field[0] = 0;
- while (c = *p++)
- if (isalpha(c)) {
- q = getfield(p-1, field, ref);
- if (q != 0) {
- p = q;
- for (fp = field; *fp; )
- *cp++ = *fp++;
- }
- }
- else if (c == '1') {
- sprintf(field,"%d",1 + i);
- for (fp = field; *fp; )
- *cp++ = *fp++;
- }
- else if (c == '2') {
- if (getname(1, field, temp, ref)) {
- np = cp;
- fp = field;
- for (j = 1; j <= 3; j++)
- if (*fp != 0)
- *cp++ = *fp++;
- if (getname(2, field, temp, ref))
- np[2] = field[0];
- if (getname(3, field, temp, ref)) {
- np[1] = np[2];
- np[2] = field[0];
- }
- }
- }
- else if (c == '{') {
- while (*p ^= '}')
- if (*p == 0)
- error("unexpected end of citation template");
- else
- *cp++ = *p++;
- p++;
- }
- else if (c == '<') {
- while (*p ^= '>')
- if (*p == 0)
- error("unexpected end of citation template");
- else
- *cp++ = *p++;
- p++;
- }
- else if (c != '@')
- *cp++ = c;
- }
- *cp++ = 0;
-}
-
-/* getfield - get a single field from reference */
- char *getfield(ptr, field, ref)
- char *ptr, field[], ref[];
-{ char *p, *q, temp[100];
- int n, len, i, getname();
-
- field[0] = 0;
- if (*ptr == 'A')
- getname(1, field, temp, ref);
- else
- for (p = ref; *p; p++)
- if (*p == '%' && *(p+1) == *ptr) {
- for (p = p + 2; *p == ' '; p++)
- ;
- for (q = field; *p != '\n'; )
- *q++ = *p++;
- *q = 0;
- break;
- }
- n = 0;
- len = strlen(field);
- if (*++ptr == '-') {
- for (ptr++; isdigit(*ptr); ptr++)
- n = 10 * n + (*ptr - '0');
- if (n > len)
- n = 0;
- else
- n = len - n;
- for (i = 0; field[i] = field[i+n]; i++)
- ;
- }
- else if (isdigit(*ptr)) {
- for (; isdigit(*ptr); ptr++)
- n = 10 * n + (*ptr - '0');
- if (n > len)
- n = len;
- field[n] = 0;
- }
-
- if (*ptr == 'u') {
- ptr++;
- for (p = field; *p; p++)
- if (islower(*p))
- *p = (*p - 'a') + 'A';
- }
- else if (*ptr == 'l') {
- ptr++;
- for (p = field; *p; p++)
- if (isupper(*p))
- *p = (*p - 'A') + 'a';
- }
- return(ptr);
-}
-
-/* getname - get the nth name field from reference, breaking into
- first and last names */
- int getname(n, last, first, ref)
- int n;
- char last[], first[], ref[];
-{ char *p;
-
- for (p = ref; *p; p++)
- if (*p == '%' & (*(p+1) == 'A' || *(p+1) == 'E')) {
- n--;
- if (n == 0) {
- for (p = p + 2; *p == ' '; p++) ;
- breakname(p, first, last) ;
- return(true);
- }
- }
- return(false);
-}
-
-/* disambiguate - compare adjacent citation strings, and if equal, add
- single character disambiguators */
- disambiguate()
-{ int i, j;
- char adstr[2];
-
- for (i = 0; i < numrefs; i = j) {
- j = i + 1;
- if (strcmp(citestr[i], citestr[j])==0) {
- adstr[0] = 'a'; adstr[1] = 0;
- for (j = i+1; strcmp(citestr[i],citestr[j]) == 0; j++) {
- adstr[0] = 'a' + (j-i);
- strcat(citestr[j], adstr);
- if (j == numrefs)
- break;
- }
- adstr[0] = 'a';
- strcat(citestr[i], adstr);
- }
- }