Re: Re: Re: Assertion name not printed when using rescue
| Newsgroups | gmane.comp.lang.eiffel.smalleiffel |
|---|---|
| Message-ID | <OF1F895AFB.74F7BF1E-ONC1256FDA.00387EEA-C1256FDA.003A9155@mpsa.com> |
> I don't know what is "c_inline_c". I simply have a few methods like
> this in my program:
>
> ncurses_initscr:POINTER is
> external "C" alias "initscr"
> end
> And then I have 'external_lib: "-lncurses"' in my .ace file. That's
> all. This seems really nice to me because I just have to know the
> parameters of C library function and nothing else about C/C++.
Not too bad.
> I looked at "tutorial/external" to see how C file can be included in
> my program (this is where I got the above solution). I know that
> closing ncurses from C is probably easy, just writing something like
> "endwin()" but I have no idea how to write a C code and tell
> SmartEiffel "Please call this code before you want to print a runtime
> error message".
That's what I tried to explain but obviously I failed to be clear. I'll
give you a solution bellow. I'll stick to the simplest solution which
works with SmartEiffel 2.1.
1- write some C code, yes, really
2- call this code from Eiffel
3- recompile your code
How to do that?
1- open your favorite editor, and write a my_ncurses.h file (or whatever)
and a my_ncurses.c file
--[my_ncurses.h]--8<--------
#ifndef MY_NCURSES
#define MY_NCURSES 1
#define my_ncurses_init _my_ncurses_init()
void _my_ncurses_init(void);
#endif
-------->8------------------
--[my_ncurses.c]--8<--------
#include "my_ncurses.h"
static void my_ncurses_handler(se_handler_action_t action, void*data) {
switch(action) {
case SE_HANDLE_RUNTIME_ERROR:
case SE_HANDLE_NO_MORE_MEMORY:
/* some code here to stop ncurses */
break;
case SE_HANDLE_SEDB_BREAK:
/* some code here to suspend ncurses */
break;
case SE_HANDLE_SEDB_CONTINUE:
/* some code here to restart ncurses */
break;
default:
/* nothing */
break;
}
}
void _my_ncurses_init(void) {
register_handler(my_ncurses_handler);
}
-------->8------------------
2- From some Eiffel code, you must call this code, preferably in a once
feature. A solution would be to create an object of the following class:
--[my_ncurses.e]--8<--------
class MY_NCRUSES
create {ANY}
make
feature {}
make is
do
init
end
init is
once
ncurses_initscr
ncurses_init
end
ncurses_init is
external "C" alias "my_ncurses_init"
end
ncurses_initscr:POINTER is
external "C" alias "initscr"
end
end
-------->8------------------
3- the command line must have my_ncurses.c somewhere on it.
> Is this even the correct solution?
It is basically the *only* solution. There is some C code to write to shut
down ncurses at the right moment. Using an external "C" or an external
"plug_in" is not relevant here (sorry I confused you).
> Does it mean that when I use "rescue" the runtime error message is
> always lost (not accessible in some sort of "exception" object)?
Yes. There is no object but a low-level C structure displayed by the
runtime.
> So I must not use "rescue" at all and write some C plugin that
> somehow gets executed before the error message is printed and shuts
> down the ncurses? What if this plugin is called because of the error
> that occured before the ncurses was even initialized?
Keep cool. If you do as I explained above, the SmartEiffel runtime will
call the handler above when an error occurs and correctly shut ncurses
down.
> I know these may seem like stupid questions to you.
Not at all. They just show the lack of documentation, that's our biggest
flaw :-(
> I'd really like to find this out alff of this myself but I cannot find
> any useful documentation about SmartEiffel. I have only the tutorials
> from eiffel.com. I now know the basics of the language and I can use it
> AND call C libraries from it, which seems really nice to me.
Don't bother to look at eiffel.com, their compiler does not work at all as
ours. The SmartEiffel site is http://SmartEiffel.loria.fr
Some tutorials are provided in our SmartEiffel release (look for the
"tutorial" directory).
Hope it helps,
Best regards,
--
Cyril Adrian -- ALPLOG
@ PSA Peugeot Citroën, Sochaux, France
tél. +33 (0)3 81 33 48 76
fax +33 (0)3 81 33 16 06