2 * Copyright (C) 1998, Index Data ApS
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.2 1998-06-25 09:55:50 adam
8 * Minor changes - fixex headers.
18 #define SORT_IDX_BLOCKSIZE 64
27 struct sortFile *next;
28 struct sortFileHead head;
36 struct sortFile *current_file;
37 struct sortFile *files;
40 SortIdx sortIdx_open (BFiles bfs, int write_flag)
42 SortIdx si = xmalloc (sizeof(*si));
44 si->write_flag = write_flag;
45 si->current_file = NULL;
47 si->entry_buf = xmalloc (SORT_IDX_ENTRYSIZE);
51 void sortIdx_close (SortIdx si)
53 struct sortFile *sf = si->files;
56 struct sortFile *sf_next = sf->next;
62 xfree (si->entry_buf);
66 int sortIdx_type (SortIdx si, int type)
70 if (si->current_file && si->current_file->type == type)
72 for (sf = si->files; sf; sf = sf->next)
75 si->current_file = sf;
78 sf = xmalloc (sizeof(*sf));
82 si->current_file = si->files = sf;
83 sprintf (fname, "sort%d", type);
84 logf (LOG_DEBUG, "sort idx %s wr=%d", fname, si->write_flag);
85 sf->bf = bf_open (si->bfs, fname, SORT_IDX_BLOCKSIZE, si->write_flag);
88 if (!bf_read (sf->bf, 0, 0, sizeof(sf->head), &sf->head))
90 sf->head.sysno_max = 0;
97 void sortIdx_sysno (SortIdx si, int sysno)
102 void sortIdx_add (SortIdx si, const char *buf, int len)
104 if (!si->current_file || !si->current_file->bf)
106 if (len > SORT_IDX_ENTRYSIZE)
108 len = SORT_IDX_ENTRYSIZE;
109 memcpy (si->entry_buf, buf, len);
113 memcpy (si->entry_buf, buf, len);
114 memset (si->entry_buf+len, 0, SORT_IDX_ENTRYSIZE-len);
116 bf_write (si->current_file->bf, si->sysno+1, 0, 0, si->entry_buf);
119 void sortIdx_read (SortIdx si, char *buf)
121 bf_read (si->current_file->bf, si->sysno+1, 0, 0, buf);