home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / programming / dreamscape / source / Dreamscape / Headers / low-level / h / x < prev   
Text File  |  1996-09-27  |  5KB  |  142 lines

  1.  
  2. /* low-level.h.x
  3.  *
  4.  * Dreamscape - C++ class library for RISC OS
  5.  * Copyright (c) 1996 Mark Seaborn <mseaborn@argonet.co.uk>
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Library General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2 of the License, or (at your option) any later version.
  11.  * See the Dreamscape documentation for more information.
  12.  */
  13.  
  14. #ifndef dreamscape_x_H
  15. #define dreamscape_x_H
  16.  
  17. #include <string.h>
  18. #include <setjmp.h>
  19.  
  20. #ifdef __cplusplus
  21.  
  22. /*
  23.  * C++ version of pseudo-exception handling
  24.  */
  25.  
  26. #include "stringt.h"
  27.  
  28. struct os_error;
  29.  
  30. class RISCOSError {
  31. public:
  32.   RISCOSError(): errnum(0) { *errmess = 0; }
  33.   RISCOSError(const char *m): errnum(0)
  34.     { strncpy(errmess, m, 250)[250] = 0; }
  35.   RISCOSError(const char *m, unsigned n): errnum(n)
  36.     { strncpy(errmess, m, 250)[250] = 0; }
  37.  
  38.   RISCOSError &operator=(const char *m)
  39.     { strncpy(errmess, m, 250)[250] = 0; return *this; }
  40.   RISCOSError &operator+=(const char *m) { int l=strlen(errmess);
  41.       strncpy(errmess+l, m, 250-l)[250-l] = 0; return *this; }
  42.   String operator+(const char *m) const { return String(errmess) + m; }
  43.   RISCOSError &operator=(unsigned n) { errnum = n; return *this; }
  44.  
  45.   operator char*() { return errmess; }
  46.   operator const char*() const { return errmess; }
  47.   operator os_error*() { return (os_error *) this; }
  48.   operator const os_error*() const { return (os_error *) this; }
  49.  
  50.   unsigned errnum;
  51.   char errmess[252];
  52. };
  53.  
  54. extern "C" {
  55.   void os_generate_error(const os_error *error);
  56.   const RISCOSError *x_buffer_error_(const RISCOSError *error);
  57.   const RISCOSError *x_buffer_error_msg_(const char *message);
  58.   const RISCOSError *x_catch_();
  59.   int *x_try_();
  60.   const char *x_msg_memory_();
  61.   const char *x_msg_internal_(const char *message);
  62.  
  63.   const RISCOSError *x_last_error();
  64. }
  65.  
  66. inline const RISCOSError *x_buffer_error(const RISCOSError *error)
  67.   { return x_buffer_error_(error); }
  68. inline const RISCOSError *x_buffer_error(const char *message)
  69.   { return x_buffer_error_msg_(message); }
  70. inline const RISCOSError *x_buffer_error(const os_error *error)
  71.   { return x_buffer_error_((RISCOSError *) error); }
  72. inline const RISCOSError *x_buffer_error_msg(const char *message)
  73.   { return x_buffer_error_msg_(message); }
  74.  
  75. inline String x_msg_memory() { return String(x_msg_memory_()); }
  76. inline String x_msg_internal(const char *message)
  77.   { return String(x_msg_internal_(message)); }
  78.  
  79. #define x_declare(name)
  80. #define x_try if(!setjmp(x_try_()))
  81. #define x_catch(name) const RISCOSError *name = x_catch_(); if(name)
  82.  
  83. inline void x_throw()
  84.   { os_generate_error((os_error *) x_last_error()); }
  85. inline void x_throw(const RISCOSError *error)
  86.   { os_generate_error((os_error *) error); }
  87. inline void x_throw(const char *message)
  88.   { os_generate_error((os_error *) x_buffer_error(message)); }
  89. inline void x_throw(const os_error *error)
  90.   { os_generate_error(error); }
  91.  
  92. inline void x_throw_error(const RISCOSError *error)
  93.   { os_generate_error((os_error *) error); }
  94. inline void x_throw_message(const char *message)
  95.   { os_generate_error((os_error *) x_buffer_error(message)); }
  96.  
  97. extern void (*x_error_reporter)(const char *error);
  98. inline void x_report_error(const char *error) { x_error_reporter(error); }
  99.  
  100. #else
  101.  
  102. /*
  103.  * C version of pseudo-exception handling
  104.  */
  105.  
  106. typedef struct RISCOSError RISCOSError;
  107. struct RISCOSError {
  108.   unsigned errnum;
  109.   char errmess[252];
  110. };
  111.  
  112. void os_generate_error(const struct os_error *error);
  113. const RISCOSError *x_buffer_error_(const RISCOSError *error);
  114. const RISCOSError *x_buffer_error_msg_(const char *message);
  115. const RISCOSError *x_catch_(void);
  116. int *x_try_(void);
  117. const char *x_msg_memory_(void);
  118. const char *x_msg_internal_(const char *message);
  119.  
  120. #define x_msg_memory() x_msg_memory_()
  121. #define x_msg_internal(message) x_msg_internal_(message)
  122. const RISCOSError *x_last_error(void);
  123.  
  124. #define x_buffer_error(error) x_buffer_error_(error)
  125. #define x_buffer_error_msg(message) x_buffer_error_msg_(message)
  126.  
  127. #define x_declare(name) const RISCOSError *name
  128. #define x_try if(!setjmp(x_try_()))
  129. #define x_catch(name) name = x_catch_(); if(name)
  130.  
  131. #define x_throw() os_generate_error(x_last_error())
  132. #define x_throw_error(error) os_generate_error((struct os_error *) error)
  133. #define x_throw_message(message) \
  134.   os_generate_error((struct os_error *) x_buffer_error_msg(message))
  135.  
  136. extern void (*x_error_reporter)(const char *error);
  137. #define x_report_error(error) x_error_reporter(error)
  138.  
  139. #endif
  140.  
  141. #endif
  142.