mirror of https://git.wuffs.org/MWCC
finish Posix.c
This commit is contained in:
parent
45e57168fa
commit
f080c0e765
|
@ -57,6 +57,7 @@ uOSTypePair OS_TEXTTYPE = {0666};
|
||||||
int OS_Create(const OSSpec *spec, const uOSTypePair *type) {
|
int OS_Create(const OSSpec *spec, const uOSTypePair *type) {
|
||||||
int h;
|
int h;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
CONVERT_SPEC(spec, intbuf);
|
CONVERT_SPEC(spec, intbuf);
|
||||||
h = open(intbuf, O_CREAT | O_TRUNC, type->perm);
|
h = open(intbuf, O_CREAT | O_TRUNC, type->perm);
|
||||||
if (h < 0)
|
if (h < 0)
|
||||||
|
@ -64,7 +65,7 @@ int OS_Create(const OSSpec *spec, const uOSTypePair *type) {
|
||||||
close(h);
|
close(h);
|
||||||
|
|
||||||
err = OS_SetFileType(spec, type);
|
err = OS_SetFileType(spec, type);
|
||||||
return (err < 1) ? EPERM : 0;
|
return ((err == 0) || (err == EPERM)) ? 0 : err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int OS_Status(const OSSpec *spec) {
|
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 OS_SetFileType(const OSSpec *spec, const uOSTypePair *type) {
|
||||||
int err, oldmask;
|
int oldmask;
|
||||||
|
int err;
|
||||||
|
|
||||||
CONVERT_SPEC(spec, intbuf);
|
CONVERT_SPEC(spec, intbuf);
|
||||||
oldmask = umask(0) & UF_SETTABLE;
|
oldmask = umask(0);
|
||||||
err = chmod(intbuf, type->perm & ~oldmask);
|
err = chmod(intbuf, type->perm & ~oldmask);
|
||||||
umask(oldmask);
|
umask(oldmask);
|
||||||
|
|
||||||
|
@ -353,13 +355,55 @@ char *OS_GetDirPtr(char *path) {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int OS_CompactPath(const char *src, char *dst) {
|
static int OS_CompactPath(char *src, char *dst) {
|
||||||
char buf[256];
|
char buf[256];
|
||||||
char *bptr;
|
char *bptr;
|
||||||
char *to;
|
char *to;
|
||||||
char *from;
|
char *from;
|
||||||
char *start;
|
char *start;
|
||||||
char *brk;
|
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) {
|
int OS_EqualPath(const char *a, const char *b) {
|
||||||
|
@ -823,17 +867,70 @@ void OS_TimeToMac(time_t sectm, UInt32 *secs) {
|
||||||
int ydays;
|
int ydays;
|
||||||
|
|
||||||
tmrec = localtime(§m);
|
tmrec = localtime(§m);
|
||||||
// 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) {
|
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;
|
struct tm tmrec;
|
||||||
int month;
|
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) {
|
SInt16 OS_RefToMac(int ref) {
|
||||||
//return (ref >= -1) ? (ref + 1) : ref;
|
return (ref < -1) ? (SInt16) 0 : (SInt16) (ref + 1);
|
||||||
// wtf is going on here augh
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int OS_MacToRef(SInt16 refnum) {
|
int OS_MacToRef(SInt16 refnum) {
|
||||||
|
|
Loading…
Reference in New Issue