Oppolzer - Informatik / Blog


Blog-Hauptseite      Neuester Artikel      Älterer Artikel      Neuerer Artikel      Älterer gleiche Kategorie      Neuerer gleiche Kategorie

PL1-L - Parameterübergabe von PL/1 an C

Subject:

Re: Passing parameters to C

From:

Bernd Oppolzer <bernd.oppolzer@T-ONLINE.DE>

Reply-To:

PL1 (language) discussions <PL1-L@LISTSERV.DARTMOUTH.EDU>

Date:

2014.03.23 11:31:26


Hi Z.,

I'd like to start with the following source:


  DCL TESTPLI EXTERNAL ENTRY
      (PTR,                     /* ADDR (CHAR) */
       BIN FIXED (31),
       PTR);                    /* ADDR (PCRE) */

  DCL PARMC  CHAR (20)        INIT ('ENTRY VALUE');
  DCL PARMI  BIN FIXED (31)   INIT (15);
  DCL 1 STRUCT,
        3 V1 BIN FIXED (31),  INIT (15);
        3 V2 BIN FIXED (31);

  PUT SKIP LIST (PARMC);
  PUT SKIP LIST (PARMI);

  CALL TESTPLI (ADDR (PARMC),
                PARMI,
                ADDR (STRUCT));

  PUT SKIP LIST (PARMC);
  PUT SKIP LIST (PARMI);




/**************************************/
/*  Test C interface to PL1           */
/**************************************/

int testpli (const char **p1,
             int *p2,
             void **p6)

{
    char buffer [21];
    int intfield;

    memcpy (buffer, *p1, 20);
    buffer [21] = 0x00;
    printf ("%s\n", buffer);
    memset (*p1, ' ', 20);
    memcpy (*p1, "RETURN VALUE", 12);

    intfield = *p2;
    printf ("%d\n", intfield);
    *p2 = 13;

    return 27;
}


you would have to put the PL/1 excerpts on the top
into your PL/1 caller and the C test function maybe needs
some ANSI #includes to make it complete.

Regarding your request, there are some limitations;

because you use an old compiler, you will not be able
to pass integers by value and char * without descriptors
(only by using nasty workaround). That's why I limited the
example above to int * and char **. I showed in the C function
how to deal with those parameter types. The parameter passed
is printed in the C function, then changed, and then printed again
on the PL/1 side.

Another topic here is, that the PL/1 char in this case is not
null-terminated, but the C function like prints expects a
null termination, so the C function adds a zero byte.
That might not be necessary in your PCRE case, or:
it could be the other way round, that is: the PL/1 side has
to take care to add the zero byte.

I would encourage you to test these code snippets, and once
you are convinced that they work, then we go ahead and
work again on your PCRE project. The problems that you sent
me offline IMHO have nothing to do with the parameter passing
mechanism.

Kind regards

Bernd




Am 23.03.2014 08:07, schrieb Z.A.:
> Hi All
> Does any of you have a working example in which the PL/1 calls a C function
> with any of these parameters
>
> char * varname
> char ** varname
> int varname
> int * varname
> sometype * varname
>
> and this routine returns any of
>
> int
> char *
> sometype *
>
> Especially, I am interested in cases where the C is NOT aware of any descriptor
> while the PL/1 is compiled in most common way.  I am not interested in the theory,
> I tried to work with the theory to no avail.  I really need to see a working example
> (relevant snippets)
> ideally, i would like to see both sides behavior (i.e. how the PL/1 calling using
> any specific signature and how the C is handling that parm.
>
> Any response would be highly appreciated.
>
> Thanks
>
> ZA
>

Blog-Hauptseite      Neuester Artikel      Älterer Artikel      Neuerer Artikel      Älterer gleiche Kategorie      Neuerer gleiche Kategorie