rsc | b3994ec | 2003-12-11 17:50:28 +0000 | [diff] [blame] | 1 | #include <u.h> |
| 2 | #include <libc.h> |
| 3 | |
| 4 | /* |
| 5 | * I don't want too many of these, |
| 6 | * but the ones we have are just too useful. |
| 7 | */ |
| 8 | static struct { |
| 9 | char *old; |
| 10 | char *new; |
| 11 | } replace[] = { |
| 12 | "#9", nil, /* must be first */ |
| 13 | "#d", "/dev/fd", |
| 14 | }; |
| 15 | |
| 16 | char* |
rsc | 8ad5179 | 2004-03-25 23:03:57 +0000 | [diff] [blame] | 17 | plan9translate(char *old) |
rsc | b3994ec | 2003-12-11 17:50:28 +0000 | [diff] [blame] | 18 | { |
| 19 | char *new; |
| 20 | int i, olen, nlen, len; |
| 21 | |
| 22 | if(replace[0].new == nil){ |
| 23 | replace[0].new = getenv("PLAN9"); |
| 24 | if(replace[0].new == nil) |
| 25 | replace[0].new = "/usr/local/plan9"; |
| 26 | } |
| 27 | |
| 28 | for(i=0; i<nelem(replace); i++){ |
| 29 | if(!replace[i].new) |
| 30 | continue; |
| 31 | olen = strlen(replace[i].old); |
| 32 | if(strncmp(old, replace[i].old, olen) != 0 |
| 33 | || (old[olen] != '\0' && old[olen] != '/')) |
| 34 | continue; |
| 35 | nlen = strlen(replace[i].new); |
| 36 | len = strlen(old)+nlen-olen; |
| 37 | new = malloc(len+1); |
| 38 | if(new == nil) |
rsc | 8ad5179 | 2004-03-25 23:03:57 +0000 | [diff] [blame] | 39 | return "<out of memory>"; |
rsc | b3994ec | 2003-12-11 17:50:28 +0000 | [diff] [blame] | 40 | strcpy(new, replace[i].new); |
| 41 | strcpy(new+nlen, old+olen); |
| 42 | assert(strlen(new) == len); |
| 43 | return new; |
| 44 | } |
| 45 | return old; |
| 46 | } |