root/usr/src/cmd/sgs/error/common/error.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _ERROR_H
#define _ERROR_H

#ifdef  __cplusplus
extern "C" {
#endif

typedef int     boolean;

#define TRUE    1
#define FALSE   0

#define true    1
#define false   0
/*
 *      Descriptors for the various languages we know about.
 *      If you touch these, also touch lang_table
 */
#define INUNKNOWN       0
#define INCPP   1
#define INCC    2
#define INAS    3
#define INLD    4
#define INLINT  5
#define INF77   6
#define INPI    7
#define INPC    8
#define INFRANZ 9
#define INLISP  10
#define INVAXIMA        11
#define INRATFOR        12
#define INLEX   13
#define INYACC  14
#define INAPL   15
#define INMAKE  16
#define INRI    17
#define INTROFF 18
#define INMOD2  19
#define INSUNF77 20

extern  int     language;

extern  boolean notouch;

/*
 *      We analyze each line in the error message file, and
 *      attempt to categorize it by type, as well as language.
 *      Here are the type descriptors.
 */
typedef int     Errorclass;

#define C_FIRST 0               /* first error category */
#define C_UNKNOWN       0       /* must be zero */
#define C_IGNORE        1       /* ignore the message; used for pi */
#define C_SYNC          2       /* synchronization errors */
#define C_DISCARD       3       /* touches dangerous files, so discard */
#define C_NONSPEC       4       /* not specific to any file */
#define C_THISFILE      5       /* specific to this file, but at no line */
#define C_NULLED        6       /* refers to special func; so null */
#define C_TRUE          7       /* fits into true error format */
#define C_DUPL          8       /* sub class only; duplicated error message */
#define C_LAST  9               /* last error category */

#define SORTABLE(x)     (!(NOTSORTABLE(x)))
#define NOTSORTABLE(x)  (x <= C_NONSPEC)
/*
 *      Resources to count and print out the error categories
 */
extern  char            *class_table[];
extern  int             class_count[];

#define nunknown        class_count[C_UNKNOWN]
#define nignore         class_count[C_IGNORE]
#define nsyncerrors     class_count[C_SYNC]
#define ndiscard        class_count[C_DISCARD]
#define nnonspec        class_count[C_NONSPEC]
#define nthisfile       class_count[C_THISFILE]
#define nnulled         class_count[C_NULLED]
#define ntrue           class_count[C_TRUE]
#define ndupl           class_count[C_DUPL]

/* places to put the error complaints */

#define TOTHEFILE       1       /* touch the file */
#define TOSTDOUT        2       /* just print them out (ho-hum) */

extern FILE *errorfile; /* where error file comes from */
extern FILE *queryfile; /* where the query responses from the user come from */

extern  char    *currentfilename;
extern  char    *processname;
extern  char    *scriptname;

extern  boolean query;
extern  boolean terse;
int     inquire(char *format, ...);                     /* inquire for yes/no */
/*
 *      codes for inquire() to return
 */
#define Q_NO    1                       /* 'N' */
#define Q_no    2                       /* 'n' */
#define Q_YES   3                       /* 'Y' */
#define Q_yes   4                       /* 'y' */

int     probethisfile(char *name);
/*
 *      codes for probethisfile to return
 */
#define F_NOTEXIST      1
#define F_NOTREAD       2
#define F_NOTWRITE      3
#define F_TOUCHIT       4

/*
 *      Describes attributes about a language
 */
struct lang_desc {
        char    *lang_name;
        char    *lang_incomment;        /* one of the following defines */
        char    *lang_outcomment;       /* one of the following defines */
};
extern struct lang_desc lang_table[];

#define CINCOMMENT      "/*###"
#define COUTCOMMENT     "%%%*/\n"
#define FINCOMMENT      "C###"
#define FOUTCOMMENT     "%%%\n"
#define NEWLINE         "%%%\n"
#define PIINCOMMENT     "(*###"
#define PIOUTCOMMENT    "%%%*)\n"
#define LISPINCOMMENT   ";###"
#define ASINCOMMENT     "####"
#define RIINCOMMENT     CINCOMMENT
#define RIOUTCOMMENT    COUTCOMMENT
#define TROFFINCOMMENT  ".\\\"###"
#define TROFFOUTCOMMENT NEWLINE
#define MOD2INCOMMENT   "(*###"
#define MOD2OUTCOMMENT  "%%%*)\n"
/*
 *      Defines and resources for determing if a given line
 *      is to be discarded because it refers to a file not to
 *      be touched, or if the function reference is to a
 *      function the user doesn't want recorded.
 */
#define IG_FILE1        "llib-port"
#define IG_FILE2        "/usr/lib/llib-port"

#define ERRORNAME       "/.errorrc"
extern int      nignored;
extern char     **names_ignored;
/*
 *      Structure definition for a full error
 */
typedef struct edesc    Edesc;
typedef Edesc   *Eptr;

struct edesc {
        Eptr    error_next;             /* linked together */
        int     error_lgtext;           /* how many on the right hand side */
        char    **error_text;           /* the right hand side proper */
        Errorclass      error_e_class;  /* error category of this error */
        Errorclass      error_s_class;  /* sub descriptor of error_e_class */
        int     error_language;         /* the language for this error */
        int     error_position;         /* oridinal position */
        int     error_line;             /* discovered line number */
        int     error_no;               /* sequence number on input */
};
/*
 *      Resources for the true errors
 */
extern  int     nerrors;
extern  Eptr    er_head;
extern  Eptr    *errors;
/*
 *      Resources for each of the files mentioned
 */
extern  int     nfiles;
extern  Eptr    **files;        /* array of pointers into errors */
extern  boolean *touchedfiles;  /* which files we touched */
/*
 *      The langauge the compilation is in, as intuited from
 *      the flavor of error messages analyzed.
 */
extern  int     langauge;
extern  char    *currentfilename;
/*
 *      Functional forwards
 */
void    *Calloc(int nelements, int size);
char    *strsave(char *instring);
char    lastchar(char *string);
char    firstchar(char *string);
char    next_lastchar(char *string);
char    **wordvsplice(int emptyhead, int wordc, char **wordv);
int     wordvcmp(char **wordv1, int wordc, char **wordv2);
boolean persperdexplode(char *string, char **r_perd, char **r_pers);
/*
 *      Printing hacks
 */
char    *plural(int n);
char    *verbform(int n);

void erroradd(int errorlength, char **errorv, Errorclass errorclass,
    Errorclass errorsubclass);
void eaterrors(int *r_errorc, Eptr **r_errorv);
void wordvbuild(char *string, int *r_wordc, char ***r_wordv);
void wordvprint(FILE *fyle, int wordc, char *wordv[]);
void printerrors(boolean look_at_subclass, int errorc, Eptr errorv[]);
void clob_last(char *string, char newstuff);
void arrayify(int *e_length, Eptr **e_array, Eptr header);
void getignored(char *auxname);
void filenames(int nfiles, Eptr **files);
void findfiles(int nerrors, Eptr *errors, int *r_nfiles, Eptr ***r_files);
void onintr(int sig);
boolean touchfiles(int nfiles, Eptr **files, int *r_edargc, char ***r_edargv);
Errorclass discardit(Eptr errorp);
char *substitute(char *string, char chold, char chnew);
int position(char *string, char ch);

#ifdef  __cplusplus
}
#endif

#endif /* _ERROR_H */