#include "focas1.h" #define NL 3000 #define FMAX 17 struct sst { struct sst *next; float sval; struct objrec ob; } /* CATSORT -- Catalog sorting */ catsort (input, output, srttype) char *input; char *output; int *srttype; { struct objrec ob[FMAX]; struct sst *head, *frep, *prev, list[NL]; register struct sst *ep, *use; FILE *fin[FMAX], *fout; int i, j, m, nfls; char srttyp, str[FMAX][32], ent[32]; float a, b, rule (); cfd = catopen (input, 0); srttyp = *srttype; nfls = 0; for (i = 0; i < FMAX; i++) { sprintf (str[i], "catsort%c.tmp", "abcdefghijklmnopqrstuvwxyz0123456789"[i]); fout = catopen (str[i], 1); nfls++; for (j = 1; j < NL; j++) list[j - 1].next = &list[j]; frep = &list[0]; list[NL - 1].next = 0; head = 0; for (; i < 36;) { if ((use = frep) == 0) break; frep = use->next; if (rdcatob (cfd, 0L, &use->ob)) i = 100; else { use->next = 0; if (srttyp == 'y') use->sval = use->ob.yc; else if (srttyp == 'd') use->sval = use->ob.dec; else if (srttyp == 'm') use->sval = use->ob.mag; else if (srttyp == 'n') { sprintf (ent, "%d.%-d", use->ob.entnum, use->ob.subent); sscanf (ent, "%hf", &use->sval); } else focaserr (1, "catsort: Sort code not known", ""); if (head == 0) { head = use; continue; } for (ep = head; ep != 0; ep = ep->next) { if (use->sval < ep->sval) { if (ep == head) { use->next = ep; head = use; break; } else { use->next = ep; prev->next = use; break; } } prev = ep; } if (ep == 0) prev->next = use; } } for (ep = head; ep != 0; ep = ep->next) wtcat (&ep->ob, fout); fclose (fout); } fclose (cfd); cfd = catopen (output, 1); cmmnt ("catsort"); wtcathdr (cfd, 0); for (j = 0; j < nfls; j++) { fin[j] = catopen (str[j], 0); if (rdcatob (fin[j], 0L, &ob[j])) ob[j].entnum = -1; } for (;;) { a = 1.0e30; m = -1; for (j = 0; j < nfls; j++) { if (ob[j].entnum < 0) continue; b = rule (srttyp, &ob[j]); if (b < a) { m = j; a = b; } } if (m < 0) break; wtcat (&ob[m], cfd); if (rdcatob (fin[m], 0L, &ob[m])) ob[m].entnum = -1; } for (j = 0; j < nfls; j++) { fclose (fin[j]); c_delete (str[j]); } fclose (cfd); } /*ordering rule for merge*/ float rule (st, jc) char st; struct objrec *jc; { char str[20]; float a; switch (st) { case 'n': /* lexograpgic order */ sprintf (str, "%d.%-d", jc->entnum, jc->subent); sscanf (str, "%hf", &a); break; case 'y': /* increasing y value */ a = jc->yc; break; case 'd': /* increasing dec value */ a = jc->dec; break; case 'k': /* preserve input ordering */ a = 0.0; break; case 'm': /* magnitude */ a = jc->mag; break; } return (a); }