Testing
[tpg/acess2.git] / Kernel / vfs / open.c
index 7cb4750..0013dee 100644 (file)
@@ -2,26 +2,16 @@
  * AcessMicro VFS
  * - Open, Close and ChDir
  */
+#define DEBUG  0
 #include <common.h>
 #include "vfs.h"
 #include "vfs_int.h"
 #include "vfs_ext.h"
 
-#define DEBUG  0
-
-#if DEBUG
-#else
-# undef ENTER
-# undef LOG
-# undef LEAVE
-# define ENTER(...)
-# define LOG(...)
-# define LEAVE(...)
-#endif
-
 // === CONSTANTS ===
 #define        OPEN_MOUNT_ROOT 1
 #define MAX_KERNEL_FILES       128
+#define MAX_PATH_SLASHES       256
 
 // === IMPORTS ===
 extern tVFS_Node       gVFS_MemRoot;
@@ -41,8 +31,8 @@ char *VFS_GetAbsPath(char *Path)
        char    *ret;
         int    pathLen = strlen(Path);
         int    read, write;
-        int    pos, slashNum=0, baseLen;
-       Uint    slashOffsets[256];
+        int    pos, slashNum=1, baseLen;
+       Uint    slashOffsets[MAX_PATH_SLASHES] = {1};
        char    *cwd = CFGPTR(CFG_VFS_CWD);
         int    cwdLen;
        
@@ -76,17 +66,10 @@ char *VFS_GetAbsPath(char *Path)
                strcpy(ret, cwd);
                ret[cwdLen] = '/';
                strcpy(&ret[cwdLen+1], Path);
-       
-               // Pre-fill the slash positions
-               pos = 0;
-               while( (pos = strpos( &ret[pos+1], '/' )) != -1 )
-                       slashOffsets[slashNum++] = pos;
-                       
-               baseLen = cwdLen;
        }
        
        // Remove . and ..
-       read = write = baseLen; // Cwd has already been parsed
+       read = write = 1;       // Cwd has already been parsed
        for(; read < baseLen+pathLen; read = pos+1)
        {
                pos = strpos( &ret[read], '/' );
@@ -94,18 +77,21 @@ char *VFS_GetAbsPath(char *Path)
                if(pos == -1)   pos = baseLen+pathLen;
                else    pos += read;    // Else, Adjust to absolute
                
+               //Log("pos-read = %i", pos-read);
+               
                // Check Length
                if(pos - read <= 2)
                {
+                       //Log("&ret[read] = '%s'", &ret[read]);
                        // Current Dir "."
                        if(strncmp(&ret[read], ".", pos-read) == 0)     continue;
                        // Parent ".."
                        if(strncmp(&ret[read], "..", pos-read) == 0)
                        {
                                // If there is no higher, silently ignore
-                               if(!slashNum)   continue;
+                               if(slashNum < 2)        continue;
                                // Reverse write pointer
-                               write = slashOffsets[ slashNum-- ];
+                               write = slashOffsets[ --slashNum - 1 ];
                                continue;
                        }
                }
@@ -113,11 +99,13 @@ char *VFS_GetAbsPath(char *Path)
                
                // Only copy if the positions differ
                if(read != write) {
+                       Log("write = %i, read = %i", write, read);
                        memcpy( &ret[write], &ret[read], pos-read+1 );
                }
-               write = pos+1;
-               if(slashNum < 256)
-                       slashOffsets[ slashNum++ ] = pos;
+               write += (pos-read)+1;
+               
+               if(slashNum < MAX_PATH_SLASHES)
+                       slashOffsets[ slashNum++ ] = write;
                else {
                        LOG("Path '%s' has too many elements", Path);
                        free(ret);
@@ -128,6 +116,7 @@ char *VFS_GetAbsPath(char *Path)
        
        // `ret` should now be the absolute path
        LEAVE('s', ret);
+       Log("VFS_GetAbsPath: RETURN '%s'", ret);
        return ret;
 }
 

UCC git Repository :: git.ucc.asn.au