Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:26421 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 37928 invoked by uid 1010); 8 Nov 2006 18:34:00 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 37913 invoked from network); 8 Nov 2006 18:33:59 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 8 Nov 2006 18:33:59 -0000 Authentication-Results: pb1.pair.com smtp.mail=info@adaniels.nl; spf=permerror; sender-id=unknown Authentication-Results: pb1.pair.com header.from=info@adaniels.nl; sender-id=unknown Received-SPF: error (pb1.pair.com: domain adaniels.nl from 82.94.235.198 cause and error) X-PHP-List-Original-Sender: info@adaniels.nl X-Host-Fingerprint: 82.94.235.198 hyak.bean-it.nl Received: from [82.94.235.198] ([82.94.235.198:33246] helo=hyak.bean-it.nl) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 57/7E-40701-61322554 for ; Wed, 08 Nov 2006 13:33:59 -0500 Received: from [127.0.0.1] (bean-it.xs4all.nl [213.84.27.165]) (authenticated bits=0) by hyak.bean-it.nl (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id kA8IXlIT008656 for ; Wed, 8 Nov 2006 19:33:49 +0100 Message-ID: <4552230A.9090700@adaniels.nl> Date: Wed, 08 Nov 2006 19:33:46 +0100 User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/alternative; boundary="------------040202050900010703050005" X-Virus-Scanned: by amavisd-new X-Spam-Status: No, score=-0.7 required=4.0 tests=BAYES_20,HTML_MESSAGE autolearn=ham version=3.1.3 X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on hyak.bean-it.nl Subject: Newbie question: zend_hash_find From: info@adaniels.nl (Arnold Daniels) --------------040202050900010703050005 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I'm new at PHP internals and have read the 'Extension Writing' tutorial (part 1-3) of devzone.zend.com. I'm writing a set of parsers, to parse different kind of configuration formats. The first is an .ini parser. The code almost works correctly. The only problem I have is that sections get overwritten if appear multiple times in the .ini content. [abc] test = 1 [abc] xyz = 2 Should result in: array('abc'=>array('test'=>1, 'xyz'=>2)) but instead returns: array('abc'=>array('xyz'=>2)) The logical conclusion is that my zend_hash_find call doesn't work correctly and is always returning FAILURE. Though I've got no clue what's wrong. Perhaps someone could have a quick look at the code. Thanks a lot, Arnold -------------------- /** * Parse .ini content into a zend array */ PHP_FUNCTION(qconf_ini_parse) { char *content; int len; char *c; char *ln_start; char key[ASCIILINESZ+1]; char val[ASCIILINESZ+1]; zval *cur_out; zval **fnd_sec; char t; // boolean: trim value yes/no if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &content, &len) == FAILURE) { RETURN_NULL(); } array_init(return_value); cur_out = return_value; ln_start = content; for (c=content; c <= content+len; c++) { if (*c == '\n' || *c == '\0' || c == content+len) { *c = '\0'; t = 0; ln_start = strskp(ln_start); /* Skip leading spaces */ if (*ln_start!=';' && *ln_start!='#' && *ln_start!=0) { /* Skip comment lines */ if (sscanf(ln_start, "[%[^]]", key)==1) { /* Valid section name */ if (zend_hash_find(Z_ARRVAL_P(return_value), key, strlen(key), (void**)&fnd_sec) == FAILURE) { ALLOC_INIT_ZVAL(cur_out); array_init(cur_out); add_assoc_zval(return_value, key, cur_out); } else { cur_out = *fnd_sec; } } else if (sscanf (ln_start, "%[^=] = \"%[^\"]\"", key, val) == 2 || sscanf (ln_start, "%[^=] = '%[^\']'", key, val) == 2 || (t=1 && sscanf (ln_start, "%[^=] = %[^;#]", key, val) == 2)) { strcpy(key, strlwc(strcrop(key))); /* * sscanf cannot handle "" or '' as empty value, * this is done here */ if (!strcmp(val, "\"\"") || !strcmp(val, "''")) { val[0] = (char)0; } else if (t) { strcpy(val, strcrop(val)); } add_assoc_string(cur_out, key, val, 1); } } ln_start = c+1; } } } --------------040202050900010703050005--