home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / README.FRESCO < prev    next >
Text File  |  1996-09-28  |  6KB  |  221 lines

  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     bothner@cygnus.com
  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. ! static const unsigned char false = 0;
  54. ! static const unsigned char true = 1;
  55.   
  56.   #ifndef TRUE
  57.   #define TRUE true
  58.   #endif
  59.   #ifndef FALSE
  60.   #define FALSE false
  61.   #endif
  62.   
  63. ! #endif
  64.   
  65.   #ifndef ox_octet
  66.   #define ox_octet
  67. --- 39,68 ----
  68.   #ifndef ox_Boolean
  69.   #define ox_Boolean
  70.   
  71. ! /* Note that 'bool', 'false', and 'true' are now reserved words in
  72. !    ANSI/ISO C++, though few compilers implement them. */
  73. ! #ifndef __GNUC__
  74. ! #ifndef false
  75. ! #define false 0
  76. ! #endif
  77. ! #ifndef true
  78. ! #define true 1
  79. ! #endif
  80. ! #ifndef bool
  81. ! #define bool unsigned char
  82. ! #endif
  83. ! #endif
  84.   
  85. + /* Note:  Avoid obsolete identifiers Boolean/TRUE/FALSE. */
  86.   #ifndef TRUE
  87.   #define TRUE true
  88.   #endif
  89.   #ifndef FALSE
  90.   #define FALSE false
  91.   #endif
  92. + typedef bool Boolean;
  93.   
  94. ! #endif /*!ox_Boolean*/
  95.   
  96.   #ifndef ox_octet
  97.   #define ox_octet
  98. ***************
  99. *** 85,91 ****
  100.   #else
  101.   typedef long Long;
  102.   typedef unsigned long ULong;
  103. ! #if defined(sgi)
  104.   /* compiler supports long long */
  105.   typedef long long LongLong;
  106.   typedef unsigned long long ULongLong;
  107. --- 95,101 ----
  108.   #else
  109.   typedef long Long;
  110.   typedef unsigned long ULong;
  111. ! #if defined(sgi) || defined (__GNUC__)
  112.   /* compiler supports long long */
  113.   typedef long long LongLong;
  114.   typedef unsigned long long ULongLong;
  115.  
  116. *** main.cxx.orig    Mon Apr 11 16:25:30 1994
  117. --- main.cxx.new    Sat May 14 12:48:09 1994
  118. ***************
  119. *** 251,264 ****
  120.       if (strcmp(s, "0") == 0) {
  121.       obj = nil;
  122.       } else {
  123. !     b = sscanf(s, "_dish_%p", &obj) == 1;
  124.       }
  125.       return b;
  126.   }
  127.   
  128.   char* Dish::object_to_string(BaseObjectRef obj, char* result) {
  129.       if (is_not_nil(obj)) {
  130. !     sprintf(result, "_dish_%p", obj);
  131.       } else {
  132.       sprintf(result, "0");
  133.       }
  134. --- 251,268 ----
  135.       if (strcmp(s, "0") == 0) {
  136.       obj = nil;
  137.       } else {
  138. !     long val;
  139. !     b = sscanf(s, "_dish_%lx", &val) == 1;
  140. !     if (b)
  141. !       obj = (BaseObjectRef)(void*)val;
  142.       }
  143.       return b;
  144.   }
  145.   
  146.   char* Dish::object_to_string(BaseObjectRef obj, char* result) {
  147.       if (is_not_nil(obj)) {
  148. !     long val = (long)obj;
  149. !     sprintf(result, "_dish_%lx", val);
  150.       } else {
  151.       sprintf(result, "0");
  152.       }
  153. ***************
  154. *** 1087,1110 ****
  155.       }
  156.   }
  157.   
  158. ! /*
  159. !  *  Called by main() defined in tcl lib.
  160. !  */
  161.   
  162.   #if defined(sun) && !defined(SVR4)
  163.   extern "C" {
  164.     void _main();
  165.     void on_exit(void (*)(), caddr_t);
  166.   }
  167.   #endif
  168.   
  169.   int Tcl_AppInit(Tcl_Interp* interp) {
  170.   #if defined(sun) && !defined(SVR4)
  171.       _main();
  172.       on_exit(&Dish::cleanup, NULL);
  173.   #else
  174.       atexit(&Dish::cleanup);
  175.   #endif
  176.       Dish* dish = new Dish(interp);
  177.       dish->add_commands(interp);
  178.       dish->add_variables(interp);
  179. --- 1091,1129 ----
  180.       }
  181.   }
  182.   
  183. ! #if !defined(DISH_CLEANUP_USE_DESTRUCTOR) && defined(__GNUC__)
  184. ! /* This assumes that the tcl library's main() has also been
  185. !    compiled with gcc, or else the destructors won't get run properly. */
  186. ! #define DISH_CLEANUP_USE_DESTRUCTOR 1
  187. ! #endif
  188.   
  189. + #if DISH_CLEANUP_USE_DESTRUCTOR
  190. + struct DishCleanup {
  191. +   ~DishCleanup() { Dish::cleanup(); }
  192. + };
  193. + static DishCleanup DishCleanupObject;
  194. + #else /* !DISH_CLEANUP_USE_DESTRUCTOR */
  195.   #if defined(sun) && !defined(SVR4)
  196.   extern "C" {
  197.     void _main();
  198.     void on_exit(void (*)(), caddr_t);
  199.   }
  200.   #endif
  201. + #endif /* !DISH_CLEANUP_USE_DESTRUCTOR */
  202. + /*
  203. +  *  Called by main() defined in tcl lib.
  204. +  */
  205.   
  206.   int Tcl_AppInit(Tcl_Interp* interp) {
  207. + #if !DISH_CLEANUP_USE_DESTRUCTOR
  208.   #if defined(sun) && !defined(SVR4)
  209.       _main();
  210.       on_exit(&Dish::cleanup, NULL);
  211.   #else
  212.       atexit(&Dish::cleanup);
  213.   #endif
  214. + #endif /* !DISH_CLEANUP_USE_DESTRUCTOR */
  215.       Dish* dish = new Dish(interp);
  216.       dish->add_commands(interp);
  217.       dish->add_variables(interp);
  218.