Annotation of coherent/f/usr/include.78/sys/ccompat.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * /usr/include/sys/ccompat.h
                      3:  *
                      4:  * C compiler compatibility definitions.
                      5:  *
                      6:  * Revised: Wed May 19 10:30:25 1993 CDT
                      7:  */
                      8: #ifndef        __SYS_CCOMPAT_H__
                      9: #define        __SYS_CCOMPAT_H__
                     10: 
                     11: /*
                     12:  * Define some handy things that allow us to work with K&R, ANSI and C++
                     13:  * compilers in a way that is at least less painful than not working. This
                     14:  * file does mandate an ANSI C pre-processing environment.
                     15:  *
                     16:  * While ANSI allows us to not define function prototypes, C++ mandates that
                     17:  * they exist, and it's a *really* good idea to use them whereever possible.
                     18:  *
                     19:  * This file also deals with some compiler-specific features that are either
                     20:  * in the C or C++ language standards but not always available, and some
                     21:  * language extensions that are very widely available, if only because they
                     22:  * are part of the C++ standard and have been incorporated into C compilers.
                     23:  *
                     24:  * This file specifically excludes specifics about target machines and
                     25:  * compiler interactions. Such definitions belong in another file.
                     26:  */
                     27: 
                     28: /*
                     29:  * The following ISO-ism has been included in this header as the most
                     30:  * logical place. This pair of macros are used to get the *value* of a
                     31:  * preprocessor macro stringized, rather than the *name* of the macro.
                     32:  * As mentioned above, this file deals with compiler dependencies, and
                     33:  * assumes an ANSI preprocessor. Should this have to change, remember to
                     34:  * change this.
                     35:  *
                     36:  * This usage follows PJ Plauger's <assert.h> in "The Standard C Library".
                     37:  */
                     38: 
                     39: #define        __STR(x)        __VAL(x)
                     40: #define        __VAL(x)        #x
                     41: 
                     42: 
                     43: /*
                     44:  * The Mark Williams Company C compiler on the Coherent operating system for
                     45:  * some reason uses symbols in the user's name space to internally identify
                     46:  * itself. Here we work around that.
                     47:  */
                     48: 
                     49: #if    defined (COHERENT) && defined (MWC) && defined (_I386)
                     50: 
                     51: /* #undef      COHERENT */
                     52: /* #undef      MWC */
                     53: 
                     54: #define        __COHERENT__    1
                     55: #define        __MWC__         1
                     56: 
                     57: #endif
                     58: 
                     59: 
                     60: /*
                     61:  * There is some complexity on the way __STDC__ is used in practice: the ANSI
                     62:  * committee merely says that if __STDC__ is defined and value 1, then the
                     63:  * implementation is ISO-conforming.
                     64:  *
                     65:  * Unfortunately, much existing code uses #ifdef as the only test, which
                     66:  * means that some non-conforming compilers which defined __STDC__ as zero
                     67:  * caused problems (the Coherent 3.x compiler is one such; the 4.x compiler
                     68:  * uses the alternate convention). The #if test is preferable in programs,
                     69:  * since in preprocessor tests undefined symbols assume value 0, but still
                     70:  * many programs use the alternate form.
                     71:  *
                     72:  * For compilers with an intermediate status, eg. with an ISO preprocessor,
                     73:  * or support for "const" but not prototypes, or prototypes but not "const"
                     74:  * we perform individual featurectomies below.
                     75:  *
                     76:  * A general rule for future extensions: use double-underscores before and
                     77:  * after for non-parameterized macros, double-underscores before for macros
                     78:  * that take parameters. If this file's definitions are to be used by user-
                     79:  * level code, create a header that exports the definitions into the user
                     80:  * namespace.
                     81:  */
                     82: 
                     83: #define        __PROTODECL_M__ 0x0001  /* supports prototype declarations */
                     84: #define        __PROTODEFN_M__ 0x0002  /* supports prototype definitions */
                     85: #define        __CONST_M__     0x0004  /* supports "const" construct */
                     86: #define        __VOLATILE_M__  0x0008  /* supports "volatile" construct */
                     87: #define        __VOIDSTAR_M__  0x0010  /* supports "void *" type */
                     88: 
                     89: #define        __NOTUSED_M__   0x0100  /* allows "not used" warning suppression */
                     90: #define        __REGISTER_M__  0x0200  /* requires "register" declaration */
                     91: #define        __LINKID_M__    0x0400  /* requires linkage specifier (eg C++) */
                     92: #define        __INLINE_M__    0x0800  /* allows inline functions */
                     93: #define        __INLINEL_M__   0x1000  /* allows inline functions with loops */
                     94: #define        __DOTDOTDOT__   0x2000  /* requires (...) rather than () */
                     95: 
                     96: 
                     97: /*
                     98:  * The Standard C language features in one definition for simplicity.
                     99:  */
                    100: 
                    101: #define        __STDC_M__      (__PROTODECL_M__ | __PROTODEFN_M__ | __CONST_M__ | \
                    102:                         __VOLATILE_M__ | __VOIDSTAR_M__)
                    103: 
                    104: 
                    105: /*
                    106:  * Below, we attempt to determine a configuration suitable for the translator
                    107:  * that is working on the current program. Each group of macros attempts to
                    108:  * set a preprocessor macro __PROFILE__ with a bit-mask of the features
                    109:  * supported by the current translator.
                    110:  *
                    111:  * This approach has been taken since it considerably simplifies both the
                    112:  * task of adding new features to test for and adding new translators. Many
                    113:  * other programs intermingle the tasks of determining the translator and
                    114:  * defining the responses to that determination; in general, such programs
                    115:  * fail to be maintainable when the matrix of features and translators grows 
                    116:  * larger than about 3x3.
                    117:  */
                    118: 
                    119: #if    defined (__PROFILE__)                           /* user-overridden */
                    120: 
                    121: # if   (__PROFILE__ & ~ (__STDC_M__ | __NOTUSED_M__ | __REGISTER_M__ | \
                    122:                          __LINKID_M__)) != 0
                    123: # error        __PROFILE__ contains unknown flag bits.
                    124: # endif
                    125: 
                    126: #elif  defined (__cplusplus)                           /* C++ */
                    127: 
                    128: # ifdef        __GNUC__
                    129: #  define __PROFILE__  (__STDC_M__ | __NOTUSED_M__ | __LINKID_M__ | \
                    130:                         __INLINE_M__ | __INLINEL_M__ | __DOTDOTDOT__)
                    131: # else
                    132: #  define __PROFILE__  (__STDC_M__ | __NOTUSED_M__ | __LINKID_M__ | \
                    133:                         __INLINE_M__ | __DOTDOTDOT__)
                    134: # endif
                    135: 
                    136: #elif  defined (__BORLANDC__)                          /* Borland C */
                    137: 
                    138: # if   __BORLANDC__ >= 0x410
                    139: #  define  __PROFILE__ (__STDC_M__)    /* features restricted to C++ */
                    140: # else
                    141: #  define  __PROFILE__ (__STDC_M__ | __NOTUSED_M__ | __INLINE_M__)
                    142: # endif
                    143: 
                    144: #elif  defined (__GNUC__)                              /* GCC w/o C */
                    145: 
                    146: # define __PROFILE__   (__STDC_M__ | __INLINE_M__ | __INLINEL_M__)
                    147: 
                    148: #elif  defined (__STDC__) && (__STDC__ == 1)           /* minimal ANSI C */
                    149: 
                    150: # define  __PROFILE__  (__STDC_M__)
                    151: 
                    152: #elif  defined (__COHERENT__)                          /* MWC Coherent */
                    153: 
                    154: # define  __PROFILE__  (__REGISTER_M__)
                    155: 
                    156: #else                                                  /* VANILLA */
                    157: 
                    158: # define  __PROFILE__  (__REGISTER_M__)
                    159: 
                    160: #endif
                    161: 
                    162: 
                    163: /*
                    164:  * In the following sections we determine the responses to take on the basis
                    165:  * of whether or not each feature/misfeature is supported by the current
                    166:  * translator.
                    167:  *
                    168:  * In cases where the feature requires considerable change to source code,
                    169:  * such as prototyping and inline functions, we define both an existence test
                    170:  * name (which should be tested for definition, not value) and a value macro.
                    171:  * For the case of inline functions, this is because the function should not
                    172:  * appear at all in the souce code unless unlining is supported (and because
                    173:  * often a macro may suffice in place, although with less safety).
                    174:  *
                    175:  * In addition, the tests below always check to see whether a particular
                    176:  * symbol is defined already, allowing almost any feature to be turned on or
                    177:  * off at will from the command-line. This is useful when testing the
                    178:  * characteristics of a new translator, and may often be useful to suppress
                    179:  * certain features to aid in debugging.
                    180:  */
                    181: 
                    182: /*
                    183:  * __PROTO__ is a general test which can be performed in .c files to see
                    184:  * whether to use a prototype form or a K&R form, since the two are so
                    185:  * different. This has the advantage that some tools which are hard-wired for
                    186:  * K&R source code can get confused by macros in the function header, so
                    187:  * keeping a real K&R header around can help.
                    188:  *
                    189:  * __PROTO () is a macro that can be used in header files, since all that
                    190:  * differs between K&R and ANSI external definitions is whether the types
                    191:  * are present.
                    192:  *
                    193:  * The difference between the two is important, especially when "lint"-like
                    194:  * tools are used. In order to check for consistency between the prototype
                    195:  * and K&R-style definitions, it may be necessary to enable prototypes in
                    196:  * the header files while suppressing them in the C files.
                    197:  */
                    198: 
                    199: #ifndef        __PROTO
                    200: # if   (__PROFILE__ & __PROTODECL_M__) != 0
                    201: 
                    202: #  define  __PROTO(p)  p
                    203: 
                    204: # else /* prototypes are not supported */
                    205: 
                    206: #  define  __PROTO(p)  ()
                    207: 
                    208: # endif
                    209: # if   (__PROFILE__ & __PROTODEFN_M__) != 0
                    210: 
                    211: #  define      __USE_PROTO__
                    212: 
                    213: # endif
                    214: #endif /* ! defined (__PROTO) */
                    215: 
                    216: 
                    217: /*
                    218:  * There are several existing compilers still in use which either do not
                    219:  * support the notion of a "const" language element or implement the feature
                    220:  * incorrectly with respect to the C standard.
                    221:  *
                    222:  * For these compilers, we allow the "const" specifier in prototypes, local
                    223:  * variables and structure declarations to be suppressed. Note that "const"
                    224:  * will never appear in a K&R function header.
                    225:  */
                    226: 
                    227: #ifndef        __CONST__
                    228: # if   (__PROFILE__ & __CONST_M__) != 0
                    229: 
                    230: #  define  __CONST__   const
                    231: 
                    232: # else /* const is not supported */
                    233: 
                    234: #  define  __CONST__
                    235: 
                    236: # endif
                    237: #endif /* ! defined (__CONST__) */
                    238: 
                    239: 
                    240: /*
                    241:  * For symmetry with the "const" definition, we provide a wrapper for the
                    242:  * "volatile" feature. Note that for some reason "volatile" is available in
                    243:  * some compilers that do not implement "const", probably because the feature
                    244:  * was defined in simpler terms.
                    245:  *
                    246:  * For these compilers, we allow the "volatile" specifier in prototypes,
                    247:  * local variables, and structure declarations to be suppressed.
                    248:  */
                    249: 
                    250: #ifndef        __VOLATILE__
                    251: # if   (__PROFILE__ & __VOLATILE_M__) != 0
                    252: 
                    253: #  define  __VOLATILE__        volatile
                    254: 
                    255: # else /* const is not supported */
                    256: 
                    257: #  define  __VOLATILE__
                    258: 
                    259: # endif
                    260: #endif /* ! defined (__VOLATILE__) */
                    261: 
                    262: 
                    263: /*
                    264:  * Some compilers support the "void" type, but not the semantics of "void *".
                    265:  *
                    266:  * The following definition is similar to a usage in System V documentation
                    267:  * which probably exists for the same reason, except that we use two
                    268:  * underscores in ours before and after, where theirs is called _VOID.
                    269:  */
                    270: 
                    271: #ifndef        __VOID__
                    272: # if   (__PROFILE__ & __VOIDSTAR_M__) != 0
                    273: 
                    274: #  define  __VOID__    void
                    275: 
                    276: # else /* void with a pointer is not supported */
                    277: 
                    278: #  define  __VOID__    unsigned char
                    279: 
                    280: # endif
                    281: #endif /* ! defined (__VOID__) */
                    282: 
                    283: 
                    284: /*
                    285:  * A feature defined as part of the C++ language that also exists in many
                    286:  * C implementations is the ability to suppress "argument not used" warnings
                    287:  * in some cases by omitting the name of the variable in the function
                    288:  * prototype and merely giving the type.
                    289:  *
                    290:  * This feature is common in type-checking compilers since the checking of
                    291:  * function pointer arguments and other extra checks mean that functions
                    292:  * must be declared with unused arguments to match the shape of some function
                    293:  * pointer.
                    294:  *
                    295:  * Of course, it is desirable to leave the original name of the variable in
                    296:  * the same place for documentation purposes, often commented out, but this
                    297:  * usage chokes some compilers. It seems preferable use the following
                    298:  * definition to explicitly state the intention, even in cases where the
                    299:  * compiler generates spurious warnings.
                    300:  */
                    301: 
                    302: #ifndef        __NOTUSED
                    303: # if   (__PROFILE__ & __NOTUSED_M__) != 0
                    304: 
                    305: #  define  __NOTUSED(name)             /* name */
                    306: 
                    307: # else /* does not understand name suppression */
                    308: 
                    309: #  define  __NOTUSED(name)             name
                    310: 
                    311: # endif
                    312: #endif /* ! defined (__NOTUSED) */
                    313: 
                    314: 
                    315: /*
                    316:  * Most modern compilers perform their own register allocation and ignore
                    317:  * the "register" directive from K&R C. Such compilers usually have debugging
                    318:  * tools that know how to deal with variables that spend at least part of
                    319:  * their lifetime in a machine register (or at worst, the option to suppress
                    320:  * the auto-register allocation).
                    321:  *
                    322:  * For compilers that require a register declaration for a variable to be
                    323:  * placed in a machine register, often it is desirable to suppress the use
                    324:  * of registers when debugging.
                    325:  */
                    326: 
                    327: #ifndef        __REGISTER__
                    328: # if   (__PROFILE__ & __REGISTER_M__) != 0
                    329: 
                    330: #  define  __REGISTER__                register
                    331: 
                    332: # else
                    333: 
                    334: #  define  __REGISTER__
                    335: 
                    336: # endif
                    337: #endif /* ! defined (__REGISTER__) */
                    338: 
                    339: 
                    340: /*
                    341:  * Some compilers for C-like languages such as C++, Objective-C or even
                    342:  * conceivably Pascal/Modula-2/Fortran support cross-language linkage.
                    343:  *
                    344:  * The standard way of doing this within the C family is to use a special
                    345:  * form of "extern" which names the language a function is implemented in.
                    346:  * Functions which are implemented in C in a library should be declared as
                    347:  * such in the exported header.
                    348:  *
                    349:  * Currently, this is most important for C++.
                    350:  */
                    351: 
                    352: #ifndef        __EXTERN_C__
                    353: # if   (__PROFILE__ & __LINKID_M__) != 0
                    354: 
                    355: #  define  __EXTERN_C__                extern "C"
                    356: #  define  __EXTERN_C_BEGIN__  __EXTERN_C__ {
                    357: #  define  __EXTERN_C_END__    }
                    358: 
                    359: # else /* this is being compiled by a C compiler */
                    360: 
                    361: #  define  __EXTERN_C__
                    362: #  define  __EXTERN_C_BEGIN__
                    363: #  define  __EXTERN_C_END__
                    364: 
                    365: # endif
                    366: #endif /* ! defined (__EXTERN_C__) */
                    367: 
                    368: 
                    369: /*
                    370:  * In order for some of the useful compiler extensions below to be kept
                    371:  * available during a "strict" compile (assuming that the feature-tests above
                    372:  * enable their use) then the convention is to prepend compiler-specific
                    373:  * keywords with double-underscores.
                    374:  *
                    375:  * This also serves to document which usages are not ISO C. Note that this
                    376:  * may have to change a little for a potential standardized C++.
                    377:  */
                    378: 
                    379: #if    defined (__STDC__) && __STDC__ != 0
                    380: 
                    381: # define   __NON_ISO(k)                __##k
                    382: 
                    383: #else
                    384: 
                    385: # define   __NON_ISO(k)                k
                    386: 
                    387: #endif
                    388: 
                    389: 
                    390: /*
                    391:  * All C++ compilers and many C compilers support the notion of "inline
                    392:  * functions" as an alternative to macros that (i) can be used to wrap up
                    393:  * casts so they are only used in safe contexts, (ii) can be used as an
                    394:  * alternative to macros that allow arguments with side-effects.
                    395:  *
                    396:  * This comes in two strengths: can inline anything, and can inline anything
                    397:  * that does not contain a loop. GNU C has extra strength, can inline tail-
                    398:  * recursive inline function, but that facility is not sufficiently widespread
                    399:  * to be useful as yet.
                    400:  *
                    401:  * The question is, what should the default setting of the client tests be?
                    402:  * I prefer #ifndef __NO_INLINE__, since by default I want to be getting all
                    403:  * the features. The possibility of defining __INLINE__ as "static" so that
                    404:  * inline functions appear in the module separately breakpointable from other
                    405:  * modules is a desirable facility (assuming the debug namespace is separate
                    406:  * from the linkage namespace, likely in a system sophisticated enough to
                    407:  * support inlining). Furthermore, be aware of any interactions with the
                    408:  * __LOCAL__ macro defined in <sys/xdebug.h>
                    409:  */
                    410: 
                    411: #if    ! defined (__NO_INLINE__) && ! defined (__INLINE__)
                    412: # if   (__PROFILE__ & __INLINE_M__) != 0
                    413: 
                    414: #   define   __INLINE__                __NON_ISO (inline)
                    415: 
                    416: #  if  ! defined (__NO_INLINEL__) && ! defined (__INLINEL__)
                    417: #   if (__PROFILE__ & __INLINEL_M__) != 0
                    418: 
                    419: #    define __INLINEL__                __NON_ISO (inline)
                    420: 
                    421: #   else
                    422: 
                    423: #    define  __INLINEL__
                    424: #    define  __NO_INLINEL__
                    425: 
                    426: #   endif
                    427: #  endif       /* ! defined (__NO_INLINEL__) && ! defined (__INLINEL__) */
                    428: 
                    429: # else /* does not grok inlining */
                    430: 
                    431: #  define    __INLINE__
                    432: #  define    __NO_INLINE__
                    433: 
                    434: # endif
                    435: 
                    436: #else  /* if the user has overridden __NO_INLINE__ or __INLINE__ */
                    437: 
                    438: #endif /* defined (__NO_INLINE__) || defined (__INLINE__) */
                    439: 
                    440: 
                    441: /*
                    442:  * One particular incompatibility between ANSI C and C++ code exists in the
                    443:  * way in which prototypes which do not specify any types at all are handled.
                    444:  * Under C++, the () form is used to imply (void), since such declarations
                    445:  * are extremely common and because early versions of the C++ translators did
                    446:  * not allow any declarations in the argument lists of constructors or
                    447:  * destructors, not even void, so this form was used to syntactically imply
                    448:  * (void).
                    449:  *
                    450:  * The ANSI C committe declared that a prototype of the form
                    451:  *     extern char * malloc ();
                    452:  * said nothing whatsoever about the types of its arguments, since such
                    453:  * declarations were extremely common in K&R C code, and doing anything else
                    454:  * would gratuitously require considerable rewriting.
                    455:  *
                    456:  * Unfortunately, the ANSI C committee decided that the special form "..." to
                    457:  * introduce variable arguments was not valid unless preceeded by a regular
                    458:  * argument type declaration, so that there is no way of being unambiguous
                    459:  * that will compile under both transators.
                    460:  *
                    461:  *             ANSI            C++
                    462:  *
                    463:  * ()          (...)           (void)          ambiguous
                    464:  *
                    465:  * (void)      (void)          (void)          unambiguous
                    466:  *
                    467:  * (...)       error           (...)           thanks, X3J11
                    468:  *
                    469:  * Use the preprocessor symbol __ANY_ARGS__ in this context to expand to
                    470:  * whatever the current translator needs to see for it to make no assumptions
                    471:  * about the number and type of any function arguments.
                    472:  */
                    473: 
                    474: #ifndef        __ANY_ARGS__
                    475: # if   (__PROFILE__ & __DOTDOTDOT__) != 0
                    476: 
                    477: #  define  __ANY_ARGS__                ...
                    478: 
                    479: # else
                    480: 
                    481: #  define  __ANY_ARGS__
                    482: 
                    483: # endif
                    484: #endif /* ! defined (__ANY_ARGS__) */
                    485: 
                    486: 
                    487: /*
                    488:  * This is a minor K&R compatibility issue: certain K&R compilers reject the
                    489:  * ISO C idiom of enclosing a macro name in parentheses to suppress macro
                    490:  * expansion when this idiom is used in function declarations. To get around
                    491:  * this, we can use the ISO preprocessor in a clumsy fashion by providing an
                    492:  * identity macro to provide the same overall effect of making the name we
                    493:  * wish to suppress expansion for not be immediately followed by a left
                    494:  * parenthesis (it will be followed by parenthesis eventually, but since the
                    495:  * proprocessor won't revisit the text it has seen before the expansion of
                    496:  * the identity macro we get the behaviour we want).
                    497:  */
                    498: 
                    499: #define        __ARGS(x)       x
                    500: 
                    501: 
                    502: /*
                    503:  * The C standard recommends that a system have a method of selecting a "pure"
                    504:  * compilation environment, but leaves the method for doing so up to the
                    505:  * implementation. For our headers we will define a feature-test macro along
                    506:  * the lines of the POSIX.1 feature-test.
                    507:  *
                    508:  * If _STDC_SOURCE is defined with a non-zero value, we interpret that as
                    509:  * meaning that the user wishes a pure compilation environment with no symbols
                    510:  * in the user name-space visible in headers other than those defined in the
                    511:  * ISO C standard ISO/IEC 9899:1990.
                    512:  *
                    513:  * This flag cannot be used with the _POSIX_SOURCE flag; the symbols defined
                    514:  * by headers in the POSIX.1 standard ISO/IEC 9945-1:1990 are a superset of
                    515:  * those defined by the C standard, so if _POSIX_SOURCE is specified we
                    516:  * undefine _STDC_SOURCE.
                    517:  */
                    518: 
                    519: #if    defined(_POSIX_SOURCE)
                    520: #undef _STDC_SOURCE
                    521: #endif
                    522: 
                    523: 
                    524: /*
                    525:  * The POSIX.1 standard discusses a special namespace issue; how can standard
                    526:  * structures be portably extended, given that the structure tags are in the
                    527:  * user namespace. For structures which have members with regular names and
                    528:  * which are likely to be extended, the POSIX.1 standard deals with this by
                    529:  * implicitly reserving all names of that form (something which further
                    530:  * underscores the restrictions on standard headers not including each other).
                    531:  *
                    532:  * However, for situations where we wish to extend a structure not covered by
                    533:  * the namespace reservation rules, or we wish to name a member according to
                    534:  * some other usage, we must take care to not define the member such that it
                    535:  * might conflict with some macro name which the user is permitted to define.
                    536:  * See POSIX.1 B.2.7.2 for discussion of this point.
                    537:  *
                    538:  * The following definition can be used to wrap the definition of structure
                    539:  * member names such that those names will not conflict with user macros if
                    540:  * _POSIX_SOURCE is defined. This form can be used in references to the member
                    541:  * name which may be encapsulated in macros so that there is no loss of
                    542:  * functionality or alteration of behaviour when _POSIX_SOURCE is used.
                    543:  */
                    544: 
                    545: #if    defined(_POSIX_SOURCE)
                    546: 
                    547: # define       __NON_POSIX(name)       _##name
                    548: 
                    549: #else
                    550: 
                    551: # define       __NON_POSIX(name)       name
                    552: 
                    553: #endif
                    554: 
                    555: 
                    556: /*
                    557:  * Undefine all our internal symbols... why pollute the namespace?
                    558:  */
                    559: 
                    560: #undef __PROTO_M__
                    561: #undef __CONST_M__
                    562: #undef __VOLATILE_M__
                    563: #undef __VOIDSTAR_M__
                    564: 
                    565: #undef __NOTUSED_M__
                    566: #undef __REGISTER_M__
                    567: #undef __LINKID_M__
                    568: #undef __INLINE_M__
                    569: #undef __INLINEL_M__
                    570: #undef __DOTDOTDOT__
                    571: 
                    572: #undef __STDC_M__
                    573: #undef __PROFILE__
                    574: 
                    575: 
                    576: #endif /* ! defined (__SYS_CCOMPAT_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.