Annotation of gcc/README.FRESCO, revision 1.1

1.1     ! root        1: Compiling Fresco with g++ 2.6
        !             2: -----------------------------
        !             3: 
        !             4: Fresco is an evolving interface and toolkit for object-oriented
        !             5: graphics.  A preliminary version (written in C++) was released
        !             6: with x11r6.
        !             7: 
        !             8: G++ 2.5.x had various bugs preventing Fresco from compiling properly.
        !             9: We believe these have all been fixed in g++ 2.6.  However, there
        !            10: are still a few portability problems in Fresco itself.  These should
        !            11: be fixed in the next release of Fresco.
        !            12: 
        !            13: The following patches should help in working around the problems.
        !            14: I used these patches when I built Fresco, but I don't have time
        !            15: right now to verify them, or to check that they would apply cleanly.
        !            16: Perhaps someone could verify these patches against gcc 2.6 and
        !            17: the latest Fresco and clean it up?
        !            18: 
        !            19: The most obvious problem is that Fresco defines false and true as constants.
        !            20: However, these are noe reserved words in ANSI C++.  Since g++ has
        !            21: implemented false, true, and bool, it complains about a syntax error.
        !            22: 
        !            23: The first patch below to workInProgress/Fresco/include/Ox/base.h should
        !            24: fix that.  It also enables use of long long.
        !            25: 
        !            26: I ran into the same "true/false" problem in some other file,
        !            27: but I can find it now.  (It was not in the library proper.)
        !            28: 
        !            29: The second patch is to contrib/programs/dish/main.cxx.
        !            30: The first part of it is probably SunOS4-specific.
        !            31: It was somewhat puzzling, but it looks like the %p format conversion
        !            32: specifier in either sscanf or sprintf doesn't work properly, so I had to
        !            33: use (the less strictly correct) %x specifier.
        !            34: 
        !            35: The other part is also Sun-specific.  The original code assumes
        !            36: it can call _main, but g++ does not provide that.  Instead, I changed
        !            37: the code to use a static destructor.  The fix in the next Fresco
        !            38: release will probably be different.
        !            39: 
        !            40: Please try these patches, and let me know how they work.
        !            41: 
        !            42:        --Per Bothner
        !            43: Cygnus Support     [email protected]
        !            44: 
        !            45: *** /cygint/x11r6/workInProgress/Fresco/include/Ox/base.h      Fri Apr  1 13:49:59 1994
        !            46: --- ./base.h   Thu May 19 21:02:24 1994
        !            47: ***************
        !            48: *** 39,58 ****
        !            49:   #ifndef ox_Boolean
        !            50:   #define ox_Boolean
        !            51:   
        !            52: ! typedef unsigned char Boolean;
        !            53: ! 
        !            54: ! static const unsigned char false = 0;
        !            55: ! static const unsigned char true = 1;
        !            56:   
        !            57:   #ifndef TRUE
        !            58:   #define TRUE true
        !            59:   #endif
        !            60: - 
        !            61:   #ifndef FALSE
        !            62:   #define FALSE false
        !            63:   #endif
        !            64:   
        !            65: ! #endif
        !            66:   
        !            67:   #ifndef ox_octet
        !            68:   #define ox_octet
        !            69: --- 39,68 ----
        !            70:   #ifndef ox_Boolean
        !            71:   #define ox_Boolean
        !            72:   
        !            73: ! /* Note that 'bool', 'false', and 'true' are now reserved words in
        !            74: !    ANSI/ISO C++, though few compilers implement them. */
        !            75: ! #ifndef __GNUC__
        !            76: ! #ifndef false
        !            77: ! #define false 0
        !            78: ! #endif
        !            79: ! #ifndef true
        !            80: ! #define true 1
        !            81: ! #endif
        !            82: ! #ifndef bool
        !            83: ! #define bool unsigned char
        !            84: ! #endif
        !            85: ! #endif
        !            86:   
        !            87: + /* Note:  Avoid obsolete identifiers Boolean/TRUE/FALSE. */
        !            88:   #ifndef TRUE
        !            89:   #define TRUE true
        !            90:   #endif
        !            91:   #ifndef FALSE
        !            92:   #define FALSE false
        !            93:   #endif
        !            94: + typedef bool Boolean;
        !            95:   
        !            96: ! #endif /*!ox_Boolean*/
        !            97:   
        !            98:   #ifndef ox_octet
        !            99:   #define ox_octet
        !           100: ***************
        !           101: *** 85,91 ****
        !           102:   #else
        !           103:   typedef long Long;
        !           104:   typedef unsigned long ULong;
        !           105: ! #if defined(sgi)
        !           106:   /* compiler supports long long */
        !           107:   typedef long long LongLong;
        !           108:   typedef unsigned long long ULongLong;
        !           109: --- 95,101 ----
        !           110:   #else
        !           111:   typedef long Long;
        !           112:   typedef unsigned long ULong;
        !           113: ! #if defined(sgi) || defined (__GNUC__)
        !           114:   /* compiler supports long long */
        !           115:   typedef long long LongLong;
        !           116:   typedef unsigned long long ULongLong;
        !           117: 
        !           118: *** main.cxx.orig      Mon Apr 11 16:25:30 1994
        !           119: --- main.cxx.new       Sat May 14 12:48:09 1994
        !           120: ***************
        !           121: *** 251,264 ****
        !           122:       if (strcmp(s, "0") == 0) {
        !           123:        obj = nil;
        !           124:       } else {
        !           125: !      b = sscanf(s, "_dish_%p", &obj) == 1;
        !           126:       }
        !           127:       return b;
        !           128:   }
        !           129:   
        !           130:   char* Dish::object_to_string(BaseObjectRef obj, char* result) {
        !           131:       if (is_not_nil(obj)) {
        !           132: !      sprintf(result, "_dish_%p", obj);
        !           133:       } else {
        !           134:        sprintf(result, "0");
        !           135:       }
        !           136: --- 251,268 ----
        !           137:       if (strcmp(s, "0") == 0) {
        !           138:        obj = nil;
        !           139:       } else {
        !           140: !      long val;
        !           141: !      b = sscanf(s, "_dish_%lx", &val) == 1;
        !           142: !      if (b)
        !           143: !        obj = (BaseObjectRef)(void*)val;
        !           144:       }
        !           145:       return b;
        !           146:   }
        !           147:   
        !           148:   char* Dish::object_to_string(BaseObjectRef obj, char* result) {
        !           149:       if (is_not_nil(obj)) {
        !           150: !      long val = (long)obj;
        !           151: !      sprintf(result, "_dish_%lx", val);
        !           152:       } else {
        !           153:        sprintf(result, "0");
        !           154:       }
        !           155: ***************
        !           156: *** 1087,1110 ****
        !           157:       }
        !           158:   }
        !           159:   
        !           160: ! /*
        !           161: !  *  Called by main() defined in tcl lib.
        !           162: !  */
        !           163:   
        !           164:   #if defined(sun) && !defined(SVR4)
        !           165:   extern "C" {
        !           166:     void _main();
        !           167:     void on_exit(void (*)(), caddr_t);
        !           168:   }
        !           169:   #endif
        !           170:   
        !           171:   int Tcl_AppInit(Tcl_Interp* interp) {
        !           172:   #if defined(sun) && !defined(SVR4)
        !           173:       _main();
        !           174:       on_exit(&Dish::cleanup, NULL);
        !           175:   #else
        !           176:       atexit(&Dish::cleanup);
        !           177:   #endif
        !           178:       Dish* dish = new Dish(interp);
        !           179:       dish->add_commands(interp);
        !           180:       dish->add_variables(interp);
        !           181: --- 1091,1129 ----
        !           182:       }
        !           183:   }
        !           184:   
        !           185: ! #if !defined(DISH_CLEANUP_USE_DESTRUCTOR) && defined(__GNUC__)
        !           186: ! /* This assumes that the tcl library's main() has also been
        !           187: !    compiled with gcc, or else the destructors won't get run properly. */
        !           188: ! #define DISH_CLEANUP_USE_DESTRUCTOR 1
        !           189: ! #endif
        !           190:   
        !           191: + #if DISH_CLEANUP_USE_DESTRUCTOR
        !           192: + struct DishCleanup {
        !           193: +   ~DishCleanup() { Dish::cleanup(); }
        !           194: + };
        !           195: + static DishCleanup DishCleanupObject;
        !           196: + #else /* !DISH_CLEANUP_USE_DESTRUCTOR */
        !           197:   #if defined(sun) && !defined(SVR4)
        !           198:   extern "C" {
        !           199:     void _main();
        !           200:     void on_exit(void (*)(), caddr_t);
        !           201:   }
        !           202:   #endif
        !           203: + #endif /* !DISH_CLEANUP_USE_DESTRUCTOR */
        !           204: + 
        !           205: + /*
        !           206: +  *  Called by main() defined in tcl lib.
        !           207: +  */
        !           208:   
        !           209:   int Tcl_AppInit(Tcl_Interp* interp) {
        !           210: + #if !DISH_CLEANUP_USE_DESTRUCTOR
        !           211:   #if defined(sun) && !defined(SVR4)
        !           212:       _main();
        !           213:       on_exit(&Dish::cleanup, NULL);
        !           214:   #else
        !           215:       atexit(&Dish::cleanup);
        !           216:   #endif
        !           217: + #endif /* !DISH_CLEANUP_USE_DESTRUCTOR */
        !           218:       Dish* dish = new Dish(interp);
        !           219:       dish->add_commands(interp);
        !           220:       dish->add_variables(interp);

unix.superglobalmegacorp.com

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