ddlmain.c

来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 383 行

C
383
字号
/*************************************************************************** *                                                                         * * db.*                                                                    * * open source database kernel                                             * *                                                                         * * Copyright (c) 2000 Centura Software Corporation. All rights reserved.   * *                                                                         * * Use of this software, whether in source code format, or in executable,  * * binary object code form, is governed by the CENTURA OPEN SOURCE LICENSE * * which is fully described in the LICENSE.TXT file, included within this  * * distribution of source code files.                                      *  *                                                                         * * Except as provided herein, the contents of this file are subject to the * * Centura Open Source Public License Version 1.0 (the "License"); you may * * not use this file except in compliance with the License.  A copy of the * * License will be provided to you by Club ITTIA.                          * *                                                                         * * Software distributed under the License is distributed on an "AS IS"     * * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * * License for the specific language governing rights and limitations      * * under the License.                                                      * *                                                                         * * The Original Code is db.linux version 1.0, released February 29, 2000.  * *                                                                         * * The Initial Developer of the Original Code is Centura Software          * * Corporation. Portions created by Centura Software Corporation are       * * Copyright (C) 1984-2000 Centura Software Corporation. All Rights        * * Reserved.                                                               * *                                                                         * * This file contains modifications to the Original Code made by ITTIA.    * * This file may only be used in accordance with the ITTIA DB.* V.2        * * License Agreement which is available at WWW.ITTIA.COM.                  * *                                                                         * **************************************************************************//*-----------------------------------------------------------------------    ddlmain.c - ddlp main program, driver.    This function will process options, open the ddlp_g.schema file and initiate    the parsing of the ddlp_g.schema.-----------------------------------------------------------------------*/#define MOD ddlp#include "db.star.h"#include "version.h"#include "parser.h"#include "ddldefs.h"#if !defined(NO_PREPRO)static char prepro[63];static char grepv[] = "grep -v '#'";static char command[900];static char include_path[400];#endif /* NO_PREPRO */DDLP_G ddlp_g; /* all global variables, saving namespace */#if defined(UNICODE)#define UPARM L##"[-u] "#else#define UPARM ""#endif#if !defined(NO_PREPRO)#define IPARM DB_TEXT("[-i] ")#else#define IPARM DB_TEXT("")#endifstatic int usage(DB_TCHAR *errMsg){    register DB_TCHAR **psz;    static DB_TCHAR *cmdHelp[] = {        DB_TEXT("usage: ddlp [-d] ") IPARM DB_TEXT("[-n] [-r] ") UPARM DB_TEXT("[-x] [-z] [-sg [<mode>,]<passwd>] [-s[-]]"),        DB_TEXT("            [-c] ddlfile"),        DB_TEXT("where:"),        DB_TEXT("  -d     Allow duplicate field and struct names."),#if !defined(NO_PREPRO)        DB_TEXT("  -i     Instruct cc to search for this path for include file."),#endif /* NO_PREPRO */        DB_TEXT("  -n     Instruct ddlp to omit writing the ASCII names."),        DB_TEXT("  -r     Generate the File Structure Report."),        DB_TEXT("  -c     Generate C source database dictionary."),#if defined(UNICODE)        DB_TEXT("  -u     Specify Unicode input (ddl) and output (include & dbd) files."),#endif        DB_TEXT("  -x     Generate a cross-reference listing."),        DB_TEXT("  -z     Turn off printing of SIZEOF_??? constants."),        DB_TEXT("  -sg    Specify encryption information for the database. (SafeGarde only)"),        DB_TEXT("            <mode> can \"low\", \"med\" (default), or \"high\""),        DB_TEXT("* -s     Case sensitivity.  Specify -s- to turn case sensitivity off."),        DB_TEXT("  -b     Produce database discionary with specified byte order"),        DB_TEXT("         -bh   host defined byte order (default)"),        DB_TEXT("         -bl   byte order is LITTLE ENDIAN"),        DB_TEXT("         -bb   byte order is BIG ENDIAN"),        DB_TEXT("* indicates default options"),        DB_TEXT("")    };    if (errMsg)        vftprintf(stderr, DB_TEXT("%s\n"), errMsg);    for (psz = cmdHelp; **psz; ++psz)        vftprintf(stderr, DB_TEXT("%s\n"), *psz);    return(1);}/* db.* Database Definition Language Processor */int MAIN(int argc, DB_TCHAR *argv[]){    int       i;    long      memused;    long      memtotal;#if defined(SAFEGARDE)    DB_TCHAR *cp;    DB_TCHAR *password = NULL;    int       mode = NO_ENC;#endif#if !defined(NO_PREPRO)    char     *ptr;#endif /* NO_PREPRO */    /* initialize global variables explicitly (for VxWorks) */    memset(&ddlp_g, 0, sizeof(DDLP_G));    ddlp_g.outfile = stdout;    setvbuf(stdout, NULL, _IONBF, 0 );    setvbuf(stderr, NULL, _IONBF, 0 );    vtprintf(DBSTAR_UTIL_DESC(DB_TEXT("Database Definition Language Processor")));    ddlp_g.ddlfile[0] = 0;    ddlp_g.ifn[0] = 0;    ddlp_g.byte_order = HOST_ENDIAN;    /* process option switches */    for (i = 1; i < argc; ++i)    {        if (argv[i][0] == DB_TEXT('-'))        {            switch (vtotlower(argv[i][1]))            {                case DB_TEXT('d'):                    ddlp_g.d_flag = 1;                    break;                case DB_TEXT('n'):                    ddlp_g.n_flag = 1;                    break;                case DB_TEXT('r'):                    ddlp_g.r_flag = 1;                    break;                case DB_TEXT('c'):                    ddlp_g.c_flag = 1;                    break;                case DB_TEXT('u'):                    ddlp_g.u_flag = 1;                    break;                case DB_TEXT('x'):                    ddlp_g.x_flag = 1;                    break;                case DB_TEXT('z'):                    ddlp_g.z_flag = 1;                    break;                case DB_TEXT('s'):                    switch (vtotlower(argv[i][2]))                    {                        case DB_TEXT('g'):#if defined(SAFEGARDE)                            if (i == argc - 1)                                return usage("No password specified");                            cp = vtstrchr(argv[++i], DB_TEXT(','));                            if (cp != NULL)                                *cp++ = '\0';                            if (cp) {                                if (vtstricmp(argv[i], "low") == 0)                                    mode = LOW_ENC;                                else if (vtstricmp(argv[i], "med") == 0)                                    mode = MED_ENC;                                else if (vtstricmp(argv[i], "high") == 0)                                    mode = HIGH_ENC;                                else                                    return usage("Invalid encryption mode");                                password = cp;                            }                            else                            {                                mode = MED_ENC;                                password = argv[i];                            }#else                            return usage("SafeGarde not available in this version");#endif                            break;                        case DB_TEXT('-'):                            ddlp_g.s_flag = 1;                            break;                        case DB_TEXT('\0'):                            ddlp_g.s_flag = 0;                            break;                        default:                            return usage(DB_TEXT("Invalid argument"));                    }                    break;#if !defined(NO_PREPRO)                case 'i':                    if (ddlp_g.i_flag)                    {                        strcat(include_path, " ");                        strcat(include_path, &argv[i][2]);                    }                    else  /* First -I encountered */                    {                        ddlp_g.i_flag = 1;                        strcpy(include_path, &argv[i][2]);                    }                    break;#endif				case 'b':					switch (vtotlower(argv[i][2])) {					case 'h': ddlp_g.byte_order = HOST_ENDIAN; break;					case 'b': ddlp_g.byte_order = BIG_ENDIAN; break;					case 'l': ddlp_g.byte_order = LITTLE_ENDIAN; break;					default:						return usage(DB_TEXT("invalid byte order"));					}					break;					                default:                    return usage(NULL);            }        }        else        {            if (vtstrlen(ddlp_g.ddlfile) == 0)                vtstrcpy(ddlp_g.ddlfile, argv[i]);            else                return(usage(DB_TEXT("Error: only one ddl file allowed")));        }    }    if (vtstrlen(ddlp_g.ddlfile) == 0)        return(usage(DB_TEXT("Error: ddl file required")));#if !defined(NO_PREPRO)    if (!psp_fileValidate(ddlp_g.ddlfile))#else    if ((ddlp_g.schema = vtfopen(ddlp_g.ddlfile, ddlp_g.u_flag ? DB_TEXT("rb") : DB_TEXT("r"))) == NULL)#endif    {        vftprintf(stderr, DB_TEXT("Error (errno=%d): unable to open file '%s'\n"),            errno, ddlp_g.ddlfile);        return(1);    }    psp_init();#if !defined(NO_PREPRO)    if ((ptr = psp_getenv("DBCCOM")) == NULL)    {#if defined(__GNUC__)        strcpy(prepro, "gcc -E -x c-header");#else  /* __GNUC__ */        strcpy(prepro, "cc -E");#endif /* __GNUC__ */    }    else    {        strcpy(prepro, ptr);        strcat(prepro, " -E");    }    if (ddlp_g.i_flag)        sprintf(command, "%s %s %s | %s", prepro, include_path, ddlp_g.ddlfile, grepv);    else        sprintf(command, "%s %s | %s", prepro, ddlp_g.ddlfile, grepv);    if ((ddlp_g.schema = popen(command, "r")) == NULL)    {        fprintf(stderr, "popen Error %s(%d): command:%s\n",                strerror(errno), errno, command);        psp_term();        return 1;    }#endif /* NO_PREPRO */#if defined(SAFEGARDE)    if (mode && (ddlp_g.sg = sg_create(mode, password)) == NULL)        return usage(DB_TEXT("Failed to create SafeGarde context"));#endif    tableInit();    ddlpInit();    lexInit();    init_align();    init_lists();    yyparse();    fclose(ddlp_g.schema);    if (!ddlp_g.abort_flag)        finish_up();    if (ddlp_g.tot_errs == 0)    {        write_tables();        if (!ddlp_g.abort_flag)        {            if (ddlp_g.c_flag)                write_source();            if (ddlp_g.r_flag)                print_tables();            if (ddlp_g.x_flag)                print_xref();            /* compute memory reqts */            vftprintf(stderr, DB_TEXT("Runtime dictionary memory requirements:\n\n"));            memused = (long)ddlp_g.tot_files * (long)sizeof(FILE_ENTRY);            vftprintf(stderr, DB_TEXT("   file table  : %6ld\n"), memused);            memtotal = memused;            memused = (long)ddlp_g.tot_records * (long)sizeof(RECORD_ENTRY);            vftprintf(stderr, DB_TEXT("   record table: %6ld\n"), memused);            memtotal += memused;            memused = (long)ddlp_g.tot_fields * (long)sizeof(FIELD_ENTRY);            vftprintf(stderr, DB_TEXT("   field table : %6ld\n"), memused);            memtotal += memused;            memused = (long)ddlp_g.tot_sets * (long)sizeof(SET_ENTRY);            vftprintf(stderr, DB_TEXT("   set table   : %6ld\n"), memused);            memtotal += memused;            memused = (long)ddlp_g.tot_members * (long)sizeof(MEMBER_ENTRY);            vftprintf(stderr, DB_TEXT("   member table: %6ld\n"), memused);            memtotal += memused;            memused = (long)ddlp_g.tot_sort_fields * (long)sizeof(SORT_ENTRY);            vftprintf(stderr, DB_TEXT("   sort table  : %6ld\n"), memused);            memtotal += memused;            memused = (long)ddlp_g.tot_comkeyflds * (long)sizeof(KEY_ENTRY);            vftprintf(stderr, DB_TEXT("   key table   : %6ld\n\n"), memused);            memtotal += memused;            vftprintf(stderr, DB_TEXT("   total       : %6ld\n\n"), memtotal);        }    }    free_lists();    free_xref_list();    vftprintf(stderr, DB_TEXT("%d error%s detected\n"), ddlp_g.tot_errs,        ddlp_g.tot_errs == 1 ? DB_TEXT("") : DB_TEXT("s"));#if defined(SAFEGARDE)    if (ddlp_g.sg)        sg_delete(ddlp_g.sg);#endif    psp_term();    return ddlp_g.tot_errs;}VXSTARTUP("ddlp", 0)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?