Initial import of the CDE 2.1.30 sources from the Open Group.
[oweals/cde.git] / cde / lib / DtSearch / vstfunct.c
1 /*
2  *   COMPONENT_NAME: austext
3  *
4  *   FUNCTIONS: fillnew_wordrec
5  *              find_keyword
6  *              read_wordstr
7  *              write_wordstr
8  *
9  *   ORIGINS: 27
10  *
11  *
12  *   (C) COPYRIGHT International Business Machines Corp. 1993,1995
13  *   All Rights Reserved
14  *   Licensed Materials - Property of IBM
15  *   US Government Users Restricted Rights - Use, duplication or
16  *   disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
17  */
18 /********************* VSTFUNCT.C **********************************
19  * $XConsortium: vstfunct.c /main/6 1996/08/12 13:20:01 cde-ibm $
20  * Performs vista KEYFIND, RECREAD, RECWRITE, and FILLNEW functions
21  * on word database files without caller having to know
22  * whether word is short, long, or huge.
23  * Remember: all word lengths are 1 byte shorter than the field size,
24  * plus 1 byte for the terminating \0.
25  *
26  * $Log$
27  * Revision 2.2  1995/10/26  14:12:32  miker
28  * Added prolog.
29  *
30  * Revision 2.1  1995/09/22  22:23:13  miker
31  * Freeze DtSearch 0.1, AusText 2.1.8
32  *
33  * Revision 1.3  1995/09/05  19:34:07  miker
34  * Minor name changes for DtSearch.
35  */
36 #include "SearchP.h"
37 #include "vista.h"
38
39 #define PROGNAME        "VSTFUNCT"
40
41 static struct or_swordrec Swordbuf;
42 static struct or_lwordrec Lwordbuf;
43
44
45 /************************/
46 /*                      */
47 /*      find_keyword    */
48 /*                      */
49 /************************/
50 /* Sets vista "curr record" to correct word record.
51  * Usually performed prior to vista read or write function.
52  * CALLER MUST CHECK DB_STATUS.
53  */
54 void            find_keyword (char *cur_word, int vista_num)
55 {
56     static size_t   len;
57     static long     keyfield;
58
59     len = strlen (cur_word);
60     if (len < sizeof (Swordbuf.or_swordkey))
61         keyfield = OR_SWORDKEY;
62     else if (len < sizeof (Lwordbuf.or_lwordkey))
63         keyfield = OR_LWORDKEY;
64     else
65         keyfield = OR_HWORDKEY;
66     KEYFIND (PROGNAME "24", keyfield, cur_word, vista_num);
67     return;
68 }  /* find_keyword() */
69
70
71
72 /********************************/
73 /*                              */
74 /*         read_wordstr         */
75 /*                              */
76 /********************************/
77 /* Performs vista RECREAD on curr word record.
78  * CALLER SHOULD CHECK DB_STATUS.
79  */
80 void            read_wordstr (struct or_hwordrec * glob_word, int vista_num)
81 {
82     static size_t   len;
83
84     len = strlen (glob_word->or_hwordkey);
85     if (len < sizeof (Swordbuf.or_swordkey)) {
86         RECREAD (PROGNAME "61", &Swordbuf, vista_num);
87         if (db_status != S_OKAY)
88             return;
89         strncpy (glob_word->or_hwordkey, Swordbuf.or_swordkey,
90             DtSrMAXWIDTH_HWORD);
91         glob_word->or_hwordkey[DtSrMAXWIDTH_HWORD - 1] = 0;
92         glob_word->or_hwoffset =        ntohl (Swordbuf.or_swoffset);
93         glob_word->or_hwfree =          ntohl (Swordbuf.or_swfree);
94         glob_word->or_hwaddrs =         ntohl (Swordbuf.or_swaddrs);
95     }
96     else if (len < sizeof (Lwordbuf.or_lwordkey)) {
97         RECREAD (PROGNAME "69", &Lwordbuf, vista_num);
98         if (db_status != S_OKAY)
99             return;
100         strncpy (glob_word->or_hwordkey, Lwordbuf.or_lwordkey,
101             DtSrMAXWIDTH_HWORD);
102         glob_word->or_hwordkey[DtSrMAXWIDTH_HWORD - 1] = 0;
103         glob_word->or_hwoffset =        ntohl (Lwordbuf.or_lwoffset);
104         glob_word->or_hwfree =          ntohl (Lwordbuf.or_lwfree);
105         glob_word->or_hwaddrs =         ntohl (Lwordbuf.or_lwaddrs);
106     }
107     else {
108         RECREAD (PROGNAME "78", glob_word, vista_num);
109         glob_word->or_hwordkey[DtSrMAXWIDTH_HWORD - 1] = 0;
110         NTOHL (glob_word->or_hwoffset);
111         NTOHL (glob_word->or_hwfree);
112         NTOHL (glob_word->or_hwaddrs);
113     }
114     return;
115 }  /* read_wordstr() */
116
117
118 /********************************/
119 /*                              */
120 /*         write_wordstr        */
121 /*                              */
122 /********************************/
123 /* performs vista RECWRITE on curr word record.
124  * CALLER MUST CHECK DB_STATUS.
125  */
126 void            write_wordstr (struct or_hwordrec * glob_word, int vista_num)
127 {
128     static size_t   len;
129
130     len = strlen (glob_word->or_hwordkey);
131
132     if (len < sizeof (Swordbuf.or_swordkey)) {
133         strcpy (Swordbuf.or_swordkey, glob_word->or_hwordkey);
134         Swordbuf.or_swoffset =  htonl (glob_word->or_hwoffset);
135         Swordbuf.or_swfree =    htonl (glob_word->or_hwfree);
136         Swordbuf.or_swaddrs =   htonl (glob_word->or_hwaddrs);
137         RECWRITE (PROGNAME "102", &Swordbuf, vista_num);
138     }
139     else if (len < sizeof (Lwordbuf.or_lwordkey)) {
140         strcpy (Lwordbuf.or_lwordkey, glob_word->or_hwordkey);
141         Lwordbuf.or_lwoffset =  htonl (glob_word->or_hwoffset);
142         Lwordbuf.or_lwfree =    htonl (glob_word->or_hwfree);
143         Lwordbuf.or_lwaddrs =   htonl (glob_word->or_hwaddrs);
144         RECWRITE (PROGNAME "111", &Lwordbuf,
145             vista_num);
146     }
147     else {
148         if (len >= DtSrMAXWIDTH_HWORD) {
149             printf ("\n" PROGNAME "124 Program Error Abort, "
150                 "word too long:\n  '%s'\n",
151                 glob_word->or_hwordkey);
152             DtSearchExit (24);
153         }
154         HTONL (glob_word->or_hwoffset);
155         HTONL (glob_word->or_hwfree);
156         HTONL (glob_word->or_hwaddrs);
157         RECWRITE (PROGNAME "115", glob_word, vista_num);
158         NTOHL (glob_word->or_hwoffset);
159         NTOHL (glob_word->or_hwfree);
160         NTOHL (glob_word->or_hwaddrs);
161     }
162     return;
163 }  /* write_wordstr() */
164
165
166 /****************************************/
167 /*                                      */
168 /*           fillnew_wordrec            */
169 /*                                      */
170 /****************************************/
171 /* The input record is always a word in a 'huge' structure.
172  * This function performs vista FILLNEW on that word,
173  * but into correct sized word rec.
174  * Formerly this function was called put_new_word().
175  * CALLER MUST CHECK DB_STATUS.
176  */
177 void            fillnew_wordrec (struct or_hwordrec * glob_word, int vista_num)
178 {
179     static size_t   len;
180
181     len = strlen (glob_word->or_hwordkey);
182     if (len < sizeof (Swordbuf.or_swordkey)) {
183         strcpy (Swordbuf.or_swordkey, glob_word->or_hwordkey);
184         Swordbuf.or_swoffset =  htonl (glob_word->or_hwoffset);
185         Swordbuf.or_swfree =    htonl (glob_word->or_hwfree);
186         Swordbuf.or_swaddrs =   htonl (glob_word->or_hwaddrs);
187         FILLNEW (PROGNAME "137", OR_SWORDREC, &Swordbuf, vista_num);
188     }
189     else if (len < sizeof (Lwordbuf.or_lwordkey)) {
190         strcpy (Lwordbuf.or_lwordkey, glob_word->or_hwordkey);
191         Lwordbuf.or_lwoffset =  htonl (glob_word->or_hwoffset);
192         Lwordbuf.or_lwfree =    htonl (glob_word->or_hwfree);
193         Lwordbuf.or_lwaddrs =   htonl (glob_word->or_hwaddrs);
194         FILLNEW (PROGNAME "147", OR_LWORDREC, &Lwordbuf, vista_num);
195     }
196     else {
197         if (len >= DtSrMAXWIDTH_HWORD) {
198             printf ("\n" PROGNAME "168 Program Error Abort, "
199                 "word too long:\n  '%s'\n",
200                 glob_word->or_hwordkey);
201             DtSearchExit (68);
202         }
203         HTONL (glob_word->or_hwoffset);
204         HTONL (glob_word->or_hwfree);
205         HTONL (glob_word->or_hwaddrs);
206         FILLNEW (PROGNAME "151", OR_HWORDREC, glob_word, vista_num);
207         NTOHL (glob_word->or_hwoffset);
208         NTOHL (glob_word->or_hwfree);
209         NTOHL (glob_word->or_hwaddrs);
210     }
211     return;
212 }  /* fillnew_wordrec() */
213
214 /********************* VSTFUNCT.C **********************************/