2 * Copyright (C) 1994-1995, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.3 1996-11-01 09:00:33 adam
8 * This simple "text" format now supports element specs B and M.
10 * Revision 1.2 1996/10/29 14:02:45 adam
11 * Uses buffered read to speed up things.
13 * Revision 1.1 1996/10/11 10:57:28 adam
14 * New module recctrl. Used to manage records (extract/retrieval).
16 * Revision 1.7 1996/01/17 14:57:55 adam
17 * Prototype changed for reader functions in extract/retrieve. File
18 * is identified by 'void *' instead of 'int.
20 * Revision 1.6 1995/10/10 13:59:24 adam
21 * Function rset_open changed its wflag parameter to general flags.
23 * Revision 1.5 1995/10/02 16:24:39 adam
24 * Use attribute actually used in search requests.
26 * Revision 1.4 1995/10/02 15:42:55 adam
27 * Extract uses file descriptors instead of FILE pointers.
29 * Revision 1.3 1995/09/28 09:19:45 adam
30 * xfree/xmalloc used everywhere.
31 * Extract/retrieve method seems to work for text records.
33 * Revision 1.2 1995/09/15 14:45:21 adam
37 * Revision 1.1 1995/09/14 07:48:25 adam
38 * Record control management.
48 static void text_init (void)
53 struct recExtractCtrl *p;
59 struct buf_info *buf_open (struct recExtractCtrl *p)
61 struct buf_info *fi = xmalloc (sizeof(*fi));
64 fi->buf = xmalloc (4096);
70 int buf_read (struct buf_info *fi, char *dst)
74 if (fi->offset >= fi->max)
76 fi->max = (*fi->p->readf)(fi->p->fh, fi->buf, 4096);
81 *dst = fi->buf[(fi->offset)++];
85 void buf_close (struct buf_info *fi)
91 static int text_extract (struct recExtractCtrl *p)
96 struct buf_info *fi = buf_open (p);
99 recWord.which = Word_String;
104 r = buf_read (fi, w);
105 while (r > 0 && i < 255 && isalnum(w[i]))
108 r = buf_read (fi, w + i);
113 for (j = 0; j<i; j++)
114 w[j] = tolower(w[j]);
116 recWord.seqno = seqno++;
117 recWord.u.string = w;
125 static int text_retrieve (struct recRetrieveCtrl *p)
128 static char *text_buf = NULL;
129 static int text_size = 0;
131 const char *elementSetName = NULL;
134 if (p->comp && p->comp->which == Z_RecordComp_simple &&
135 p->comp->u.simple->which == Z_ElementSetNames_generic)
136 elementSetName = p->comp->u.simple->u.generic;
140 if (text_ptr + 4096 >= text_size)
144 text_size = 2*text_size + 8192;
145 nb = xmalloc (text_size);
148 memcpy (nb, text_buf, text_ptr);
158 sprintf (text_buf, "Rank: %d\n", p->score);
159 text_ptr = strlen(text_buf);
161 sprintf (text_buf + text_ptr, "Local Number: %d\n", p->localno);
162 text_ptr = strlen(text_buf);
164 r = (*p->readf)(p->fh, text_buf + text_ptr, 4096);
169 text_buf[text_ptr] = '\0';
172 if (!strcmp (elementSetName, "B"))
174 if (!strcmp (elementSetName, "M"))
182 while (++i <= no_lines && (p = strchr (p, '\n')))
187 text_ptr = p-text_buf;
190 p->output_format = VAL_SUTRS;
191 p->rec_buf = text_buf;
192 p->rec_len = text_ptr;
196 static struct recType text_type = {
203 RecType recTypeText = &text_type;