× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.





Part of my standards is that every procedure has a test program that
will display all values returned by the
procedure.

Seems to me that it'd be more useful to display the data that the pointer points to. I have yet to meet the programmer who can take a value like SPP:D572811D4306B980 and say "hey! that's not right! That API is supposed to return SPP:D572811A4306B980!"

But, having said that, it's certainly possible to display the value of a pointer.

There are other ways to determine if the procedures worked. I just like
the idea of displaying the pointer value, and was looking for an easy
way. After all, it's just a number. There should be a way to convert it
to a display value.

A pointer _isn't_ just a number on the iSeries. You may be thinking of a PC or Unix environment where a pointer is an integer. On the iSeries, a pointer is significantly more complex, it contains several different pieces of information that enable it to access any memory anywhere in either teraspace or single-level store. There are many types of pointers, system pointers, space pointers, procedure pointers, invocation pointers, suspend pointers, data pointers, label pointers... the format of the data in the pointer itself will be different depending on the type of pointer.

But, anyway, yeah you can display a pointer.  Two ways that come to mind:

a) You could use the cvthc() API to read the contents of the pointer (just by specifying where the pointer is stored in memory) and it'll output a raw hex representation of the bytes that make up the pointer.

For example:

     D cvthc           PR                  ExtProc('cvthc')
     D   target                      32A
     D   src_bits                      *   value
     D   tgt_length                  10I 0 value

     D myPointer       s               *
     D rawHexData      s             32A

      /free

         cvthc(rawHexData: %addr(myPointer): %size(rawHexData));


b) The printf() family of functions in ILE C has the ability to make a nicely formatted dump of the various pieces of info in a pointer. It's relatively easy for an RPG program to call the snprintf() API from ILE C to format the pointer:

     D snprintf        PR            10I 0 extproc('snprintf')
     d   buf                      32767A   options(*varsize)
     D   bufsize                     10U 0 value
     D   fmt                           *   value options(*string)
     D   ptr                           *   value options(*nopass)

     D temp            s             81A
     D humanData       s             80A


      /free

            snprintf(temp: %size(temp): '%p': myPointer);
            humanData = %str(%addr(temp));

Since snprintf() writes out a C-style string (i.e. null-terminated string), I write it to a temporary field, and then I use the %str() BIF to extract it into an RPG-style character field.


Either of these could be used for your purposes if you really want to print the contents of a pointer. Here's a sample program (in fact, it's where the code snippets above came from) that demonstrates printing a standard space pointer, a procedure pointer, and a teraspace pointer. Each pointer is printed using both methods:

     H DFTACTGRP(*NO) BNDDIR('QC2LE')

     FQSYSPRT   O    F  132        PRINTER

     D TS_malloc       PR              *   ExtProc('_C_TS_malloc')
     D   size                        10U 0 value
     D TS_free         PR                  ExtProc('_C_TS_free')
     D   ptr                           *   value

     D snprintf        PR            10I 0 extproc('snprintf')
     d   buf                      32767A   options(*varsize)
     D   bufsize                     10U 0 value
     D   fmt                           *   value options(*string)
     D   ptr                           *   value options(*nopass)

     D snprintf2       PR            10I 0 extproc('snprintf')
     d   buf                      32767A   options(*varsize)
     D   bufsize                     10U 0 value
     D   fmt                           *   value options(*string)
     D   ptr                           *   value procptr options(*nopass)

     D cvthc           PR                  ExtProc('cvthc')
     D   target                      32A
     D   src_bits                      *   value
     D   tgt_length                  10I 0 value

     D myPointer       s               *
     D procPtr         s               *   procptr
     D rawHexData      s             32A
     D temp            s             81A
     D humanData       s             80A

      /free
           // Use cvthc() to create a hex dump of the contents
           // of a pointer.
           //
           // Use sprintf() to format a pointer's contents to make
           //  it easier for a person to read.

            myPointer = %alloc(1234);
            cvthc(rawHexData: %addr(myPointer): %size(rawHexData));
            snprintf(temp: %size(temp): '%p': myPointer);
            humanData = %str(%addr(temp));
            except;
            dealloc myPointer;

           // now try it with a procedure pointer:

             procPtr = %paddr(snprintf);
             cvthc(rawHexData: %addr(procPtr): %size(rawHexData));
             snprintf2(temp: %size(temp): '%p': procPtr);
             humanData = %str(%addr(temp));
             except;

           // now try it with a teraspace pointer:

             myPointer = TS_malloc(54321);
             cvthc(rawHexData: %addr(myPointer): %size(rawHexData));
             snprintf(temp: %size(temp): '%p': myPointer);
             humanData = %str(%addr(temp));
             TS_free(myPointer);
             except;

            *inlr = *on;
      /end-free

     OQSYSPRT   E
     O                                              'Raw Hex='
     O                       rawHexData          +0
     O          E
     O                                              'Human Readable='
     O                       humanData           +0


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.