On 3/18/2025 9:56 AM, Arne Vajhøj wrote:
On 3/18/2025 1:58 AM, Lawrence D'Oliveiro wrote:
On Tue, 18 Mar 2025 16:24:46 +1100, Michael Brown wrote:
Working in C, how do you return the RMS$_CODE symbol for any given error
number as returned from any operation?
>
The $GETMSG system service comes to mind. I see there is a library routine
LIB$SYS_GETMSG, not sure what that does that the system service call does
not.
Classic LIB$ SYS$ difference in API style:
SYS$ LIB$
optional arguments require placeholder can be omitted
readonly integer argument by value by reference
string arguments fixed length only dynamic ok
In C it is just different:
#include <stdio.h>
#include <stdint.h>
#include <descrip.h>
#include <lib$routines.h>
#include <starlet.h>
int main(int argc, char *argv[])
{
char msg[256];
int32_t code, stat;
int16_t msglen;
$DESCRIPTOR(msgdesc, msg);
code = 98962;
stat = lib$sys_getmsg(&code, &msglen, &msgdesc);
msg[msglen] = 0;
printf("stat=%d msg=|%s|\n", stat, msg);
stat = sys$getmsg(code, &msglen, &msgdesc, 0, 0);
msg[msglen] = 0;
printf("stat=%d msg=|%s|\n", stat, msg);
return 0;
}
but in other languages the LIB$ variant can be convenient:
$ bas/obj=msgfun sys$input
program msgfun
declare integer code, msglen, stat
declare string msg
external integer function lib$sys_getmsg(integer, integer, string)
code = 98962
stat = lib$sys_getmsg(code, msglen, msg)
print stat
print "|" + msg + "|"
end program
$
$ link msgfun
$ run msgfun
1
|%RMS-E-FNF, file not found|
$ bas/obj=msgfun sys$input
program msgfun
declare integer code, msglen, stat
map (fun) string msg = 256
external integer function sys$getmsg(integer by value, integer, string, integer by value, integer by value)
code = 98962
stat = sys$getmsg(code, msglen, msg, 0, 0)
print stat
print "|" + mid$(msg, 1, msglen) + "|"
end program
$
$ link msgfun
$ run msgfun
1
|%RMS-E-FNF, file not found|
$ bas/obj=msgfun sys$input
program msgfun
declare integer code, msglen, stat
map (fun) string msg = 256
external integer function sys$getmsg(integer by value, integer, string)
code = 98962
stat = sys$getmsg(code, msglen, msg)
print stat
!print "|" + mid$(msg, 1, msglen) + "|"
end program
$
$ link msgfun
$ run msgfun
276
$ bas/obj=msgfun sys$input
program msgfun
declare integer code, msglen, stat
declare string msg
external integer function sys$getmsg(integer by value, integer, string, integer by value, integer by value)
code = 98962
stat = sys$getmsg(code, msglen, msg, 0, 0)
print stat
!print "|" + mid$(msg, 1, msglen) + "|"
end program
$
$ link msgfun
$ run msgfun
1537
Arne