diff options
Diffstat (limited to 'Build/source/utils/chktex/chktex-1.6.4/ChkTeX.c')
-rw-r--r-- | Build/source/utils/chktex/chktex-1.6.4/ChkTeX.c | 1035 |
1 files changed, 0 insertions, 1035 deletions
diff --git a/Build/source/utils/chktex/chktex-1.6.4/ChkTeX.c b/Build/source/utils/chktex/chktex-1.6.4/ChkTeX.c deleted file mode 100644 index d3565b4a2d5..00000000000 --- a/Build/source/utils/chktex/chktex-1.6.4/ChkTeX.c +++ /dev/null @@ -1,1035 +0,0 @@ -/* - * ChkTeX, finds typographic errors in (La)TeX files. - * Copyright (C) 1995-96 Jens T. Berger Thielemann - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - * Contact the author at: - * Jens Berger - * Spektrumvn. 4 - * N-0666 Oslo - * Norway - * E-mail: <jensthi@ifi.uio.no> - * - * - */ - - -#include "getopt.h" -#include "ChkTeX.h" -#include "OpSys.h" -#include "Utility.h" -#include "FindErrs.h" -#include "Resource.h" -#include <string.h> - -#undef MSG -#define MSG(num, type, inuse, ctxt, text) {num, type, inuse, ctxt, text}, - -struct ErrMsg PrgMsgs[pmMaxFault + 1] = { - PRGMSGS {pmMaxFault, etErr, TRUE, 0, INTERNFAULT} -}; - -struct Stack CharStack = { - 0L -}, InputStack = - -{ -0L}, EnvStack = - -{ -0L}; - -/************************************************************************/ - -const char BrOrder[NUMBRACKETS + 1] = "()[]{}"; - -unsigned long Brackets[NUMBRACKETS]; - -/************************************************************************/ - - -/* - * Have to do things this way, to ease some checking throughout the - * program. - */ - - -NEWBUF(TmpBuffer, BUFSIZ); -NEWBUF(ReadBuffer, BUFSIZ); - -static const char *Banner = - "ChkTeX v" PACKAGE_VERSION " - Copyright 1995-96 Jens T. Berger Thielemann.\n" -#ifdef __OS2__ - "OS/2 port generated with emx compiler, by Wolfgang Fritsch, <fritsch@hmi.de>" -#elif defined(__MSDOS__) - "MS-DOS port by Bj\\o rn Ove Thue, <bjort@ifi.uio.no>" -#endif - "\n"; - -static const char *BigBanner = - "ChkTeX comes with ABSOLUTELY NO WARRANTY; details on this and\n" - "distribution conditions in the GNU General Public License file.\n" - "Type \"ChkTeX -h\" for help, \"ChkTeX -i\" for distribution info.\n" - "Author: Jens Berger, Spektrumvn. 4, N-0666 Oslo, Norway.\n" - "E-mail: <jensthi@ifi.uio.no>\n" - "Press " STDIN_BREAK " to terminate stdin input.\n"; - -static const char *Distrib = - "\n" - "This program is free software; you can redistribute it and/or modify\n" - "it under the terms of the GNU General Public License as published by\n" - "the Free Software Foundation; either version 2 of the License, or\n" - "(at your option) any later version.\n" - "\n" - "This program is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "GNU General Public License for more details.\n" - "\n" - "You should have received a copy of the GNU General Public License\n" - "along with this program; if not, write to the Free Software\n" - "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"; - -static const char *OnText = "On"; - -static const char *OffText = "Off"; - -static const char *HowHelp = - "-h or --help gives usage information. See also ChkTeX.{ps,dvi}.\n"; - -static const char *HelpText = - "\n" - "\n" - " Usage of ChkTeX v" PACKAGE_VERSION "\n" - " ~~~~~~~~~~~~~~~~~~~~\n" - "\n" - " Template\n" - " ~~~~~~~~\n" - "chktex [-hiqrW] [-v[0-...]] [-l <rcfile>] [-[wemn] <[1-42]|all>]\n" - " [-d[0-...]] [-p <name>] [-o <outfile>] [-[btxgI][0|1]]\n" - " file1 file2 ...\n" - "\n" - "----------------------------------------------------------------------\n" - " Description of options:\n" - " ~~~~~~~~~~~~~~~~~~~~~~~\n" - "Misc. options\n" - "~~~~~~~~~~~~~\n" - " -h --help : This text.\n" - " -i --license : Show distribution information\n" - " -l --localrc : Read local .chktexrc formatted file.\n" - " -d --debug : Debug information. Give it a number.\n" - " -r --reset : Reset settings to default.\n" - "\n" - "Muting warning messages:\n" - "~~~~~~~~~~~~~~~~~~~~~~~~\n" - " -w --warnon : Makes msg # given a warning and turns it on.\n" - " -e --erroron : Makes msg # given an error and turns it on.\n" - " -m --msgon : Makes msg # given a message and turns it on.\n" - " -n --nowarn : Mutes msg # given.\n" - "\n" - "Output control flags:\n" - "~~~~~~~~~~~~~~~~~~~~~\n" - " -v --verbosity : How errors are displayed.\n" - " Default 1, 0=Less, 2=Fancy, 3=lacheck.\n" - " -V --pipeverb : How errors are displayed when stdout != tty.\n" - " Defaults to the same as -v.\n" - " -s --splitchar : String used to split fields when doing -v0\n" - " -o --output : Redirect error report to a file.\n" - " -q --quiet : Shuts up about version information.\n" - " -p --pseudoname: Input file-name when reporting.\n" - " -f --format : Format to use for output\n" - "\n" - "Boolean switches (1 -> enables / 0 -> disables):\n" - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" - " -b --backup : Backup output file.\n" - " -x --wipeverb : Ignore contents of `\\verb' commands.\n" - " -g --globalrc : Read global .chktexrc file.\n" - " -I --inputfiles: Execute \\input statements.\n" - " -H --headererr : Show errors found in front of \\begin{document}\n" - "\n" - "Miscellaneous switches:\n" - "~~~~~~~~~~~~~~~~~~~~~~~\n" - " -W --version : Version information\n" - "\n" - "----------------------------------------------------------------------\n" - "If no LaTeX files are specified on the command line, we will read from\n" - "stdin. For explanation of warning/error messages, please consult the\n" - "main document ChkTeX.dvi or ChkTeX.ps.\n"; - - - - -/* - * Options we will set. - * - */ - -enum Quote Quote; - -char VerbNormal[] = "%k %n in %f line %l: %m\n" "%r%s%t\n" "%u\n"; - -#define DEF(type, name, value) type name = value; -OPTION_DEFAULTS STATE_VARS; -#undef DEF -FILE *OutputFile = NULL; - -char *PrgName; - -int StdInTTY, StdOutTTY; - -/* - * End of config params. - */ - -static int ParseArgs(int argc, char **argv); -static void ShowIntStatus(void); -static int OpenOut(void); -static int ShiftArg(char **Argument); - - -/* - * Duplicates all arguments, and appends an asterix to each of them. - */ - -static void AddStars(struct WordList *wl) -{ - unsigned long Count, CmdLen; - char *Data; - - FORWL(Count, *wl) - { - Data = wl->Stack.Data[Count]; - CmdLen = strlen(Data); - if (Data[CmdLen - 1] != '*') - { - strcpy(TmpBuffer, Data); - strcat(TmpBuffer, "*"); - InsertWord(TmpBuffer, wl); - } - } -} - -/* - * Sets up all the lists. - * - */ - -static void SetupLists(void) -{ - unsigned long i; - - AddStars(&VerbEnvir); - AddStars(&MathEnvir); - - MakeLower(&UserWarnCase); - - ListRep(&WipeArg, ':', 0); - ListRep(&NoCharNext, ':', 0); - -#define ThisItem ((char *) AbbrevCase.Stack.Data[i]) - - FORWL(i, AbbrevCase) - { - if (isalpha((unsigned char)ThisItem[0])) - { - ThisItem[0] = toupper((unsigned char)ThisItem[0]); - InsertWord(ThisItem, &Abbrev); - ThisItem[0] = tolower((unsigned char)ThisItem[0]); - } - InsertWord(ThisItem, &Abbrev); - } -} - -#define NOCOMMON(a,b) NoCommon(&a,#a,&b,#b) - -/* - * Checks that two lists don't have any common element. - */ - -static void -NoCommon(struct WordList *a, const char *aName, - struct WordList *b, const char *bName) -{ - unsigned long i; - - FORWL(i, *a) - { - if (HasWord((char *) a->Stack.Data[i], b)) - PrintPrgErr(pmNoCommon, a->Stack.Data[i], aName, bName); - } -} - -/* - * Expands the tabs in a string to regular intervals sized - * TSize. - */ - -static void ExpandTabs(char *From, char *To, long TSize) -{ - char *Next; - char *Orig; - unsigned long Diff; - - Next = From; - Orig = To; - - while ((Next = strchr(From, '\t'))) - { - if ((Diff = Next - From)) - { - strncpy(To, From, Diff); - To += Diff; - Diff = TSize - ((To - Orig) % TSize); - } - else - Diff = TSize; - - memset(To, ' ', Diff); - To += Diff; - - From = ++Next; - } - strcpy(To, From); -} - - -int main(int argc, char **argv) -{ - int retval = EXIT_FAILURE, CurArg; - unsigned long Count; - int StdInUse = FALSE; - long Tab = 8; - -#ifdef __LOCALIZED - - InitStrings(); -#endif - - OutputFile = stdout; - PrgName = argv[0]; - -#undef KEY -#undef LCASE -#undef LIST -#undef LNEMPTY -#define KEY(a, def) -#define LCASE(a) -#define LIST(a) -#define LNEMPTY(a) InsertWord("", &a); - - RESOURCE_INFO; - - while (SetupVars()) - ReadRC(ConfigFile); - - if (CmdLine.Stack.Used) - { - ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); - CmdLine.Stack.Used = 1L; - } - - if ((CurArg = ParseArgs((unsigned long) argc, argv))) - { - if (CmdLine.Stack.Used) - { - ParseArgs(CmdLine.Stack.Used, (char **) CmdLine.Stack.Data); - CmdLine.Stack.Used = 1L; - } - - if (!Quiet || LicenseOnly) - fprintf(stderr, Banner); - - if (CurArg == argc) - UsingStdIn = TRUE; - -#if defined(HAVE_FILENO) && defined(HAVE_ISATTY) - - StdInTTY = isatty(fileno(stdin)); - StdOutTTY = isatty(fileno(stdout)); -#else - - StdInTTY = StdOutTTY = TRUE; -#endif - - SetupTerm(); - - if ((UsingStdIn && StdInTTY && !Quiet) || LicenseOnly) - { - fprintf(stderr, BigBanner); - } - - if (!StdOutTTY && PipeOutputFormat) - OutputFormat = PipeOutputFormat; - - if (LicenseOnly) - { - fprintf(stderr, Distrib); - } - else - { - SetupLists(); - if (QuoteStyle) - { - if (!strcasecmp(QuoteStyle, "LOGICAL")) - Quote = quLogic; - else if (!strcasecmp(QuoteStyle, "TRADITIONAL")) - Quote = quTrad; - else - { - PrintPrgErr(pmQuoteStyle, QuoteStyle); - Quote = quTrad; - } - } - - if (DebugLevel) - ShowIntStatus(); - - NOCOMMON(Italic, NonItalic); - NOCOMMON(Italic, ItalCmd); - NOCOMMON(LowDots, CenterDots); - - if (TabSize && isdigit((unsigned char)*TabSize)) - Tab = strtol(TabSize, NULL, 10); - - if (OpenOut()) - { - for (;;) - { - for (Count = 0; Count < NUMBRACKETS; Count++) - Brackets[Count] = 0L; - -#define DEF(type, name, value) name = value; - - STATE_VARS -#undef DEF - if (UsingStdIn) - { - if (StdInUse) - break; - else - { - StdInUse = TRUE; - PushFile("stdin", stdin, &InputStack); - } - } - else - { - if (CurArg <= argc) - { - const char *filename = NULL; - if (CurArg < argc) - filename = argv[CurArg++]; - - if (!PushFileName(filename, &InputStack)) - break; - } - } - - if (StkTop(&InputStack) && OutputFile) - { - while (!ferror(OutputFile) - && StkTop(&InputStack) - && !ferror(CurStkFile(&InputStack)) - && FGetsStk(ReadBuffer, BUFSIZ - 1, - &InputStack)) - { - - /* Make all spaces ordinary spaces */ - - strrep(ReadBuffer, '\n', ' '); - strrep(ReadBuffer, '\r', ' '); - ExpandTabs(ReadBuffer, TmpBuffer, Tab); - strcpy(ReadBuffer, TmpBuffer); - - strcat(ReadBuffer, " "); - FindErr(ReadBuffer, CurStkLine(&InputStack)); - } - - PrintStatus(CurStkLine(&InputStack)); - retval = EXIT_SUCCESS; - } - } - } - } - } - return retval; -} - -/* - * Opens the output file handle & possibly renames - */ - -static int OpenOut(void) -{ - int Success = TRUE; - - if (*OutputName) - { - if (BackupOut && fexists(OutputName)) - { - strcpy(TmpBuffer, OutputName); - AddAppendix(TmpBuffer, BAKAPPENDIX); - - if (fexists(TmpBuffer)) - remove(TmpBuffer); - - if (!rename(OutputName, TmpBuffer)) - PrintPrgErr(pmRename, OutputName, TmpBuffer); - else - { - PrintPrgErr(pmRenameErr, OutputName, TmpBuffer); - Success = FALSE; - } - - } - - if (Success) - { - if (!(OutputFile = fopen(OutputName, "w"))) - { - PrintPrgErr(pmOutOpen); - Success = FALSE; - } - } - } - else - OutputFile = stdout; - - return (Success); -} - -#ifndef STRIP_DEBUG -static void ShowWL(const char *Name, const struct WordList *wl) -{ - unsigned long i, j, percent; - - fprintf(stderr, "Name: %12s", Name); - - if (DebugLevel & FLG_DbgListInfo) - { - fprintf(stderr, ", MaxLen: %3ld, Entries: %3ld, ", - wl->MaxLen, wl->Stack.Used); - - if (wl->Hash.Index && wl->Stack.Used) - { - for (i = j = 0; i < HASH_SIZE; i++) - { - if (wl->Hash.Index[i]) - j++; - } - percent = (j * 10000) / wl->Stack.Used; - - - fprintf(stderr, "Hash usage: %3ld.%02ld%%", - percent / 100, percent % 100); - } - else - fprintf(stderr, "No hash table."); - } - - fputc('\n', stderr); - - if (DebugLevel & FLG_DbgListCont) - { - FORWL(i, *wl) fprintf(stderr, "\t%s\n", (char *) wl->Stack.Data[i]); - } -} -#endif - -#define BOOLDISP(var) ((var)? OnText : OffText) -#define SHOWSTAT(text, arg) fprintf(stderr, "\t" text ": %s\n", arg) -#define BOOLSTAT(name, var) SHOWSTAT(name, BOOLDISP(var)) -#define SHOWSTR(text, arg) fprintf(stderr, "%s:\n\t%s\n", text, arg); - - -/* - * Prints some of the internal flags; mainly for debugging purposes - */ - -static void ShowIntStatus(void) -{ -#ifndef STRIP_DEBUG - unsigned long Cnt; - const char *String; - const char *iuStr = ""; - - if (DebugLevel & FLG_DbgMsgs) - { - fprintf(stderr, "There are %d warnings/error messages available:\n", - emMaxFault - emMinFault - 1); - - for (Cnt = emMinFault + 1; Cnt < emMaxFault; Cnt++) - { - switch (LaTeXMsgs[Cnt].Type) - { - case etWarn: - String = "Warning"; - break; - case etErr: - String = "Error"; - break; - case etMsg: - String = "Message"; - break; - default: - String = ""; - break; - } - - switch (LaTeXMsgs[Cnt].InUse) - { - case iuOK: - iuStr = "In use"; - break; - case iuNotUser: - iuStr = "User muted"; - break; - case iuNotSys: - iuStr = "System muted"; - break; - } - - fprintf(stderr, "Number: %2ld, Type: %s, Status: %s\n" - "\tText: %s\n\n", - Cnt, String, iuStr, LaTeXMsgs[Cnt].Message); - } - } - -#undef KEY -#undef LCASE -#undef LNEMPTY -#undef LIST - -#define LNEMPTY LIST -#define LIST(a) ShowWL(#a, &a); -#define LCASE(a) LIST(a); LIST(a ## Case); -#define KEY(a,def) SHOWSTR(#a, a); - - - if (DebugLevel & (FLG_DbgListInfo | FLG_DbgListCont)) - { - RESOURCE_INFO; - } - - if (DebugLevel & FLG_DbgOtherInfo) - { - SHOWSTR("Outputformat", OutputFormat); - - fprintf(stderr, "Current flags include:\n"); - - BOOLSTAT("Read global resource", GlobalRC); - BOOLSTAT("Wipe verbose commands", WipeVerb); - BOOLSTAT("Backup outfile", BackupOut); - BOOLSTAT("Quiet mode", Quiet); - BOOLSTAT("Show license", LicenseOnly); - BOOLSTAT("Use stdin", UsingStdIn); - BOOLSTAT("\\input files", InputFiles); - BOOLSTAT("Output header errors", HeadErrOut); - } -#endif -} - -/* - * Resets all stacks. - * - */ - -#undef KEY -#undef LCASE -#undef LNEMPTY -#undef LIST - -#define LNEMPTY LIST -#define LIST(a) ClearWord(&a); -#define LCASE(a) LIST(a); LIST(a ## Case); -#define KEY(a,def) a = def; - -static void ResetStacks(void) -{ - RESOURCE_INFO; - -} - -/* - * Resets all flags (not wordlists) to their default values. Sets - * Outputfile to stdout. - * - */ - -static void ResetSettings(void) -{ - -#define DEF(type, name, value) name = value; - OPTION_DEFAULTS -#undef DEF - if (OutputFile != stdout) - { - fclose(OutputFile); - OutputFile = stdout; - } -} - -/* - * Reads a numerical argument from the argument. Supports concatenation - * of arguments (main purpose) - */ - -static int ParseNumArg(long *Dest, /* Where to put the value */ - long Default, /* Value to put in if no in argue */ - char **Argument) /* optarg or similar */ -{ - if (Argument && *Argument && isdigit((unsigned char)**Argument)) - *Dest = strtol(*Argument, Argument, 10); - else - *Dest = Default; - - return (ShiftArg(Argument)); -} - -/* - * Same as above; however, will toggle the boolean if user doesn't - * supply value - */ - -static int ParseBoolArg(int *Dest, /* Boolean value */ - char **Argument) /* optarg or similar */ -{ - long D = *Dest ? 1L : 0L; - int Retval; - - Retval = ParseNumArg(&D, *Dest ? 0L : 1L, Argument); - - *Dest = D ? TRUE : FALSE; - - return (Retval); -} - -/* - * Returns the first character in the string passed, updates the - * string pointer, if the string is non-empty. - * - * 0 if the string is empty. - */ - -static int ShiftArg(char **Argument) /* optarg or similar */ -{ - if (Argument && *Argument && **Argument) - return (*((char *) (*Argument)++)); - else - return 0; -} - -/* - * Parses an argv similar array. - */ - -static int ParseArgs(int argc, char **argv) -{ - /* Needed for option parsing. */ - - static const struct option long_options[] = { - {"help", no_argument, 0L, 'h'}, - {"localrc", required_argument, 0L, 'l'}, - {"output", required_argument, 0L, 'o'}, - {"warnon", required_argument, 0L, 'w'}, - {"erroron", required_argument, 0L, 'e'}, - {"msgon", required_argument, 0L, 'm'}, - {"nowarn", required_argument, 0L, 'n'}, - {"verbosity", optional_argument, 0L, 'v'}, - {"pipeverb", optional_argument, 0L, 'V'}, - {"debug", required_argument, 0L, 'd'}, - {"reset", no_argument, 0L, 'r'}, - {"quiet", no_argument, 0L, 'q'}, - {"license", no_argument, 0L, 'i'}, - {"splitchar", required_argument, 0L, 's'}, - {"format", required_argument, 0L, 'f'}, - {"pseudoname", required_argument, 0L, 'p'}, - - {"inputfiles", optional_argument, 0L, 'I'}, - {"backup", optional_argument, 0L, 'b'}, - {"globalrc", optional_argument, 0L, 'g'}, - {"wipeverb", optional_argument, 0L, 'x'}, - {"tictoc", optional_argument, 0L, 't'}, - {"headererr", optional_argument, 0L, 'H'}, - {"version", no_argument, 0L, 'W'}, - - {0L, 0L, 0L, 0L} - }; - - int option_index = 0L, c, i, nextc, ErrType; - - int Retval = FALSE, InUse; - int Success, Foo; - long Err, Verb = 1, PipeVerb = 1; - - enum - { - aeNoErr = 0, - aeArg, /* missing/bad required argument */ - aeOpt, /* unknown option returned */ - aeHelp, /* just a call for help */ - aeMem /* no memory */ - } ArgErr = aeNoErr; - - optind = 0; - - while (!ArgErr && - ((c = getopt_long((int) argc, argv, - "b::d:e:f:g::hH::I::il:m:n:o:p:qrs:t::v::V::w:Wx::", - long_options, &option_index)) != EOF)) - { - while (c) - { - nextc = 0; - switch (c) - { - case 's': - if (!(Delimit = strdup(optarg))) - { - PrintPrgErr(pmStrDupErr); - ArgErr = aeMem; - } - - break; - case 'p': - if (!(PseudoInName = strdup(optarg))) - { - PrintPrgErr(pmStrDupErr); - ArgErr = aeMem; - } - - break; - - case 'd': -#ifdef STRIP_DEBUG - - PrintPrgErr(pmNoDebugFlag); -#else - - nextc = ParseNumArg(&DebugLevel, 0xffff, &optarg); -#endif - - break; - case 'i': - LicenseOnly = TRUE; - - nextc = ShiftArg(&optarg); - break; - case 'q': - Quiet = TRUE; - - nextc = ShiftArg(&optarg); - break; - - LOOP(warntype, case 'w': - ErrType = etWarn; InUse = iuOK; LAST(warntype); case 'e': - ErrType = etErr; InUse = iuOK; LAST(warntype); case 'm': - ErrType = etMsg; InUse = iuOK; LAST(warntype); case 'n': - ErrType = etMsg; InUse = iuNotUser; LAST(warntype);) if (isdigit((unsigned char)*optarg)) - { - nextc = ParseNumArg(&Err, -1, &optarg); - if (betw(emMinFault, Err, emMaxFault)) - { - LaTeXMsgs[Err].Type = ErrType; - LaTeXMsgs[Err].InUse = InUse; - } - else - { - ArgErr = aeOpt; - PrintPrgErr(pmWarnNumErr); - } - } - else if (!strcasecmp(optarg, "all")) - { - for (i = emMinFault + 1; i < emMaxFault; i++) - { - LaTeXMsgs[i].Type = ErrType; - LaTeXMsgs[i].InUse = InUse; - } - } - else - { - ArgErr = aeOpt; - PrintPrgErr(pmWarnNumErr); - } - - break; - - case 'g': - nextc = ParseBoolArg(&GlobalRC, &optarg); - if (!GlobalRC) - { - ResetStacks(); - } - break; - - case 'r': - ResetSettings(); - nextc = ShiftArg(&optarg); - break; - - case 'l': - if (optarg) - ReadRC(optarg); - break; - - case 'f': - if (!(OutputFormat = strdup(optarg))) - { - PrintPrgErr(pmStrDupErr); - ArgErr = aeMem; - } - break; - - case 'v': - nextc = ParseNumArg(&Verb, 2, &optarg); - - if (Verb < (long) OutFormat.Stack.Used) - OutputFormat = strdup(OutFormat.Stack.Data[Verb]); - else - { - PrintPrgErr(pmVerbLevErr); - ArgErr = aeArg; - } - break; - case 'V': - nextc = ParseNumArg(&PipeVerb, 1, &optarg); - - if (PipeVerb < (long) OutFormat.Stack.Used) - PipeOutputFormat = strdup(OutFormat.Stack.Data[PipeVerb]); - else - { - PrintPrgErr(pmVerbLevErr); - ArgErr = aeArg; - } - break; - - case 'o': - if (optarg) - { - if (*OutputName) - { - PrintPrgErr(pmOutTwice); - ArgErr = aeOpt; - } - else - { - if (!(OutputName = strdup(optarg))) - { - PrintPrgErr(pmStrDupErr); - ArgErr = aeMem; - } - } - } - - break; - - case 't': - nextc = ParseBoolArg(&Foo, &optarg); - break; - case 'x': - nextc = ParseBoolArg(&WipeVerb, &optarg); - break; - case 'b': - nextc = ParseBoolArg(&BackupOut, &optarg); - break; - case 'I': - nextc = ParseBoolArg(&InputFiles, &optarg); - break; - case 'H': - nextc = ParseBoolArg(&HeadErrOut, &optarg); - break; - case 'W': - printf(Banner); - exit(EXIT_SUCCESS); - case '?': - default: - fputs(Banner, stderr); - fputs(HowHelp, stderr); - exit(EXIT_FAILURE); - break; - case 'h': - ArgErr = aeHelp; - break; - } - c = nextc; - } - } - - if ((argc > optind) && !strcmp(argv[optind], "?")) - ArgErr = aeHelp; - - if (ArgErr) - { - fputs(Banner, stderr); - fputs(BigBanner, stderr); - fputs(HelpText, stderr); - Success = FALSE; - } - else - Success = TRUE; - - if (Success) - Retval = optind; - - return (Retval); -} - -/* - * Outputs a program error. - */ - - -void PrintPrgErr(enum PrgErrNum Error, ...) -{ - const char *Type; - va_list MsgArgs; - - if (betw(pmMinFault, Error, pmMaxFault)) - { - switch (PrgMsgs[Error].Type) - { - case etWarn: - Type = "WARNING"; - break; - case etMsg: - Type = "NOTE"; - break; - default: - case etErr: - Type = "ERROR"; - break; - } - fprintf(stderr, "%s: %s -- ", PrgName, Type); - - va_start(MsgArgs, Error); - vfprintf(stderr, PrgMsgs[Error].Message, MsgArgs); - va_end(MsgArgs); - fputc('\n', stderr); - - if (PrgMsgs[Error].Type == etErr) - exit(EXIT_FAILURE); - } -} - -void ErrPrintf(const char *fmt, ...) -{ - va_list MsgArgs; - - va_start(MsgArgs, fmt); - vfprintf(stderr, fmt, MsgArgs); - va_end(MsgArgs); -} |