Add name_locate regression test, and adapt open.c for test.zip change.

--HG--
branch : HEAD
diff --git a/regress/Makefile.am b/regress/Makefile.am
index e1f1b8d..d37c5be 100644
--- a/regress/Makefile.am
+++ b/regress/Makefile.am
@@ -1,4 +1,4 @@
-noinst_PROGRAMS=buffadd open
+noinst_PROGRAMS=buffadd open name_locate
 EXTRA_PROGRAMS=ziptest deltest
 
 EXTRA_DIST=test.zip
@@ -7,7 +7,7 @@
 buffadd_SOURCES=buffadd.c
 ziptest_SOURCES=ziptest.c
 
-TESTS=buffadd open
+TESTS=buffadd open name_locate
 
 AM_CPPFLAGS=-I${top_srcdir}/lib
 LDADD=../lib/libzip.la
diff --git a/regress/name_locate.c b/regress/name_locate.c
new file mode 100644
index 0000000..74c4319
--- /dev/null
+++ b/regress/name_locate.c
@@ -0,0 +1,118 @@
+/*
+  $NiH$
+
+  name_locate.c -- test cases for finding files in zip archives
+  Copyright (C) 2005 Dieter Baron and Thomas Klausner
+
+  This file is part of libzip, a library to manipulate ZIP archives.
+  The authors can be contacted at <nih@giga.or.at>
+
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+  1. Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in
+     the documentation and/or other materials provided with the
+     distribution.
+  3. The names of the authors may not be used to endorse or promote
+     products derived from this software without specific prior
+     written permission.
+ 
+  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "zip.h"
+
+#define TEST_ZIP	"test.zip"
+
+int find_fail(struct zip *, const char *, int, int);
+int find_success(struct zip *, const char *, int);
+
+
+
+int
+main(int argc, char *argv[])
+{
+    int fail, ze;
+    struct zip *z;
+
+    fail = 0;
+
+    if ((z=zip_open(TEST_ZIP, 0, &ze)) == NULL) {
+	printf("fail: opening zip archive ``%s'' failed (%d)\n",
+	       TEST_ZIP, ze);
+	return 1;
+    }
+
+    fail += find_fail(z, "nosuchfile", 0, ZIP_ER_NOENT);
+    fail += find_success(z, "test", 0);
+    fail += find_fail(z, "TeSt", 0, ZIP_ER_NOENT);
+    fail += find_success(z, "TeSt", ZIP_FL_NOCASE);
+    fail += find_success(z, "testdir/test2", 0);
+    fail += find_success(z, "tesTdir/tESt2", ZIP_FL_NOCASE);
+    fail += find_fail(z, "testdir/test2", ZIP_FL_NODIR, ZIP_ER_NOENT);
+    fail += find_fail(z, "tesTdir/tESt2", ZIP_FL_NOCASE|ZIP_FL_NODIR,
+		      ZIP_ER_NOENT);
+    fail += find_fail(z, "test2", 0, ZIP_ER_NOENT);
+    fail += find_success(z, "test2", ZIP_FL_NODIR);
+    fail += find_success(z, "TeST2", ZIP_FL_NODIR|ZIP_FL_NOCASE);
+
+    exit(fail ? 1 : 0);
+}
+
+
+
+int
+find_fail(struct zip *z, const char *name, int flags, int zerr)
+{
+    int ret, ze, se;
+    char expected[80];
+
+    if ((ret=zip_name_locate(z, name, flags)) < 0) {
+	zip_error_get(z, &ze, &se);
+	if (ze != zerr) {
+	    zip_error_to_str(expected, sizeof(expected), zerr, 0);
+	    printf("unexpected error while looking for ``%s'': "
+		   "got ``%s'', expected ``%s''\n", name, zip_strerror(z),
+		   expected);
+	    return 1;
+	}
+
+	return 0;
+    }
+
+    return 1;
+}
+
+
+
+int
+find_success(struct zip *z, const char *name, int flags)
+{
+
+    if (zip_name_locate(z, name, flags) < 0) {
+	printf("unexpected error while looking for ``%s'': %s\n",
+	       name, zip_strerror(z));
+	return 1;
+    }
+
+    return 0;
+}
diff --git a/regress/open.c b/regress/open.c
index db364de..750e773 100644
--- a/regress/open.c
+++ b/regress/open.c
@@ -1,5 +1,5 @@
 /*
-  $NiH: open.c,v 1.2 2004/04/14 14:01:30 dillo Exp $
+  $NiH: open.c,v 1.3 2004/11/17 21:55:17 wiz Exp $
 
   open.c -- test cases for opening zip archives
   Copyright (C) 1999, 2003 Dieter Baron and Thomas Klausner
@@ -62,7 +62,7 @@
     /* ZIP_ER_SEEK */
     /* ZIP_ER_INCONS */
 
-    fail += open_success("test.zip", 0, "existing", 1);
+    fail += open_success("test.zip", 0, "existing", 3);
     fail += open_success("nosuchfile", ZIP_CREATE, "new", 0);
 
     exit(fail ? 1 : 0);
diff --git a/regress/test.zip b/regress/test.zip
index 69ff08a..e4efd71 100644
--- a/regress/test.zip
+++ b/regress/test.zip
Binary files differ