Hello Sara Seems my post to news.php.net went somehow through though my NNTP client complained about errors...anyway (o;
"mycount" is defined in here: FUN_ACCESSOR(mycount) Which is the updated by the read function. The function macro itself is defined as: ZEND_FE(readmydevice, NULL) So would the arg_info go in here? There isn't any arg_info in the original code. thanks in advance richard On Mon, 12 Mar 2018 13:18:30 -0400, Sara Golemon wrote: > On Mon, Mar 12, 2018 at 12:16 PM, Richard Klingler > <rich...@klingler.net> wrote: >> ZEND_FUNCTION(readmydevice) >> { >> zend_long n; >> zval *z; >> size_t len; >> char *p; >> long r; >> >> if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lzl", &n, >> &z, &len) == FAILURE) { >> return; >> } >> >> p = (char *) emalloc(len + 1); >> memset(p,0,len+1); >> >> r = myread(n, p, len); >> printf("Read %d bytes from device %d up to %d bytes\n", mycount, >> n, len); >> p[ibcnt] = '\0'; >> ZVAL_STRINGL(z, p, mycount); >> printf("Returned %s\n", p); >> efree(p); >> RETURN_LONG(r); >> } >> >> >> Any ideas why ZVAL_STRINGL is not doing anything? >> Or did I miss something? >> > Well, ZVAL_STRINGL is probably doing something, but there are two > reasons there's no way to be certain: > > 1. What is 'mycount' and where does it come from / how is it set? If > it's zero, then you'll be saving a zero length string. In any case, it > doesn't seem to have any relationship to the data read into `p`. I'm > guessing you wanted to use `r` rather than `mycount` both here and in > your debug message. > > 2. I'm inferring that you want argument 2 to your function to be a > pass-by-ref argument. Are you specifying any arg_info in the function > entry list? (where you have your PHP_FE macro -- or perhaps ZEND_FE > macro, since you seem to be using those versions). In order to pass > by ref, you need that structure to specify that the argument is > by-ref. This *might* have worked without it in PHP 5, but only by > accident and would have probably failed in hard-to-diagnose ways. > > 2a. Also, when using by-ref args, you need to destruct any previously > held value. In this case, with a zval_dtor(z); prior to the > ZVAL_STRINGL() macro. > > -Sara -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php