#include <errno.h>
#include <stdio.h>
#include <string.h>

#include <rms.h>
#include <fabdef.h>
#include <fibdef.h>
#include <starlet.h>
#include <stsdef.h>

/* Define macros for use with either NAM or NAML. */

#ifdef NAML$C_MAXRSS            /* NAML is available (ODS5 support...) */

#  ifndef NAM_MAXRSS            /* May have been defined before. */
#    define NAM_MAXRSS NAML$C_MAXRSS
#  endif

#  define NAM_STRUCT NAML

#  define FAB_OR_NAM(fab, nam) nam
#  define FAB_OR_NAM_DNA naml$l_long_defname
#  define FAB_OR_NAM_DNS naml$l_long_defname_size
#  define FAB_OR_NAM_FNA naml$l_long_filename
#  define FAB_OR_NAM_FNS naml$l_long_filename_size

#  define CC_RMS_NAM cc$rms_naml
#  define FAB_NAM fab$l_naml
#  define NAME_DNA naml$l_long_defname
#  define NAME_DNS naml$l_long_defname_size
#  define NAME_FNA naml$l_long_filename
#  define NAME_FNS naml$l_long_filename_size
#  define NAM_DID naml$w_did
#  define NAM_DVI naml$t_dvi
#  define NAM_ESA naml$l_long_expand
#  define NAM_ESL naml$l_long_expand_size
#  define NAM_ESS naml$l_long_expand_alloc
#  define NAM_FID naml$w_fid
#  define NAM_FNB naml$l_fnb
#  define NAM_RSA naml$l_long_result
#  define NAM_RSL naml$l_long_result_size
#  define NAM_RSS naml$l_long_result_alloc
#  define NAM_NOP naml$b_nop
#  define NAM_M_SYNCHK NAML$M_SYNCHK
#  define NAM_B_DEV naml$l_long_dev_size
#  define NAM_L_DEV naml$l_long_dev
#  define NAM_B_DIR naml$l_long_dir_size
#  define NAM_L_DIR naml$l_long_dir
#  define NAM_B_NAME naml$l_long_name_size
#  define NAM_L_NAME naml$l_long_name
#  define NAM_B_TYPE naml$l_long_type_size
#  define NAM_L_TYPE naml$l_long_type
#  define NAM_B_VER naml$l_long_ver_size
#  define NAM_L_VER naml$l_long_ver

#else /* !NAML$C_MAXRSS */      /* NAML is not available.  Use NAM. */

#  ifndef NAM_MAXRSS            /* May have been defined before. */
#    define NAM_MAXRSS NAM$C_MAXRSS
#  endif

#  define NAM_STRUCT NAM

#  define FAB_OR_NAM(fab, nam) fab
#  define FAB_OR_NAM_DNA fab$l_dna
#  define FAB_OR_NAM_DNS fab$b_dns
#  define FAB_OR_NAM_FNA fab$l_fna
#  define FAB_OR_NAM_FNS fab$b_fns

#  define CC_RMS_NAM cc$rms_nam
#  define FAB_NAM fab$l_nam
#  define NAME_DNA fab$l_dna
#  define NAME_DNS fab$b_dns
#  define NAME_FNA fab$l_fna
#  define NAME_FNS fab$b_fns
#  define NAM_DID nam$w_did
#  define NAM_DVI nam$t_dvi
#  define NAM_ESA nam$l_esa
#  define NAM_ESL nam$b_esl
#  define NAM_ESS nam$b_ess
#  define NAM_FID nam$w_fid
#  define NAM_FNB nam$l_fnb
#  define NAM_RSA nam$l_rsa
#  define NAM_RSL nam$b_rsl
#  define NAM_RSS nam$b_rss
#  define NAM_NOP nam$b_nop
#  define NAM_M_SYNCHK NAM$M_SYNCHK
#  define NAM_B_DEV nam$b_dev
#  define NAM_L_DEV nam$l_dev
#  define NAM_B_DIR nam$b_dir
#  define NAM_L_DIR nam$l_dir
#  define NAM_B_NAME nam$b_name
#  define NAM_L_NAME nam$l_name
#  define NAM_B_TYPE nam$b_type
#  define NAM_L_TYPE nam$l_type
#  define NAM_B_VER nam$b_ver
#  define NAM_L_VER nam$l_ver

#endif /* ?NAML$C_MAXRSS */


static struct FAB        fab;           /* File Access Block. */
static struct NAM_STRUCT nam;           /* Name block. */
static struct RAB        rab;           /* Record Access Block. */

/* Expanded and resultant name storage. */
static char exp_nam[NAM_MAXRSS];
static char res_nam[NAM_MAXRSS];


main( int argc, char **argv)
{
    int sts;

    fab = cc$rms_fab;                   /* Initialize FAB. */
    nam = CC_RMS_NAM;                   /* Initialize NAM[L]. */
    fab.FAB_NAM = &nam;                 /* Point FAB to NAM[L]. */

    printf( " (0) nam.naml$v_search_symlink = %d.\n",
     nam.naml$v_search_symlink);

    printf( " (0) nam.naml$v_open_special = %d.\n",
     nam.naml$v_open_special);

    printf( " (0) nam.naml$v_object_symlink = %d.\n",
     nam.naml$v_object_symlink);


#ifdef NAML$C_MAXRSS

    fab.fab$l_dna = (char *) -1;    /* Using NAML for default name. */
    fab.fab$l_fna = (char *) -1;    /* Using NAML for file name. */

#endif /* NAML$C_MAXRSS */

    FAB_OR_NAM(fab, nam).FAB_OR_NAM_FNA = argv[ 1];
    FAB_OR_NAM(fab, nam).FAB_OR_NAM_FNS = strlen( argv[ 1]);

    /* Expanded and resultant name storage. */
    nam.NAM_ESA = exp_nam;
    nam.NAM_ESS = sizeof(exp_nam);
    nam.NAM_RSA = res_nam;
    nam.NAM_RSS = sizeof(res_nam);

    sts = sys$open( &fab);
    if ((sts& STS$M_SUCCESS) == 0)
    {
        printf( " sys$open() = %%x%08x .\n", sts);
        printf( " %s\n", strerror( EVMSERR));
        return sts;
    }

    printf( " e: >%.*s<.\n", nam.NAM_ESL, exp_nam);
    printf( " r: >%.*s<.\n", nam.NAM_RSL, res_nam);

    printf( " (1) nam.naml$v_search_symlink = %d.\n",
     nam.naml$v_search_symlink);

    printf( " (1) nam.naml$v_open_special = %d.\n",
     nam.naml$v_open_special);

    printf( " (1) nam.naml$v_object_symlink = %d.\n",
     nam.naml$v_object_symlink);

    printf( " (1) nam.naml$l_output_flags = %%x%08x .\n",
     nam.naml$l_output_flags);

    printf( " (1) fab.fab$b_org = %%x%02x .\n", fab.fab$b_org);
    printf( " (1) fab.fab$b_rfm = %%x%02x .\n", fab.fab$b_rfm);
    printf( " (1) fab.fab$b_rat = %%x%02x .\n", fab.fab$b_rat);

    printf( " (1) did: %05d:%05d:%05d  fid: %05d:%05d:%05d\n",
     nam.NAM_DID[0], nam.NAM_DID[1], nam.NAM_DID[2],
     nam.NAM_FID[0], nam.NAM_FID[1], nam.NAM_FID[2]);


    fab = cc$rms_fab;                   /* Initialize FAB. */
    nam = CC_RMS_NAM;                   /* Initialize NAM[L]. */
    fab.FAB_NAM = &nam;                 /* Point FAB to NAM[L]. */

#ifdef NAML$C_MAXRSS

    fab.fab$l_dna = (char *) -1;    /* Using NAML for default name. */
    fab.fab$l_fna = (char *) -1;    /* Using NAML for file name. */

#endif /* NAML$C_MAXRSS */

    FAB_OR_NAM(fab, nam).FAB_OR_NAM_FNA = argv[ 1];
    FAB_OR_NAM(fab, nam).FAB_OR_NAM_FNS = strlen( argv[ 1]);

    /* Expanded and resultant name storage. */
    nam.NAM_ESA = exp_nam;
    nam.NAM_ESS = sizeof(exp_nam);
    nam.NAM_RSA = res_nam;
    nam.NAM_RSS = sizeof(res_nam);

#if 0
    /* No effect on failure of $OPEN. */
    nam.naml$v_search_symlink = 1;      /* Don't follow a symlink. */
#endif /* 0 */

    /* Gets DID+FID of the link (not the target) from $SEARCH. */
    nam.naml$v_open_special = 1;        /* $OPEN a special file itself. */

    sts = sys$open( &fab);
    if ((sts& STS$M_SUCCESS) == 0)
    {
        printf( " sys$open() = %%x%08x .\n", sts);
        printf( " %s\n", strerror( EVMSERR));
        return sts;
    }

    printf( " e: >%.*s<.\n", nam.NAM_ESL, exp_nam);
    printf( " r: >%.*s<.\n", nam.NAM_RSL, res_nam);

    printf( " (2) nam.naml$v_search_symlink = %d.\n",
     nam.naml$v_search_symlink);

    printf( " (2) nam.naml$v_open_special = %d.\n",
     nam.naml$v_open_special);

    printf( " (2) nam.naml$v_object_symlink = %d.\n",
     nam.naml$v_object_symlink);

    printf( " (2) nam.naml$l_output_flags = %%x%08x .\n",
     nam.naml$l_output_flags);

    printf( " (2) fab.fab$b_org = %%x%02x .\n", fab.fab$b_org);
    printf( " (2) fab.fab$b_rfm = %%x%02x .\n", fab.fab$b_rfm);
    printf( " (2) fab.fab$b_rat = %%x%02x .\n", fab.fab$b_rat);
    printf( " (2) did: %05d:%05d:%05d  fid: %05d:%05d:%05d\n",
     nam.NAM_DID[0], nam.NAM_DID[1], nam.NAM_DID[2],
     nam.NAM_FID[0], nam.NAM_FID[1], nam.NAM_FID[2]);

}
