diff options
author | Ash Wolf <ninji@wuffs.org> | 2022-10-13 03:03:13 +0100 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2022-10-13 03:03:13 +0100 |
commit | bdf2608f1d72f3b0705e783c1870d5d31a53a2d7 (patch) | |
tree | 817a882e6ed933459331249e1030871ee52ec973 /command_line | |
parent | 945f73751630db0420522b5d6af0629d90376a45 (diff) | |
download | MWCC-bdf2608f1d72f3b0705e783c1870d5d31a53a2d7.tar.gz MWCC-bdf2608f1d72f3b0705e783c1870d5d31a53a2d7.zip |
finish OSLib/Generic.c
Diffstat (limited to '')
-rw-r--r-- | command_line/CmdLine/Src/OSLib/Generic.c | 183 |
1 files changed, 181 insertions, 2 deletions
diff --git a/command_line/CmdLine/Src/OSLib/Generic.c b/command_line/CmdLine/Src/OSLib/Generic.c index e95ebd5..a4e9fed 100644 --- a/command_line/CmdLine/Src/OSLib/Generic.c +++ b/command_line/CmdLine/Src/OSLib/Generic.c @@ -230,27 +230,177 @@ char *OS_CompactPaths(char *buf, const char *p, const char *n, int size) { int nlen; char *ptr; int bidx; + int wat; + + plen = p ? strlen(p) : 0; + nlen = n ? strlen(n) : 0; + + if (plen + nlen + 1 <= size) { + sprintf(buf, "%s%s", p ? p : "", n ? n : ""); + return buf; + } + + ptr = buf; + bidx = 0; + wat = plen + nlen - size; + + while (plen > 0 && nlen > 0) { + if (plen > 0) { + *(ptr++) = *(p++); + plen--; + } else if (nlen > 0) { + *(ptr++) = *(n++); + nlen--; + } + + if (++bidx == (size / 2) - 2) { + ptr[0] = '.'; + ptr[1] = '.'; + ptr[2] = '.'; + ptr += 3; + bidx += 3; + if (plen > 0) { + plen -= wat / 2; + if (plen < 0) { + n -= plen; + nlen += plen; + plen = 0; + } + } else { + n += wat / 2; + nlen -= wat / 2; + } + } + } + + *ptr = 0; + return buf; } char *OS_SpecToStringRelative(const OSSpec *spec, const OSPathSpec *cwdspec, char *path, int size) { char fullbuf[256]; char *full; - char cwfbuf[256]; + char cwdbuf[256]; char *cwd; OSPathSpec mycwdspec; char *pptr; + + full = fullbuf; + cwd = cwdbuf; + OS_SpecToString(spec, full, 256); + + if (!size) + size = 256; + + if (!path) { + path = malloc(size); + if (!path) + return 0; + } + + if (!cwdspec) { + OS_GetCWD(&mycwdspec); + cwdspec = &mycwdspec; + } + + if (!OS_PathSpecToString(cwdspec, cwdbuf, 256)) { + memcpy(path, fullbuf, size - 1); + path[size - 1] = 0; + return path; + } + + while (*cwd && *full == *cwd) { + full++; + cwd++; + } + + if ((cwd - cwdbuf) < (strlen(fullbuf) / 2) && (strlen(cwd) > (strlen(fullbuf) / 2))) { + memcpy(path, fullbuf, size - 1); + path[size - 1] = 0; + return path; + } + + while (cwd > cwdbuf) { + cwd--; + full--; + if (*cwd == '/') + break; + } + + if (cwd == cwdbuf) { + strncpy(path, full, size - 1); + path[size - 1] = 0; + } else { + if (*(++cwd)) { + pptr = path; + while (*cwd) { + if (*cwd == '/') + pptr += sprintf(pptr, "../"); + ++cwd; + } + strcpy(pptr, full + 1); + } else { + strncpy(path, full + 1, size - 1); + path[size - 1] = 0; + } + } + + return path; } int OS_FindFileInPath(const char *filename, const char *plist, OSSpec *spec) { - char *next; + const char *next; char path[256]; int err; + + while (plist && *plist) { + next = strchr(plist, ':'); + if (!next) + next = strpbrk(plist, ":;"); + + if (!next) + next = plist + strlen(plist); + + strcpyn(path, plist, next - plist, 255); + if (!OS_MakeSpec2(path, filename, spec)) { + if (!OS_Status(spec)) + return 0; + } + + if (*next) + plist = next + 1; + else + plist = 0; + } + + err = OS_MakeFileSpec(filename, spec); + if (!err) { + err = OS_Status(spec); + if (!err) + err = 0; + } + return err; } int OS_FindProgram(const char *filename, OSSpec *spec) { char *plist; int err; char temp[256]; + + strncpy(temp, filename, 256); + temp[255] = 0; + + if (!strchr(temp, '/')) { + plist = getenv("PATH"); + err = OS_FindFileInPath(temp, plist, spec); + if (!err) + return 0; + } + + err = OS_MakeFileSpec(temp, spec); + if (!err) + err = OS_Status(spec); + return err; } int OS_CopyHandle(OSHandle *hand, OSHandle *copy) { @@ -258,10 +408,39 @@ int OS_CopyHandle(OSHandle *hand, OSHandle *copy) { UInt32 sz; void *f; void *t; + + err = OS_GetHandleSize(hand, &sz); + if (!err) { + err = OS_NewHandle(sz, copy); + if (!err) { + f = OS_LockHandle(hand); + t = OS_LockHandle(copy); + memcpy(t, f, sz); + OS_UnlockHandle(hand); + OS_UnlockHandle(copy); + return 0; + } + } + OS_FreeHandle(copy); + return err; } int OS_AppendHandle(OSHandle *hand, const void *data, UInt32 len) { int err; UInt32 sz; void *buffer; + + err = OS_GetHandleSize(hand, &sz); + if (!err) { + err = OS_ResizeHandle(hand, sz + len); + if (!err) { + buffer = OS_LockHandle(hand); + if (buffer) { + memcpy((unsigned char *) buffer + sz, data, len); + OS_UnlockHandle(hand); + return 0; + } + } + } + return err; } |