Post by Arne VajhøjPost by Arne VajhøjPost by Craig A. BerryPost by Arne VajhøjBecause SMG$ are supporting Pascal/Basic/Cobol/Fortran then
many arguments are pass by descriptor and you will need to setup
those in C, so some familiarity with descriptors will be required.
https://groups.google.com/g/comp.os.vms/c/ufBEqvGdglU
That discussion has pointers to various examples,
In general VMS Pascal/VMS Basic code should be maybe 25% shorter
than equivalent C code. But with a descriptor centric API like
SMG$ then it may be more like 40% shorter.
One could make a nice wrapper in C++ encapsulating the context
and convert between stl::string / C char array and descriptors.
$ CXX/POINTER=32 ...
or you will regret it.
So I tried based on:
* almost 1:1 between wrapper methods and SMG$ functions
* integer in by reference -> by value
* integer out by reference -> integer return value
* string in by descriptor -> char* or stl::string in
* string out by descriptor -> stl::string return value
* status code -> throw exception
* expose displayid, pasteboardid and keyboardid so wrapper
can be mixed with custom SMG$ function calls
* use original SMG$ constants
Example:
#include <iostream>
using namespace std;
#include "smg.h"
int main(int argc, char *argv[])
{
try
{
SMG smg(true);
smg.PutString(1, 1, "AA");
smg.PutString(1, 3, "BB", SMG$M_BOLD);
smg.PutString(1, 5, "CC", SMG$M_UNDERLINE);
smg.PutString(1, 7, "DD", SMG$M_REVERSE);
smg.DrawRectangle(17, 1, 5, 78);
smg.DrawHorLine(19, 2, 76);
smg.PutString(18, 2, "ABC");
smg.PutString(20, 2, "123");
smg.PutString(2, 1, ">>>> ");
string reply = smg.GetString(2, 6);
smg.PutString(3, 1, "You entered: " + reply);
smg.PutString(4, 1, "Hit PF1 to exit");
while(smg.GetKey() != SMG$K_TRM_PF1);
}
catch(SMGexception& ex)
{
cout << ex.what() << endl;
}
return 0;
}
If anyone is interested I will make the code available.
Arne