summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--command_line/CmdLine/Src/OSLib/Posix.c111
1 files changed, 104 insertions, 7 deletions
diff --git a/command_line/CmdLine/Src/OSLib/Posix.c b/command_line/CmdLine/Src/OSLib/Posix.c
index 0711559..e836653 100644
--- a/command_line/CmdLine/Src/OSLib/Posix.c
+++ b/command_line/CmdLine/Src/OSLib/Posix.c
@@ -57,6 +57,7 @@ uOSTypePair OS_TEXTTYPE = {0666};
int OS_Create(const OSSpec *spec, const uOSTypePair *type) {
int h;
int err;
+
CONVERT_SPEC(spec, intbuf);
h = open(intbuf, O_CREAT | O_TRUNC, type->perm);
if (h < 0)
@@ -64,7 +65,7 @@ int OS_Create(const OSSpec *spec, const uOSTypePair *type) {
close(h);
err = OS_SetFileType(spec, type);
- return (err < 1) ? EPERM : 0;
+ return ((err == 0) || (err == EPERM)) ? 0 : err;
}
int OS_Status(const OSSpec *spec) {
@@ -86,10 +87,11 @@ int OS_GetFileType(const OSSpec *spec, uOSTypePair *type) {
}
int OS_SetFileType(const OSSpec *spec, const uOSTypePair *type) {
- int err, oldmask;
+ int oldmask;
+ int err;
CONVERT_SPEC(spec, intbuf);
- oldmask = umask(0) & UF_SETTABLE;
+ oldmask = umask(0);
err = chmod(intbuf, type->perm & ~oldmask);
umask(oldmask);
@@ -353,13 +355,55 @@ char *OS_GetDirPtr(char *path) {
return path;
}
-static int OS_CompactPath(const char *src, char *dst) {
+static int OS_CompactPath(char *src, char *dst) {
char buf[256];
char *bptr;
char *to;
char *from;
char *start;
char *brk;
+
+ start = OS_GetDirPtr(src);
+ if (dst == NULL)
+ bptr = buf;
+ else
+ bptr = dst;
+
+ strncpy(bptr, src, start - src);
+ bptr = bptr + (start - src);
+ from = start;
+ to = bptr;
+ while (*from) {
+ brk = from + 1;
+ while (*brk && *brk != '/')
+ ++brk;
+
+ if ((brk - from) == 1) {
+ from = brk;
+ } else if ((brk - from) == 2 && from[1] == '.') {
+ from = brk;
+ } else if ((brk - from) == 3 && from[1] == '.' && from[2] == '.') {
+ if (to > bptr) {
+ do {
+ to--;
+ } while (to >= bptr && *to != '/');
+ }
+ from = brk;
+ } else {
+ while (from < brk) {
+ *(to++) = *(from++);
+ }
+ }
+ }
+
+ if (to == bptr || from[-1] == '/')
+ *(to++) = '/';
+ *to = 0;
+
+ if (!dst)
+ strcpy(src, buf);
+
+ return 0;
}
int OS_EqualPath(const char *a, const char *b) {
@@ -823,17 +867,70 @@ void OS_TimeToMac(time_t sectm, UInt32 *secs) {
int ydays;
tmrec = localtime(&sectm);
- // this is horrendous lol
+ years = tmrec->tm_year - 4;
+
+ ydays =
+ (years * 365) +
+ ((years + 3) / 4) -
+ ((years + 4) / 100) +
+ ((years - 296) / 400);
+
+ *secs =
+ ((ydays + tmrec->tm_yday) * 86400)
+ + (tmrec->tm_hour * 3600)
+ + (tmrec->tm_min * 60)
+ + (tmrec->tm_sec)
+ + (tmrec->tm_isdst ? -3600 : 0);
}
void OS_MacToTime(UInt32 secs, time_t *sectm) {
+ static int monthdays[12] = {
+ 31, 28, 31, 30,
+ 31, 30, 31, 31,
+ 30, 31, 30, 31
+ };
struct tm tmrec;
int month;
+
+ memset(&tmrec, 0, sizeof(tmrec));
+ tmrec.tm_sec = secs % 60; // line 1523
+ tmrec.tm_min = (secs / 60) % 60; // line 1524
+ tmrec.tm_hour = (secs / 3600) % 24; // line 1525
+ tmrec.tm_yday = (secs / 86400) % 365;
+ tmrec.tm_year = (secs / 31536000) + 4; // line 1533
+ tmrec.tm_yday -=
+ ((((secs / 31536000) + 3) / 4)
+ -
+ (((secs / 31536000) + 4) / 100)
+ +
+ ((SInt32)((secs / 31536000) - 296) / 400))
+ ;
+
+ if ((tmrec.tm_year % 4) && ((tmrec.tm_year % 100) || !(tmrec.tm_year % 400))) {
+ monthdays[1] = 28;
+ } else {
+ monthdays[1] = 29;
+ }
+
+ if (tmrec.tm_yday >= (monthdays[1] + 62) && tmrec.tm_yday < (monthdays[1] + 245)) {
+ tmrec.tm_hour++;
+ if (tmrec.tm_hour >= 24) {
+ tmrec.tm_yday++;
+ tmrec.tm_hour -= 24;
+ }
+ }
+
+ for (month = 0; tmrec.tm_yday >= monthdays[month]; month++) {
+ tmrec.tm_yday -= monthdays[month];
+ }
+ tmrec.tm_mon = month;
+ tmrec.tm_mday = tmrec.tm_yday + 1;
+
+ *sectm = mktime(&tmrec);
}
SInt16 OS_RefToMac(int ref) {
- //return (ref >= -1) ? (ref + 1) : ref;
- // wtf is going on here augh
+ return (ref < -1) ? (SInt16) 0 : (SInt16) (ref + 1);
}
int OS_MacToRef(SInt16 refnum) {