|
|
1.1 ! root 1: #ifndef __COMMON__CCOMPAT_H__ ! 2: #define __COMMON__CCOMPAT_H__ ! 3: ! 4: /* ! 5: * Define some handy things that allow us to work with K&R, ANSI and C++ ! 6: * compilers in a way that is at least less painful than not working. This ! 7: * file does mandate an ANSI C pre-processing environment. ! 8: * ! 9: * While ANSI allows us to not define function prototypes, C++ mandates that ! 10: * they exist, and it's a *really* good idea to use them whereever possible. ! 11: * ! 12: * This file also deals with some compiler-specific features that are either ! 13: * in the C or C++ language standards but not always available, and some ! 14: * language extensions that are very widely available, if only because they ! 15: * are part of the C++ standard and have been incorporated into C compilers. ! 16: * ! 17: * This file specifically excludes specifics about target machines and ! 18: * compiler interactions. Such definitions belong in another file. ! 19: */ ! 20: ! 21: #include <common/feature.h> ! 22: ! 23: ! 24: /* ! 25: * There is some complexity on the way __STDC__ is used in practice: the ANSI ! 26: * committee merely says that if __STDC__ is defined and value 1, then the ! 27: * implementation is ISO-conforming. ! 28: * ! 29: * Unfortunately, much existing code uses #ifdef as the only test, which ! 30: * means that some non-conforming compilers which defined __STDC__ as zero ! 31: * caused problems (the Coherent 3.x compiler is one such; the 4.x compiler ! 32: * uses the alternate convention). The #if test is preferable in programs, ! 33: * since in preprocessor tests undefined symbols assume value 0, but still ! 34: * many programs use the alternate form. ! 35: * ! 36: * For compilers with an intermediate status, eg. with an ISO preprocessor, ! 37: * or support for "const" but not prototypes, or prototypes but not "const" ! 38: * we perform individual featurectomies below. ! 39: * ! 40: * A general rule for future extensions: use double-underscores before and ! 41: * after for non-parameterized macros, double-underscores before for macros ! 42: * that take parameters. If this file's definitions are to be used by user- ! 43: * level code, create a header that exports the definitions into the user ! 44: * namespace. ! 45: * ! 46: * Jun '93 - split profile in two sections in anticipation of future growth. ! 47: * We can't assume more than 16-bit arithmetic because of some extremely ! 48: * losing preprocessors out there. ! 49: */ ! 50: ! 51: /* __STD_PROFILE__ bits */ ! 52: #define __STRINGIZE_M__ 0x0001 /* supports ISO C "stringize" */ ! 53: #define __PASTE_M__ 0x0002 /* support ISO C token-pasting */ ! 54: #define __PROTODECL_M__ 0x0004 /* supports prototype declarations */ ! 55: #define __PROTODEFN_M__ 0x0008 /* supports prototype definitions */ ! 56: #define __CONST_M__ 0x0010 /* supports "const" construct */ ! 57: #define __VOLATILE_M__ 0x0020 /* supports "volatile" construct */ ! 58: #define __VOIDSTAR_M__ 0x0040 /* supports "void *" type */ ! 59: ! 60: #define __STD_PROFILE_MASK__ 0x007F ! 61: ! 62: /* __MISC_PROFILE__ bits */ ! 63: #define __NOTUSED_M__ 0x0001 /* allows "not used" warning suppression */ ! 64: #define __REGISTER_M__ 0x0002 /* requires "register" declaration */ ! 65: #define __LINKID_M__ 0x0004 /* requires linkage specifier (eg C++) */ ! 66: #define __INLINE_M__ 0x0008 /* allows inline functions */ ! 67: #define __INLINEL_M__ 0x0010 /* allows inline functions with loops */ ! 68: #define __DOTDOTDOT_M__ 0x0020 /* requires (...) rather than () */ ! 69: #define __NOMERGESTR_M__ 0x0040 /* cannot merge identical strings */ ! 70: ! 71: #define __MISC_PROFILE_MASK__ 0x007F ! 72: ! 73: ! 74: /* ! 75: * The Standard C language features in one definition for simplicity. This may ! 76: * not be all the bits in __STD_PROFILE_MASK__ once C++ standards start ! 77: * hitting the streets. Normative addenda to ISO C will complicate this, too. ! 78: */ ! 79: ! 80: #define __STDC_M__ (__STD_PROFILE_MASK__) ! 81: ! 82: ! 83: /* ! 84: * Below, we attempt to determine a configuration suitable for the translator ! 85: * that is working on the current program. Each group of macros attempts to ! 86: * set a preprocessor macro __PROFILE__ with a bit-mask of the features ! 87: * supported by the current translator. ! 88: * ! 89: * This approach has been taken since it considerably simplifies both the ! 90: * task of adding new features to test for and adding new translators. Many ! 91: * other programs intermingle the tasks of determining the translator and ! 92: * defining the responses to that determination; in general, such programs ! 93: * fail to be maintainable when the matrix of features and translators grows ! 94: * larger than about 3x3. ! 95: * ! 96: * Jun '93 - With the split into two parts, we still let people use the single ! 97: * __PROFILE__ definition if their translator's preprocessor can deal with ! 98: * 32-bit arithmetic. ! 99: */ ! 100: ! 101: #if defined (__PROFILE__) /* user-overridden */ ! 102: ! 103: # if (1 << 31) == 0 ! 104: # error Your preprocessor cannot handle 32-bit arithmetic! ! 105: # endif ! 106: # if __PROFILE__ & ~ (__STD_PROFILE_MASK__ | (__MISC_PROFILE_MASK << 16)) ! 107: # error __PROFILE__ contains unknown flag bits. ! 108: # endif ! 109: ! 110: # define __STD_PROFILE__ (__PROFILE__ & __STD_PROFILE_MASK__) ! 111: # define __MISC_PROFILE__ ((__PROFILE__ >> 16) & __MISC_PROFILE_MASK__) ! 112: ! 113: #elif defined (__STD_PROFILE__) || defined (__MISC_PROFILE__) ! 114: ! 115: # ifndef __STD_PROFILE__ ! 116: # error If you defined __MISC_PROFILE__, you must also define __STD_PROFILE__ ! 117: # elif __STD_PROFILE__ & ~ __STD_PROFILE_MASK__ ! 118: # error Unknown bits set in __STD_PROFILE__ ! 119: # endif ! 120: ! 121: # ifndef __MISC_PROFILE__ ! 122: # error If you defined __STD_PROFILE__, you must also define __MISC_PROFILE__ ! 123: # elif __MISC_PROFILE__ & ~ __MISC_PROFILE_MASK__ ! 124: # error Unknown bits set in __MISC_PROFILE__ ! 125: # endif ! 126: ! 127: #elif defined (__cplusplus) /* C++ */ ! 128: ! 129: # ifdef __GNUC__ ! 130: # define __STD_PROFILE__ __STDC_M__ ! 131: # define __MISC_PROFILE__ (__NOTUSED_M__ | __LINKID_M__ | \ ! 132: __INLINE_M__ | __INLINEL_M__ | \ ! 133: __DOTDOTDOT_2M__) ! 134: # else ! 135: # define __STD_PROFILE__ __STDC_M__ ! 136: # define __MISC_PROFILE__ (__NOTUSED_M__ | __LINKID_M__ | \ ! 137: __INLINE_M__ | __DOTDOTDOT_M__) ! 138: # endif ! 139: ! 140: #elif __BORLANDC__ /* Borland C */ ! 141: ! 142: # if __BORLANDC__ >= 0x410 ! 143: # define __STD_PROFILE__ __STDC_M__ ! 144: # define __MISC_PROFILE__ 0 /* features restricted to C++ */ ! 145: # else ! 146: # define __STD_PROFILE__ __STDC_M__ ! 147: # define __MISC_PROFILE__ (__NOTUSED_M__ | __INLINE_M__) ! 148: # endif ! 149: ! 150: #elif defined (__GNUC__) /* GCC w/o C++ */ ! 151: ! 152: # define __STD_PROFILE__ __STDC_M__ ! 153: # define __MISC_PROFILE__ (__INLINE_M__ | __INLINEL_M__) ! 154: ! 155: #elif __STDC__ + 0 /* minimal ANSI C */ ! 156: ! 157: # define __STD_PROFILE__ __STDC_M__ ! 158: # define __MISC_PROFILE__ 0 ! 159: ! 160: #elif __COHERENT__ /* MWC Coherent */ ! 161: ! 162: # define __STD_PROFILE__ (__STRINGIZE_M__ | __PASTE_M__) ! 163: # define __MISC_PROFILE__ (__REGISTER_M__ | __NOMERGESTR_M__) ! 164: ! 165: #else /* VANILLA */ ! 166: ! 167: # define __STD_PROFILE__ 0 ! 168: # define __MISC_PROFILE__ __REGISTER_M__ ! 169: ! 170: #endif ! 171: ! 172: ! 173: /* ! 174: * In the following sections we determine the responses to take on the basis ! 175: * of whether or not each feature/misfeature is supported by the current ! 176: * translator. ! 177: * ! 178: * In cases where the feature requires considerable change to source code, ! 179: * such as prototyping and inline functions, we define both an existence ! 180: * feature-test and a value macro. ! 181: * ! 182: * For the case of inline functions, this is because the function should not ! 183: * appear at all in the souce code unless unlining is supported (and because ! 184: * often a macro may suffice in place, although with less safety). ! 185: * ! 186: * In addition, the tests below always check to see whether a particular ! 187: * symbol is defined already, allowing almost any feature to be turned on or ! 188: * off at will from the command-line. This is useful when testing the ! 189: * characteristics of a new translator, and may often be useful to suppress ! 190: * certain features to aid in debugging. ! 191: */ ! 192: ! 193: /* ! 194: * Some old Reiser preprocessors looked for macro-expansions unside quoted ! 195: * strings; this was useful, but dangerous, so ISO C defined a new operator ! 196: * for doing just this job. A tip of the hat to P.J. Plauger for the form of ! 197: * these macros. ! 198: */ ! 199: ! 200: #ifndef __STRING ! 201: # if __STD_PROFILE__ & __STRINGIZE_M__ ! 202: ! 203: # define __STRING(x) __VALUE(x) ! 204: # define __VALUE(x) #x ! 205: ! 206: # else ! 207: ! 208: # define __STRING(x) "x" ! 209: ! 210: # endif ! 211: #endif ! 212: ! 213: ! 214: /* ! 215: * As above, this is a feature supported in old systems by ill-advised hacks, ! 216: * so ISO C has a special operator just for the job. We define __CONCAT3 () ! 217: * and __CONCAT4 () as primitives just for fun; it's handy, and nested calls ! 218: * to __CONCAT () are just too messy to be practical. ! 219: */ ! 220: ! 221: #ifndef __CONCAT ! 222: # if __STD_PROFILE__ & __PASTE_M__ ! 223: ! 224: # define __CONCAT(x,y) x##y ! 225: # define __CONCAT3(x,y,z) x##y##z ! 226: # define __CONCAT4(a,b,c,d) a##b##c##d ! 227: ! 228: # else ! 229: ! 230: # define __CONCAT(x,y) x/**/y ! 231: # define __CONCAT3(x,y,z) x/**/y/**/z ! 232: # define __CONCAT4(a,b,c,d) a/**/b/**/c/**/d ! 233: ! 234: # endif ! 235: #endif ! 236: ! 237: ! 238: /* ! 239: * __USE_PROTO__ is a general test which can be performed in .c files to see ! 240: * whether to use a prototype form or a K&R form, since the two are so ! 241: * different. This has the advantage that some tools which are hard-wired for ! 242: * K&R source code can get confused by macros in the function header, so ! 243: * keeping a real K&R header around can help. ! 244: * ! 245: * __PROTO () is a macro that can be used in header files, since all that ! 246: * differs between K&R and ANSI external definitions is whether the types ! 247: * are present. ! 248: * ! 249: * The difference between the two is important, especially when "lint"-like ! 250: * tools are used. In order to check for consistency between the prototype ! 251: * and K&R-style definitions, it may be necessary to enable prototypes in ! 252: * the header files while suppressing them in the C files. ! 253: */ ! 254: ! 255: #ifndef __PROTO ! 256: # if __STD_PROFILE__ & __PROTODECL_M__ ! 257: ! 258: # define __PROTO(p) p ! 259: ! 260: # else /* prototypes are not supported */ ! 261: ! 262: # define __PROTO(p) () ! 263: ! 264: # endif ! 265: # if __STD_PROFILE__ & __PROTODEFN_M__ ! 266: ! 267: # define __USE_PROTO__ 1 ! 268: ! 269: # endif ! 270: #endif /* ! defined (__PROTO) */ ! 271: ! 272: ! 273: /* ! 274: * There are several existing compilers still in use which either do not ! 275: * support the notion of a "const" language element or implement the feature ! 276: * incorrectly with respect to the C standard. ! 277: * ! 278: * For these compilers, we allow the "const" specifier in prototypes, local ! 279: * variables and structure declarations to be suppressed. Note that "const" ! 280: * will never appear in a K&R function header. ! 281: */ ! 282: ! 283: #ifndef __CONST__ ! 284: # if __STD_PROFILE__ & __CONST_M__ ! 285: ! 286: # define __CONST__ const ! 287: ! 288: # else /* const is not supported */ ! 289: ! 290: # define __CONST__ ! 291: ! 292: # endif ! 293: #endif /* ! defined (__CONST__) */ ! 294: ! 295: ! 296: /* ! 297: * For symmetry with the "const" definition, we provide a wrapper for the ! 298: * "volatile" feature. Note that for some reason "volatile" is available in ! 299: * some compilers that do not implement "const", probably because the feature ! 300: * was defined in simpler terms. ! 301: * ! 302: * For these compilers, we allow the "volatile" specifier in prototypes, ! 303: * local variables, and structure declarations to be suppressed. ! 304: */ ! 305: ! 306: #ifndef __VOLATILE__ ! 307: # if __STD_PROFILE__ & __VOLATILE_M__ ! 308: ! 309: # define __VOLATILE__ volatile ! 310: ! 311: # else /* const is not supported */ ! 312: ! 313: # define __VOLATILE__ ! 314: ! 315: # endif ! 316: #endif /* ! defined (__VOLATILE__) */ ! 317: ! 318: ! 319: /* ! 320: * Some compilers support the "void" type, but not the semantics of "void *". ! 321: * ! 322: * The following definition is similar to a usage in System V documentation ! 323: * which probably exists for the same reason, except that we use two ! 324: * underscores in ours before and after, where theirs is called _VOID. ! 325: * ! 326: * A word of explanation; what we are doing here is declaring an incomplete ! 327: * type; pointers to this incomplete type should function more-or-less as ! 328: * a pointer to "void" would except for lacking the implicit conversions that ! 329: * are special to "void *", because "void" is an "incomplete type that cannot ! 330: * be completed". Read the standard if you don't know about incomplete types. ! 331: */ ! 332: ! 333: #ifndef __VOID__ ! 334: # if __STD_PROFILE__ & __VOIDSTAR_M__ ! 335: ! 336: # define __VOID__ void ! 337: ! 338: # else /* void with a pointer is not supported */ ! 339: ! 340: # if __COHERENT__ && ! __GNUC__ /* stroke a bug in Coherent 'cc' */ ! 341: ! 342: # define __VOID__ char ! 343: ! 344: #else ! 345: ! 346: typedef struct __deep_magic__ __void__; ! 347: # define __VOID__ __void__ ! 348: ! 349: # endif ! 350: ! 351: # endif ! 352: #endif /* ! defined (__VOID__) */ ! 353: ! 354: ! 355: /* ! 356: * In order for some of the useful compiler extensions below to be kept ! 357: * available during a "strict" compile (assuming that the feature-tests above ! 358: * enable their use) then the convention is to prepend compiler-specific ! 359: * keywords with double-underscores. ! 360: * ! 361: * This also serves to document which usages are not ISO C. Note that this ! 362: * may have to change a little for a potential standardized C++. ! 363: */ ! 364: ! 365: #if __STDC__ + 0 ! 366: ! 367: # define __NON_ISO(k) __CONCAT (__, k) ! 368: ! 369: #else ! 370: ! 371: # define __NON_ISO(k) k ! 372: ! 373: #endif ! 374: ! 375: ! 376: /* ! 377: * A feature defined as part of the C++ language that also exists in many ! 378: * C implementations is the ability to suppress "argument not used" warnings ! 379: * in some cases by omitting the name of the variable in the function ! 380: * prototype and merely giving the type. ! 381: * ! 382: * This feature is common in type-checking compilers since the checking of ! 383: * function pointer arguments and other extra checks mean that functions ! 384: * must be declared with unused arguments to match the shape of some function ! 385: * pointer. ! 386: * ! 387: * Of course, it is desirable to leave the original name of the variable in ! 388: * the same place for documentation purposes, often commented out, but this ! 389: * usage chokes some compilers. It seems preferable use the following ! 390: * definition to explicitly state the intention, even in cases where the ! 391: * compiler generates spurious warnings. ! 392: */ ! 393: ! 394: #ifndef __NOTUSED ! 395: # if __MISC_PROFILE__ & __NOTUSED_M__ ! 396: ! 397: # define __NOTUSED(name) /* name */ ! 398: ! 399: # else /* does not understand name suppression */ ! 400: ! 401: # define __NOTUSED(name) __CONCAT (unused_, name) ! 402: ! 403: # endif ! 404: #endif /* ! defined (__NOTUSED) */ ! 405: ! 406: ! 407: /* ! 408: * Most modern compilers perform their own register allocation and ignore ! 409: * the "register" directive from K&R C. Such compilers usually have debugging ! 410: * tools that know how to deal with variables that spend at least part of ! 411: * their lifetime in a machine register (or at worst, the option to suppress ! 412: * the auto-register allocation). ! 413: * ! 414: * For compilers that require a register declaration for a variable to be ! 415: * placed in a machine register, often it is desirable to suppress the use ! 416: * of registers when debugging. ! 417: */ ! 418: ! 419: #ifndef __REGISTER__ ! 420: # if __MISC_PROFILE__ & __REGISTER_M__ ! 421: ! 422: # define __REGISTER__ register ! 423: ! 424: # else ! 425: ! 426: # define __REGISTER__ ! 427: ! 428: # endif ! 429: #endif /* ! defined (__REGISTER__) */ ! 430: ! 431: ! 432: /* ! 433: * Some compilers for C-like languages such as C++, Objective-C or even ! 434: * conceivably Pascal/Modula-2/Fortran support cross-language linkage. ! 435: * ! 436: * The standard way of doing this within the C family is to use a special ! 437: * form of "extern" which names the language a function is implemented in. ! 438: * Functions which are implemented in C in a library should be declared as ! 439: * such in the exported header. ! 440: * ! 441: * Currently, this is most important for C++. ! 442: */ ! 443: ! 444: #ifndef __EXTERN_C__ ! 445: # if __MISC_PROFILE__ & __LINKID_M__ ! 446: ! 447: # define __EXTERN_C__ extern "C" ! 448: # define __EXTERN_C_BEGIN__ __EXTERN_C__ { ! 449: # define __EXTERN_C_END__ } ! 450: ! 451: # else /* this is being compiled by a C compiler */ ! 452: ! 453: # define __EXTERN_C__ ! 454: # define __EXTERN_C_BEGIN__ ! 455: # define __EXTERN_C_END__ ! 456: ! 457: # endif ! 458: #endif /* ! defined (__EXTERN_C__) */ ! 459: ! 460: ! 461: /* ! 462: * All C++ compilers and many C compilers support the notion of "inline ! 463: * functions" as an alternative to macros that (i) can be used to wrap up ! 464: * casts so they are only used in safe contexts, (ii) can be used as an ! 465: * alternative to macros that allow arguments with side-effects. ! 466: * ! 467: * This comes in two strengths: can inline anything, and can inline anything ! 468: * that does not contain a loop. GNU C has extra strength, can inline tail- ! 469: * recursive inline function, but that facility is not sufficiently widespread ! 470: * to be useful as yet. ! 471: * ! 472: * The question is, what should the default setting of the client tests be? ! 473: * #if ! __NO_INLINE__ is a double-negative, so don't use that. The ! 474: * possibility of defining __INLINE__ as "static" so that inline functions ! 475: * appear in the module separately breakpointable from other modules is a ! 476: * desirable facility (assuming the debug namespace is separate from the ! 477: * linkage namespace, likely in a system sophisticated enough to support ! 478: * inlining). Furthermore, be aware of any interactions with the __LOCAL__ ! 479: * macro defined in <common/xdebug.h> ! 480: */ ! 481: ! 482: #ifndef __INLINE__ ! 483: # if __MISC_PROFILE__ & __INLINE_M__ ! 484: ! 485: # define __INLINE__ __NON_ISO (inline) ! 486: # define __USE_INLINE__ 1 ! 487: ! 488: # else ! 489: ! 490: # define __INLINE__ ! 491: ! 492: # endif ! 493: #endif ! 494: ! 495: #ifndef __INLINEL__ ! 496: # if __MISC_PROFILE__ & __INLINEL_M__ ! 497: ! 498: # define __INLINEL__ __NON_ISO (inline) ! 499: # define __USE_INLINEL__ 1 ! 500: ! 501: # else ! 502: ! 503: # define __INLINEL__ ! 504: ! 505: # endif ! 506: #endif ! 507: ! 508: ! 509: /* ! 510: * One particular incompatibility between ANSI C and C++ code exists in the ! 511: * way in which prototypes which do not specify any types at all are handled. ! 512: * Under C++, the () form is used to imply (void), since such declarations ! 513: * are extremely common and because early versions of the C++ translators did ! 514: * not allow any declarations in the argument lists of constructors or ! 515: * destructors, not even void, so this form was used to syntactically imply ! 516: * (void). ! 517: * ! 518: * The ANSI C committe declared that a prototype of the form ! 519: * extern char * malloc (); ! 520: * said nothing whatsoever about the types of it's arguments, since such ! 521: * declarations were extremely common in K&R C code, and doing anything else ! 522: * would gratuitously require considerable rewriting. ! 523: * ! 524: * Unfortunately, the ANSI C committee decided that the special form "..." to ! 525: * introduce variable arguments was not valid unless preceeded by a regular ! 526: * argument type declaration, so that there is no way of being unambiguous ! 527: * that will compile under both transators. ! 528: * ! 529: * ANSI C++ ! 530: * ! 531: * () (...) (void) ambiguous ! 532: * ! 533: * (void) (void) (void) unambiguous ! 534: * ! 535: * (...) error (...) thanks, X3J11 ! 536: * ! 537: * Use the preprocessor symbol __ANY_ARGS__ in this context to expand to ! 538: * whatever the current translator needs to see for it to make no assumptions ! 539: * about the number and type of any function arguments. ! 540: */ ! 541: ! 542: #ifndef __ANY_ARGS__ ! 543: # if __MISC_PROFILE__ & __DOTDOTDOT__ ! 544: ! 545: # define __ANY_ARGS__ ... ! 546: ! 547: # else ! 548: ! 549: # define __ANY_ARGS__ ! 550: ! 551: # endif ! 552: #endif /* ! defined (__ANY_ARGS__) */ ! 553: ! 554: ! 555: /* ! 556: * String constants have been mightily botched in C, largely because K&R C ! 557: * always treated strings as unique, writeable data. The introduction of the ! 558: * 'const' qualifier should have made things simpler by allowing compilers to ! 559: * figure out whether a string is being used in a 'const' or non-'const' ! 560: * way. However, the precedent of just making all strings which are not being ! 561: * used as character array initializers into shareable constants has already ! 562: * been established. ! 563: * ! 564: * This has an effect on complex macros, because a string in a macro may (in ! 565: * a K&R environment or an ISO environment with certain switch settings) ! 566: * cause a host of anonymous, identical string constants to be created, which ! 567: * have to be suppressed by using a static declaration. On the other hand, ! 568: * this does worse than a compiler which does share strings, because if the ! 569: * macro is not actually used then the data space is still taken up. ! 570: * ! 571: * Here we give a hint to those macros that care. ! 572: */ ! 573: ! 574: #ifndef _SHARED_STRINGS ! 575: # if (__MISC_PROFILE__ & __NOMERGESTR_M__) == 0 ! 576: ! 577: # define _SHARED_STRINGS 1 ! 578: ! 579: # endif ! 580: #endif /* ! defined (_SHARED_STRINGS) */ ! 581: ! 582: ! 583: /* ! 584: * It is frequently convenient to be able to map a pointer to a member of a ! 585: * structure back to a pointer to the parent structure. Unfortunately, while ! 586: * ISO C mandates that conversions between pointer types and will not cause ! 587: * loss of information, there are few things that can portably be done with ! 588: * such a converted pointer. In particular, the easy way of mapping back from ! 589: * a structure member pointer to the containing structure performs address ! 590: * arithmetic on character pointers using offsetof (). It appears that this ! 591: * puts us in the realm of implementation-defined behaviour, except when the ! 592: * offsetof () the member is 0. ! 593: */ ! 594: ! 595: #ifndef __DOWNCAST ! 596: ! 597: # define __DOWNCAST(str,mem,ptomem) \ ! 598: ((str *) ((char *) (ptomem) - \ ! 599: offsetof (str, mem))) ! 600: ! 601: #endif ! 602: ! 603: ! 604: /* ! 605: * This is a minor K&R compatibility issue: certain K&R compilers reject the ! 606: * ISO C idiom of enclosing a macro name in parentheses to suppress macro ! 607: * expansion when this idiom is used in function declarations. To get around ! 608: * this, we can use the ISO preprocessor in a clumsy fashion by providing an ! 609: * identity macro to provide the same overall effect of making the name we ! 610: * wish to suppress expansion for not be immediately followed by a left ! 611: * parenthesis (it will be followed by a parenthesis eventually, but since the ! 612: * proprocessor won't revisit the text it has seen before the expansion of ! 613: * the identity macro we get the behaviour we want). ! 614: */ ! 615: ! 616: #define __ARGS(x) x ! 617: ! 618: ! 619: /* ! 620: * The POSIX.1 standard discusses a special namespace issue; how can standard ! 621: * structures be portably extended, given that the structure tags are in the ! 622: * user namespace. For structures which have members with regular names and ! 623: * which are likely to be extended, the POSIX.1 standard deals with this by ! 624: * implicitly reserving all names of that form (something which further ! 625: * underscores the restrictions on standard headers not including each other). ! 626: * ! 627: * However, for situations where we wish to extend a structure not covered by ! 628: * the namespace reservation rules, or we wish to name a member according to ! 629: * some other usage, we must take care to not define the member such that it ! 630: * might conflict with some macro name which the user is permitted to define. ! 631: * See POSIX.1 B.2.7.2 for discussion of this point. ! 632: * ! 633: * The following definition can be used to wrap the definition of structure ! 634: * member names such that those names will not conflict with user macros if ! 635: * _POSIX_SOURCE is defined. This form can be used in references to the member ! 636: * name which may be encapsulated in macros so that there is no loss of ! 637: * functionality or alteration of behaviour when _POSIX_SOURCE is used. ! 638: */ ! 639: ! 640: #if _POSIX_SOURCE ! 641: # define __NON_POSIX(name) __CONCAT (_, name) ! 642: #else ! 643: # define __NON_POSIX(name) name ! 644: #endif ! 645: ! 646: ! 647: /* ! 648: * GCC has a special feature for declaring functions as not ever returning. ! 649: */ ! 650: ! 651: #if __GNUC__ ! 652: # define __NO_RETURN__ volatile ! 653: #else ! 654: # define __NO_RETURN__ ! 655: #endif ! 656: ! 657: ! 658: /* ! 659: * Undefine all our internal symbols... why pollute the namespace? ! 660: */ ! 661: ! 662: #undef __STRINGIZE_M__ ! 663: #undef __PASTE_M__ ! 664: #undef __PROTODECL_M__ ! 665: #undef __PROTODEFN_M__ ! 666: #undef __CONST_M__ ! 667: #undef __VOLATILE_M__ ! 668: #undef __VOIDSTAR_M__ ! 669: #undef __STD_PROFILE_MASK__ ! 670: ! 671: #undef __NOTUSED_M__ ! 672: #undef __REGISTER_M__ ! 673: #undef __LINKID_M__ ! 674: #undef __INLINE_M__ ! 675: #undef __INLINEL_M__ ! 676: #undef __DOTDOTDOT_M__ ! 677: #undef __NOMERGESTR_M__ ! 678: #undef __MISC_PROFILE_MASK__ ! 679: ! 680: #undef __STDC_M__ ! 681: #undef __PROFILE__ ! 682: #undef __STD_PROFILE__ ! 683: #undef __MISC_PROFILE__ ! 684: ! 685: #endif /* ! defined (__COMMON__CCOMPAT_H__) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.