mirror of
https://github.com/vivier/EMILE.git
synced 2024-05-31 17:41:33 +00:00
Move UNIX/POSIX/C functions to libunix
This commit is contained in:
parent
9773bd7e68
commit
b0323e54df
61
libunix/Makefile
Normal file
61
libunix/Makefile
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
#
|
||||||
|
# (c) 2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
#
|
||||||
|
|
||||||
|
TOP = $(shell pwd)
|
||||||
|
CFLAGS = -nostdlib -nodefaultlibs -Wall -Werror -Wno-multichar -fpic
|
||||||
|
CPPFLAGS = -I$(TOP) -I$(TOP)/../libmacos -DARCH_M68K
|
||||||
|
|
||||||
|
LIBRARY = libunix.a
|
||||||
|
|
||||||
|
SOURCES = divsi3.S modsi3.S mulsi3.S udivsi3.S umodsi3.S free.c malloc.c \
|
||||||
|
memcpy.c memset.c printf.c putchar.c puts.c read.c sprintf.c \
|
||||||
|
strcpy.c strlen.c strncpy.c vsprintf.c write.c
|
||||||
|
|
||||||
|
HEADERS =
|
||||||
|
|
||||||
|
DISTFILES = $(SOURCES) $(HEADERS)
|
||||||
|
|
||||||
|
OBJS = $(patsubst %.S,%.o,$(SOURCES:.c=.o))
|
||||||
|
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
$(LIBRARY): $(OBJS)
|
||||||
|
$(AR) rc $@ $^
|
||||||
|
|
||||||
|
install: install-headers install-lib
|
||||||
|
|
||||||
|
install-lib:
|
||||||
|
install -d $(DESTDIR)/$(PREFIX)/usr/lib/
|
||||||
|
install $(LIBRARY) $(DESTDIR)/$(PREFIX)/usr/lib/$(LIBRARY)
|
||||||
|
|
||||||
|
install-headers:
|
||||||
|
for file in $(HEADERS); do \
|
||||||
|
dir=$$(dirname $$file); \
|
||||||
|
if [ "$$dir" != "" ] ; then \
|
||||||
|
mkdir -p $(DESTDIR)/$(PREFIX)/usr/include/$$dir; \
|
||||||
|
fi; \
|
||||||
|
cp -p $$file $(DESTDIR)/$(PREFIX)/usr/include/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
uninstall: uninstall-lib uninstall-headers
|
||||||
|
|
||||||
|
uninstall-lib:
|
||||||
|
rm -f $(DESTDIR)/$(PREFIX)/usr/lib/$(LIBRARY)
|
||||||
|
|
||||||
|
uninstall-headers:
|
||||||
|
for file in $(HEADERS); do \
|
||||||
|
rm -f $(DESTDIR)/$(PREFIX)/usr/include/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
dist:
|
||||||
|
for file in $(DISTFILES); do \
|
||||||
|
dir=$$(dirname $$file); \
|
||||||
|
if [ "$$dir" != "" ] ; then \
|
||||||
|
mkdir -p $(DISTDIR)/libunix/$$dir; \
|
||||||
|
fi; \
|
||||||
|
cp -p $$file $(DISTDIR)/libunix/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(OBJS) $(LIBRARY)
|
38
libunix/divsi3.S
Normal file
38
libunix/divsi3.S
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* (c) 2004,2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
*
|
||||||
|
* Some parts from libgcc routines for 68000 w/o floating-point hardware.
|
||||||
|
* Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
.chip 68000
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.globl __divsi3
|
||||||
|
__divsi3:
|
||||||
|
movel %d2, %sp@-
|
||||||
|
|
||||||
|
moveq #1, %d2 /* sign of result stored in %d2 (=1 or =-1) */
|
||||||
|
movel %sp@(12), %d1 /* %d1 = divisor */
|
||||||
|
jpl __divsi3L1
|
||||||
|
negl %d1
|
||||||
|
negb %d2 /* change sign because divisor <0 */
|
||||||
|
__divsi3L1: movel %sp@(8), %d0 /* %d0 = dividend */
|
||||||
|
jpl __divsi3L2
|
||||||
|
negl %d0
|
||||||
|
negb %d2
|
||||||
|
|
||||||
|
__divsi3L2: movel %d1, %sp@-
|
||||||
|
movel %d0, %sp@-
|
||||||
|
bsr __udivsi3 /* divide abs(dividend) by abs(divisor) */
|
||||||
|
addql #8, %sp
|
||||||
|
|
||||||
|
tstb %d2
|
||||||
|
jpl __divsi3L3
|
||||||
|
negl %d0
|
||||||
|
|
||||||
|
__divsi3L3: movel %sp@+, %d2
|
||||||
|
rts
|
6
libunix/free.c
Normal file
6
libunix/free.c
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include <macos/memory.h>
|
||||||
|
|
||||||
|
void free(void *ptr)
|
||||||
|
{
|
||||||
|
DisposePtr(ptr);
|
||||||
|
}
|
7
libunix/malloc.c
Normal file
7
libunix/malloc.c
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <macos/memory.h>
|
||||||
|
|
||||||
|
void *malloc(size_t size)
|
||||||
|
{
|
||||||
|
return NewPtr(size);
|
||||||
|
}
|
11
libunix/memcpy.c
Normal file
11
libunix/memcpy.c
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
void* memcpy(void* __dest, __const void* __src,
|
||||||
|
size_t __n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *d = (char *)__dest, *s = (char *)__src;
|
||||||
|
|
||||||
|
for (i=0;i<__n;i++) d[i] = s[i];
|
||||||
|
return __dest;
|
||||||
|
}
|
10
libunix/memset.c
Normal file
10
libunix/memset.c
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
void* memset(void* s, int c, size_t n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *ss = (char*)s;
|
||||||
|
|
||||||
|
for (i=0;i<n;i++) ss[i] = c;
|
||||||
|
return s;
|
||||||
|
}
|
30
libunix/modsi3.S
Normal file
30
libunix/modsi3.S
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* (c) 2004,2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
*
|
||||||
|
* Some parts from libgcc routines for 68000 w/o floating-point hardware.
|
||||||
|
* Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
.chip 68000
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.globl __modsi3
|
||||||
|
__modsi3:
|
||||||
|
movel %sp@(8), %d1 /* %d1 = divisor */
|
||||||
|
movel %sp@(4), %d0 /* %d0 = dividend */
|
||||||
|
movel %d1, %sp@-
|
||||||
|
movel %d0, %sp@-
|
||||||
|
bsr __divsi3
|
||||||
|
addql #8, %sp
|
||||||
|
movel %sp@(8), %d1 /* %d1 = divisor */
|
||||||
|
movel %d1, %sp@-
|
||||||
|
movel %d0, %sp@-
|
||||||
|
bsr __mulsi3 /* %d0 = (a/b)*b */
|
||||||
|
addql #8, %sp
|
||||||
|
movel %sp@(4), %d1 /* %d1 = dividend */
|
||||||
|
subl %d0, %d1 /* %d1 = a - (a/b)*b */
|
||||||
|
movel %d1, %d0
|
||||||
|
rts
|
26
libunix/mulsi3.S
Normal file
26
libunix/mulsi3.S
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* (c) 2004,2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
*
|
||||||
|
* Some parts from libgcc routines for 68000 w/o floating-point hardware.
|
||||||
|
* Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
.chip 68000
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.globl __mulsi3
|
||||||
|
__mulsi3:
|
||||||
|
movew %sp@(4), %d0 /* x0 -> %d0 */
|
||||||
|
muluw %sp@(10), %d0 /* x0*y1 */
|
||||||
|
movew %sp@(6), %d1 /* x1 -> %d1 */
|
||||||
|
muluw %sp@(8), %d1 /* x1*y0 */
|
||||||
|
addl %d1, %d0
|
||||||
|
swap %d0
|
||||||
|
clrw %d0
|
||||||
|
movew %sp@(6), %d1 /* x1 -> %d1 */
|
||||||
|
muluw %sp@(10), %d1 /* x1*y1 */
|
||||||
|
addl %d1, %d0
|
||||||
|
rts
|
22
libunix/printf.c
Normal file
22
libunix/printf.c
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
extern void console_putstring(const char *s);
|
||||||
|
|
||||||
|
static char __printf_buffer[2048];
|
||||||
|
|
||||||
|
int
|
||||||
|
printf(const char * format, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
va_start(args, format);
|
||||||
|
len = vsprintf(__printf_buffer, format, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
if (len)
|
||||||
|
console_putstring(__printf_buffer);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
6
libunix/putchar.c
Normal file
6
libunix/putchar.c
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
extern int console_putchar(int c);
|
||||||
|
|
||||||
|
int putchar (int c)
|
||||||
|
{
|
||||||
|
return console_putchar(c);
|
||||||
|
}
|
10
libunix/puts.c
Normal file
10
libunix/puts.c
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
extern void console_putstring(const char *s);
|
||||||
|
extern int console_putchar(int c);
|
||||||
|
|
||||||
|
int puts(const char * s)
|
||||||
|
{
|
||||||
|
console_putstring(s);
|
||||||
|
console_putchar('\n');
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
26
libunix/read.c
Normal file
26
libunix/read.c
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <macos/devices.h>
|
||||||
|
#include <macos/serial.h>
|
||||||
|
|
||||||
|
ssize_t read(int fd, void *buf, size_t count)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
ParamBlockRec param;
|
||||||
|
long available;
|
||||||
|
|
||||||
|
res = SerGetBuf(fd, &available);
|
||||||
|
if ( (res != noErr) || (available == 0) )
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
param.ioCompletion = 0;
|
||||||
|
param.ioVRefNum = 0;
|
||||||
|
param.ioRefNum = fd;
|
||||||
|
param.ioBuffer = (u_int32_t)buf;
|
||||||
|
param.ioReqCount= count > available ? available : count;
|
||||||
|
param.ioPosMode = fsAtMark;
|
||||||
|
param.ioPosOffset = 0;
|
||||||
|
res = PBReadSync(¶m);
|
||||||
|
if (res != noErr)
|
||||||
|
return 0;
|
||||||
|
return param.ioActCount;
|
||||||
|
}
|
14
libunix/sprintf.c
Normal file
14
libunix/sprintf.c
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int sprintf(char * s, const char * format, ...)
|
||||||
|
{
|
||||||
|
va_list params;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
va_start(params, format);
|
||||||
|
r = vsprintf(s, format, params);
|
||||||
|
va_end(params);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
7
libunix/strcpy.c
Normal file
7
libunix/strcpy.c
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
char *strcpy (char *__restrict __dest,
|
||||||
|
__const char *__restrict __src)
|
||||||
|
{
|
||||||
|
while ( (*__dest ++ = *__src++) );
|
||||||
|
|
||||||
|
return __dest;
|
||||||
|
}
|
11
libunix/strlen.c
Normal file
11
libunix/strlen.c
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
int strlen(const char* s)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (!s) return 0;
|
||||||
|
|
||||||
|
len = 0;
|
||||||
|
while (*s++) len++;
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
9
libunix/strncpy.c
Normal file
9
libunix/strncpy.c
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
char *strncpy (char *__restrict __dest,
|
||||||
|
__const char *__restrict __src, size_t __n)
|
||||||
|
{
|
||||||
|
while ( (*__dest ++ = *__src++) && __n--);
|
||||||
|
|
||||||
|
return __dest;
|
||||||
|
}
|
58
libunix/udivsi3.S
Normal file
58
libunix/udivsi3.S
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* (c) 2004,2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
*
|
||||||
|
* Some parts from libgcc routines for 68000 w/o floating-point hardware.
|
||||||
|
* Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
.chip 68000
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.globl __udivsi3
|
||||||
|
__udivsi3:
|
||||||
|
movel %d2, %sp@-
|
||||||
|
movel %sp@(12), %d1 /* %d1 = divisor */
|
||||||
|
movel %sp@(8), %d0 /* %d0 = dividend */
|
||||||
|
|
||||||
|
cmpl #0x10000, %d1 /* divisor >= 2 ^ 16 ? */
|
||||||
|
jcc __udivsi3L3 /* then try next algorithm */
|
||||||
|
movel %d0, %d2
|
||||||
|
clrw %d2
|
||||||
|
swap %d2
|
||||||
|
divu %d1, %d2 /* high quotient in lower word */
|
||||||
|
movew %d2, %d0 /* save high quotient */
|
||||||
|
swap %d0
|
||||||
|
movew %sp@(10), %d2 /* get low dividend + high rest */
|
||||||
|
divu %d1, %d2 /* low quotient */
|
||||||
|
movew %d2, %d0
|
||||||
|
jra __udivsi3L6
|
||||||
|
|
||||||
|
__udivsi3L3: movel %d1, %d2 /* use %d2 as divisor backup */
|
||||||
|
__udivsi3L4: lsrl #1, %d1 /* shift divisor */
|
||||||
|
lsrl #1, %d0 /* shift dividend */
|
||||||
|
cmpl #0x10000, %d1 /* still divisor >= 2 ^ 16 ? */
|
||||||
|
jcc __udivsi3L4
|
||||||
|
divu %d1, %d0 /* now we have 16-bit divisor */
|
||||||
|
andl #0xffff, %d0 /* mask out divisor, ignore remainder */
|
||||||
|
|
||||||
|
/* Multiply the 16-bit tentative quotient with the 32-bit divisor. Because of
|
||||||
|
the operand ranges, this might give a 33-bit product. If this product is
|
||||||
|
greater than the dividend, the tentative quotient was too large. */
|
||||||
|
movel %d2, %d1
|
||||||
|
mulu %d0, %d1 /* low part, 32 bits */
|
||||||
|
swap %d2
|
||||||
|
mulu %d0, %d2 /* high part, at most 17 bits */
|
||||||
|
swap %d2 /* align high part with low part */
|
||||||
|
tstw %d2 /* high part 17 bits? */
|
||||||
|
jne __udivsi3L5 /* if 17 bits, quotient was too large */
|
||||||
|
addl %d2, %d1 /* add parts */
|
||||||
|
jcs __udivsi3L5 /* if sum is 33 bits, quotient was too large */
|
||||||
|
cmpl %sp@(8), %d1 /* compare the sum with the dividend */
|
||||||
|
jls __udivsi3L6 /* if sum > dividend, quotient was too large */
|
||||||
|
__udivsi3L5: subql #1, %d0 /* adjust quotient */
|
||||||
|
|
||||||
|
__udivsi3L6: movel %sp@+, %d2
|
||||||
|
rts
|
30
libunix/umodsi3.S
Normal file
30
libunix/umodsi3.S
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* (c) 2004,2005 Laurent Vivier <LaurentVivier@wanadoo.fr>
|
||||||
|
*
|
||||||
|
* Some parts from libgcc routines for 68000 w/o floating-point hardware.
|
||||||
|
* Copyright (C) 1994, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
.chip 68000
|
||||||
|
|
||||||
|
.align 2
|
||||||
|
|
||||||
|
.globl __umodsi3
|
||||||
|
__umodsi3:
|
||||||
|
movel %sp@(8), %d1 /* %d1 = divisor */
|
||||||
|
movel %sp@(4), %d0 /* %d0 = dividend */
|
||||||
|
movel %d1, %sp@-
|
||||||
|
movel %d0, %sp@-
|
||||||
|
bsr __udivsi3
|
||||||
|
addql #8, %sp
|
||||||
|
movel %sp@(8), %d1 /* %d1 = divisor */
|
||||||
|
movel %d1, %sp@-
|
||||||
|
movel %d0, %sp@-
|
||||||
|
bsr __mulsi3 /* %d0 = (a/b)*b */
|
||||||
|
addql #8, %sp
|
||||||
|
movel %sp@(4), %d1 /* %d1 = dividend */
|
||||||
|
subl %d0, %d1 /* %d1 = a - (a/b)*b */
|
||||||
|
movel %d1, %d0
|
||||||
|
rts
|
211
libunix/vsprintf.c
Normal file
211
libunix/vsprintf.c
Normal file
|
@ -0,0 +1,211 @@
|
||||||
|
/*-
|
||||||
|
* Copyright (c) 1986, 1988, 1991, 1993
|
||||||
|
* The Regents of the University of California. All rights reserved.
|
||||||
|
* (c) UNIX System Laboratories, Inc.
|
||||||
|
* All or some portions of this file are derived from material licensed
|
||||||
|
* to the University of California by American Telephone and Telegraph
|
||||||
|
* Co. or Unix System Laboratories, Inc. and are reproduced herein with
|
||||||
|
* the permission of UNIX System Laboratories, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. All advertising materials mentioning features or use of this
|
||||||
|
software
|
||||||
|
* must display the following acknowledgement:
|
||||||
|
* This product includes software developed by the University of
|
||||||
|
* California, Berkeley and its contributors.
|
||||||
|
* 4. Neither the name of the University nor the names of its contributors
|
||||||
|
* may be used to endorse or promote products derived from this
|
||||||
|
software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
|
||||||
|
LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||||
|
STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
|
||||||
|
WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* @(#)subr_prf.c 8.3 (Berkeley) 1/21/94
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Extracted vsprinf & adapted by BenH for MountX, Wed, June 3 1998.
|
||||||
|
* Added support for pascal strings.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
typedef unsigned long u_long;
|
||||||
|
typedef unsigned int u_int;
|
||||||
|
typedef unsigned char u_char;
|
||||||
|
|
||||||
|
#define NBBY 8
|
||||||
|
|
||||||
|
static char *ksprintn(u_long ul, int base, int *lenp, int prec);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Scaled down version of sprintf(3).
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
vsprintf(char *buf, const char *cfmt, va_list ap)
|
||||||
|
{
|
||||||
|
register const char *fmt = cfmt;
|
||||||
|
register char *p, *bp;
|
||||||
|
register int ch, base;
|
||||||
|
u_long ul;
|
||||||
|
int lflag, tmp, width, pstring;
|
||||||
|
int prec, precspec;
|
||||||
|
char padc;
|
||||||
|
|
||||||
|
for (bp = buf; ; ) {
|
||||||
|
padc = ' ';
|
||||||
|
width = 0;
|
||||||
|
prec = 0;
|
||||||
|
precspec = 0;
|
||||||
|
pstring = 0;
|
||||||
|
while ((ch = *(u_char *)fmt++) != '%')
|
||||||
|
if ((*bp++ = (char)ch) == '\0')
|
||||||
|
return ((bp - buf) - 1);
|
||||||
|
|
||||||
|
lflag = 0;
|
||||||
|
reswitch: switch (ch = *(u_char *)fmt++) {
|
||||||
|
case '0':
|
||||||
|
padc = '0';
|
||||||
|
goto reswitch;
|
||||||
|
case '1': case '2': case '3': case '4':
|
||||||
|
case '5': case '6': case '7': case '8': case '9':
|
||||||
|
for (width = 0;; ++fmt) {
|
||||||
|
width = width * 10 + ch - '0';
|
||||||
|
ch = *fmt;
|
||||||
|
if (ch < '0' || ch > '9')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
goto reswitch;
|
||||||
|
|
||||||
|
case '#':
|
||||||
|
pstring = 1;
|
||||||
|
goto reswitch;
|
||||||
|
case '*':
|
||||||
|
width = va_arg(ap, int);
|
||||||
|
goto reswitch;
|
||||||
|
case '.':
|
||||||
|
precspec = 1;
|
||||||
|
if (*fmt == '*') {
|
||||||
|
prec = va_arg(ap, int);
|
||||||
|
++fmt;
|
||||||
|
goto reswitch;
|
||||||
|
}
|
||||||
|
for (prec = 0;; ++fmt) {
|
||||||
|
ch = *fmt;
|
||||||
|
if (ch < '0' || ch > '9')
|
||||||
|
break;
|
||||||
|
prec = prec * 10 + ch - '0';
|
||||||
|
}
|
||||||
|
goto reswitch;
|
||||||
|
case 'l':
|
||||||
|
lflag = 1;
|
||||||
|
goto reswitch;
|
||||||
|
/* case 'b': ... break; XXX */
|
||||||
|
case 'c':
|
||||||
|
*bp++ = (char)va_arg(ap, int);
|
||||||
|
break;
|
||||||
|
/* case 'r': ... break; XXX */
|
||||||
|
case 's':
|
||||||
|
p = va_arg(ap, char *);
|
||||||
|
if (pstring)
|
||||||
|
{
|
||||||
|
prec = precspec ? ((prec < *p) ? prec : *p) : *p;
|
||||||
|
p++;
|
||||||
|
precspec = 1;
|
||||||
|
}
|
||||||
|
while ((!precspec || (--prec >= 0)) && ((*bp = *p++) != 0))
|
||||||
|
++bp;
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
ul = (unsigned long)(lflag ? va_arg(ap, long) : va_arg(ap, int));
|
||||||
|
if ((long)ul < 0) {
|
||||||
|
*bp++ = (char)'-';
|
||||||
|
ul = (unsigned long)(-(long)ul);
|
||||||
|
}
|
||||||
|
base = 10;
|
||||||
|
goto number;
|
||||||
|
break;
|
||||||
|
case 'o':
|
||||||
|
ul = lflag ? va_arg(ap, u_long) : va_arg(ap,
|
||||||
|
u_int);
|
||||||
|
base = 8;
|
||||||
|
goto number;
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
|
ul = lflag ? va_arg(ap, u_long) : va_arg(ap,
|
||||||
|
u_int);
|
||||||
|
base = 10;
|
||||||
|
goto number;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
*bp++ = '0';
|
||||||
|
*bp++ = 'x';
|
||||||
|
ul = (u_long)va_arg(ap, void *);
|
||||||
|
base = 16;
|
||||||
|
goto number;
|
||||||
|
case 'x':
|
||||||
|
case 'X':
|
||||||
|
ul = lflag ? va_arg(ap, u_long) : va_arg(ap,
|
||||||
|
u_int);
|
||||||
|
base = 16;
|
||||||
|
number: p = ksprintn(ul, base, &tmp, prec);
|
||||||
|
if (width && (width -= tmp) > 0)
|
||||||
|
while (width--)
|
||||||
|
*bp++ = padc;
|
||||||
|
while ((ch = *p--) != 0)
|
||||||
|
*bp++ = (char)ch;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*bp++ = '%';
|
||||||
|
if (lflag)
|
||||||
|
*bp++ = 'l';
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
case '%':
|
||||||
|
*bp++ = (char)ch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Put a number (base <= 16) in a buffer in reverse order; return an
|
||||||
|
* optional length and a pointer to the NULL terminated (preceded?)
|
||||||
|
* buffer.
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
ksprintn(u_long ul, int base, int *lenp, int prec)
|
||||||
|
{ /* A long in base 8, plus NULL. */
|
||||||
|
static char buf[sizeof(long) * NBBY / 3 + 4];
|
||||||
|
register char *p;
|
||||||
|
int i;
|
||||||
|
p = buf;
|
||||||
|
for(i=0;i<sizeof(buf);i++)
|
||||||
|
buf[i] = 0;
|
||||||
|
do {
|
||||||
|
*++p = "0123456789abcdef"[ul % base];
|
||||||
|
ul /= base;
|
||||||
|
} while ((--prec > 0 || ul != 0) && p < buf + sizeof(buf) - 1);
|
||||||
|
if (lenp)
|
||||||
|
*lenp = p - buf;
|
||||||
|
return (p);
|
||||||
|
}
|
21
libunix/write.c
Normal file
21
libunix/write.c
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <macos/devices.h>
|
||||||
|
|
||||||
|
ssize_t write(int fd, const void *buf, size_t count)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
ParamBlockRec param;
|
||||||
|
|
||||||
|
param.ioCompletion = 0;
|
||||||
|
param.ioVRefNum = 0;
|
||||||
|
param.ioRefNum = fd;
|
||||||
|
param.ioBuffer = (u_int32_t)buf;
|
||||||
|
param.ioReqCount= count;
|
||||||
|
param.ioPosMode = fsAtMark;
|
||||||
|
param.ioPosOffset = 0;
|
||||||
|
res = PBWriteSync(¶m);
|
||||||
|
if (res != noErr)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return param.ioActCount;
|
||||||
|
}
|
|
@ -4,59 +4,13 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
|
||||||
int strlen(const char* s)
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
|
|
||||||
if (!s) return 0;
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
while (*s++) len++;
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* memset(void* s, int c, size_t n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *ss = (char*)s;
|
|
||||||
|
|
||||||
for (i=0;i<n;i++) ss[i] = c;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* memcpy(void* __dest, __const void* __src,
|
|
||||||
size_t __n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
char *d = (char *)__dest, *s = (char *)__src;
|
|
||||||
|
|
||||||
for (i=0;i<__n;i++) d[i] = s[i];
|
|
||||||
return __dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *strcpy (char *__restrict __dest,
|
|
||||||
__const char *__restrict __src)
|
|
||||||
{
|
|
||||||
while ( (*__dest ++ = *__src++) );
|
|
||||||
|
|
||||||
return __dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *strncpy (char *__restrict __dest,
|
|
||||||
__const char *__restrict __src, size_t __n)
|
|
||||||
{
|
|
||||||
while ( (*__dest ++ = *__src++) && __n--);
|
|
||||||
|
|
||||||
return __dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned char *c2pstring(char* s)
|
unsigned char *c2pstring(char* s)
|
||||||
{
|
{
|
||||||
int len = strlen(s);
|
int len = strlen(s);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user