diff 172dc0005aa16dea8451bf2bcef7f3eb04df2c04 uncommitted --- a/sys/src/cmd/patch.c +++ b/sys/src/cmd/patch.c @@ -146,11 +146,19 @@ if(strncmp(s, "@@ -", 4) != 0) return -1; e = s + 4; - h->oldln = strtol(e, &e, 10); - h->oldcnt = 1; + if(reverse){ + h->newln = strtol(e, &e, 10); + h->newcnt = 1; + }else{ + h->oldln = strtol(e, &e, 10); + h->oldcnt = 1; + } if(*e == ','){ e++; - h->oldcnt = strtol(e, &e, 10); + if(reverse) + h->newcnt = strtol(e, &e, 10); + else + h->oldcnt = strtol(e, &e, 10); } while(*e == ' ' || *e == '\t') e++; @@ -157,13 +165,21 @@ if(*e != '+') return -1; e++; - h->newln = strtol(e, &e, 10); + if(reverse){ + h->oldln = strtol(e, &e, 10); + h->oldcnt = 1; + }else{ + h->newln = strtol(e, &e, 10); + h->newcnt = 1; + } if(e == s) return -1; - h->newcnt = 1; if(*e == ','){ e++; - h->newcnt = strtol(e, &e, 10); + if(reverse) + h->oldcnt = strtol(e, &e, 10); + else + h->newcnt = strtol(e, &e, 10); } if(e == s || *e != ' ') return -1; @@ -298,8 +314,10 @@ while(1){ if((ln = readline(f, &lnum)) == nil){ - if(oldcnt != h.oldcnt || newcnt != h.newcnt) - sysfatal("%s:%d: malformed hunk: mismatched counts", name, lnum); + if(oldcnt != h.oldcnt) + sysfatal("%s:%d: malformed hunk: mismatched -hunk size %d != %d", name, lnum, oldcnt, h.oldcnt); + if(newcnt != h.newcnt) + sysfatal("%s:%d: malformed hunk: mismatched +hunk size %d != %d", name, lnum, newcnt, h.newcnt); addhunk(p, &h); break; } @@ -309,11 +327,17 @@ goto out; case '-': addold(&h, ln); - oldcnt++; + if(reverse) + newcnt++; + else + oldcnt++; break; case '+': addnew(&h, ln); - newcnt++; + if(reverse) + oldcnt++; + else + newcnt++; break; case '\n': addold(&h, " \n");