OpenVMS Source Code Demos
VT_SMG_DEMO
//==============================================================================================================================
// title : vt_smg_demo_100.c
// author : Neil Rieck ( https://neilrieck.net/ )
// created : 2015-05-03
// purpose : to demo old "school i/o" to a vt-terminal
// reference: http://h41379.www4.hpe.com/doc/73final/5935/5935pro.html -- OpenVMS RTL Screen Management (SMG$) Manual
// : sys$library:c$starlet.txt (search for: smgdef)
// caveat : learning to write programs employing 100+ "SMG$ calls" may be as difficult as learning to program with 200+ "FDV$
// calls" (and may not be worth the investment of your time in 2015). SMG-based programming is procedural which may
// add an undesired amount of per-user overhead to your system. Unless you need to support fancy smaller scrolling
// sections or line graphics, you may wish to consider embedding escape sequences directly into your output data
// stream.
// build : cc vt_smg_demo_100
// : link vt_smg_demo_100
// run-1 : run vt_smg_demo_100
// run-2 : $'f$environment("default")'VT_SMG_DEMO_100
// : yada 0.25
// history :
// ver who when what
// --- --- ------ --------------------------------------------------------------------------------------------------------------
// 100 NSR 150503 original effort
//==============================================================================================================================
//
// stuff for OpenVMS
//
#if defined(VMS) // for VMS and OpenVMS only
#define __NEW_STARLET 1 // enable strict for OpenVMS Alpha 7.0 and later
#include <starlet.h> // OpenVMS stuff
#include <lib$routines.h> // defines functions like: lib$wait
#include <libwaitdef.h> // defines constants like: lib$k_vax_f
#include <stddef.h> //
#include <smg$routines.h> //
#include <smgdef.h> //
#include <smgmsg.h> //
#include <descrip.h> // vms string descriptors
#endif
//
// common stuff
//
#include <stdio.h> //
#include <stdlib.h> // atof
#include <string.h> //
//
// define a few constants
//
static $DESCRIPTOR(lab1des, "SMG EXAMPLE 1");
static $DESCRIPTOR(lab2des, "SMG EXAMPLE 2");
static $DESCRIPTOR(msg1des, "Normal text: abcdefghijklmnopqrstuvwxyz");
static $DESCRIPTOR(msg2des, "Text with CR: \r, LF: \n, VT: \v, FF: \f");
//
// decterm colors
//
#define DTC$M_BLACK SMG$M_USER1
#define DTC$M_BLUE SMG$M_USER2
#define DTC$M_CYAN SMG$M_USER3
#define DTC$M_GREEN SMG$M_USER4
#define DTC$M_MAGENTA SMG$M_USER5
#define DTC$M_ORANGE SMG$M_USER6
#define DTC$M_WHITE SMG$M_USER7
#define DTC$M_YELLOW SMG$M_USER8
//
// forward declarations
//
void nsr_delay(float); //
//
//==============================================================================
//
// main() "the big kahuna"
//
//==============================================================================
void main(int argc, char *argv[]) {
int rc;
unsigned int pasteboard1, display1;
struct dsc$descriptor_s byedes;
float delay;
//--------------------------------------------------------------------------
printf("pgm: %s\n",argv[0]);
printf(" 1) assuming your terminal driver is vt300 or higher with color enabled\n");
printf(" 2) $ set term/device=vt300\n");
printf(" 3) $ set term/color\n");
printf(" 4) assuming color is enabled on your terminal or terminal emulator\n");
delay = 0.25;
if (argc==1){
printf("-i- arg#1 not found so defaulting delay to 0.25\n");
}else{
delay = atof(argv[1]);
printf("-i- delay set to %.2f seconds\n",delay);
}
nsr_delay(2.0);
//--------------------------------------------------------------------------
printf("starting...\n");
rc = SMG$CREATE_PASTEBOARD(&pasteboard1);
//
// create virtual display1 (12 lines by 40 characters)
//
rc = SMG$CREATE_VIRTUAL_DISPLAY(&12, &40, &display1,&(SMG$M_BLOCK_BORDER|SMG$M_DISPLAY_CONTROLS));
nsr_delay(delay);
//
rc = SMG$PASTE_VIRTUAL_DISPLAY(&display1, &pasteboard1, &2, &2);
nsr_delay(delay);
//
rc = SMG$LABEL_BORDER(&display1, &lab1des, &SMG$K_TOP, NULL,&DTC$M_YELLOW);
nsr_delay(delay);
//
rc = SMG$PUT_LINE(&display1, &msg1des, NULL, &DTC$M_GREEN); //
nsr_delay(delay);
//
rc = SMG$PUT_LINE(&display1, &msg2des, NULL, &DTC$M_BLUE); //
nsr_delay(delay);
//
/* Build descriptor at run-time */
byedes.dsc$w_length = 3;
byedes.dsc$b_dtype = DSC$K_DTYPE_T;
byedes.dsc$b_class = DSC$K_CLASS_S;
byedes.dsc$a_pointer = "Bye";
rc = SMG$PUT_CHARS_WIDE(&display1, &byedes, &3, &8, &(SMG$M_BLINK|DTC$M_YELLOW));
nsr_delay(delay);
//
/* Re-use by changing length and pointer (only):- */
byedes.dsc$w_length = 4;
byedes.dsc$a_pointer = "-bye";
rc = SMG$PUT_CHARS_HIGHWIDE(&display1, &byedes, &4, &11,&(SMG$M_BLINK|SMG$M_BOLD|DTC$M_CYAN));
nsr_delay(delay);
//
rc = SMG$SET_CURSOR_ABS(&display1, &10, &1);
nsr_delay(delay);
}
//======================================================================
// nsr_delay(float)
//======================================================================
//
#if defined(VMS) // for VMS and OpenVMS
//----------------------------------------------------------------------
// this next bit of voodoo ensures we are using the correct float type on
// various hardware platforms: VAX, Alpha, Itanium
//
#if __G_FLOAT != 0
# define FLOAT_TYPE LIB$K_VAX_F
#elif __D_FLOAT != 0
# define FLOAT_TYPE LIB$K_VAX_D
#elif __IEEE_FLOAT != 0
# define FLOAT_TYPE LIB$K_IEEE_S
#else
# error "Try specifying a floating point qualifier on the compile"
#endif
//
// delay for the desired number of milliseconds
//
void nsr_delay(float fp_delay) { //
int rc; //
rc = lib$wait(&fp_delay,0,&FLOAT_TYPE); //
}
#else // for non-VMS systems
//
void nsr_delay(float fp_delay) { //
sleep(1); //
} //
#endif
//======================================================================