pkgsrc-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Problem with BCC



On Tue, Oct 03, 2006 at 09:00:51AM +0200, Pierrick Brossin wrote:
> io.c: In function 'redefined':
> io.c:534: error: 'NULL' undeclared (first use in this function)
> io.c:534: error: (Each undeclared identifier is reported only once
> io.c:534: error: for each function it appears in.)
> *** Error code 1

It seems POSIX headers are missing.
We just have to comment or remove the line saying #undef NULL in:
 - ld/io.c
 - ld/ld.c
 - as/as.c
 - as/genobj.c
 - as/gensym.c
 - bcco
Make sure to comment the one in the 'else' of #ifdef
POSIX_HEADERS_MISSING!

I now have another problem:

#   compile  bcc-cc1/input.o
cc -O2 -DNSIG=32   -Werror      -c    input.c
cc1: warnings being treated as errors
input.c: In function 'openio':
input.c:426: warning: incompatible implicit declaration of built-in
function 'memset'
*** Error code 1

input.c attached.


-Pierrick Brossin

/* input.c - input for bcc */

/* Copyright (C) 1992 Bruce Evans */

#define ARBITRARY_BACKSLASH_NEWLINES_NOT
#define INSERT_BACKSLASH_NEWLINES_NOT

#include "const.h"
#include "types.h"
#include "gencode.h"
#include "output.h"
#include "os.h"
#include "sc.h"
#include "scan.h"
#include "table.h"

#undef EXTERN
#define EXTERN
#include "input.h"

#define INBUFSIZE 2048

struct fbufstruct               /* file buffer structure */
{
    struct fcbstruct fcb;       /* status after opening an include sub-file */
    char *fname;                /* file name */
    bool_t fname_malloced;      /* nonzero if fname was malloced */
    char pushback[3];           /* allows pushback to 2 before start of fbuf
                                 * XXX 3 chars before?
                                 * XXX should do everything in fbuf */
    char fbuf[INBUFSIZE + 1];   /* buffer to read into */
};

struct inclist                  /* list of include file directories */
{
    char *incdirname;
    struct inclist *incnext;
};

PRIVATE char filemacro[] = "__FILE__";
PRIVATE struct inclist incabsolute;     /* dummy list for absolute names */
                                /* depends on zero (NULL) init */
PRIVATE struct inclist incfirst;
                                /* begin include searches here for "" */
                                /* at next in list for <> */
                                /* -I directories are put in list */
                                /* between first and last */
PRIVATE struct inclist inclast =
{
    DEFAULT_INCLUDE_DIR,
    NULL,
};
PRIVATE fastin_t inclevel;      /* nest level of include files */
                                /* depends on zero init */
PRIVATE struct fbufstruct *inputbuf;    /* current input file buffer */
                                        /* its fcb only to date in includes */
                                        /* depends on zero (NULL) init */
PRIVATE bool_t suppress_line_numbers;

#ifdef ARBITRARY_BACKSLASH_NEWLINES
FORWARD void backslash P((void));
#endif
FORWARD void definefile P((char *fname));
FORWARD void inputinit P((char *fname, fd_t fd));
FORWARD void leaveinclude P((void));
FORWARD void usage P((void));

#ifdef ARBITRARY_BACKSLASH_NEWLINES
PRIVATE void backslash()
{
    static unsigned nbackslash;

    if (nbackslash != 0)
        --nbackslash;
more:
    ++nbackslash;
    while (*(lineptr + 1) == '\\')
    {
        ++nbackslash;
        ++lineptr;
    }
    if (*(lineptr + 1) != EOL)
    {
        if (--nbackslash != 0)
            *--lineptr = '\\';  /* force look at current backslash again */
        return;
    }
    ch = *++lineptr;
more1:
    if (!eof && lineptr >= input.limit)
        skipeol();
    if (ch == EOL)
    {
        --nbackslash;
        if (eof)
            eofin("backslash-newline");
        else
        {
            skipeol();
            if (ch == EOL && !eof && lineptr >= input.limit)
                skipeol();
#ifdef COEOL /* XXX - this should go through specialchar() */
            if (ch == COEOL)
            {
                ch = *++lineptr;
                if (ch == EOL && !eof && lineptr >= input.limit)
                    skipeol();
            }
#endif
        }
        if (ch == '\\')
            goto more;
        if (nbackslash != 0 && ch == EOL && !eof)
            goto more1;
        if (nbackslash != 0)
        {
            ch = *--lineptr = '\\';
            if (--nbackslash != 0)
                ch = *--lineptr = '\\';
        }
        return;
    }
    if (ch == '\\')
        goto more;
    if (ch == EOL && !eof)
        goto more1;
    ch = *--lineptr = '\\';     /* pushback */
    if (--nbackslash != 0)
        ch = *--lineptr = '\\';
}
#endif

PUBLIC void closein()
{
#ifdef FAKE_INBUFSIZE_1
    fclose(input.fp);
#else
    close(input.fd);
#endif
    while (inclevel != 0)
        leaveinclude();
}

PRIVATE void definefile(fname)
char *fname;
{
    char *def;

    def = ourmalloc(sizeof filemacro - 1 + 2 + strlen(fname) + 1 + 1);
    strcpy(def, filemacro);
    strcat(def, "=\"");
    strcat(def, fname);
    strcat(def, "\"");
    definestring(def);
    ourfree(def);
}

PUBLIC void errorloc()
{
    register struct fbufstruct *infbuf;

    if ((infbuf = inputbuf) == NULL)
        return;
    outstr(infbuf->fname);
    outbyte(':');
    if (eof)
        outstr("eof");
    else
    {
        outudec(input.linenumber);
        outbyte('.');
        if (maclevel == 0)
            outudec((unsigned) (lineptr - inputbuf->fbuf) - input.lineoffset);
        else
        {
            outudec((unsigned) (savedlineptr() - inputbuf->fbuf)
                    - input.lineoffset);
            outstr(" (macro level ");
            outudec((unsigned) maclevel);
            outbyte(')');
        }
    }
    infbuf->fcb.includer = input.includer;
    while ((infbuf = infbuf->fcb.includer) != NULL)
    {
        outstr(" (from ");
        outstr(infbuf->fname);
        outbyte(':');
        outudec(infbuf->fcb.linenumber);
        outbyte(')');
    }
    outstr(": ");
}

/* gch1() - get next char, advance ptr (only works on current line) */

PUBLIC void gch1()
{
    if (SYMOFCHAR(ch = *++lineptr) != SPECIALCHAR)
        return;
    specialchar();
}

/* process #include */

PUBLIC void include()
{
    char *dirnameptr;
    char *dirnamend;
    unsigned dirnamelen;
    fd_t fd;
    char *fnameptr;
    char *fullnameptr;
    struct inclist *incptr;
    char terminator;

    while (blanksident())
    {
        if ((gsymptr = findlorg(gsname)) == NULL ||
            gsymptr->flags != DEFINITION)
            break;
        entermac();
    }
    if ((terminator = ch) == '<')
        terminator = '>';
    else if (terminator != '"')
    {
        error("bad file name");
        return;
    }
    gch1();
    fnameptr = charptr;
    while (TRUE)
    {
        if (ch == EOL)          /* no escapes in file names */
            break;
        if (ch == terminator)
        {
            gch1();
            break;
        }
        if (charptr >= chartop)
            fnameptr = growobject(fnameptr, 1);
#ifdef TS
++ts_n_filename;
++ts_s_filename;
++ts_s_filename_tot;
#endif
        *charptr++ = ch;
        gch1();
    }
    if (charptr >= chartop)
        fnameptr = growobject(fnameptr, 1);
#ifdef TS
++ts_n_filename_term;
++ts_s_filename_term;
++ts_s_filename_tot;
#endif
    *charptr++ = 0;
    dirnamend = NULL;
    if (isabspath(fnameptr, &ch))
        incptr = &incabsolute;
    else
    {
        incptr = &incfirst;
        if (terminator == '>')
            incptr = incptr->incnext;
        else
        {
            dirnameptr = inputbuf->fname;
            if ((dirnamend = strrchr(dirnameptr, DIRCHAR)) == NULL)
                incptr->incdirname = NULL;
            else
            {
                *dirnamend = 0;
                incptr->incdirname = dirnameptr;
            }
        }
    }
    do
    {
        if (incptr->incdirname == NULL)
        {
            fullnameptr = ourmalloc(strlen(fnameptr) + 1);
#ifdef TS
++ts_n_pathname;
ts_s_pathname += strlen(fnameptr) + 1;
ts_s_pathname_tot += strlen(fnameptr) + 1;
#endif
            strcpy(fullnameptr, fnameptr);
        }
        else
        {
            dirnamelen = strlen(incptr->incdirname);
            fullnameptr = ourmalloc(dirnamelen + (int) (charptr - fnameptr)
                                    + 2);
                                /* 2 extra for null and maybe DIRCHAR */
#ifdef TS
++ts_n_pathname;
ts_s_pathname += dirnamelen + (charptr - fnameptr) + 2;
ts_s_pathname_tot += dirnamelen + (charptr - fnameptr) + 2;
#endif
            dirnameptr = fullnameptr + dirnamelen;
            strcpy(fullnameptr, incptr->incdirname);
            if (*fullnameptr != 0 && *(dirnameptr - 1) != DIRCHAR)
                strcat(fullnameptr, DIRSTRING);
            strcat(fullnameptr, fnameptr);
            if (dirnamend != NULL)
            {
                *dirnamend = DIRCHAR;
                dirnamend = NULL;
            }
        }
        fd = open(fullnameptr, 0);
        if (fd >= 0)
        {
#ifdef TS
ts_s_filename_tot -= charptr - fnameptr;
#endif
            charptr = fnameptr;
            input.lineptr = lineptr;
            inputbuf->fcb = input;
            ++inclevel;         /* XXX - will run out of memory before overflow 
*/
            inputinit(fullnameptr, fd);
            inputbuf->fname_malloced = TRUE;
            return;
        }
#ifdef TS
ts_s_pathname_tot -= strlen(fullnameptr) + 1;
#endif
        ourfree(fullnameptr);
    }
    while ((incptr = incptr->incnext) != NULL);
    error("cannot find include file");
#ifdef TS
ts_s_filename_tot -= charptr - fnameptr;
#endif
    charptr = fnameptr;
}

/* initialise current input file */

PRIVATE void inputinit(fname, fd)
char *fname;
fd_t fd;
{
    register struct fbufstruct *newinputbuf;

    /* don't allocate after saying input.includer = inputbuf (to save a reg)
     * or an error in the alloc would cycle trying to print the include list
     */
    newinputbuf = (struct fbufstruct *) ourmalloc(sizeof *inputbuf);
#ifdef TS
++ts_n_inputbuf;
ts_s_inputbuf += sizeof *inputbuf;
ts_s_inputbuf_tot += sizeof *inputbuf;
#endif
    input.fd = fd;
#ifdef FAKE_INBUFSIZE_1
    input.fp = fdopen(fd, "r");
#endif
    input.linenumber = 0;
    input.lineoffset = 0;
    input.includer = inputbuf;
    inputbuf = newinputbuf;
    newinputbuf->fname = fname;
    newinputbuf->fname_malloced = FALSE;
    undefinestring(filemacro);
    definefile(fname);
    if (orig_cppmode && !suppress_line_numbers)
        outcpplinenumber(1, fname, input.includer == NULL ? "" : " 1");
    *(input.limit = newinputbuf->fbuf) = EOL;

    /* dummy line so #include processing can start with skipline() */
    ch = *(lineptr = newinputbuf->fbuf - 1) = EOL;
}

/* switch from include file to file which included it */

PRIVATE void leaveinclude()
{
    --inclevel;
    if (inputbuf->fname_malloced)
{
#ifdef TS
ts_s_pathname_tot -= strlen(inputbuf->fname) + 1;
#endif
        ourfree(inputbuf->fname);
}
#ifdef TS
ts_s_inputbuf_tot -= sizeof *inputbuf;
#endif
    ourfree((char *) inputbuf);
    close(input.fd);
#ifdef FAKE_INBUFSIZE_1
    fclose(input.fp);
#endif
    inputbuf = input.includer;
    input = inputbuf->fcb;
    undefinestring(filemacro);
    definefile(inputbuf->fname);
    ch = *(lineptr = input.lineptr);
    skipline();
    if (orig_cppmode && !suppress_line_numbers)
        outcpplinenumber(input.linenumber, inputbuf->fname, " 2");
}

/* open input and output files and get options */

PUBLIC void openio(argc, argv)
int argc;
char *argv[];
{
    register char *arg;
    int argn;
    fd_t fd;
    char *fname;
    struct inclist *incnew;
    struct inclist *incptr;
    bool_t flag[128];

#if 0
    lineptr = "\n";             /* empty line in case error message */
#endif
    fd = 0;                     /* standard input */
    memset(flag, 0, sizeof flag);
    flag['3'] = sizeof (int) >= 4;
    fname = "stdin";
    (incptr = &incfirst)->incnext = &inclast;
    initout();
    for (argn = 1; argn < argc; ++argn)
    {
        arg = argv[argn];
        if (*arg != '-')
        {
            if (fd != 0)
                fatalerror("more than one input file");
            fname = arg;
            if ((fd = open(arg, 0)) < 0)
                fatalerror("cannot open input");
        }
        else
            switch (arg[1])
            {
#ifdef I8088
            case '0':           /* generate 16-bit code */
            case '3':           /* generate 32-bit code */
#endif
            case 'c':           /* caller saves */
#ifdef DEBUG
            case 'd':           /* print debugging information in asm output */
#endif
            case 'E':           /* acting as cpp */
            case 'f':           /* pass first argument in register */
#ifdef DYNAMIC_LONG_ORDER
            case 'l':           /* long big-endian */
#endif
            case 'P':           /* if acting as cpp, suppress line numbers */
#ifdef POSINDEPENDENT
            case 'p':           /* generate almost-position-independent code */
#endif
            case 't':           /* print source code in asm output */
            case 'w':           /* watch location counter */
                if (arg[2] == 0)
                    flag[arg[1]] = TRUE;
                else if (arg[2] == '-' && arg[3] == 0)
                    flag[arg[1]] = FALSE;
                else
                    usage();
                if (arg[1] == '0')      /* flag 0 is negative logic flag 3 */
                    flag['3'] = TRUE + FALSE - flag['0'];
                break;
            case 'D':
                definestring(arg + 2);
                break;
            case 'I':
                (incnew = (struct inclist *) ourmalloc(sizeof *incnew))
                          ->incdirname = arg + 2;
#ifdef TS
++ts_n_includelist;
ts_s_includelist += sizeof *incnew;
#endif
                incnew->incnext = incptr->incnext;
                incptr = incptr->incnext = incnew;
                break;
            case 'U':
                undefinestring(arg + 2);
                break;
            case 'o':
                if (arg[2] != 0 || ++argn >= argc)
                    usage();
                openout(argv[argn]);
                break;
            default:
                usage();
                break;
            }
    }
#ifdef I8088
    if (flag['3'])
    {
        i386_32 = TRUE;
        definestring("__AS386_32__");
    }
    else
        definestring("__AS386_16__");
#endif
#ifdef MC6809
    definestring("__AS09__");
#endif
    if (flag['c'])
    {
        callersaves = TRUE;
        definestring("__CALLER_SAVES__");
    }
#ifdef DEBUG
    debugon = flag['d'];
#endif
    orig_cppmode = cppmode = flag['E'];
    if (flag['f'])
    {
        arg1inreg = TRUE;
#ifdef I8088
        definestring("__FIRST_ARG_IN_AX__");
#endif
#ifdef MC6808
        definestring("__FIRST_ARG_IN_X__");
#endif
    }
    arg1op = arg1inreg ? ROOTLISTOP : LISTOP;
#ifdef DYNAMIC_LONG_ORDER
    if (flag['l'])
    {
        long_big_endian = TRUE;
        definestring("__LONG_BIG_ENDIAN__");
    }
#endif
    suppress_line_numbers = flag['P'];
#ifdef POSINDEPENDENT
    if (flag['p'])
    {
        posindependent = TRUE;
        definestring("__POS_INDEPENDENT__");
    }
#endif
    ctext = flag['t'];
    watchlc = flag['w'];
    setoutbufs();
    inputinit(fname, fd);
}

/* advance over EOL sentinel to new line */

PUBLIC void skipeol()
{
#ifdef FAKE_INBUFSIZE_1
    static int ich;
#endif
#ifdef INSERT_BACKSLASH_NEWLINES
    static int bs_state;
    static bool_t skip_printing_nl;
#endif
    int nread;

    if (eof)
        return;
    if (lineptr < input.limit)
    {
        ++input.linenumber;
        ch = *++lineptr;
        if (ctext && !asmmode)
        {
            comment();
            outudec(input.linenumber);
            outbyte(' ');
            outline(lineptr);
        }
        if (orig_cppmode && !asmmode)
#ifdef INSERT_BACKSLASH_NEWLINES
            if (!skip_printing_nl)
#endif

                outbyte('\n');
#ifdef INSERT_BACKSLASH_NEWLINES
        if (bs_state == 1 && *(lineptr - 1) == EOL)
#endif
            input.lineoffset = (int) (lineptr - inputbuf->fbuf);
        return;
    }
    input.lineoffset -= (int) (lineptr - inputbuf->fbuf);
#ifdef FAKE_INBUFSIZE_1
    lineptr = inputbuf->fbuf;
#ifdef INSERT_BACKSLASH_NEWLINES
    switch (bs_state)
    {
case0:
    case 0:
        bs_state = nread = (ich = getc(input.fp)) == EOF ? 0 : 1;
        skip_printing_nl = FALSE;
        break;
    case 1:
        if (ich == '\\')
            goto case0;         /* avoid chance of splitting \EOL */
        ich = '\\';
        nread = 1;
        bs_state = 2;
        ++input.lineoffset;
        break;
    case 2:
        ich = EOL;
        nread = 1;
        bs_state = 0;
        skip_printing_nl = TRUE;
        ++input.lineoffset;
        --input.linenumber;
        break;
    }
#else
    nread = (ich = getc(input.fp)) == EOF ? 0 : 1;
#endif
    *lineptr = ich;
#else
    nread = read(input.fd, lineptr = inputbuf->fbuf, INBUFSIZE);
#endif
    if (nread < 0)
        fatalerror("input error");
    *(input.limit = lineptr + nread) = EOL;
    ch = *lineptr;
    if (nread == 0)
    {
        if (inclevel == 0)
        {
            eof = TRUE;
            checknotinif();
        }
        else
        {
            leaveinclude();
            skipeol();
        }
        return;
    }
    if (ctext && !asmmode)
    {
        comment();
        outudec(input.linenumber);
        outbyte(' ');
        outline(lineptr);
    }
}

PUBLIC void specialchar()
{
    if (maclevel != 0)
    {
        if (ch == EOL)          /* it might also be backslash or COEOL */
            leavemac();
        if (ch != EOL)
            return;
    }
more:
#ifdef ARBITRARY_BACKSLASH_NEWLINES
    if (ch == '\\')
        backslash();
#endif
    if (!eof && lineptr >= input.limit)
    {
        skipeol();
#ifdef ARBITRARY_BACKSLASH_NEWLINES
        if (ch == '\\')
            backslash();
#endif
    }
#ifndef ARBITRARY_BACKSLASH_NEWLINES
    if (ch == '\\')
    {
        if (*(lineptr + 1) == EOL)
        {
            if (lineptr + 1 >= input.limit)
            {
                ++lineptr;
                skipeol();
                ch = *--lineptr = '\\'; /* pushback */
            }
            if (*(lineptr + 1) == EOL)
            {
                if (eof)
                    eofin("backslash-newline");
                else
                {
                    ++lineptr;
                    skipeol();
                    if (SYMOFCHAR(ch) == SPECIALCHAR)
                    {
#ifdef COEOL
                        if (ch != COEOL
                            || SYMOFCHAR(ch = *++lineptr) == SPECIALCHAR)
#endif
                            goto more;
                    }
                }
            }
        }
#endif
    }
#ifdef COEOL
    if (ch == EOL && !eof)
    {
        if (*(lineptr + 1) == EOL && lineptr + 1 >= input.limit)
        {
            ++lineptr;
            skipeol();          /* refill buffer */
            ch = *--lineptr = EOL;      /* pushback */
        }
        if (*(lineptr + 1) == COEOL)
            *++lineptr = EOL;   /* discard COEOL */
    }
#endif
}

PRIVATE void usage()
{
    fatalerror(
#ifdef MC6809
"usage: cc1 [-cdfptw[-]] [-Ddefine] [-Iincdir] [-Uundef] [-o outfile] 
[infile]");
#else
"usage: cc1 [-03cdfltw[-]] [-Ddefine] [-Iincdir] [-Uundef] [-o outfile] 
[infile]");
#endif
}


Home | Main Index | Thread Index | Old Index