]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/pack: support removing of leading file prefix on windows
authorAlex Brainman <alex.brainman@gmail.com>
Fri, 26 Jul 2013 06:56:24 +0000 (16:56 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Fri, 26 Jul 2013 06:56:24 +0000 (16:56 +1000)
Fixes #5550

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/11904043

src/cmd/pack/ar.c

index 7053f841f37eedef478172c3aecad77094336cd7..284eff5ca535141d22f71bfa5bd5926729e88e2f 100644 (file)
@@ -1618,6 +1618,25 @@ int (*reader[256])(Biobuf*, Prog*) = {
        [Obj386] = _read8,
 };
 
+#define isdelim(c) ((c) == '/' || (c) == '\\')
+
+/*
+ *     check if p is start of windows full path, like C:\ or c:/.
+ *     return 1 if so. also set drive parameter to its
+ *     upper-case drive letter.
+ */
+int
+iswinpathstart(char *p, char *drive)
+{
+       if('A' <= p[0] || p[0] <= 'Z')
+               *drive = p[0];
+       else if('a' <= p[0] || p[0] <= 'z')
+               *drive = p[0] - ('a' - 'A');
+       else
+               return 0;
+       return p[1] == ':' && isdelim(p[2]);
+}
+
 /*
  *     copy b into bp->member but rewrite object
  *     during copy to drop prefix from all file names.
@@ -1630,7 +1649,7 @@ arread_cutprefix(Biobuf *b, Armember *bp)
        vlong offset, o, end;
        int n, t;
        int (*rd)(Biobuf*, Prog*);
-       char *w, *inprefix;
+       char *w, *inprefix, d1, d2;
        Prog p;
        
        offset = Boffset(b);
@@ -1666,12 +1685,15 @@ arread_cutprefix(Biobuf *b, Armember *bp)
                        if(inprefix == nil && prefix[0] == '/' && p.id[1] == '/' && p.id[2] == '\0') {
                                // leading /
                                inprefix = prefix+1;
+                       } else if(inprefix == nil && iswinpathstart(prefix, &d1) && iswinpathstart(p.id + 1, &d2) && d1 == d2 && p.id[4] == '\0') {
+                               // leading c:\ ...
+                               inprefix = prefix+3;
                        } else if(inprefix != nil) {
                                // handle subsequent elements
                                n = strlen(p.id+1);
-                               if(strncmp(p.id+1, inprefix, n) == 0 && (inprefix[n] == '/' || inprefix[n] == '\0')) {
+                               if(strncmp(p.id+1, inprefix, n) == 0 && (isdelim(inprefix[n]) || inprefix[n] == '\0')) {
                                        inprefix += n;
-                                       if(inprefix[0] == '/')
+                                       if(isdelim(inprefix[0]))
                                                inprefix++;
                                }
                        }