OpenVMS Source-Code Demos

DESCRIPTOR_MACRO

//============================================================================================================
// title : descriptor_macro.c
// author: Neil Rieck
// date  : 2014-12-23
// notes : 1) the $DESCRIPTOR macro (found in <descrip.h>) is really dumb so be very careful when using it.
//         2) Why? It incorrectly uses "sizeof()-1" rather than "strlen()" which might not be what you wanted.
//         3) if in doubt, never use this macro. Populate the structure yourself.
//============================================================================================================
#include <stdio.h>					// standard C
#include <string.h>					// standard C
#include <descrip.h>					// VMS/OpenVMS systems only
//
char neil[] = "Neil Rieck";
char * ptr;
//
void main () {
    ptr = neil;						// copy address of static string
    //
    printf("var: neil[] sizeof: %d strlen: %d\n", sizeof(neil), strlen(neil));
    printf("var: *ptr   sizeof: %d strlen: %d\n", sizeof(ptr) , strlen(ptr));
    //
    //	create 3 new variables of type "struct dsc$descriptor_s"
    //
    $DESCRIPTOR (macro1, "SYS$COMMAND");		// example from the docs
    $DESCRIPTOR (macro2, neil);				// should work
    $DESCRIPTOR (macro3, ptr);				// does not work
    //
    printf("macro1 len %d \n",macro1.dsc$w_length);	// yields:  11 (correct answer)
    printf("macro2 len %d \n",macro2.dsc$w_length);	// yields:  10 (correct answer)
    printf("macro3 len %d \n",macro3.dsc$w_length);	// yields:   3 (incorrect answer)
    //
    printf("macro1 typ %d \n",macro1.dsc$b_dtype);	// yields:  14 DSC$K_DTYPE_T (character string)
    printf("macro2 typ %d \n",macro2.dsc$b_dtype);	// yields:  14 DSC$K_DTYPE_T (character string)
    printf("macro3 typ %d \n",macro3.dsc$b_dtype);	// yields:  14 DSC$K_DTYPE_T (character string)
    //
    printf("macro1 cla %d \n",macro1.dsc$b_class);	// yields:   1 DSC$K_CLASS_S (fixed-length descriptor)
    printf("macro2 cla %d \n",macro2.dsc$b_class);	// yields:   1 DSC$K_CLASS_S (fixed-length descriptor)
    printf("macro3 cla %d \n",macro3.dsc$b_class);	// yields:   1 DSC$K_CLASS_S (fixed-length descriptor)
}