implement Libc0; include "libc0.m"; islx(c: int): int { return c >= 'a' && c <= 'f'; } isux(c: int): int { return c >= 'A' && c <= 'F'; } isalnum(c: int): int { return isalpha(c) || isdigit(c); } isalpha(c: int): int { return islower(c) || isupper(c); } isascii(c: int): int { return (c&~16r7f) == 0; } iscntrl(c: int): int { return c == 16r7f || (c&~16r1f) == 0; } isdigit(c: int): int { return c >= '0' && c <= '9'; } isgraph(c: int): int { return c >= '!' && c <= '~'; } islower(c: int): int { return c >= 'a' && c <= 'z'; } isprint(c: int): int { return c >= ' ' && c <= '~'; } ispunct(c: int): int { return isascii(c) && !iscntrl(c) && !isspace(c) && !isalnum(c); } isspace(c: int): int { return c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v'; } isupper(c: int): int { return c >= 'A' && c <= 'Z'; } isxdigit(c: int): int { return isdigit(c) || islx(c) || isux(c); } tolower(c: int): int { if(isupper(c)) return c+'a'-'A'; return c; } toupper(c: int): int { if(islower(c)) return c+'A'-'a'; return c; } toascii(c: int): int { return c&16r7f; } strlen(s: array of byte): int { l := len s; for(i := 0; i < l; i++) if(s[i] == byte 0) break; return i; } strcpy(s1: array of byte, s2: array of byte): array of byte { l := strlen(s2)+1; if(l == len s2) s1[0: ] = s2; else s1[0: ] = s2[0: l]; return s1; } strncpy(s1: array of byte, s2: array of byte, n: int): array of byte { l := strlen(s2); if(l >= n) s1[0: ] = s2[0: n]; else{ s1[0: ] = s2; for(i := l; i < n; i++) s1[i] = byte '\0'; } return s1; } strcat(s1: array of byte, s2: array of byte): array of byte { l := strlen(s2)+1; m := strlen(s1); if(l == len s2) s1[m: ] = s2; else s1[m: ] = s2[0: l]; return s1; } strncat(s1: array of byte, s2: array of byte, n: int): array of byte { l := strlen(s2); if(l >= n){ m := strlen(s1); s1[m: ] = s2[0: n]; s1[m+n] = byte '\0'; } else strcat(s1, s2); return s1; } strdup(s: array of byte): array of byte { l := strlen(s)+1; t := array[l] of byte; if(l == len s) t[0: ] = s; else t[0: ] = s[0: l]; return t; } strcmp(s1: array of byte, s2: array of byte): int { l1 := strlen(s1); l2 := strlen(s2); for(i := 0; i < l1 && i < l2; i++) if(s1[i] != s2[i]) return int s1[i]-int s2[i]; return l1-l2; } strncmp(s1: array of byte, s2: array of byte, n: int): int { i1 := i2 := 0; while(n > 0){ c1 := int s1[i1++]; c2 := int s2[i2++]; n--; if(c1 != c2){ if(c1 > c2) return 1; return -1; } if(c1 == 0) break; } return 0; } strchr(s: array of byte, n: int): array of byte { l := strlen(s); for(i := 0; i < l; i++) if(s[i] == byte n) return s[i: ]; return nil; } strrchr(s: array of byte, n: int): array of byte { l := strlen(s); for(i := l-1; i >= 0; i--) if(s[i] == byte n) return s[i: ]; return nil; } ls2aab(argl: list of string): array of array of byte { l := len argl; ls := argl; a := array[l+1] of array of byte; for(i := 0; i < l; i++){ a[i] = array of byte (hd ls + "\0"); ls = tl ls; } a[l] = nil; return a; } s2ab(s: string): array of byte { return array of byte (s + "\0"); } ab2s(a: array of byte): string { return string a[0: strlen(a)]; } abs(n: int): int { if(n < 0) return -n; return n; } min(m: int, n: int): int { if(m < n) return m; return n; } max(m: int, n: int): int { if(m > n) return m; return n; }