Category : C Source Code
Archive   : JPSRC2.ZIP
Filename : CONFIG.C

 
Output of file : CONFIG.C contained in archive : JPSRC2.ZIP
/*
* config.c
*
* Copyright (C) 1991, Thomas G. Lane.
* This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file.
*/

/*
* This program is intended to help you determine how to configure the JPEG
* software for installation on a particular system. The idea is to try to
* compile and execute this program. If your compiler fails to compile the
* program, make changes as indicated in the comments below. Once you can
* compile the program, run it, and it will tell you how to set the various
* switches in jconfig.h and in your Makefile.
*
* This could all be done automatically if we could assume we were on a Unix
* system, but we don't want to assume that, so you'll have to edit and
* recompile this program until it works.
*
* As a general rule, each time you try to compile this program,
* pay attention only to the *first* error message you get from the compiler.
* Many C compilers will issue lots of spurious error messages once they
* have gotten confused. Go to the line indicated in the first error message,
* and read the comments preceding that line to see what to change.
*
* Almost all of the edits you may need to make to this program consist of
* changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL",
* or vice versa. This is called defining or undefining that symbol.
*/


/* First we must see if your system has the include files we need.
* We start out with the assumption that your system follows the ANSI
* conventions for include files. If you get any error in the next dozen
* lines, undefine INCLUDES_ARE_ANSI.
*/

#define INCLUDES_ARE_ANSI /* replace 'define' by 'undef' if error here */

#ifdef INCLUDES_ARE_ANSI /* this will be skipped if you undef... */
#include /* If you ain't got this, you ain't got C. */
#ifdef __SASC /* Amiga SAS C provides size_t in stddef.h. */
#include /* (They are wrong...) */
#endif
#include /* size_t might be here too. */
typedef size_t my_size_t; /* The payoff: do we have size_t now? */
#include /* Check other ANSI includes we use. */
#endif


/* If your system doesn't follow the ANSI conventions, we have to figure out
* what it does follow. If you didn't get an error before this line, you can
* ignore everything down to "#define HAVE_ANSI_DEFINITIONS".
*/

#ifndef INCLUDES_ARE_ANSI /* skip these tests if INCLUDES_ARE_ANSI */

#include /* If you ain't got this, you ain't got C. */

/* jinclude.h will try to include if you don't set
* INCLUDES_ARE_ANSI. We need to test whether that include file is provided.
* If you get an error here, undefine HAVE_TYPES_H.
*/

#define HAVE_TYPES_H

#ifdef HAVE_TYPES_H
#include
#endif

/* We have to see if your string functions are defined by
* strings.h (BSD convention) or string.h (everybody else).
* We try the non-BSD convention first; define BSD if the compiler
* says it can't find string.h.
*/

#undef BSD

#ifdef BSD
#include
#else
#include
#endif

/* Usually size_t is defined in stdio.h, sys/types.h, and/or string.h.
* If not, you'll get an error on the "typedef size_t my_size_t;" line below.
* In that case, you'll have to search through your system library to
* figure out which include file defines "size_t". Look for a line that
* says "typedef something-or-other size_t;" (stddef.h and stdlib.h are
* good places to look first). Then, change the line below that says
* "#include " to instead include the file
* you found size_t in, and define NEED_SPECIAL_INCLUDE.
*/

#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */

#ifdef NEED_SPECIAL_INCLUDE
#include
#endif

typedef size_t my_size_t; /* The payoff: do we have size_t now? */


#endif /* INCLUDES_ARE_ANSI */



/* The next question is whether your compiler supports ANSI-style function
* definitions. You need to know this in order to choose between using
* makefile.ansi and using makefile.unix.
* The #define line below is set to assume you have ANSI function definitions.
* If you get an error in this group of lines, undefine HAVE_ANSI_DEFINITIONS.
*/

#define HAVE_ANSI_DEFINITIONS

#ifdef HAVE_ANSI_DEFINITIONS
int testfunction (int arg1, int * arg2); /* check prototypes */

struct methods_struct { /* check method-pointer declarations */
int (*error_exit) (char *msgtext);
int (*trace_message) (char *msgtext);
};

int testfunction (int arg1, int * arg2) /* check definitions */
{
return arg2[arg1];
}
#endif


/* Now we want to find out if your compiler knows what "unsigned char" means.
* If you get an error on the "unsigned char un_char;" line,
* then undefine HAVE_UNSIGNED_CHAR.
*/

#define HAVE_UNSIGNED_CHAR

#ifdef HAVE_UNSIGNED_CHAR
unsigned char un_char;
#endif


/* Now we want to find out if your compiler knows what "unsigned short" means.
* If you get an error on the "unsigned short un_short;" line,
* then undefine HAVE_UNSIGNED_SHORT.
*/

#define HAVE_UNSIGNED_SHORT

#ifdef HAVE_UNSIGNED_SHORT
unsigned short un_short;
#endif


/* Now we want to find out if your compiler understands type "void".
* If you get an error anywhere in here, undefine HAVE_VOID.
*/

#define HAVE_VOID

#ifdef HAVE_VOID
typedef void * void_ptr; /* check void * */
typedef void (*void_func) (); /* check ptr to function returning void */

void testfunction2 (arg1, arg2) /* check void function result */
void_ptr arg1;
void_func arg2;
{
char * locptr = (char *) arg1; /* check casting to and from void * */
arg1 = (void *) locptr;
(*arg2) (1, 2); /* check call of fcn returning void */
}
#endif


/* Now we want to find out if your compiler knows what "const" means.
* If you get an error here, undefine HAVE_CONST.
*/

#define HAVE_CONST

#ifdef HAVE_CONST
static const int carray[3] = {1, 2, 3};

int testfunction3 (arg1)
const int arg1;
{
return carray[arg1];
}
#endif



/************************************************************************
* OK, that's it. You should not have to change anything beyond this
* point in order to compile and execute this program. (You might get
* some warnings, but you can ignore them.)
* When you run the program, it will make a couple more tests that it
* can do automatically, and then it will print out a summary of the changes
* that you need to make to the makefile and jconfig.h.
************************************************************************
*/


static int any_changes = 0;

int new_change ()
{
if (! any_changes) {
printf("\nMost of the changes recommended by this program can be made either\n");
printf("by editing jconfig.h, or by adding -Dsymbol switches to the CFLAGS\n");
printf("line in your Makefile. (Some PC compilers expect /Dsymbol instead.)\n");
printf("The CFLAGS method is simpler, but if your system doesn't use makefiles,\n");
printf("or if your compiler doesn't support -D, then you must change jconfig.h.\n");
any_changes = 1;
}
printf("\n"); /* blank line before each problem report */
return 0;
}


int test_char_sign (arg)
int arg;
{
if (arg == 189) { /* expected result for unsigned char */
new_change();
printf("You should add -DCHAR_IS_UNSIGNED to CFLAGS,\n");
printf("or else remove the /* */ comment marks from the line\n");
printf("/* #define CHAR_IS_UNSIGNED */ in jconfig.h.\n");
printf("(Be sure to delete the space before the # character too.)\n");
}
else if (arg != -67) { /* expected result for signed char */
new_change();
printf("Hmm, it seems 'char' is less than eight bits wide on your machine.\n");
printf("I fear the JPEG software will not work at all.\n");
}
return 0;
}


int test_shifting (arg)
long arg;
/* See whether right-shift on a long is signed or not. */
{
long res = arg >> 4;

if (res == 0x80817F4L) { /* expected result for unsigned */
new_change();
printf("You must add -DRIGHT_SHIFT_IS_UNSIGNED to CFLAGS,\n");
printf("or else remove the /* */ comment marks from the line\n");
printf("/* #define RIGHT_SHIFT_IS_UNSIGNED */ in jconfig.h.\n");
}
else if (res != -0x7F7E80CL) { /* expected result for signed */
new_change();
printf("Right shift isn't acting as I expect it to.\n");
printf("I fear the JPEG software will not work at all.\n");
}
return 0;
}


int main (argc, argv)
int argc;
char ** argv;
{
char signed_char_check = (char) (-67);

printf("Results of configuration check for Independent JPEG Group's software:\n");
printf("\nIf there's not a specific makefile provided for your compiler,\n");
#ifdef HAVE_ANSI_DEFINITIONS
printf("you should use makefile.ansi as the starting point for your Makefile.\n");
#else
printf("you should use makefile.unix as the starting point for your Makefile.\n");
#endif

/* Check whether we have all the ANSI features, */
/* and whether this agrees with __STDC__ being predefined. */
#ifdef __STDC__
#define MY__STDC__ /* ANSI compilers won't allow redefining __STDC__ */
#endif

#ifdef HAVE_ANSI_DEFINITIONS
#ifdef HAVE_UNSIGNED_CHAR
#ifdef HAVE_UNSIGNED_SHORT
#ifdef HAVE_CONST
#define HAVE_ALL_ANSI_FEATURES
#endif
#endif
#endif
#endif

#ifdef HAVE_ALL_ANSI_FEATURES
#ifndef MY__STDC__
new_change();
printf("Your compiler doesn't claim to be ANSI-compliant, but it is close enough\n");
printf("for me. Either add -D__STDC__ to CFLAGS, or add #define __STDC__ at the\n");
printf("beginning of jinclude.h (NOT jconfig.h).\n");
printf("Some compilers will not let you do this: they will complain that __STDC__\n");
printf("is a reserved name. In that case you have a compiler that really is ANSI,\n");
printf("but you have to give it a special switch (often -ansi) to make it so.\n");
printf("Check your compiler documentation and add the proper switch to CFLAGS.\n");
#define MY__STDC__
#endif
#else /* !HAVE_ALL_ANSI_FEATURES */
#ifdef MY__STDC__
new_change();
printf("Your compiler claims to be ANSI-compliant, but it is lying!\n");
printf("Either add -U__STDC__ to CFLAGS, or add #undef __STDC__\n");
printf("at the beginning of jinclude.h (NOT jconfig.h).\n");
#undef MY__STDC__
#endif
#endif /* HAVE_ALL_ANSI_FEATURES */

#ifndef MY__STDC__

#ifdef HAVE_ANSI_DEFINITIONS
new_change();
printf("You should add -DPROTO to CFLAGS, or else take out the several\n");
printf("#ifdef/#else/#endif lines surrounding #define PROTO in jconfig.h.\n");
printf("(Leave only one #define PROTO line.)\n");
#endif

#ifdef HAVE_UNSIGNED_CHAR
#ifdef HAVE_UNSIGNED_SHORT
new_change();
printf("You should add -DHAVE_UNSIGNED_CHAR and -DHAVE_UNSIGNED_SHORT\n");
printf("to CFLAGS, or else take out the #ifdef __STDC__/#endif lines\n");
printf("surrounding #define HAVE_UNSIGNED_CHAR and #define HAVE_UNSIGNED_SHORT\n");
printf("in jconfig.h.\n");
#else /* only unsigned char */
new_change();
printf("You should add -DHAVE_UNSIGNED_CHAR to CFLAGS,\n");
printf("or else move #define HAVE_UNSIGNED_CHAR outside the\n");
printf("#ifdef __STDC__/#endif lines surrounding it in jconfig.h.\n");
#endif
#else /* !HAVE_UNSIGNED_CHAR */
#ifdef HAVE_UNSIGNED_SHORT
new_change();
printf("You should add -DHAVE_UNSIGNED_SHORT to CFLAGS,\n");
printf("or else move #define HAVE_UNSIGNED_SHORT outside the\n");
printf("#ifdef __STDC__/#endif lines surrounding it in jconfig.h.\n");
#endif
#endif /* HAVE_UNSIGNED_CHAR */

#ifdef HAVE_CONST
new_change();
printf("You can delete the #define const line from jconfig.h.\n");
printf("(But things should still work if you don't.)\n");
#endif

#endif /* MY__STDC__ */

test_char_sign((int) signed_char_check);

test_shifting(-0x7F7E80B1L);

#ifndef HAVE_VOID
new_change();
printf("You should add -Dvoid=char to CFLAGS,\n");
printf("or else remove the /* */ comment marks from the line\n");
printf("/* #define void char */ in jconfig.h.\n");
printf("(Be sure to delete the space before the # character too.)\n");
#endif

#ifdef INCLUDES_ARE_ANSI
#ifndef MY__STDC__
new_change();
printf("You should add -DINCLUDES_ARE_ANSI to CFLAGS, or else add\n");
printf("#define INCLUDES_ARE_ANSI at the beginning of jinclude.h (NOT jconfig.h).\n");
#endif
#else /* !INCLUDES_ARE_ANSI */
#ifdef MY__STDC__
new_change();
printf("You should add -DNONANSI_INCLUDES to CFLAGS, or else add\n");
printf("#define NONANSI_INCLUDES at the beginning of jinclude.h (NOT jconfig.h).\n");
#endif
#ifdef NEED_SPECIAL_INCLUDE
new_change();
printf("In jinclude.h, change the line reading #include \n");
printf("to instead include the file you found size_t in.\n");
#else /* !NEED_SPECIAL_INCLUDE */
#ifndef HAVE_TYPES_H
new_change();
printf("In jinclude.h, delete the line reading #include .\n");
#endif
#endif /* NEED_SPECIAL_INCLUDE */
#ifdef BSD
new_change();
printf("You should add -DBSD to CFLAGS, or else add\n");
printf("#define BSD at the beginning of jinclude.h (NOT jconfig.h).\n");
#endif
#endif /* INCLUDES_ARE_ANSI */

if (any_changes) {
printf("\nI think that's everything...\n");
} else {
printf("\nI think jconfig.h is OK as distributed.\n");
}

return any_changes;
}


  3 Responses to “Category : C Source Code
Archive   : JPSRC2.ZIP
Filename : CONFIG.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/