(file) Return to tvfs.c CVS log (file) (dir) Up to [RizwankCVS] / group3 / wine / dlls / cabinet / tests

Diff for /group3/wine/dlls/cabinet/tests/tvfs.c between version 1.5 and 1.8

version 1.5, 2005/02/26 03:39:29 version 1.8, 2005/02/27 09:37:56
Line 7 
Line 7 
 #include "tvfs.h" #include "tvfs.h"
 #include <string.h> #include <string.h>
  
 /* This is extremely cheezy.  Everything is preallocated per file. */  
   
 #define MAXFILES 10 #define MAXFILES 10
 #define MAXHANDLES 10 #define MAXHANDLES 10
 #define MAXFNAME 255 #define MAXFNAME 255
 #define MAXFLEN 65536 #define MAXFLEN 65536
  
 /*  
 #define TVFS_MAIN  
 */  
 #include <fcntl.h> #include <fcntl.h>
 #include <stdlib.h>         /* For _MAX_PATH definition */  #include <stdlib.h>
 #include <stdio.h> #include <stdio.h>
 #include <malloc.h> #include <malloc.h>
   #include <stdio.h>
   #include <stdarg.h>
  
 #define DEBUG  /*
   #define TVFS_MAIN
   #define TVFS_DEBUG
   */
  
 #define SEEK_SET 0 #define SEEK_SET 0
 #define SEEK_CUR 1 #define SEEK_CUR 1
 #define SEEK_END 2 #define SEEK_END 2
  
   #ifndef _O_BINARY
   #define _O_BINARY 0
   #endif
   
   #ifndef STANDALONE
   #else
   static void trace(const char *s, ...)
   {
       va_list elipsis;
       va_start (elipsis, s);
       vprintf(s, elipsis);
       va_end(elipsis);
   }
   #endif
   
 struct tvfs_file { struct tvfs_file {
        char fname[MAXFNAME];        char fname[MAXFNAME];
        int bytes_used;        int bytes_used;
        char buf[MAXFLEN];        char buf[MAXFLEN];
 }; };
 static struct tvfs_file *files[MAXFILES]; static struct tvfs_file *files[MAXFILES];
 int nfiles = 0;  
  
 struct tvfs_fcb { struct tvfs_fcb {
        int pos;        int pos;
        int inode;        int inode;
 }; };
 static struct tvfs_fcb *handles[MAXHANDLES]; static struct tvfs_fcb *handles[MAXHANDLES];
   
 int nhandles = 0; int nhandles = 0;
   int nfiles = 0;
  
 /* tvfs_create does NOT correspond to _creat - it is an internal function /* tvfs_create does NOT correspond to _creat - it is an internal function
 use to put a file directly into our virtual filesystem. */ use to put a file directly into our virtual filesystem. */
Line 52 
Line 67 
            int inode;            int inode;
        struct tvfs_file *f;        struct tvfs_file *f;
  
                 #ifdef DEBUG      #ifdef TVFS_DEBUG
                 printf("tvfs_create called with %s, %d, %d\n", fname, buf, len);      trace("tvfs_create called with %s, %d, %d\n", fname, buf, len);
                 #endif                 #endif
  
        if (nfiles >= MAXFILES)        if (nfiles >= MAXFILES)
                return -1;                return -1;
        inode = nfiles++;        inode = nfiles++;
                 /* calloc didn't work here, while malloc did */  
            f = malloc(sizeof(struct tvfs_file));            f = malloc(sizeof(struct tvfs_file));
        strcpy(f->fname, fname);        strcpy(f->fname, fname);
        f->bytes_used = len;        f->bytes_used = len;
   
        if (buf)        if (buf)
                memcpy(f->buf, buf, len);                memcpy(f->buf, buf, len);
   
        files[inode] = f;        files[inode] = f;
        return inode;        return inode;
 } }
Line 77 
Line 94 
        int inode;        int inode;
            struct tvfs_fcb *handler;            struct tvfs_fcb *handler;
  
                 #ifdef DEBUG      #ifdef TVFS_DEBUG
                 printf("tvfs_open called with %s, %d, %d\n", fname, flags, mode);      trace("tvfs_open called with %s, %d, %d\n", fname, flags, mode);
                 #endif                 #endif
  
            /* Existing file? */            /* Existing file? */
Line 86 
Line 103 
                if (!files[inode])                if (!files[inode])
                        continue;                        continue;
                if (!strcmp(files[inode]->fname, fname))                if (!strcmp(files[inode]->fname, fname))
                                                 break;       }              break;
       }
   
        if (inode == nfiles) {        if (inode == nfiles) {
                /* File did not exist */                /* File did not exist */
                if ((flags & O_CREAT) == 0) {                if ((flags & O_CREAT) == 0) {
                        /* ENOENT */                        /* ENOENT */
               #ifdef TVFS_DEBUG
               trace("tvfs_open returning -1\n");
               #endif
                        return -1;                        return -1;
                }                }
   
                inode = tvfs_create(fname, 0, 0);                inode = tvfs_create(fname, 0, 0);
        }        }
   
            handler = malloc(sizeof(struct tvfs_fcb));            handler = malloc(sizeof(struct tvfs_fcb));
            handler->inode = inode;            handler->inode = inode;
            handler->pos=0;            handler->pos=0;
            h = nfiles++;            h = nfiles++;
            handles[h] = handler;            handles[h] = handler;
   
       #ifdef TVFS_DEBUG
       trace("tvfs_open returning with %d\n", h);
       #endif
   
            return h;            return h;
 } }
  
Line 109 
Line 138 
        int pos = handles[h]->pos;        int pos = handles[h]->pos;
            int size = files[inode]->bytes_used;            int size = files[inode]->bytes_used;
  
         #ifdef DEBUG      #ifdef TVFS_DEBUG
         printf("tvfs_read called with %d, %d, %d\n", h, buf, len);      trace("tvfs_read called with %d, %d, %d\n", h, buf, len);
         #endif         #endif
  
        /* FIXME: handle edge cases */  
            /* Edge Case 1 : Request beyond boundary of file */            /* Edge Case 1 : Request beyond boundary of file */
            if (pos + len > size) {            if (pos + len > size) {
                    len = size-pos;                    len = size-pos;
Line 125 
Line 153 
        return len;        return len;
 } }
  
 void tvfs_free(){  void tvfs_free()
   {
  
         int inode;         int inode;
  
         #ifdef DEBUG      #ifdef TVFS_DEBUG
         printf("tvfs_free\n");      trace("tvfs_free\n");
         #endif         #endif
  
       nfiles=0;
       nhandles=0;
   
     for (inode=0; inode<nfiles; inode++) {     for (inode=0; inode<nfiles; inode++) {
                         if (!files[inode])                         if (!files[inode])
                                 continue;                                 continue;
Line 141 
Line 173 
         }         }
  
 /* Compare given file with given contents, return 0 on equal, else nonzero */ /* Compare given file with given contents, return 0 on equal, else nonzero */
 int tvfs_compare(const char *fname, const char *buf, int len){  int tvfs_compare(const char *fname, const char *buf, int len)
         #ifdef DEBUG  {
         printf("tvfs_compare called with %s, %d, %d\n", fname, buf, len);  
       int inode;
   
       #ifdef TVFS_DEBUG
       trace("tvfs_compare called with %s, %d, %d\n", fname, buf, len);
         #endif         #endif
  
         return (memcmp(fname,buf,len));      for (inode=0; inode<nfiles; inode++) {
           if (!files[inode])
               continue;
           if (!strcmp(files[inode]->fname, fname))
           break;
       }
       if (inode == nfiles) {
           /* File did not exist */
           #ifdef TVFS_DEBUG
           trace("tvfs_compare returning -1 (FAILURE)\n");
           #endif
           return -1;
       }
   
       return (memcmp(files[inode]->buf,buf,len));
         /* doesnt check for out of bound */         /* doesnt check for out of bound */
 } }
  
 long tvfs_lseek(int h, long whence, int whither ){  long tvfs_lseek(int h, long whence, int whither )
   {
  
       int inode = handles[h]->inode;       int inode = handles[h]->inode;
           int size = files[inode]->bytes_used;           int size = files[inode]->bytes_used;
         #ifdef DEBUG      #ifdef TVFS_DEBUG
         printf("tvfs_lseek called with %d, %d, %d\n", h, whither, whence);      trace("tvfs_lseek called with %d, %d, %d\n", h, whither, whence);
         #endif         #endif
   
 /*                if (whence > size) /*                if (whence > size)
                           whence = size;*/                           whence = size;*/
 /*                      Legit lseek does NOT do boundry checking */ /*                      Legit lseek does NOT do boundry checking */
Line 184 
Line 236 
                   }                   }
                   default:                   default:
                   {                   {
                           printf("lseek was called with an invalid whither %d\n",whither);      trace("lseek was called with an invalid whither %d\n",whither);
                           return -1;                           return -1;
                   }                   }
           }           }
Line 193 
Line 245 
  
 int tvfs_close(int h){ int tvfs_close(int h){
          int inode = handles[h]->inode;          int inode = handles[h]->inode;
         #ifdef DEBUG      #ifdef TVFS_DEBUG
         printf("tvfs_close called with %d\n", h);      trace("tvfs_close called with %d\n", h);
         #endif         #endif
          if (!files[inode]){          if (!files[inode]){
                  return -1;                  return -1;
Line 206 
Line 258 
  
 unsigned int tvfs_write(int h, void *buf, unsigned int len) unsigned int tvfs_write(int h, void *buf, unsigned int len)
 { {
         printf("tvfs_write called with %d, %d, %d\n", h, buf, len);  
       int inode = handles[h]->inode;
       int pos = handles[h]->pos;
       #ifdef TVFS_DEBUG
       trace("tvfs_write called with %d, %d, %d\n", h, buf, len);
       #endif
       memcpy(files[inode]->buf+pos, buf, len);
       files[inode]->bytes_used += len;
   
         return len;         return len;
         /* return -1 to simulate diskfull or some other error */         /* return -1 to simulate diskfull or some other error */
 } }
Line 237 
Line 297 
         result = tvfs_create( name_test_txt, file_test_txt,size_test_txt);         result = tvfs_create( name_test_txt, file_test_txt,size_test_txt);
         printf("Created virtual file with inode %d\n",result);         printf("Created virtual file with inode %d\n",result);
  
         /* This test failes because strcmp returns 0 incorrectly! */  
         printf("Attempting to open non-existant file\n");         printf("Attempting to open non-existant file\n");
         result = tvfs_open(bad_filename, _O_BINARY, 0 );         result = tvfs_open(bad_filename, _O_BINARY, 0 );
         printf("Result code %d\n",result);         printf("Result code %d\n",result);
Line 268 
Line 327 
                 printf("File read check failed!\n");                 printf("File read check failed!\n");
  
         printf("Testing direct file compare and lseek of %s\n", name_test_txt);         printf("Testing direct file compare and lseek of %s\n", name_test_txt);
         printf("Seeking to 0 - ");      printf("Seeking to 0 (not needed) - ");
         tvfs_lseek( active_handler, SEEK_SET, 0);         tvfs_lseek( active_handler, SEEK_SET, 0);
         printf("Reading and comparing file\n");      printf("Comparing file\n");
         result = tvfs_read(active_handler, filebuf, size_test_txt);      result = tvfs_compare( name_test_txt , file_test_txt, size_test_txt);
         result = tvfs_compare( filebuf , file_test_txt, size_test_txt);  
         if (result)         if (result)
                 printf ("File compare failed!\n");                 printf ("File compare failed!\n");
  


Legend:
Removed from v.1.5  
changed lines
  Added in v.1.8

Rizwan Kassim
Powered by
ViewCVS 0.9.2