%SYN_CHARTOSTR

Convert C-style character pointer to alpha

WSupported on Windows
USupported on Unix
VSupported on OpenVMS

 

length = %SYN_CHARTOSTR(pointer, alpha)

or

xcall SYN_CHARTOSTR(pointer, alpha)

Return value

length

The length of the original null-terminated string, not counting the null. (n)

Arguments

pointer

The character pointer that points to the null-terminated string you want to convert. (D_ADDR)

alpha

Returned with the converted alpha string. (a)

Discussion

%SYN_CHARTOSTR converts a C-style character pointer (char *) to a Synergy DBL alpha type. This routine can be useful for dealing with C routines that are in external DLLs or linked into the runtime. If the C routine returns a pointer to a null-terminated string, this routine can be used to copy the contents to a Synergy alpha variable. The contents of the null-terminated buffer whose address is pointer are copied into alpha. The null termination is removed from the copy, and any remaining space in alpha is blank-filled. Length may be larger than the size of the buffer into which the string was copied, although %SYN_CHARTOSTR only copies up to the size of the buffer.

Examples

main strex
.align
stack record
    kernel32    ,D_ADDR                         ;Handle to kernel32.dll
    ptr         ,D_ADDR                         ;Pointer to environment
    curr        ,D_ADDR                         ;Pointer to current entry
    len         ,i4                             ;Length of an entry
    buf         ,a256                           ;Buffer for conversion

proc
    open(1,o,"TT:")
    kernel32 = %dll_open("kernel32")
;
; GetEnvironmentStrings returns a pointer to a block of memory containing
; the environment settings for the current process. This data is a series
; of null-terminated strings, with an extra null at the end.
;
    ptr = %dll_call(kernel32, DLL_TYPE_WINAPI, "GetEnvironmentStringsA")
    curr = ptr
    while (len = %syn_chartostr(curr, buf))             ;Zero length means the end
      begin
        writes(1, %atrim(buf))                          ;Display the entry
        curr += len + 1                                 ;Advance to next, skip null
      end
    xcall dll_call(kernel32, DLL_TYPE_WINAPI, "FreeEnvironmentStringsA", ptr)
    xcall dll_close(kernel32)
    stop
endmain