123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /*
- * COMPONENT_NAME: austext
- *
- * FUNCTIONS: change_max_wordsize
- * change_min_wordsize
- * confirm_ok_to_overwrite
- * create_new_dbd
- * main
- * print_usage
- * remove_d9x_file
- * user_args_processor
- *
- * ORIGINS: 27
- *
- *
- * (C) COPYRIGHT International Business Machines Corp. 1993,1996
- * All Rights Reserved
- * Licensed Materials - Property of IBM
- * US Government Users Restricted Rights - Use, duplication or
- * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
- */
- /************************* DTSRCREATE.C **************************
- * $XConsortium: dtsrcreate.c /main/9 1996/09/23 21:02:04 cde-ibm $
- * October 1993.
- * Program formerly named initausd, in module initausd.c.
- * Essentially performs the same function as vista's initdb,
- * but uses only the dtsearch.dbd and renames the files during creation.
- * Also creates and initializes the first slot, the 'dbrec'.
- *
- * $Log$
- * Revision 2.8 1996/03/25 18:53:33 miker
- * Changed FILENAME_MAX to _POSIX_PATH_MAX.
- *
- * Revision 2.7 1996/02/01 18:16:16 miker
- * Changed some arg defaults depending on DTSEARCH definition.
- * Deleted BETA definition.
- *
- * Revision 2.6 1995/12/27 16:10:03 miker
- * Permit -wx before -wn on command line.
- *
- * Revision 2.5 1995/12/07 23:27:51 miker
- * Fixed bug: minwordsz was > max when max inited to -1.
- * Changed 'Engine Type' to 'Flavor' for AusBuild.
- *
- * Revision 2.4 1995/10/25 21:09:42 miker
- * Added prolog.
- *
- * Revision 2.3 1995/10/20 21:28:25 miker
- * Intelligently look for dtsearch.dbd in 3 places.
- *
- * Revision 2.2 1995/10/19 21:16:17 miker
- * Internally rename database files so it doesn't have to be
- * done at open time. Ask permission to overwrite preexisting
- * files. Always create databases from current model dtsearch.dbd
- * (elminate SECOND CASE). Coincides with libDtvis enhancements.
- *
- * Revision 2.1 1995/09/22 19:32:18 miker
- * Freeze DtSearch 0.1, AusText 2.1.8
- *
- * Revision 1.2 1995/09/19 21:56:53 miker
- * Enabled Japanese language DtSrJPN.
- * If DtSearch, use DtSrVERSION instead of AUSAPI_VERSION in banner.
- *
- * Revision 1.1 1995/08/31 20:50:28 miker
- * Initial revision
- */
- #include "SearchP.h"
- #include <limits.h>
- #include <errno.h>
- #include <ctype.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <stdlib.h>
- #include <locale.h>
- #include "vista.h"
- char *ensure_end_slash (char *pathstr); // lib/DtSearch/lang.c
- #define PROGNAME "DTSRCREATE"
- #define DEFAULT_MINWORD (MINWIDTH_TOKEN + 1)
- #define STANDARD_MAXWORD (DtSrMAXWIDTH_HWORD - 1)
- #define MS_misc 1
- #define MS_initausd 12
- #define FNAME_MODEL "dtsearch.dbd"
- /* The following MUST MATCH vista's dbtype.h! */
- #define SIZEOF_FILE_ENTRY 252 /* sizeof(FILE_ENTRY) */
- #define DBD_COMPAT_LEN 6
- #define START_OF_FT (DBD_COMPAT_LEN + (8 * sizeof(INT)))
- /* Values for 'flavor' global variable */
- #define AUSTEXT_FLAVOR 'a'
- #define DTSEARCH_FLAVOR 'd'
- /*------------------ GLOBALS -------------------*/
- static int abstrsz = -1;
- static char dbname [12] = "<dbname>";
- struct or_dbrec dbrec;
- static int debug_mode = FALSE;
- static char default_cant_open_msg[] =
- "%s: %s: %s.\n";
- static int fzkeysz = 0;
- static int flavor = DTSEARCH_FLAVOR;
- static int language = DtSrLaENG;
- static int minwordsz = DEFAULT_MINWORD;
- static int maxwordsz = INT_MAX;
- static int max_ormisc_size;
- static int maxwidth_lword;
- static int maxwidth_sword;
- static char modelpath [_POSIX_PATH_MAX];
- /* path/name of model dbd file */
- static char newpath [_POSIX_PATH_MAX];
- /* path/name for each renamed file */
- static char *newextp; /* loc where extension suffixes placed */
- static int ok_to_overwrite = FALSE;
- static long path_offset = 0;
- static int quiet_mode = FALSE;
- static char *exttab[] = {
- /* Must be in same order as model .dbd file tables */
- ".d00", ".d01", ".d21", ".d22", ".d23",
- ".k00", ".k01", ".k21", ".k22", ".k23",
- NULL };
- /* Same as MS_initausd, 213... */
- static char default_unable_to_open_msg[] =
- "%1$s Unable to open '%2$s':\n %3$s.\a\n";
- /************************************************/
- /* */
- /* confirm_ok_to_overwrite */
- /* */
- /************************************************/
- /* Called whenever we are about to write a new file.
- * Checks to see if file preexists. If it does,
- * and user has never said it's ok to overwrite,
- * prompts for permission to overlay all preexisting files.
- * If 'yes', never asks again. If 'no', exits.
- * Returns if ok to overwrite, else exits.
- */
- static void confirm_ok_to_overwrite (char *fname)
- {
- FILE *fptr;
- int i;
- if (ok_to_overwrite)
- return;
- if ((fptr = fopen (newpath, "r")) == NULL)
- return;
- fclose (fptr);
- printf ( CATGETS(dtsearch_catd, MS_initausd, 12,
- "\nFile '%s' already exists.\n"
- "Is it ok to overwrite it and other database files? [y,n] ") ,
- newpath);
- i = tolower (getchar());
- if (i == 'y')
- ok_to_overwrite = TRUE;
- else
- DtSearchExit (2);
- return;
- } /* confirm_ok_to_overwrite() */
- /************************************************/
- /* */
- /* change_max_wordsize */
- /* */
- /************************************************/
- /* Subroutine of user_args_processor().
- * Adjusts maxwordsz per user request and allowed sizes of schema.
- */
- static int change_max_wordsize (char *new_size)
- {
- int users_newsize;
- maxwordsz = users_newsize = atoi (new_size);
- /* error if min and max specifications incompatible */
- if (minwordsz > maxwordsz) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 5,
- PROGNAME" Minimum word size %d greater "
- "than maximum word size %d.\n"),
- minwordsz, maxwordsz);
- return FALSE;
- }
- /* If necessary, adjust to nearest logical maxwordsz */
- if (maxwordsz != maxwidth_sword &&
- maxwordsz != maxwidth_lword &&
- maxwordsz != DtSrMAXWIDTH_HWORD - 1) {
- if (maxwordsz < maxwidth_sword)
- maxwordsz = maxwidth_sword;
- else if (maxwordsz < maxwidth_lword)
- maxwordsz = maxwidth_lword;
- else
- maxwordsz = DtSrMAXWIDTH_HWORD - 1;
- }
- if (maxwordsz != users_newsize)
- printf (CATGETS(dtsearch_catd, MS_initausd, 8,
- PROGNAME " Adjusted maximum word size to %d.\n"),
- maxwordsz);
- /* Give user a final warning about large word sizes */
- if (maxwordsz > STANDARD_MAXWORD && language != DtSrLaDEU && !quiet_mode)
- printf ("%s", CATGETS(dtsearch_catd, MS_initausd, 10,
- PROGNAME" Specifying large maximum word sizes may "
- "significantly\n increase storage requirements.\n"));
- return TRUE;
- } /* change_max_wordsize() */
- /************************************************/
- /* */
- /* change_min_wordsize */
- /* */
- /************************************************/
- /* Subroutine of user_args_processor().
- * Adjusts minwordsz per user request.
- */
- static int change_min_wordsize (char *new_size)
- {
- int old_minwordsz = minwordsz;
- if ((minwordsz = atoi (new_size)) < 0)
- return FALSE;
- /* error if min and max specifications incompatible */
- if (minwordsz > maxwordsz) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 5,
- PROGNAME " Minimum word size %d greater than "
- "maximum word size %d.\n"),
- minwordsz, maxwordsz);
- return FALSE;
- }
- if (!quiet_mode) {
- if (minwordsz != old_minwordsz)
- printf (CATGETS(dtsearch_catd, MS_initausd, 6,
- PROGNAME " Adjusted minimum word size to %d.\n"),
- minwordsz);
- /* give user a warning about short word sizes */
- if (minwordsz < DEFAULT_MINWORD)
- printf ("%s", CATGETS(dtsearch_catd, MS_initausd, 9,
- PROGNAME " Specifying small minimum word sizes"
- " may require extensive\n"
- " editing of stopword file to prevent significantly\n"
- " increased index storage requirements.\n"));
- }
- return TRUE;
- } /* change_min_wordsize() */
- /************************************************/
- /* */
- /* print_usage */
- /* */
- /************************************************/
- static void print_usage (void)
- {
- int i;
- printf (CATGETS(dtsearch_catd, MS_initausd,
- 3,
- "\nUSAGE: %s [-options] dbname\n"
- " Creates and initializes DtSearch/AusText database files.\n"
- " -q Do not print information messages.\n"
- " -o Ok to overwrite preexisting database.\n"
- " -a<n> Set maximum abstract size to <N> (default per flavor).\n"
- " -d<dir> Dir containing "FNAME_MODEL" file if not in dbname dir.\n"
- " -wn<n> Change minimum word size to <N>. Default is %d.\n"
- " -wx<n> Change maximum word size to <N>. Default per language.\n"
- " ---------- Database Flavor ----------\n"
- " -fd DtSearch flavor. No documents, only document references\n"
- " in abstracts (default).\n"
- " -fa AusText flavor. Documents stored in central server repository.\n"
- " ------------ Supported Languages ------------\n"
- " -l<n> Set language number to <N>. Default is 0. Supported values:\n"
- " 0 English-ASCII\n"
- " 1 English-Latin1\n"
- " 2 Spanish\n"
- " 3 French\n"
- " 4 Italian\n"
- " 5 German\n"
- " 6 Japanese-autoknj\n"
- " 7 Japanese-knjlist\n"
- " <dbname> Optional path prefix, then 1 - 8 character\n"
- " database name. Do not specify 'austext' or 'dtsearch'.\n"),
- aa_argv0, DEFAULT_MINWORD);
- return;
- } /* print_usage() */
- /************************************************/
- /* */
- /* user_args_processor */
- /* */
- /************************************************/
- /* Handles command line arguments for main().
- * Initializes global variables.
- */
- static void user_args_processor (int argc, char **argv)
- {
- int i;
- int remaining_slot_space;
- char *ptr;
- /* Initialize variables prior to parsing command line */
- newpath[0] = 0;
- modelpath[0] = 0;
- if (argc < 2) {
- print_usage();
- DtSearchExit (2);
- }
- /* Each pass grabs new parm of "-xxx" format */
- for (;;) {
- argc--;
- argv++;
- if (argc <= 0)
- break;
- ptr = argv[0];
- if (ptr[0] != '-')
- break;
- switch (ptr[1]) {
- case 'r': /* unadvertised debug mode */
- if (strcmp (ptr, "-russell") == 0) {
- debug_mode = TRUE;
- puts ("001*** debug mode.");
- }
- else {
- BAD_ARG:
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_misc, 9,
- "%sInvalid command line argument '%s'.\a\n"),
- "\n"PROGNAME" ", ptr);
- DtSearchExit (2);
- }
- break;
- case 'a':
- /* zero length abstract may be explicity specified */
- abstrsz = atoi (ptr + 2);
- if (abstrsz < 0 || (abstrsz == 0 && ptr[2] != '0'))
- goto BAD_ARG;
- break;
- case 'q':
- quiet_mode = TRUE;
- break;
- case 'o':
- ok_to_overwrite = TRUE;
- break;
- case 'f':
- switch (ptr[2]) {
- case AUSTEXT_FLAVOR:
- case DTSEARCH_FLAVOR:
- flavor = ptr[2];
- break;
- default:
- goto BAD_ARG;
- }
- break;
- case 'w': /* change min (-wn..) or max (-wx..) word size */
- switch (ptr[2]) {
- case 'x':
- if (!change_max_wordsize (ptr + 3))
- goto BAD_ARG;
- break;
- case 'n':
- if (!change_min_wordsize (ptr + 3))
- goto BAD_ARG;
- break;
- default:
- goto BAD_ARG;
- }
- break;
- case 'd': /* special path name for model .dbd */
- strncpy (modelpath, ptr + 2, sizeof(modelpath));
- modelpath [sizeof(modelpath) - sizeof(FNAME_MODEL) - 4] = 0;
- ensure_end_slash (modelpath);
- strcat (modelpath, FNAME_MODEL);
- break;
- case 'l':
- /* Note that custom, unsupported languages
- * greater than DtSrLaLAST are permitted.
- */
- language = atoi (ptr + 2);
- if (language < 0)
- goto BAD_ARG;
- if (!quiet_mode && language > DtSrLaLAST)
- printf ( CATGETS(dtsearch_catd, MS_initausd, 13,
- "%s Warning! you have specified "
- "an unsupported, custom language.\n"
- " You will have to provide your own "
- "language loaders at run time\n"
- " in user function 'load_custom_language' "
- "to access this database.\a\n"),
- PROGNAME"444");
- break;
- default:
- printf (CATGETS(dtsearch_catd, MS_misc, 10,
- "%sIgnored unknown command line argument '%s'.\n"),
- PROGNAME " ", ptr);
- break;
- } /* end switch */
- } /* end parse of cmd line options beginning with '-' */
- /* Only required arg is new database name,
- * including optional path prefix.
- * Load newpath and newextp, leaving room
- * for long dbnames and .xxx extensions.
- */
- if (argc <= 0) {
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_misc, 18,
- "%sDatabase name not specified.\n\a"), "\n"PROGNAME" ");
- DtSearchExit(2);
- }
- strncpy (newpath, argv[0], sizeof (newpath));
- newpath [sizeof(newpath) - 12] = 0;
- newextp = newpath + strlen (newpath);
- /* Get just the 1 - 8 char database name by moving ptr
- * backwards until first non-alphanumeric character
- * (such as a ":" in the dos drive id or a slash between directories),
- * or to the beginning of string.
- * Then test database name for validity.
- */
- for (ptr = newpath + strlen(newpath) - 1; ptr >= newpath; ptr--)
- if (!isalnum (*ptr)) {
- ptr++;
- break;
- }
- if (ptr < newpath)
- ptr = newpath;
- i = strlen (ptr);
- if (i < 1 || i > 8) {
- BAD_DBNAME:
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_misc, 11,
- "%sInvalid database name '%s'.\a\n"),
- "\n"PROGNAME"346 ", ptr);
- DtSearchExit(2);
- }
- path_offset = ptr - newpath;
- strcpy (dbname, ptr); /* save it */
- if (strcmp (dbname, "austext") == 0 || strcmp (dbname, "dtsearch") == 0) {
- goto BAD_DBNAME;
- }
- /* Ensure semantic processing specified only for english language */
- if (fzkeysz != 0 && language != DtSrLaENG && language != DtSrLaENG2) {
- print_usage();
- printf ( CATGETS(dtsearch_catd, MS_initausd, 14,
- "\n%s semantic processing is only available "
- "for English language databases.\n\a") ,
- PROGNAME"340");
- DtSearchExit(2);
- }
- /* Unless overridden by user args,
- * initialize abstract based on flavor.
- * The abstract size defaults to the remaining
- * space in the final misc slot after the fzkey.
- * However if the user specified a specific
- * abstract size, it may be adjusted later
- * to fill up the last slot.
- */
- if (abstrsz == -1)
- abstrsz = max_ormisc_size - (fzkeysz % max_ormisc_size);
- /* Default maxword size is 'short', except for German */
- if (maxwordsz == INT_MAX)
- maxwordsz = STANDARD_MAXWORD;
- if (debug_mode)
- printf ("002*** userargs: modelpath='%s' newpath='%s'\n"
- " fzkeysz=%d abstrsz=%d\n",
- modelpath, newpath, fzkeysz, abstrsz);
- return;
- } /* user_args_processor() */
- /************************************************/
- /* */
- /* remove_d9x_file */
- /* */
- /************************************************/
- static void remove_d9x_file (char *extension)
- {
- strcpy (newextp, extension);
- if (debug_mode)
- printf ("094*** delete '%s'.\n", newpath);
- if (remove (newpath) != 0) {
- /* 'file not found' is not an error */
- if (errno != ENOENT) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 244,
- PROGNAME "244 Unable to remove '%s': %s\n"),
- newpath, strerror (errno));
- DtSearchExit (5);
- }
- }
- return;
- } /* remove_d9x_file() */
- /************************************************/
- /* */
- /* create_new_dbd */
- /* */
- /************************************************/
- /* Copies and moves binary contents in passed, preopened
- * model .dbd file (f) to new dbd file in target directory.
- * Rename the internal .d00, etc filenames to match dbname.
- */
- static void create_new_dbd (FILE *f)
- {
- FILE *g; /* target dbd file */
- int i;
- static char *nocopy_msg =
- "%s Unable to copy '%s' to '%s':\n %s\a\n";
- /* (Same as dtsearch.msg: MS_initausd, 214) */
- static char zeros[] =
- "\0\0\0\0\0\0\0\0\0\0\0\0";
- strcpy (newextp, ".dbd");
- if (debug_mode)
- printf (PROGNAME"507 create_new_dbd '%s'\n", newpath);
- /* If new .dbd file preexists, make sure it is writable */
- confirm_ok_to_overwrite (newpath);
- if (chmod (newpath, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)) {
- if (errno != ENOENT) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 214, nocopy_msg),
- PROGNAME"515", modelpath, newpath, strerror(errno));
- DtSearchExit (15);
- }
- }
- if ((g = fopen (newpath, "w+b")) == NULL) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 214, nocopy_msg),
- PROGNAME"509", modelpath, newpath, strerror(errno));
- DtSearchExit (4);
- }
- errno = 0;
- while ((i = fgetc (f)) != EOF)
- fputc (i, g);
- if (errno) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 214, nocopy_msg),
- PROGNAME"531", modelpath, newpath, strerror(errno));
- DtSearchExit (13);
- }
- /* Now reposition the write head in the new dbd file
- * to rename the filenames. Rename each internal file
- * name to '<newdbname>.xxx'.
- */
- for (i = 0; exttab[i] != NULL; i++) {
- fseek (g, START_OF_FT + (i * SIZEOF_FILE_ENTRY), SEEK_SET);
- fprintf (g, "%s%s", dbname, exttab[i]);
- fwrite (zeros, sizeof(char), sizeof(zeros), g);
- }
- /* The new dbd file only has to be readable */
- fclose (g);
- chmod (newpath, S_IRUSR | S_IRGRP | S_IROTH);
- return;
- } /* create_new_dbd() */
- /************************************************/
- /* */
- /* main */
- /* */
- /************************************************/
- /* 1. CREATE or find database dictionary (.dbd file).
- * 2. CREATE empty 'dtsearch' database files.
- * 3. OPEN 'dtsearch' database.
- * 4. INITIALIZE the database.
- * 5. WRITE dbrec after initializing it.
- * 6. RENAME each database file.
- * 7. UNLINK (delete) d9x files.
- */
- int main (int argc, char *argv[])
- {
- int i;
- char *ptr;
- FILE *f;
- struct or_miscrec miscrec;
- struct or_swordrec swordrec;
- struct or_lwordrec lwordrec;
- setlocale (LC_ALL, "");
- dtsearch_catd = CATOPEN(FNAME_DTSRCAT, 0);
- aa_argv0 = argv[0];
- max_ormisc_size = sizeof (miscrec.or_misc);
- maxwidth_sword = sizeof (swordrec.or_swordkey) - 1;
- maxwidth_lword = sizeof (lwordrec.or_lwordkey) - 1;
- printf (CATGETS(dtsearch_catd, MS_misc, 4,
- "%s Version %s.\n"),
- aa_argv0,
- DtSrVERSION
- );
- /* Handle cmd line args. Init global variables. */
- user_args_processor (argc, argv);
- /* ------- copy model .dbd to new .dbd ------- */
- /* CASE 1: If user specified -d special alternative
- * directory for model .dbd, it should be there.
- */
- if (modelpath[0] != 0) {
- if (debug_mode)
- printf (PROGNAME"628 Try opening '%s' (-d dir).\n", modelpath);
- if ((f = fopen (modelpath, "rb")) != NULL) {
- if (debug_mode)
- puts (PROGNAME"638 Found it!");
- create_new_dbd (f);
- fclose (f);
- goto DBD_OKAY;
- }
- else {
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_initausd, 213,
- default_unable_to_open_msg),
- "\n"PROGNAME"302", modelpath, strerror(errno));
- DtSearchExit (4);
- }
- } /* end CASE 1 */
- /* CASE 2: If model .dbd is in current directory, use it.
- * If error is anything other than 'cant find file', quit now.
- */
- if (debug_mode)
- printf (PROGNAME"649 Try opening '%s' (curr dir).\n", FNAME_MODEL);
- if ((f = fopen (FNAME_MODEL, "rb")) != NULL) {
- if (debug_mode)
- puts (PROGNAME"660 Found it!");
- create_new_dbd (f);
- fclose (f);
- goto DBD_OKAY;
- }
- else if (errno != ENOENT) {
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_initausd, 213,
- default_unable_to_open_msg),
- "\n"PROGNAME"655", FNAME_MODEL, strerror(errno));
- DtSearchExit (4);
- } /* end else CASE 2 */
- /* CASE 3: Last chance. Look for model .dbd in target directory.
- * At this point have to quit on any error.
- */
- strcpy (modelpath, newpath);
- strcpy (modelpath + path_offset, FNAME_MODEL);
- if (debug_mode)
- printf (PROGNAME"672 Try opening '%s' (new dir).\n", modelpath);
- if ((f = fopen (modelpath, "rb")) != NULL) {
- if (debug_mode)
- puts (PROGNAME"675 Found it!");
- create_new_dbd (f);
- fclose (f);
- goto DBD_OKAY;
- }
- if (debug_mode)
- puts (PROGNAME"682 Never found it!");
- print_usage();
- printf (CATGETS(dtsearch_catd, MS_initausd, 213,
- default_unable_to_open_msg),
- "\n"PROGNAME"686", FNAME_MODEL,
- "Not found in either current or target directories. Use -d option\a");
- DtSearchExit (4);
- DBD_OKAY:
- /* Open a new database */
- *newextp = 0; /* use no extension when opening database */
- if (debug_mode)
- printf ("040*** d_open newpath = '%s'.\n", newpath);
- d_open (newpath, "o");
- if (db_status != S_OKAY) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 230,
- PROGNAME "230 Could not open database '%s'.\n"), newpath);
- puts (vista_msg (PROGNAME "231"));
- DtSearchExit (3);
- }
- austext_exit_dbms = (void (*) (int)) d_close; /* emerg exit func */
- /* initialize the 'dtsearch' database */
- if (debug_mode)
- printf ("042*** d_initialize.\n");
- d_initialize (0);
- if (db_status != S_OKAY) {
- printf (CATGETS(dtsearch_catd, MS_initausd, 239,
- PROGNAME "239 Could not initialize database '%s'.\n"), newpath);
- puts (vista_msg (PROGNAME "240"));
- DtSearchExit (3);
- }
- /* Create and initialize dbrec database header record in first slot.
- * First fill entire record with binary zeros.
- * Then set specific values as specified by flavor on command line.
- * For now most values are hard-coded.
- */
- if (debug_mode)
- printf ("050*** create dbrec.\n");
- memset (&dbrec, 0, sizeof (dbrec));
- /* Init fields that are completely independent */
- dbrec.or_language = (DtSrINT16) language;
- dbrec.or_maxwordsz = (DtSrINT16) maxwordsz;
- dbrec.or_minwordsz = (DtSrINT16) minwordsz;
- dbrec.or_fzkeysz = (DtSrINT16) fzkeysz;
- dbrec.or_abstrsz = (DtSrINT16) abstrsz;
- dbrec.or_dbflags = ORD_NONOTES | ORD_NOMARKDEL | ORD_XWORDS;
- strncpy (dbrec.or_version, SCHEMA_VERSION, sizeof(dbrec.or_version));
- dbrec.or_version [sizeof(dbrec.or_version) - 1] = 0;
- /* Load dbrec's recslots fields based on correct number
- * of misc recs required to hold user's abstract.
- * Round abstrsz upward if there is any space left on last misc rec.
- */
- dbrec.or_recslots = 1; /* start with obj rec itself */
- for (i = dbrec.or_fzkeysz + dbrec.or_abstrsz; i > 0; i -= max_ormisc_size)
- dbrec.or_recslots++;
- if (i < 0) {
- /* Add in difference to INCREASE abstrsz */
- dbrec.or_abstrsz -= i;
- printf (CATGETS(dtsearch_catd, MS_misc, 433,
- "%1$sAdjusted maximum abstract size upward to %2$hd.\n"),
- PROGNAME "433 ", dbrec.or_abstrsz);
- }
- /* Init fields that are dependent on language */
- switch (language) {
- case DtSrLaENG:
- case DtSrLaENG2:
- dbrec.or_dbflags |= ORD_XSTEMS;
- break;
- default:
- break;
- }
- /* Init fields that are dependent on flavor */
- if (flavor == AUSTEXT_FLAVOR) {
- dbrec.or_dbaccess = ORA_BLOB;
- dbrec.or_compflags = ORC_COMPBLOB;
- dbrec.or_hufid = -1L; /* -1 = use huffman compression, but
- * hufid not yet known. */
- dbrec.or_dbotype = DtSrObjTEXT;
- }
- else { /* default flavor == DTSEARCH_FLAVOR */
- dbrec.or_dbaccess = ORA_NOTAVAIL;
- }
- if (!quiet_mode) {
- /******putchar ('\n');******/
- print_dbrec (newpath, &dbrec);
- fflush (stdout);
- }
- swab_dbrec (&dbrec, HTON);
- if (debug_mode)
- printf ("060*** fillnew dbrec.\n");
- d_fillnew (OR_DBREC, &dbrec, 0);
- if (db_status != S_OKAY) {
- printf ("%s", CATGETS(dtsearch_catd, MS_initausd, 509,
- PROGNAME "509 Could not initialize database header record.\n"));
- puts (vista_msg (PROGNAME "510"));
- DtSearchExit (3);
- }
- /* Close the database */
- d_close ();
- austext_exit_dbms = NULL; /* emerg exit no longer required */
- /* Delete all nonvista (inverted index) database files (.d9x) */
- remove_d9x_file (".d97");
- remove_d9x_file (".d98");
- remove_d9x_file (".d99");
- *newextp = 0; /* no extension suffixes for next msgs */
- printf (CATGETS(dtsearch_catd, MS_initausd, 24,
- PROGNAME " Successfully initialized database '%s'.\n"), newpath);
- return 0;
- } /* main() */
- /************************* DTSRCREATE.C **************************/
|