]> granicus.if.org Git - php/commitdiff
add sorting to opendir() so that it matches PHP_Archive exactly
authorGreg Beaver <cellog@php.net>
Sun, 1 Jan 2006 20:16:09 +0000 (20:16 +0000)
committerGreg Beaver <cellog@php.net>
Sun, 1 Jan 2006 20:16:09 +0000 (20:16 +0000)
ext/phar/EXPERIMENTAL
ext/phar/phar.c

index 2ac36c743de7bbdfe74873ab9b19e9d4b0e47a1f..093f87d3e17bb661c63ddc7f9f57701df140e534 100644 (file)
@@ -1,6 +1,8 @@
 TODO:
-- implement openSSL signing of phars
-- implement strnatcasecmp sorting of opendir directory listings like PHP_Archive
+
+bugs:
+no known bugs
 
 features:
-- stream context option for cleaning crap paths like phar://blah.phar/file//to\\here.php
\ No newline at end of file
+- stream context option for cleaning crap paths like phar://blah.phar/file//to\\here.php
+- implement openSSL signing of phars
index 8bb63a0379fccbb240826d02a347280952480be6..1f7229dc879e7ede243918390670992774e0e839 100644 (file)
@@ -29,7 +29,9 @@
 #include "ext/standard/url.h"
 #include "ext/standard/crc32.h"
 #include "zend_execute.h"
+#include "zend_qsort.h"
 #include "zend_constants.h"
+#include "zend_operators.h"
 #include "php_phar.h"
 #include "main/php_streams.h"
 #ifndef TRUE
@@ -991,6 +993,33 @@ static int phar_add_empty(HashTable *ht, char *arKey, uint nKeyLength)
        return zend_hash_update(ht, arKey, nKeyLength, &dummy, sizeof(void *), NULL);
 }
 
+static int compare_dir_name(const void *a, const void *b TSRMLS_DC)
+{
+       Bucket *f;
+       Bucket *s;
+       int result;
+       f = *((Bucket **) a);
+       s = *((Bucket **) b);
+
+       result = zend_binary_strcmp(f->arKey, f->nKeyLength - 1,
+                                   s->arKey, s->nKeyLength - 1);
+
+       if (result == 0) {
+               return 0;
+       } 
+
+       if (result < 0) {
+               return -1;
+       } else if (result > 0) {
+               return 1;
+       } else {
+               return 0;
+       }
+
+       return 0;
+}
+
 static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC)
 {
        HashTable *data;
@@ -1063,6 +1092,10 @@ PHAR_ADD_ENTRY:
        }
        if (HASH_KEY_NON_EXISTANT != zend_hash_has_more_elements(data)) {
                efree(dir);
+               if (zend_hash_sort(data, zend_qsort, compare_dir_name, 0 TSRMLS_CC) == FAILURE) {
+                       FREE_HASHTABLE(data);
+                       return NULL;
+               }
                return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
        } else {
                efree(dir);