home *** CD-ROM | disk | FTP | other *** search
/ vsiftp.vmssoftware.com / VSIPUBLIC@vsiftp.vmssoftware.com.tar / FREEWARE / FREEWARE40.ZIP / flistfrontend / src / sygetsym.c < prev    next >
C/C++ Source or Header  |  1995-10-21  |  2KB  |  69 lines

  1. #ifndef NO_IDENT
  2. static char *Id = "$Id: sygetsym.c,v 1.5 1995/10/21 18:39:57 tom Exp $";
  3. #endif
  4.  
  5. /*
  6.  * Title:    sysgetsym.c
  7.  * Author:    Thomas E. Dickey
  8.  * Created:    02 Aug 1984
  9.  * Last update:
  10.  *        19 Feb 1995, sys utils prototypes
  11.  *        25 Aug 1984, assume longest filename is length of symbol
  12.  *
  13.  * Function:    Given a character-string, this procedure performs a run-time
  14.  *        call (LIB$GET_SYMBOL) to obtain the expansion of the string.
  15.  *        If the input string corresponds to a user- or system symbol,
  16.  *        the output string is loaded with the expansion.  Otherwise,
  17.  *        the output string is loaded with the input string.
  18.  *
  19.  * Parameters:    co_    => output buffer
  20.  *        ci_    => input buffer (symbol to lookup)
  21.  *        len    =  maximum length of 'co_'
  22.  *
  23.  * Returns:    TRUE iff a symbol was found.
  24.  */
  25.  
  26. #include    <string.h>
  27.  
  28. #include    <rms.h>
  29. #include    <stsdef.h>
  30. #include    <descrip.h>
  31.  
  32. #include    "sysutils.h"
  33.  
  34. extern unsigned lib$get_symbol (struct dsc$descriptor_s *sym, struct dsc$descriptor_s *ret, short *ret_len_w);
  35.  
  36. int
  37. sysgetsym (char *co_, char *ci_, int len)
  38. {
  39.     char    ret_bfr[NAM$C_MAXRSS];
  40.     $DESCRIPTOR(sym_desc,"");
  41.     $DESCRIPTOR(ret_desc,"");
  42.     static    short    ret_len_w;
  43.     unsigned status;
  44.     int    found;
  45.  
  46.     sym_desc.dsc$a_pointer = ci_;
  47.     sym_desc.dsc$w_length  = strlen(sym_desc.dsc$a_pointer);
  48.  
  49.     ret_desc.dsc$a_pointer = ret_bfr;
  50.     ret_desc.dsc$w_length  = sizeof(ret_bfr)-1;
  51.  
  52.     status    = lib$get_symbol (&sym_desc, &ret_desc, &ret_len_w);
  53.  
  54.     if (found = $VMS_STATUS_SUCCESS(status))
  55.     {
  56.         ret_bfr[ret_len_w] = '\0';
  57.         ci_ = ret_desc.dsc$a_pointer;
  58.     }
  59.  
  60.     /*
  61.      * Copy the result (or unresolved) string into the output buffer:
  62.      */
  63.     if (len > strlen(ci_))    len = strlen(ci_);
  64.     strncpy (co_, ci_, len);
  65.     co_[len] = '\0';
  66.  
  67.     return (found);
  68. }
  69.