Miscellaneous cleanup changes to apps/ and tests/

apps/avifdec.c:
  * Handle avifDecoderSetIOFile() failures.

apps/avifenc.c:
  * Check for not only a zero return value (empty file) but also a
    negative return value (failure) of ftell().
  * In error messages, change "content" to "metadata" when referring to
    Exif and XMP.

tests/aviftest.c:
  * Carry over my recent changes from avifIOMemoryReaderRead() to
    avifIOTestReaderRead().
  * Declare local variables holding strlen() return values as size_t
    rather than int to avoid the casts to int.
  * Add the new --io-only option to the syntax help message.
diff --git a/apps/avifdec.c b/apps/avifdec.c
index b0bdca7..79ca30c 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -41,8 +41,13 @@
 static int info(const char * inputFilename)
 {
     avifDecoder * decoder = avifDecoderCreate();
-    avifDecoderSetIOFile(decoder, inputFilename);
-    avifResult result = avifDecoderParse(decoder);
+    avifResult result = avifDecoderSetIOFile(decoder, inputFilename);
+    if (result != AVIF_RESULT_OK) {
+        fprintf(stderr, "Cannot open file for read: %s\n", inputFilename);
+        avifDecoderDestroy(decoder);
+        return 1;
+    }
+    result = avifDecoderParse(decoder);
     if (result == AVIF_RESULT_OK) {
         printf("Image decoded: %s\n", inputFilename);
 
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 32a900e..b5215a9 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -242,11 +242,12 @@
     }
 
     fseek(f, 0, SEEK_END);
-    size_t fileSize = (size_t)ftell(f);
-    if (!fileSize) {
+    long pos = ftell(f);
+    if (pos <= 0) {
         fclose(f);
         return AVIF_FALSE;
     }
+    size_t fileSize = (size_t)pos;
     fseek(f, 0, SEEK_SET);
 
     avifRWDataRealloc(raw, fileSize);
@@ -449,14 +450,14 @@
         } else if (!strcmp(arg, "--exif")) {
             NEXTARG();
             if (!readEntireFile(arg, &exifOverride)) {
-                fprintf(stderr, "ERROR: Unable to read Exif content: %s\n", arg);
+                fprintf(stderr, "ERROR: Unable to read Exif metadata: %s\n", arg);
                 returnCode = 1;
                 goto cleanup;
             }
         } else if (!strcmp(arg, "--xmp")) {
             NEXTARG();
             if (!readEntireFile(arg, &xmpOverride)) {
-                fprintf(stderr, "ERROR: Unable to read XMP content: %s\n", arg);
+                fprintf(stderr, "ERROR: Unable to read XMP metadata: %s\n", arg);
                 returnCode = 1;
                 goto cleanup;
             }
diff --git a/tests/aviftest.c b/tests/aviftest.c
index d7bdea6..86b6406 100644
--- a/tests/aviftest.c
+++ b/tests/aviftest.c
@@ -273,18 +273,19 @@
     avifIOTestReader * reader = (avifIOTestReader *)io;
 
     // Sanitize/clamp incoming request
-    if (offset >= reader->rodata.size) {
-        offset = 0;
-        size = 0;
+    if (offset > reader->rodata.size) {
+        // The offset is past the end of the buffer.
+        return AVIF_RESULT_IO_ERROR;
     }
-    if ((offset + size) > reader->rodata.size) {
-        size = reader->rodata.size - offset;
+    uint64_t availableSize = reader->rodata.size - offset;
+    if (size > availableSize) {
+        size = availableSize;
     }
 
-    if (offset >= reader->availableBytes) {
+    if (offset > reader->availableBytes) {
         return AVIF_RESULT_WAITING_ON_IO;
     }
-    if ((offset + size) > reader->availableBytes) {
+    if (size > (reader->availableBytes - offset)) {
         return AVIF_RESULT_WAITING_ON_IO;
     }
 
@@ -320,8 +321,8 @@
     static const char * ioSuffix = "/io/";
 
     char ioDir[FILENAME_MAX_LENGTH + 1];
-    int dataDirLen = (int)strlen(dataDir);
-    int ioSuffixLen = (int)strlen(ioSuffix);
+    size_t dataDirLen = strlen(dataDir);
+    size_t ioSuffixLen = strlen(ioSuffix);
 
     if ((dataDirLen + ioSuffixLen) > FILENAME_MAX_LENGTH) {
         printf("Path too long: %s\n", dataDir);
@@ -329,7 +330,7 @@
     }
     strcpy(ioDir, dataDir);
     strcat(ioDir, ioSuffix);
-    int ioDirLen = (int)strlen(ioDir);
+    size_t ioDirLen = strlen(ioDir);
 
     int retCode = 0;
 
@@ -339,7 +340,7 @@
     const char * filename = nextFilename(ioDir, "avif", &nfd);
     for (; filename != NULL; filename = nextFilename(ioDir, "avif", &nfd)) {
         char fullFilename[FILENAME_MAX_LENGTH + 1];
-        int filenameLen = (int)strlen(filename);
+        size_t filenameLen = strlen(filename);
         if ((ioDirLen + filenameLen) > FILENAME_MAX_LENGTH) {
             printf("Path too long: %s\n", filename);
             return 1;
@@ -426,7 +427,8 @@
     fprintf(stderr,
             "Syntax: aviftest [options] dataDir [testFilter]\n"
             "Options:\n"
-            "    -g : Generate tests\n");
+            "    -g : Generate Encode/Decode tests\n"
+            "    --io-only : Run IO tests only\n");
 }
 
 int main(int argc, char * argv[])