mirror of
https://github.com/Interlisp/maiko.git
synced 2026-03-15 14:27:19 +00:00
Compare commits
82 Commits
maiko-2108
...
sdl-textur
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32335d5304 | ||
|
|
e175a69377 | ||
|
|
f87b1604e5 | ||
|
|
88f5729727 | ||
|
|
65bbcb7d9d | ||
|
|
ceda3d146e | ||
|
|
753c7d37a9 | ||
|
|
ffd86beb52 | ||
|
|
31a244c0e6 | ||
|
|
2eae377e5f | ||
|
|
00125785be | ||
|
|
c32233b824 | ||
|
|
3091bb2e5a | ||
|
|
fabfca2486 | ||
|
|
e430513d6a | ||
|
|
184f02d0c1 | ||
|
|
0606015793 | ||
|
|
d64e1d1b38 | ||
|
|
f59e4395b8 | ||
|
|
f7588b8c8e | ||
|
|
241e5fe9a9 | ||
|
|
f9d1e51456 | ||
|
|
c64f8534df | ||
|
|
ba6e365cc8 | ||
|
|
37aed57027 | ||
|
|
ecfd4048e0 | ||
|
|
a3fdf18edc | ||
|
|
8a872d7d85 | ||
|
|
5413934525 | ||
|
|
784d9f61cb | ||
|
|
00c4d65aff | ||
|
|
bab9213120 | ||
|
|
9bb7fab4a4 | ||
|
|
bab54bca6a | ||
|
|
572b94d4a7 | ||
|
|
e9968a211b | ||
|
|
e346db4b99 | ||
|
|
f769dbadeb | ||
|
|
56d563983e | ||
|
|
ccfacb23a7 | ||
|
|
4ee904fd1d | ||
|
|
ab94538d0c | ||
|
|
f8fea0b8d8 | ||
|
|
0d4703086e | ||
|
|
5c225467ab | ||
|
|
8f7067943f | ||
|
|
2092a74869 | ||
|
|
f198204bca | ||
|
|
4821dac4c0 | ||
|
|
28931acd36 | ||
|
|
7b7db9aac5 | ||
|
|
333c132e40 | ||
|
|
87ede7cee1 | ||
|
|
78e42b7217 | ||
|
|
f73b4d1ff5 | ||
|
|
987cf4c7c6 | ||
|
|
c46fcce307 | ||
|
|
de5ea2110f | ||
|
|
6c241f1eaa | ||
|
|
19688bc314 | ||
|
|
c39b751f42 | ||
|
|
f58abe36ee | ||
|
|
75c668f1cd | ||
|
|
a25368714f | ||
|
|
3cdbccd0c7 | ||
|
|
4d2bf13347 | ||
|
|
f7e40d1ed5 | ||
|
|
9bb5a4298c | ||
|
|
533c935e72 | ||
|
|
6fedd97d21 | ||
|
|
a70b18d444 | ||
|
|
c7adb3c4ba | ||
|
|
b1545e4ccc | ||
|
|
4f79f55c20 | ||
|
|
85c4ebf0ac | ||
|
|
7284e19b32 | ||
|
|
0de1b1438b | ||
|
|
740f012254 | ||
|
|
377a6f3f47 | ||
|
|
c07618f55c | ||
|
|
dbbb59b30b | ||
|
|
e957e331c4 |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@@ -42,9 +42,17 @@ jobs:
|
||||
BUILD_TYPE: Release
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Show CMake version
|
||||
run: cmake --version
|
||||
- name: Install X11 dependencies on MacOS
|
||||
if: ${{ runner.os == 'macOS'}}
|
||||
run: brew install --cask xquartz
|
||||
- name: Install SDL2 dependencies on MacOS
|
||||
if: ${{ runner.os == 'macOS'}}
|
||||
run: brew install sdl2
|
||||
- name: Install SDL dependency on Ubuntu
|
||||
if: ${{ runner.os == 'Linux'}}
|
||||
run: sudo apt-get update && sudo apt-get install -y libsdl2-dev
|
||||
- name: Create Build Environment
|
||||
run: cmake -E make_directory ${{github.workspace}}/build
|
||||
- name: Configure CMake
|
||||
|
||||
@@ -16,6 +16,21 @@ IF(CMAKE_C_COMPILER_ID MATCHES "SunPro")
|
||||
SET(CMAKE_C_FLAGS "-fno-strict-aliasing ${CMAKE_C_FLAGS}")
|
||||
ENDIF()
|
||||
|
||||
find_program(
|
||||
CLANG_TIDY_EXE
|
||||
NAMES "clang-tidy" "clang-tidy12" "clang-tidy11" "clang-tidy10"
|
||||
DOC "Path to clang-tidy executable"
|
||||
)
|
||||
|
||||
IF (CLANG_TIDY_EXE)
|
||||
IF (NOT CMAKE_CROSSCOMPILING)
|
||||
# There are many many warnings for strcpy instances to deal with,
|
||||
# but suppress it for now so that other issues are more obvious
|
||||
#
|
||||
SET(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_EXE} -checks=-*,cert-*,clang-analyzer-security.*,-clang-analyzer-security.insecureAPI.strcpy,-clang-analyzer-security.insecureAPI.bzero -header-filter=.*)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
INCLUDE(CheckLibraryExists)
|
||||
CHECK_LIBRARY_EXISTS(m fmod "" NEED_LIB_M)
|
||||
IF(NEED_LIB_M)
|
||||
@@ -26,7 +41,7 @@ SET(MAIKO_DEFINITIONS
|
||||
"-DRELEASE=351"
|
||||
)
|
||||
|
||||
OPTION(MAIKO_DISPLAY_X11 "Use X11 for display." ON)
|
||||
OPTION(MAIKO_DISPLAY_X11 "Use X11 for display." OFF)
|
||||
IF(MAIKO_DISPLAY_X11)
|
||||
FIND_PACKAGE(X11 REQUIRED)
|
||||
SET(MAIKO_DISPLAY_X11_DEFINITIONS
|
||||
@@ -59,6 +74,21 @@ IF(MAIKO_DISPLAY_X11)
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
OPTION(MAIKO_DISPLAY_SDL "Use SDL for display." ON)
|
||||
IF(MAIKO_DISPLAY_SDL)
|
||||
FIND_PACKAGE(SDL2 REQUIRED)
|
||||
SET(MAIKO_DISPLAY_SDL_DEFINITIONS
|
||||
"-DSDL"
|
||||
)
|
||||
SET(MAIKO_DISPLAY_SDL_LIBRARIES ${SDL2_LIBRARIES})
|
||||
SET(MAIKO_DISPLAY_SDL_SRCS
|
||||
src/sdl.c
|
||||
)
|
||||
SET(MAIKO_DISPLAY_SDL_HDRS
|
||||
inc/sdldefs.h
|
||||
)
|
||||
ENDIF()
|
||||
|
||||
IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||
LIST(APPEND MAIKO_DEFINITIONS
|
||||
"-DOS5"
|
||||
@@ -391,6 +421,11 @@ IF(MAIKO_DISPLAY_X11)
|
||||
TARGET_LINK_LIBRARIES(lde X11::X11)
|
||||
ENDIF()
|
||||
|
||||
IF(MAIKO_DISPLAY_SDL)
|
||||
# Tell it that the SDL launcher is available.
|
||||
TARGET_COMPILE_DEFINITIONS(lde PUBLIC ${MAIKO_DISPLAY_SDL_DEFINITIONS})
|
||||
ENDIF()
|
||||
|
||||
ADD_EXECUTABLE(ldeether src/ldeether.c src/dlpi.c)
|
||||
TARGET_COMPILE_DEFINITIONS(ldeether PUBLIC ${MAIKO_DEFINITIONS})
|
||||
TARGET_INCLUDE_DIRECTORIES(ldeether PUBLIC inc)
|
||||
@@ -409,6 +444,21 @@ IF(MAIKO_DISPLAY_X11)
|
||||
TARGET_LINK_LIBRARIES(ldex ${MAIKO_LIBRARIES} ${MAIKO_DISPLAY_X11_LIBRARIES})
|
||||
ENDIF()
|
||||
|
||||
IF(MAIKO_DISPLAY_SDL)
|
||||
ADD_EXECUTABLE(ldesdl
|
||||
src/main.c
|
||||
vdate.c
|
||||
${MAIKO_SRCS}
|
||||
${MAIKO_HDRS}
|
||||
${MAIKO_DISPLAY_SDL_SRCS}
|
||||
${MAIKO_DISPLAY_SDL_HDRS}
|
||||
)
|
||||
TARGET_COMPILE_DEFINITIONS(ldesdl PUBLIC ${MAIKO_DEFINITIONS} ${MAIKO_DISPLAY_SDL_DEFINITIONS})
|
||||
TARGET_INCLUDE_DIRECTORIES(ldesdl PUBLIC inc)
|
||||
TARGET_INCLUDE_DIRECTORIES(ldesdl PRIVATE ${SDL2_INCLUDE_DIRS})
|
||||
TARGET_LINK_LIBRARIES(ldesdl ${MAIKO_LIBRARIES} ${MAIKO_DISPLAY_SDL_LIBRARIES})
|
||||
ENDIF()
|
||||
|
||||
ADD_EXECUTABLE(mkvdate src/mkvdate.c)
|
||||
TARGET_COMPILE_DEFINITIONS(mkvdate PUBLIC ${MAIKO_DEFINITIONS})
|
||||
TARGET_INCLUDE_DIRECTORIES(mkvdate PUBLIC inc)
|
||||
|
||||
@@ -124,6 +124,17 @@ BIGATOMS True if this emulator will support 3-byte symbols, instead of
|
||||
NEWBITBLT True if we want to use assembler BITBLT code, rather than
|
||||
have code created inline by macro calls.
|
||||
|
||||
USE_DLPI True if the ethernet API is via the SysV Data Link Provider
|
||||
Interface. Solaris uses DLPI.
|
||||
|
||||
USE_NIT True if the ethernet API is via the Network Interface Tap.
|
||||
SunOS uses NIT.
|
||||
|
||||
PKTFILTER True if the ethernet packets are to be filtered before being
|
||||
passed to the Lisp ethernet handler. Available on Sun systems
|
||||
for both the NIT and DLPI cases.
|
||||
|
||||
|
||||
bitbltsub.c:#ifdef GETBASE
|
||||
testdisplay.c:#ifdef NOTUSED
|
||||
uraid.c:#ifdef ETHERINT
|
||||
|
||||
@@ -19,7 +19,7 @@ XFLAGS = -I/opt/X11/include -DXWINDOW
|
||||
OPTFLAGS = -O2 -g
|
||||
DEBUGFLAGS = # -DDEBUG -DOPTRACE
|
||||
DFLAGS = $(DEBUGFLAGS) $(XFLAGS) \
|
||||
-DRELEASE=351 -DSTACKCHECK -DFSBCHECK -DPCTRACE
|
||||
-DRELEASE=351 # -DSTACKCHECK -DFSBCHECK -DPCTRACE
|
||||
|
||||
LDFLAGS = -L/opt/X11/lib -lX11 -lm
|
||||
LDELDFLAGS = -L/opt/X11/lib -lX11 -lm
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O2.
|
||||
OPTFLAGS = -O2 -g
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O2.
|
||||
OPTFLAGS = -O2 -g
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O2.
|
||||
OPTFLAGS = -O2 -g
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O0 for init
|
||||
OPTFLAGS = -O0 -g
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O0 for init
|
||||
OPTFLAGS = -O0 -g
|
||||
|
||||
@@ -13,7 +13,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \
|
||||
$(OBJECTDIR)xwinman.o
|
||||
|
||||
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW -DLOCK_X_UPDATES
|
||||
XFLAGS = -I/usr/local/include -DXWINDOW
|
||||
|
||||
# OPTFLAGS is normally -O0 for init
|
||||
OPTFLAGS = -O0 -g
|
||||
|
||||
@@ -41,7 +41,7 @@ OPTFLAGS = -g3 -O0
|
||||
|
||||
DEBUGFLAGS = # -DSTACKCHECK -DFNSTKCHECK
|
||||
|
||||
MACHINEFLAGS = -DOS5 -DUSE_DLPI -DLOCK_X_UPDATES
|
||||
MACHINEFLAGS = -DOS5 -DUSE_DLPI
|
||||
|
||||
# The LDEINIT wants to have NOVERSION set, so we don't hang up on
|
||||
# any change-over in versions.
|
||||
|
||||
@@ -36,7 +36,6 @@ DEBUGFLAGS = # -DSTACKCHECK -DFNSTKCHECK
|
||||
DFLAGS = $(XFLAGS) \
|
||||
$(DEBUGFLAGS) \
|
||||
-DOS5 \
|
||||
-DLOCK_X_UPDATES \
|
||||
-DRELEASE=351
|
||||
|
||||
LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm -lsocket -lnsl
|
||||
|
||||
@@ -36,7 +36,6 @@ DEBUGFLAGS = # -DSTACKCHECK -DFNSTKCHECK
|
||||
DFLAGS = $(XFLAGS) \
|
||||
$(DEBUGFLAGS) \
|
||||
-DOS5 -DUSE_DLPI \
|
||||
-DLOCK_X_UPDATES \
|
||||
-I$(OPENWINHOME)/include \
|
||||
-DRELEASE=210
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ OPTFLAGS = -O2 -g3
|
||||
|
||||
DEBUGFLAGS = # -DSTACKCHECK -DFNSTKCHECK
|
||||
|
||||
MACHINEFLAGS = -DOS5 -DUSE_DLPI -DLOCK_X_UPDATES
|
||||
MACHINEFLAGS = -DOS5 -DUSE_DLPI
|
||||
|
||||
DFLAGS = $(XFLAGS) \
|
||||
$(DEBUGFLAGS) \
|
||||
|
||||
@@ -36,7 +36,6 @@ DEBUGFLAGS = # -DSTACKCHECK -DFNSTKCHECK
|
||||
DFLAGS = $(XFLAGS) \
|
||||
$(DEBUGFLAGS) \
|
||||
-DOS5 \
|
||||
-DLOCK_X_UPDATES \
|
||||
-DUSE_DLPI \
|
||||
-DRELEASE=351
|
||||
|
||||
|
||||
@@ -1026,6 +1026,9 @@ $(OBJECTDIR)xwinman.o: $(SRCDIR)xwinman.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)xlspwindefs.h $(INCDIR)xscrolldefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)xwinman.c -o $(OBJECTDIR)xwinman.o
|
||||
|
||||
$(OBJECTDIR)sdl.o: $(SRCDIR)sdl.c $(REQUIRED-INCS)
|
||||
$(CC) $(RFLAGS) $(SRCDIR)sdl.c -o $(OBJECTDIR)sdl.o
|
||||
|
||||
$(OBJECTDIR)foreign.o: $(SRCDIR)foreign.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)/foreigndefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)foreign.c -o $(OBJECTDIR)foreign.o
|
||||
|
||||
44
bin/release-one
Executable file
44
bin/release-one
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/bin/sh
|
||||
# Make and release maiko for one os / arch
|
||||
# Hopefully to be replaced by GitHub Action
|
||||
|
||||
if [ ! -x ../../maiko/bin/machinetype ] ; then
|
||||
echo ERROR: Must be run from maiko/bin
|
||||
exit 1
|
||||
fi
|
||||
|
||||
tag=$1
|
||||
if [ -z "$tag" ] ; then
|
||||
tag=maiko-`date +%y%m%d`
|
||||
fi
|
||||
|
||||
export PATH=.:"$PATH"
|
||||
osarch=`osversion`.`machinetype`
|
||||
|
||||
|
||||
./makeright x
|
||||
./makeright init
|
||||
|
||||
cd ../..
|
||||
mkdir -p maiko/build
|
||||
echo making $tag-$osarch.tgz
|
||||
|
||||
tar cfz maiko/build/$tag-$osarch.tgz \
|
||||
maiko/bin/osversion \
|
||||
maiko/bin/machinetype \
|
||||
maiko/bin/config.guess \
|
||||
maiko/bin/config.sub \
|
||||
maiko/$osarch/lde*
|
||||
|
||||
if ! command -v gh >/dev/null ; then
|
||||
echo
|
||||
echo The GitHub Command Line Interface, gh
|
||||
echo does not seem to be installed.
|
||||
echo Please upload maiko/build/$tag-$osarch.tgz
|
||||
echo to https://github.com/Interlisp/maiko/releases $tag
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo uploading
|
||||
cd maiko
|
||||
gh release upload --clobber $tag build/$tag-$osarch.tgz
|
||||
36
bin/start-release
Executable file
36
bin/start-release
Executable file
@@ -0,0 +1,36 @@
|
||||
#!/bin/sh
|
||||
# This script is just a placeholder until we get GitHub
|
||||
# Actions to do releases
|
||||
|
||||
# Start Maiko release from maiko/bin
|
||||
# startrelease [tag]
|
||||
# tag defaults to maiko-YYMMDD
|
||||
|
||||
tag=$1
|
||||
if [ -z "$tag" ] ; then
|
||||
tag=maiko-`date +%y%m%d`
|
||||
fi
|
||||
|
||||
if ! command -v gh >/dev/null ; then
|
||||
echo "It seems like 'gh', the GitHub Command Line Interface is"
|
||||
echo "not installed. You can start a release using the"
|
||||
echo "web interface at"
|
||||
echo "https://github.com/Interlisp/maiko/releases/new"
|
||||
echo "Make up a tag (or use $tag)"
|
||||
echo "and run './release-one tag' (or manually upload if"
|
||||
echo "no 'gh' is installed) on every os/machine you want"
|
||||
echo "this release to work for"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Now for the only thing this script is actually doing
|
||||
|
||||
gh release create $tag -p -t $tag -n "See release notes in medley repo"
|
||||
|
||||
|
||||
echo "Now run "
|
||||
echo ./release-one $tag
|
||||
echo "in maiko/bin on every os/machine you want this release"
|
||||
echo "to work for. When done, edit the release in your"
|
||||
echo "browser and uncheck the prerelease box "
|
||||
|
||||
@@ -44,6 +44,10 @@ extern DLword *DISP_MAX_Address;
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
#define DISPLAYBUFFER
|
||||
#endif /* DOS */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef KEYEVENTDEFS_H
|
||||
#define KEYEVENTDEFS_H 1
|
||||
#include <sys/types.h>
|
||||
void getsignaldata(int sig);
|
||||
void process_io_events();
|
||||
void kb_trans(u_short keycode, u_short upflg);
|
||||
void taking_mouse_down(void);
|
||||
void copy_cursor(int newx, int newy);
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
NumericStringP(vp, YES, NO); \
|
||||
NO: *vp = 0; \
|
||||
YES: \
|
||||
if ((*vp)) ver = atoi(vp); \
|
||||
if ((*vp)) ver = strtol(vp, (char **)NULL, 10); \
|
||||
else ver = -1; \
|
||||
} \
|
||||
else ver = -1; \
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
\
|
||||
register char *lv_cp; \
|
||||
register char *lv_vp; \
|
||||
register int lv_ver; \
|
||||
register unsigned lv_ver; \
|
||||
char lv_ver_buf[VERSIONLEN]; \
|
||||
\
|
||||
lv_cp = pathname; \
|
||||
@@ -48,12 +48,12 @@
|
||||
/* \
|
||||
* Convert the remaining field to digit. \
|
||||
*/ \
|
||||
lv_ver = atoi(lv_vp + 1); \
|
||||
if (lv_ver == 0) { \
|
||||
lv_ver = strtoul(lv_vp + 1, (char **)NULL, 10); \
|
||||
if (lv_ver == 0) { \
|
||||
/* versionless */ \
|
||||
*lv_vp = 0; \
|
||||
} else { \
|
||||
sprintf(lv_ver_buf, ".~%d~", lv_ver); \
|
||||
sprintf(lv_ver_buf, ".~%u~", lv_ver); \
|
||||
*lv_vp = 0; \
|
||||
strcat(pathname, lv_ver_buf); \
|
||||
} \
|
||||
@@ -61,7 +61,7 @@
|
||||
\
|
||||
NO: \
|
||||
strcpy(lv_ver_buf, lv_vp + 1); \
|
||||
strcat(lv_ver_buf, "~"); \
|
||||
strcat(lv_ver_buf, "~"); \
|
||||
*lv_vp++ = '.'; \
|
||||
*lv_vp++ = '~'; \
|
||||
*lv_vp = 0; \
|
||||
|
||||
@@ -385,9 +385,9 @@ extern DLword *Lisp_world; /* To access LispSysout area */
|
||||
*(start - 1) = ';'; \
|
||||
*start = '\0'; \
|
||||
*end = '\0'; \
|
||||
/* call ato i to eliminate leading 0s. */ \
|
||||
ver_no = atoi(start + 1); \
|
||||
sprintf(ver_buf, "%d", ver_no); \
|
||||
/* call strtoul() to eliminate leading 0s. */ \
|
||||
ver_no = strtoul(start + 1, (char **)NULL, 10); \
|
||||
sprintf(ver_buf, "%u", ver_no); \
|
||||
strcat(pathname, ver_buf); \
|
||||
goto CONT; \
|
||||
\
|
||||
@@ -494,7 +494,7 @@ extern DLword *Lisp_world; /* To access LispSysout area */
|
||||
|
||||
#define MAXVERSION 999999999
|
||||
|
||||
#define LASTVERSIONARRAY (-1)
|
||||
#define LASTVERSIONARRAY ((unsigned) -1)
|
||||
#define VERSIONARRAYLENGTH 200
|
||||
|
||||
#define NoFileP(varray) \
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "lispemul.h" /* for LispPTR, DLword */
|
||||
#include "miscstat.h" /* for MISCSTAT */
|
||||
|
||||
extern DLword *Atomspace; /* ATOMSPACE */
|
||||
extern DLword *Stackspace; /* STACKSPACE*/
|
||||
extern DLword *Plistspace; /* PLISTSPACE */
|
||||
extern DLword *DTDspace; /* DTDSPACE */
|
||||
@@ -41,8 +40,6 @@
|
||||
extern DLword *AtomSpace; /* New atoms, initial set */
|
||||
extern DLword *Defspace; /* DEFSPACE */
|
||||
extern DLword *Valspace; /* VALSPACE */
|
||||
extern DLword *Spospspace; /* POSITIVE Smallp */
|
||||
extern DLword *Snegspace; /* NEGATIVE Smallp */
|
||||
|
||||
/* For Virtual Mem Management */
|
||||
#ifdef BIGVM
|
||||
@@ -82,7 +79,6 @@ extern DLword *UFNTable ;
|
||||
|
||||
|
||||
/* FLEX STORAGES */
|
||||
extern DLword *Arrayspace; /* Start of ARRAYSPACE */
|
||||
extern DLword *MDS_space_bottom; /* Start of MDS (pre -2) */
|
||||
extern DLword *PnCharspace ; /* Space for PN char codes (Thin only) */
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#ifndef MAINDEFS_H
|
||||
#define MAINDEFS_H 1
|
||||
int makepathname(char *src, char *dst);
|
||||
void start_lisp(void);
|
||||
void print_info_lines(void);
|
||||
#endif
|
||||
|
||||
@@ -5,6 +5,5 @@ DLword compute_hash(const char *char_base, DLword offset, DLword length);
|
||||
DLword compute_lisp_hash(const char *char_base, DLword offset, DLword length, DLword fatp);
|
||||
LispPTR compare_chars(register const char *char1, register const char *char2, register DLword length);
|
||||
LispPTR compare_lisp_chars(register const char *char1, register const char *char2, register DLword length, DLword fat1, DLword fat2);
|
||||
LispPTR make_atom(const char *char_base, DLword offset, DLword length, short int non_numericp);
|
||||
LispPTR parse_number(const char *char_base, short int length);
|
||||
LispPTR make_atom(const char *char_base, DLword offset, DLword length);
|
||||
#endif
|
||||
|
||||
2
inc/my.h
2
inc/my.h
@@ -71,7 +71,7 @@
|
||||
}
|
||||
|
||||
static inline LispPTR
|
||||
aref_switch(int type, LispPTR tos, LispPTR baseL, int index)
|
||||
aref_switch(unsigned type, LispPTR tos, LispPTR baseL, int index)
|
||||
{
|
||||
LispPTR result;
|
||||
DLword *wordp;
|
||||
|
||||
11
inc/sdldefs.h
Normal file
11
inc/sdldefs.h
Normal file
@@ -0,0 +1,11 @@
|
||||
#ifndef SDLDEFS_H
|
||||
#define SDLDEFS_H 1
|
||||
|
||||
void sdl_notify_damage(int x, int y, int w, int h);
|
||||
void sdl_setCursor(int hot_x, int hot_y);
|
||||
void sdl_bitblt_to_screen(int x, int y, int w, int h);
|
||||
void sdl_set_invert(int flag);
|
||||
void sdl_setMousePosition(int x, int y);
|
||||
void process_SDLevents();
|
||||
int init_SDL(char *windowtitle, int w, int h, int s);
|
||||
#endif
|
||||
332
inc/subrs.h
332
inc/subrs.h
@@ -1,194 +1,150 @@
|
||||
#ifndef SUBRS_H
|
||||
#define SUBRS_H 1
|
||||
|
||||
/* $Id: subrs.h,v 1.2 1999/01/03 02:06:24 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
|
||||
|
||||
/* This file written from LLSUBRS on 13-Sep-2021 15:19:22 */
|
||||
/* Do not edit this file! Instead, edit the list \initsubrs */
|
||||
/* on the lisp file LLSUBRS and then call WRITECALLSUBRS to */
|
||||
/* generate a new version. */
|
||||
#define sb_BACKGROUNDSUBR 06
|
||||
#define sb_CHECKBCPLPASSWORD 07
|
||||
#define sb_DISKPARTITION 010
|
||||
#define sb_DSPBOUT 011
|
||||
#define sb_DSPRATE 012
|
||||
#define sb_GATHERSTATS 013
|
||||
#define sb_GETPACKETBUFFER 014
|
||||
#define sb_LISPFINISH 015
|
||||
#define sb_MOREVMEMFILE 016
|
||||
#define sb_RAID 017
|
||||
#define sb_READRAWPBI 020
|
||||
#define sb_WRITERAWPBI 021
|
||||
#define sb_SETSCREENCOLOR 022
|
||||
#define sb_SHOWDISPLAY 023
|
||||
#define sb_PUPLEVEL1STATE 024
|
||||
#define sb_WRITESTATS 025
|
||||
#define sb_CONTEXTSWITCH 026
|
||||
#define sb_COPYSYS0SUBR 027
|
||||
#define sb_WRITEMAP 030
|
||||
|
||||
#define sb_UFS_GETFILENAME 042
|
||||
#define sb_UFS_DELETEFILE 043
|
||||
#define sb_UFS_RENAMEFILE 044
|
||||
#define sb_COM_READPAGES 045
|
||||
#define sb_COM_WRITEPAGES 046
|
||||
#define sb_COM_TRUNCATEFILE 047
|
||||
|
||||
#define sb_UFS_DIRECTORYNAMEP 051
|
||||
#define sb_COM_GETFREEBLOCK 055
|
||||
#define sb_SETUNIXTIME 060
|
||||
#define sb_GETUNIXTIME 061
|
||||
#define sb_COPYTIMESTATS 062
|
||||
#define sb_UNIX_USERNAME 063
|
||||
#define sb_UNIX_FULLNAME 064
|
||||
#define sb_UNIX_GETENV 065
|
||||
#define sb_UNIX_GETPARM 066
|
||||
#define sb_CHECK_SUM 067
|
||||
#define sb_ETHER_SUSPEND 070
|
||||
#define sb_ETHER_RESUME 071
|
||||
#define sb_ETHER_AVAILABLE 072
|
||||
#define sb_ETHER_RESET 073
|
||||
#define sb_ETHER_GET 074
|
||||
#define sb_ETHER_SEND 075
|
||||
#define sb_ETHER_SETFILTER 076
|
||||
#define sb_ETHER_CHECK 077
|
||||
#define sb_DSPCURSOR 0100
|
||||
#define sb_SETMOUSEXY 0101
|
||||
#define sb_DSP_VIDEOCOLOR 0102
|
||||
#define sb_DSP_SCREENWIDTH 0103
|
||||
#define sb_DSP_SCREENHEIGHT 0104
|
||||
#define sb_BITBLTSUB 0105
|
||||
#define sb_BLTCHAR 0106
|
||||
#define sb_TEDIT_BLTCHAR 0107
|
||||
#define sb_BITBLT_BITMAP 0110
|
||||
#define sb_BLTSHADE_BITMAP 0111
|
||||
|
||||
#define sb_RS232C_CMD 0112
|
||||
#define sb_RS232C_READ_INIT 0113
|
||||
#define sb_RS232C_WRITE 0114
|
||||
|
||||
#define sb_KEYBOARDBEEP 0120
|
||||
#define sb_KEYBOARDMAP 0121
|
||||
#define sb_KEYBOARDSTATE 0122
|
||||
|
||||
#define sb_VMEMSAVE 0131
|
||||
#define sb_LISP_FINISH 0132
|
||||
#define sb_NEWPAGE 0133
|
||||
#define sb_DORECLAIM 0134
|
||||
#define sb_DUMMY_135Q 0135
|
||||
#define sb_NATIVE_MEMORY_REFERENCE 0136
|
||||
#define sb_OLD_COMPILE_LOAD_NATIVE 0137 /* obsolete */
|
||||
#define sb_DISABLEGC 0140
|
||||
|
||||
#define sb_COM_SETFILEINFO 0147
|
||||
#define sb_COM_OPENFILE 0150
|
||||
#define sb_COM_CLOSEFILE 0151
|
||||
#define sb_DSK_GETFILENAME 0152
|
||||
#define sb_DSK_DELETEFILE 0153
|
||||
#define sb_DSK_RENAMEFILE 0154
|
||||
#define sb_COM_NEXT_FILE 0156
|
||||
#define sb_COM_FINISH_FINFO 0157
|
||||
#define sb_COM_GEN_FILES 0160
|
||||
#define sb_DSK_DIRECTORYNAMEP 0161
|
||||
#define sb_COM_GETFILEINFO 0162
|
||||
#define sb_COM_CHANGEDIR 0164
|
||||
#define sb_UNIX_HANDLECOMM 0165
|
||||
#define sb_OCR_COMM 0166
|
||||
#define sb_RPC_CALL 0167
|
||||
#define sb_MESSAGE_READP 0170
|
||||
#define sb_MESSAGE_READ 0171
|
||||
#define sb_MONITOR_CONTROL 0200
|
||||
#define sb_GET_NATIVE_ADDR_FROM_LISP_PTR 0203
|
||||
#define sb_GET_LISP_PTR_FROM_NATIVE_ADDR 0204
|
||||
#define sb_LOAD_NATIVE_FILE 0205 /* obsolete */
|
||||
#define sb_SUSPEND_LISP 0206
|
||||
#define sb_NEW_BLTCHAR 0207
|
||||
#define sb_COLOR_INIT 0210
|
||||
#define sb_COLOR_SCREENMODE 0211
|
||||
#define sb_COLOR_MAP 0212
|
||||
#define sb_COLOR_BASE 0213
|
||||
#define sb_C_SlowBltChar 0214
|
||||
#define sb_TCP_OP 0220
|
||||
#define sb_WITH_SYMBOL 0221
|
||||
|
||||
/* For linear-programming interface */
|
||||
#define sb_LP_SETUP 0230
|
||||
#define sb_LP_RUN 0231
|
||||
|
||||
/* For Native Windows */
|
||||
#define sb_MNW_OP 0244
|
||||
#define sb_QUERY_WINDOWS 0245
|
||||
#define sb_FILL_IN 0246
|
||||
|
||||
|
||||
/* DLD codes */
|
||||
#define sb_CALL_C_FN 0247
|
||||
#define sb_DLD_LINK 0250
|
||||
#define sb_DLD_UNLINK_BY_FILE 0251
|
||||
#define sb_DLD_UNLINK_BY_SYMBOL 0252
|
||||
#define sb_DLD_GET_SYMBOL 0253
|
||||
#define sb_DLD_GET_FUNC 0254
|
||||
#define sb_DLD_FUNCTION_EXECUTABLE_P 0255
|
||||
#define sb_DLD_LIST_UNDEFINED_SYM 0256
|
||||
#define sb_MALLOC 0257
|
||||
#define sb_FREE 0260
|
||||
#define sb_PUT_C_BASEBYTE 0261
|
||||
#define sb_GET_C_BASEBYTE 0262
|
||||
#define sb_SMASHING_APPLY 0263
|
||||
|
||||
#ifdef TRUECOLOR
|
||||
#define sb_PICTURE_OP 0250
|
||||
#define sb_TRUE_COLOR_OP 0251
|
||||
#ifdef VIDEO
|
||||
#define sb_VIDEO_OP 0252
|
||||
#endif /* VIDEO */
|
||||
|
||||
#endif /* TRUECOLOR */
|
||||
|
||||
|
||||
#define sb_CHAR_OPENFILE 0310
|
||||
#define sb_CHAR_BIN 0311
|
||||
#define sb_CHAR_BOUT 0312
|
||||
#define sb_CHAR_IOCTL 0313
|
||||
#define sb_CHAR_CLOSEFILE 0314
|
||||
#define sb_CHAR_EOFP 0315
|
||||
#define sb_CHAR_READP 0316
|
||||
#define sb_CHAR_BINS 0317
|
||||
#define sb_CHAR_BOUTS 0320
|
||||
#define sb_CHAR_FILLBUFFER 0321
|
||||
|
||||
|
||||
|
||||
/* on the lisp file LLSUBRS and then call WRITECALLSUBRS to */
|
||||
/* generate a new version. */
|
||||
#define sb_BACKGROUNDSUBR 06
|
||||
#define sb_CHECKBCPLPASSWORD 07
|
||||
#define sb_DISKPARTITION 010
|
||||
#define sb_DSPBOUT 011
|
||||
#define sb_DSPRATE 012
|
||||
#define sb_GATHERSTATS 013
|
||||
#define sb_GETPACKETBUFFER 014
|
||||
#define sb_LISPFINISH 015
|
||||
#define sb_MOREVMEMFILE 016
|
||||
#define sb_RAID 017
|
||||
#define sb_READRAWPBI 020
|
||||
#define sb_WRITERAWPBI 021
|
||||
#define sb_SETSCREENCOLOR 022
|
||||
#define sb_SHOWDISPLAY 023
|
||||
#define sb_PUPLEVEL1STATE 024
|
||||
#define sb_WRITESTATS 025
|
||||
#define sb_CONTEXTSWITCH 026
|
||||
#define sb_COPYSYS0SUBR 027
|
||||
#define sb_WRITEMAP 030
|
||||
#define sb_UFS_GETFILENAME 042
|
||||
#define sb_UFS_DELETEFILE 043
|
||||
#define sb_UFS_RENAMEFILE 044
|
||||
#define sb_COM_READPAGES 045
|
||||
#define sb_COM_WRITEPAGES 046
|
||||
#define sb_COM_TRUNCATEFILE 047
|
||||
#define sb_UFS_DIRECTORYNAMEP 051
|
||||
#define sb_COM_GETFREEBLOCK 055
|
||||
#define sb_SETUNIXTIME 060
|
||||
#define sb_GETUNIXTIME 061
|
||||
#define sb_COPYTIMESTATS 062
|
||||
#define sb_UNIX_USERNAME 063
|
||||
#define sb_UNIX_FULLNAME 064
|
||||
#define sb_UNIX_GETENV 065
|
||||
#define sb_UNIX_GETPARM 066
|
||||
#define sb_CHECK_SUM 067
|
||||
#define sb_ETHER_SUSPEND 070
|
||||
#define sb_ETHER_RESUME 071
|
||||
#define sb_ETHER_AVAILABLE 072
|
||||
#define sb_ETHER_RESET 073
|
||||
#define sb_ETHER_GET 074
|
||||
#define sb_ETHER_SEND 075
|
||||
#define sb_ETHER_SETFILTER 076
|
||||
#define sb_ETHER_CHECK 077
|
||||
#define sb_DSPCURSOR 0100
|
||||
#define sb_SETMOUSEXY 0101
|
||||
#define sb_DSP_VIDEOCOLOR 0102
|
||||
#define sb_DSP_SCREENWIDTH 0103
|
||||
#define sb_DSP_SCREENHEIGHT 0104
|
||||
#define sb_BITBLTSUB 0105
|
||||
#define sb_BLTCHAR 0106
|
||||
#define sb_TEDIT_BLTCHAR 0107
|
||||
#define sb_BITBLT_BITMAP 0110
|
||||
#define sb_BLTSHADE_BITMAP 0111
|
||||
#define sb_RS232C_CMD 0112
|
||||
#define sb_RS232C_READ_INIT 0113
|
||||
#define sb_RS232C_WRITE 0114
|
||||
#define sb_KEYBOARDBEEP 0120
|
||||
#define sb_KEYBOARDMAP 0121
|
||||
#define sb_KEYBOARDSTATE 0122
|
||||
#define sb_VMEMSAVE 0131
|
||||
#define sb_LISP_FINISH 0132
|
||||
#define sb_NEWPAGE 0133
|
||||
#define sb_DORECLAIM 0134
|
||||
#define sb_DUMMY_135Q 0135
|
||||
#define sb_NATIVE_MEMORY_REFERENCE 0136
|
||||
#define sb_OLD_COMPILE_LOAD_NATIVE 0137
|
||||
#define sb_DISABLEGC 0140
|
||||
#define sb_COM_SETFILEINFO 0147
|
||||
#define sb_COM_OPENFILE 0150
|
||||
#define sb_COM_CLOSEFILE 0151
|
||||
#define sb_DSK_GETFILENAME 0152
|
||||
#define sb_DSK_DELETEFILE 0153
|
||||
#define sb_DSK_RENAMEFILE 0154
|
||||
#define sb_COM_NEXT_FILE 0156
|
||||
#define sb_COM_FINISH_FINFO 0157
|
||||
#define sb_COM_GEN_FILES 0160
|
||||
#define sb_DSK_DIRECTORYNAMEP 0161
|
||||
#define sb_COM_GETFILEINFO 0162
|
||||
#define sb_COM_CHANGEDIR 0164
|
||||
#define sb_UNIX_HANDLECOMM 0165
|
||||
#define sb_RPC_CALL 0167
|
||||
#define sb_MESSAGE_READP 0170
|
||||
#define sb_MESSAGE_READ 0171
|
||||
#define sb_MONITOR_CONTROL 0200
|
||||
#define sb_GET_NATIVE_ADDR_FROM_LISP_PTR 0203
|
||||
#define sb_GET_LISP_PTR_FROM_NATIVE_ADDR 0204
|
||||
#define sb_LOAD_NATIVE_FILE 0205
|
||||
#define sb_SUSPEND_LISP 0206
|
||||
#define sb_NEW_BLTCHAR 0207
|
||||
#define sb_COLOR_INIT 0210
|
||||
#define sb_COLOR_SCREENMODE 0211
|
||||
#define sb_COLOR_MAP 0212
|
||||
#define sb_COLOR_BASE 0213
|
||||
#define sb_C_SlowBltChar 0214
|
||||
#define sb_UNCOLORIZE_BITMAP 0215
|
||||
#define sb_COLORIZE_BITMAP 0216
|
||||
#define sb_COLOR_8BPPDRAWLINE 0217
|
||||
#define sb_TCP_OP 0220
|
||||
#define sb_WITH_SYMBOL 0221
|
||||
#define sb_CAUSE_INTERRUPT 0222
|
||||
#define sb_OPEN_SOCKET 0240
|
||||
#define sb_CLOSE_SOCKET 0241
|
||||
#define sb_READ_SOCKET 0242
|
||||
#define sb_WRITE_SOCKET 0243
|
||||
#define sb_CALL_C_FUNCTION 0247
|
||||
#define sb_DLD_LINK 0250
|
||||
#define sb_DLD_UNLINK_BY_FILE 0251
|
||||
#define sb_DLD_UNLINK_BY_SYMBOL 0252
|
||||
#define sb_DLD_GET_SYMBOL 0253
|
||||
#define sb_DLD_GET_FUNC 0254
|
||||
#define sb_DLD_FUNCTION_EXECUTABLE_P 0255
|
||||
#define sb_DLD_LIST_UNDEFINED_SYMBOLS 0256
|
||||
#define sb_C_MALLOC 0257
|
||||
#define sb_C_FREE 0260
|
||||
#define sb_C_PUTBASEBYTE 0261
|
||||
#define sb_C_GETBASEBYTE 0262
|
||||
#define sb_CHAR_OPENFILE 0310
|
||||
#define sb_CHAR_BIN 0311
|
||||
#define sb_CHAR_BOUT 0312
|
||||
#define sb_CHAR_IOCTL 0313
|
||||
#define sb_CHAR_CLOSEFILE 0314
|
||||
#define sb_CHAR_EOFP 0315
|
||||
#define sb_CHAR_READP 0316
|
||||
#define sb_CHAR_BINS 0317
|
||||
#define sb_CHAR_BOUTS 0320
|
||||
#define sb_CHAR_FILLBUFFER 0321
|
||||
#define sb_YIELD 0322
|
||||
/* MISCN opcodes */
|
||||
#define miscn_USER_SUBR 00
|
||||
#define miscn_VALUES 01
|
||||
#define miscn_SXHASH 02
|
||||
#define miscn_EQLHASHBITSFN 03
|
||||
#define miscn_STRINGHASHBITS 04
|
||||
#define miscn_STRING_EQUAL_HASHBITS 05
|
||||
#define miscn_VALUES_LIST 06
|
||||
#define miscn_LCFetchMethod 07
|
||||
#define miscn_LCFetchMethodOrHelp 010
|
||||
#define miscn_LCFindVarIndex 011
|
||||
#define miscn_LCGetIVValue 012
|
||||
#define miscn_LCPutIVValue 013
|
||||
|
||||
/* for accessing RAW RS232C port */
|
||||
#define miscn_RAW_RS232C_OPEN 050
|
||||
#define miscn_RAW_RS232C_CLOSE 051
|
||||
#define miscn_RAW_RS232C_SETPARAM 052
|
||||
#define miscn_RAW_RS232C_GETPARAM 053
|
||||
#define miscn_RAW_RS232C_READ 054
|
||||
#define miscn_RAW_RS232C_WRITE 055
|
||||
#define miscn_RAW_RS232C_SETINT 056
|
||||
|
||||
/* for CHATTER */
|
||||
#define miscn_CHATTER 040
|
||||
|
||||
/* for EJLISP */
|
||||
#define miscn_EJLISP 060
|
||||
|
||||
#define miscn_USER_SUBR 00
|
||||
#define miscn_VALUES 01
|
||||
#define miscn_SXHASH 02
|
||||
#define miscn_EQLHASHBITSFN 03
|
||||
#define miscn_STRINGHASHBITS 04
|
||||
#define miscn_STRING_EQUAL_HASHBITS 05
|
||||
#define miscn_VALUES_LIST 06
|
||||
#define miscn_LCFetchMethod 07
|
||||
#define miscn_LCFetchMethodOrHelp 010
|
||||
#define miscn_LCFindVarIndex 011
|
||||
#define miscn_LCGetIVValue 012
|
||||
#define miscn_LCPutIVValue 013
|
||||
/* Assigned USER SUBR numbers */
|
||||
#define user_subr_DUMMY 012
|
||||
#define user_subr_SAMPLE_USER_SUBR 00
|
||||
|
||||
#define user_subr_DUMMY 012
|
||||
#define user_subr_SAMPLE_USER_SUBR 00
|
||||
#endif
|
||||
|
||||
@@ -61,8 +61,8 @@ extern int TIMEOUT_TIME;
|
||||
/************************************************************************/
|
||||
|
||||
#define INTRSAFE(exp) \
|
||||
do {} while ((int)(exp) == -1 && errno == EINTR)
|
||||
do {errno = 0; } while ((exp) == -1 && errno == EINTR)
|
||||
|
||||
#define INTRSAFE0(exp) \
|
||||
do {} while ((int)(exp) == 0 && errno == EINTR)
|
||||
do {errno = 0; } while ((exp) == NULL && errno == EINTR)
|
||||
#endif /* TIMEOUT_H */
|
||||
|
||||
18
inc/tosfns.h
18
inc/tosfns.h
@@ -513,7 +513,8 @@
|
||||
#ifndef BIGATOMS
|
||||
#define EVAL \
|
||||
do { \
|
||||
LispPTR scratch, work, lookuped; \
|
||||
LispPTR work, lookuped; \
|
||||
DLword scratch[2]; \
|
||||
switch (TOPOFSTACK & SEGMASK) { \
|
||||
case S_POSITIVE: \
|
||||
case S_NEGATIVE: \
|
||||
@@ -521,8 +522,8 @@
|
||||
case ATOM_OFFSET: \
|
||||
if ((TOPOFSTACK == NIL_PTR) || (TOPOFSTACK == ATOM_T)) \
|
||||
goto Hack_Label; \
|
||||
nnewframe(CURRENTFX, &scratch, TOPOFSTACK & 0xffff); \
|
||||
work = POINTERMASK & swapx(scratch); \
|
||||
nnewframe(CURRENTFX, scratch, TOPOFSTACK & 0xffff); \
|
||||
work = POINTERMASK & ((GETBASEWORD(scratch,1) << 16) | GETBASEWORD(scratch,0)); \
|
||||
lookuped = *((LispPTR *)(Addr68k_from_LADDR(work))); \
|
||||
if (lookuped == NOBIND_PTR) \
|
||||
goto op_ufn; \
|
||||
@@ -552,7 +553,8 @@
|
||||
#else
|
||||
#define EVAL \
|
||||
do { \
|
||||
LispPTR scratch, work, lookuped; \
|
||||
LispPTR work, lookuped; \
|
||||
DLword scratch[2]; \
|
||||
switch (TOPOFSTACK & SEGMASK) { \
|
||||
case S_POSITIVE: \
|
||||
case S_NEGATIVE: \
|
||||
@@ -560,8 +562,8 @@
|
||||
case ATOM_OFFSET: \
|
||||
if ((TOPOFSTACK == NIL_PTR) || (TOPOFSTACK == ATOM_T)) \
|
||||
goto Hack_Label; \
|
||||
nnewframe(CURRENTFX, &scratch, TOPOFSTACK & 0xffff); \
|
||||
work = POINTERMASK & swapx(scratch); \
|
||||
nnewframe(CURRENTFX, scratch, TOPOFSTACK & 0xffff); \
|
||||
work = POINTERMASK & ((GETBASEWORD(scratch,1) << 16) | GETBASEWORD(scratch,0)); \
|
||||
lookuped = *((LispPTR *)(Addr68k_from_LADDR(work))); \
|
||||
if (lookuped == NOBIND_PTR) \
|
||||
goto op_ufn; \
|
||||
@@ -584,8 +586,8 @@
|
||||
fn_apply = 0; \
|
||||
goto op_fn_common; \
|
||||
case TYPE_NEWATOM: \
|
||||
nnewframe(CURRENTFX, &scratch, TOPOFSTACK); \
|
||||
work = POINTERMASK & swapx(scratch); \
|
||||
nnewframe(CURRENTFX, scratch, TOPOFSTACK); \
|
||||
work = POINTERMASK & ((GETBASEWORD(scratch,1) << 16) | GETBASEWORD(scratch,0)); \
|
||||
lookuped = *((LispPTR *)(Addr68k_from_LADDR(work))); \
|
||||
if (lookuped == NOBIND_PTR) \
|
||||
goto op_ufn; \
|
||||
|
||||
@@ -223,7 +223,6 @@ error Must specify RELEASE to build Medley.
|
||||
#ifdef OS5
|
||||
/* Solaris, sort of SYSV-ish, but not really */
|
||||
#define MAIKO_ENABLE_ETHERNET
|
||||
#define LOCK_X_UPDATES 1
|
||||
#endif /* OS5 */
|
||||
|
||||
|
||||
|
||||
@@ -6,5 +6,5 @@ void lisp_Xexit(DspInterface dsp);
|
||||
void Xevent_before_raid(DspInterface dsp);
|
||||
void Xevent_after_raid(DspInterface dsp);
|
||||
void Open_Display(DspInterface dsp);
|
||||
DspInterface X_init(DspInterface dsp, char *lispbitmap, int width_hint, int height_hint, int depth_hint);
|
||||
DspInterface X_init(DspInterface dsp, LispPTR lispbitmap, int width_hint, int height_hint, int depth_hint);
|
||||
#endif
|
||||
|
||||
@@ -8,5 +8,5 @@ void Set_BitGravity(XButtonEvent *event, DspInterface dsp, Window window, int gr
|
||||
void enable_Xkeyboard(DspInterface dsp);
|
||||
void disable_Xkeyboard(DspInterface dsp);
|
||||
void beep_Xkeyboard(DspInterface dsp);
|
||||
void getXsignaldata(DspInterface dsp);
|
||||
void process_Xevents(DspInterface dsp);
|
||||
#endif
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/*** N_OP_aref1 -- op 266 (array index) ***/
|
||||
LispPTR N_OP_aref1(register LispPTR arrayarg, register LispPTR inx) {
|
||||
register LispPTR baseL;
|
||||
register int type, index;
|
||||
register int index;
|
||||
register OneDArray *arrayblk;
|
||||
|
||||
/* verify array */
|
||||
@@ -45,12 +45,9 @@ LispPTR N_OP_aref1(register LispPTR arrayarg, register LispPTR inx) {
|
||||
if (index >= arrayblk->totalsize) ERROR_EXIT(inx);
|
||||
index += arrayblk->offset;
|
||||
|
||||
/* setup typenumber */
|
||||
type = 0xFF & arrayblk->typenumber;
|
||||
|
||||
/* setup base */
|
||||
baseL = arrayblk->base;
|
||||
|
||||
/* disp on type */
|
||||
return (aref_switch(type, inx, baseL, index));
|
||||
return (aref_switch(arrayblk->typenumber, inx, baseL, index));
|
||||
} /* end N_OP_aref1() */
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
/************************************************************************/
|
||||
|
||||
LispPTR N_OP_aset1(register LispPTR data, LispPTR arrayarg, register int inx) {
|
||||
register int type;
|
||||
register OneDArray *arrayblk;
|
||||
register LispPTR base;
|
||||
register int new;
|
||||
@@ -57,14 +56,11 @@ LispPTR N_OP_aset1(register LispPTR data, LispPTR arrayarg, register int inx) {
|
||||
if (index >= arrayblk->totalsize) ERROR_EXIT(inx);
|
||||
index += arrayblk->offset;
|
||||
|
||||
/* setup typenumber */
|
||||
type = 0xFF & arrayblk->typenumber;
|
||||
|
||||
/* setup base */
|
||||
base = arrayblk->base;
|
||||
|
||||
/* disp on type */
|
||||
aset_switch(type, inx);
|
||||
aset_switch(arrayblk->typenumber, inx);
|
||||
|
||||
doufn:
|
||||
ERROR_EXIT(inx);
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
LispPTR N_OP_aref2(LispPTR arrayarg, LispPTR inx0, LispPTR inx1) {
|
||||
#define REG
|
||||
LispPTR baseL;
|
||||
int type;
|
||||
int arindex, temp;
|
||||
LispArray *arrayblk;
|
||||
int j;
|
||||
@@ -59,9 +58,6 @@ LispPTR N_OP_aref2(LispPTR arrayarg, LispPTR inx0, LispPTR inx1) {
|
||||
arindex *= j;
|
||||
arindex += temp;
|
||||
|
||||
/* setup typenumber */
|
||||
type = 0xFF & arrayblk->typenumber;
|
||||
|
||||
/* disp on type */
|
||||
return (aref_switch(type, inx1, baseL, arindex));
|
||||
return (aref_switch(arrayblk->typenumber, inx1, baseL, arindex));
|
||||
} /* end N_OP_aref2() */
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
|
||||
/*** N_OP_aset2 -- op 357 (new-value array index0 index1) ***/
|
||||
LispPTR N_OP_aset2(register LispPTR data, LispPTR arrayarg, LispPTR inx0, LispPTR inx1) {
|
||||
register int type;
|
||||
register LispArray *arrayblk;
|
||||
register LispPTR base;
|
||||
register int new;
|
||||
@@ -46,11 +45,8 @@ LispPTR N_OP_aset2(register LispPTR data, LispPTR arrayarg, LispPTR inx0, LispPT
|
||||
index *= j;
|
||||
index += temp;
|
||||
|
||||
/* setup typenumber */
|
||||
type = 0xFF & arrayblk->typenumber;
|
||||
|
||||
/* disp on type */
|
||||
aset_switch(type, inx1);
|
||||
aset_switch(arrayblk->typenumber, inx1);
|
||||
|
||||
doufn:
|
||||
ERROR_EXIT(inx1);
|
||||
|
||||
19
src/bbtsub.c
19
src/bbtsub.c
@@ -479,6 +479,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -834,6 +838,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -1081,6 +1089,10 @@ do_it_now:
|
||||
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
/* Copy the changed section of display bank to the frame buffer */
|
||||
if (in_display_segment(dstbase)) {
|
||||
@@ -1210,6 +1222,10 @@ void bltchar(LispPTR *args)
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef DOS
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* DOS */
|
||||
@@ -1423,6 +1439,9 @@ void newbltchar(LispPTR *args) {
|
||||
#ifdef XWINDOW
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* XWINDOW */
|
||||
#ifdef SDL
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* SDL */
|
||||
#ifdef DOS
|
||||
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
|
||||
#endif /* DOS */
|
||||
|
||||
@@ -33,7 +33,7 @@ LispPTR *N_OP_bind(register LispPTR *stack_pointer, register LispPTR tos, int by
|
||||
register int n1; /* # slots to bind to NIL (0, 0) */
|
||||
register int n2; /* # slots to bind to value in stack */
|
||||
register LispPTR *ppvar; /* pointer to argued slot in Pvar area */
|
||||
register int i; /* temporary for control */
|
||||
register unsigned i; /* temporary for control */
|
||||
|
||||
#ifdef TRACE
|
||||
printPC();
|
||||
|
||||
33
src/dir.c
33
src/dir.c
@@ -329,7 +329,7 @@ void print_finfo(FINFO *fp)
|
||||
if (fp != (FINFO *)NULL) {
|
||||
do {
|
||||
printf("%s -> ", fp->lname);
|
||||
printf("%d\n", fp->version);
|
||||
printf("%u\n", fp->version);
|
||||
fp = fp->next;
|
||||
} while (fp != (FINFO *)NULL && fp != sp);
|
||||
|
||||
@@ -685,13 +685,13 @@ static int enum_dsk_prop(char *dir, char *name, char *ver, FINFO **finfo_buf)
|
||||
if (*fver == '\0')
|
||||
nextp->version = 0;
|
||||
else
|
||||
nextp->version = atoi(fver);
|
||||
nextp->version = strtoul(fver, (char **)NULL, 10);
|
||||
nextp->ino = sbuf.st_ino;
|
||||
nextp->prop->length = (unsigned)sbuf.st_size;
|
||||
nextp->prop->wdate = (unsigned)ToLispTime(sbuf.st_mtime);
|
||||
nextp->prop->rdate = (unsigned)ToLispTime(sbuf.st_atime);
|
||||
nextp->prop->protect = (unsigned)sbuf.st_mode;
|
||||
TIMEOUT(pwd = getpwuid(sbuf.st_uid));
|
||||
TIMEOUT0(pwd = getpwuid(sbuf.st_uid));
|
||||
if (pwd == (struct passwd *)NULL) {
|
||||
nextp->prop->au_len = 0;
|
||||
} else {
|
||||
@@ -948,7 +948,7 @@ static int enum_dsk(char *dir, char *name, char *ver, FINFO **finfo_buf)
|
||||
if (*fver == '\0')
|
||||
nextp->version = 0;
|
||||
else
|
||||
nextp->version = atoi(fver);
|
||||
nextp->version = strtoul(fver, (char **)NULL, 10);
|
||||
nextp->ino = sbuf.st_ino;
|
||||
n++;
|
||||
}
|
||||
@@ -1080,7 +1080,7 @@ static int enum_ufs_prop(char *dir, char *name, char *ver, FINFO **finfo_buf)
|
||||
char namebuf[MAXPATHLEN];
|
||||
|
||||
errno = 0;
|
||||
TIMEOUT(dirp = opendir(dir));
|
||||
TIMEOUT0(dirp = opendir(dir));
|
||||
if (dirp == NULL) {
|
||||
*Lisp_errno = errno;
|
||||
return (-1);
|
||||
@@ -1263,7 +1263,7 @@ static int enum_ufs(char *dir, char *name, char *ver, FINFO **finfo_buf)
|
||||
char namebuf[MAXPATHLEN];
|
||||
|
||||
errno = 0;
|
||||
TIMEOUT(dirp = opendir(dir));
|
||||
TIMEOUT0(dirp = opendir(dir));
|
||||
if (dirp == NULL) {
|
||||
*Lisp_errno = errno;
|
||||
return (-1);
|
||||
@@ -1399,7 +1399,7 @@ static int trim_finfo(FINFO **fp)
|
||||
* Versionless is not linked to any versioned
|
||||
* file.
|
||||
*/
|
||||
sprintf(ver, ";%d", mp->version + 1);
|
||||
sprintf(ver, ";%u", mp->version + 1);
|
||||
strcat(sp->lname, ver);
|
||||
sp->lname_len = strlen(sp->lname);
|
||||
pnum = ++num;
|
||||
@@ -1527,7 +1527,7 @@ static int trim_finfo_highest(FINFO **fp, int highestp)
|
||||
* Versionless is not linked to any versioned
|
||||
* file.
|
||||
*/
|
||||
sprintf(ver, ";%d", mp->version + 1);
|
||||
sprintf(ver, ";%u", mp->version + 1);
|
||||
strcat(sp->lname, ver);
|
||||
sp->lname_len = strlen(sp->lname);
|
||||
/*
|
||||
@@ -1602,7 +1602,7 @@ static int trim_finfo_highest(FINFO **fp, int highestp)
|
||||
* Name: trim_finfo_version
|
||||
*
|
||||
* Argument: FINFO **fp Linked list of the numerated FINFO structures.
|
||||
* int rver Requested version number.
|
||||
* unsigned rver Requested version number.
|
||||
*
|
||||
* Value: Returns the total number of files still remaining in **fp.
|
||||
*
|
||||
@@ -1614,7 +1614,7 @@ static int trim_finfo_highest(FINFO **fp, int highestp)
|
||||
* are got rid of.
|
||||
*/
|
||||
|
||||
static int trim_finfo_version(FINFO **fp, int rver)
|
||||
static int trim_finfo_version(FINFO **fp, unsigned rver)
|
||||
{
|
||||
register FINFO *tp, *sp, *mp, *cp, *pp, *vp;
|
||||
register int num, pnum;
|
||||
@@ -1709,7 +1709,7 @@ static int trim_finfo_version(FINFO **fp, int rver)
|
||||
* file.
|
||||
*/
|
||||
if (mp->version + 1 == rver) {
|
||||
sprintf(ver, ";%d", rver);
|
||||
sprintf(ver, ";%u", rver);
|
||||
strcat(sp->lname, ver);
|
||||
sp->lname_len = strlen(sp->lname);
|
||||
/*
|
||||
@@ -1840,7 +1840,8 @@ static FINFO **prepare_sort_buf(register FINFO *fp, register int n)
|
||||
|
||||
static int dsk_filecmp(FINFO **fp1, FINFO **fp2)
|
||||
{
|
||||
register int res, v1, v2;
|
||||
register int res;
|
||||
unsigned v1, v2;
|
||||
|
||||
if ((res = strcmp((*fp1)->no_ver_name, (*fp2)->no_ver_name)) != 0) return (res);
|
||||
|
||||
@@ -2032,7 +2033,8 @@ LispPTR COM_gen_files(register LispPTR *args)
|
||||
#ifdef DOS
|
||||
char drive[1];
|
||||
#endif
|
||||
int dskp, count, highestp, propp, fid, version;
|
||||
int dskp, count, highestp, fid;
|
||||
unsigned propp, version;
|
||||
register char *cp;
|
||||
FINFO *fp;
|
||||
int dsk_filecmp(), unix_filecmp();
|
||||
@@ -2111,7 +2113,7 @@ LispPTR COM_gen_files(register LispPTR *args)
|
||||
|
||||
if (*ver != '\0') {
|
||||
highestp = 0;
|
||||
version = atoi(ver);
|
||||
version = strtoul(ver, (char **)NULL, 10);
|
||||
if (version > 0) strcpy(ver, "*");
|
||||
} else {
|
||||
version = 0;
|
||||
@@ -2193,7 +2195,8 @@ LispPTR COM_next_file(register LispPTR *args)
|
||||
register char *base;
|
||||
register DFINFO *dfp;
|
||||
register UFSGFS *gfsp;
|
||||
int finfoid, propp;
|
||||
int finfoid;
|
||||
unsigned propp;
|
||||
|
||||
ERRSETJMP(-1);
|
||||
Lisp_errno = &Dummy_errno;
|
||||
|
||||
24
src/draw.c
24
src/draw.c
@@ -17,10 +17,10 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#include "lispemul.h"
|
||||
#include "lspglob.h"
|
||||
#include "lispmap.h"
|
||||
@@ -268,21 +268,21 @@ int N_OP_drawline(LispPTR ptr, int curbit, int xsize, int width, int ysize, int
|
||||
#endif /* COLOR */
|
||||
|
||||
{
|
||||
DLword *start_addr, *temp_s, *temp_e;
|
||||
|
||||
DLword *start_addr;
|
||||
start_addr = (DLword *)Addr68k_from_LADDR(ptr);
|
||||
|
||||
if (((int)(temp_s = (DLword *)(start_addr - DisplayRegion68k)) >= 0) &&
|
||||
(start_addr < DisplayRegion68k_end_addr) &&
|
||||
((int)(temp_e = (DLword *)(dataptr - DisplayRegion68k)) >= 0) &&
|
||||
((DLword *)dataptr < DisplayRegion68k_end_addr)) {
|
||||
if (in_display_segment(start_addr) && in_display_segment(dataptr)) {
|
||||
int start_x, start_y, end_x, end_y, w, h;
|
||||
ptrdiff_t temp_s, temp_e;
|
||||
|
||||
start_y = (int)temp_s / DisplayRasterWidth;
|
||||
start_x = ((int)temp_s % DisplayRasterWidth) * BITSPER_DLWORD;
|
||||
temp_s = start_addr - DisplayRegion68k;
|
||||
temp_e = dataptr - DisplayRegion68k;
|
||||
|
||||
end_y = (int)temp_e / DisplayRasterWidth;
|
||||
end_x = ((int)temp_e % DisplayRasterWidth) * BITSPER_DLWORD + (BITSPER_DLWORD - 1);
|
||||
start_y = temp_s / DisplayRasterWidth;
|
||||
start_x = (temp_s % DisplayRasterWidth) * BITSPER_DLWORD;
|
||||
|
||||
end_y = temp_e / DisplayRasterWidth;
|
||||
end_x = (temp_e % DisplayRasterWidth) * BITSPER_DLWORD + (BITSPER_DLWORD - 1);
|
||||
|
||||
w = abs(start_x - end_x) + 1;
|
||||
h = abs(start_y - end_y) + 1;
|
||||
@@ -290,10 +290,8 @@ int N_OP_drawline(LispPTR ptr, int curbit, int xsize, int width, int ysize, int
|
||||
if (start_x > end_x) start_x = end_x;
|
||||
if (start_y > end_y) start_y = end_y;
|
||||
|
||||
|
||||
#if defined(XWINDOW) || defined(BYTESWAP)
|
||||
flush_display_region(start_x, start_y, w, h);
|
||||
|
||||
#endif /* XWINDOW */
|
||||
}
|
||||
}
|
||||
|
||||
101
src/dsk.c
101
src/dsk.c
@@ -59,7 +59,7 @@ extern int Dummy_errno;
|
||||
|
||||
typedef struct filename_entry {
|
||||
char name[MAXPATHLEN]; /* With version, foo.~3~ or foo */
|
||||
int version_no;
|
||||
unsigned version_no;
|
||||
} FileName;
|
||||
|
||||
typedef struct current_varray {
|
||||
@@ -851,7 +851,8 @@ LispPTR COM_closefile(register LispPTR *args)
|
||||
LispPTR DSK_getfilename(register LispPTR *args)
|
||||
{
|
||||
register char *base;
|
||||
register int len, dirp, rval;
|
||||
size_t len, rval;
|
||||
register int dirp;
|
||||
int fatp;
|
||||
char lfname[MAXPATHLEN];
|
||||
char aname[MAXNAMLEN];
|
||||
@@ -1510,7 +1511,8 @@ LispPTR DSK_directorynamep(register LispPTR *args)
|
||||
{
|
||||
char dirname[MAXPATHLEN];
|
||||
char fullname[MAXPATHLEN];
|
||||
register int len, fatp;
|
||||
size_t len;
|
||||
register int fatp;
|
||||
register char *base;
|
||||
#ifdef DOS
|
||||
char drive[1], rawname[MAXNAMLEN];
|
||||
@@ -1697,9 +1699,10 @@ LispPTR COM_getfileinfo(register LispPTR *args)
|
||||
*bufp = sbuf.st_mode;
|
||||
return (ATOM_T);
|
||||
|
||||
case AUTHOR:
|
||||
case AUTHOR: {
|
||||
size_t rval;
|
||||
#ifndef DOS
|
||||
TIMEOUT(pwd = getpwuid(sbuf.st_uid));
|
||||
TIMEOUT0(pwd = getpwuid(sbuf.st_uid));
|
||||
if (pwd == (struct passwd *)NULL) {
|
||||
/*
|
||||
* Returns Lisp 0. Lisp code handles this case as author
|
||||
@@ -1717,8 +1720,9 @@ LispPTR COM_getfileinfo(register LispPTR *args)
|
||||
#endif /* BYTESWAP */
|
||||
#endif /* DOS */
|
||||
return (GetSmallp(rval));
|
||||
|
||||
case ALL:
|
||||
}
|
||||
case ALL: {
|
||||
size_t rval;
|
||||
/*
|
||||
* The format of the buffer which has been allocated by Lisp
|
||||
* is as follows.
|
||||
@@ -1744,7 +1748,7 @@ LispPTR COM_getfileinfo(register LispPTR *args)
|
||||
bufp = (unsigned *)(Addr68k_from_LADDR(laddr));
|
||||
*bufp = sbuf.st_mode;
|
||||
#ifndef DOS
|
||||
TIMEOUT(pwd = getpwuid(sbuf.st_uid));
|
||||
TIMEOUT0(pwd = getpwuid(sbuf.st_uid));
|
||||
if (pwd == (struct passwd *)NULL) { return (GetSmallp(0)); }
|
||||
laddr = cdr(car(cdr(cdr(cdr(cdr(args[2]))))));
|
||||
STRING_BASE(laddr, base);
|
||||
@@ -1756,7 +1760,7 @@ LispPTR COM_getfileinfo(register LispPTR *args)
|
||||
#endif /* BYTESWAP */
|
||||
#endif /* DOS */
|
||||
return (GetSmallp(rval));
|
||||
|
||||
}
|
||||
default: return (NIL);
|
||||
}
|
||||
}
|
||||
@@ -2365,7 +2369,7 @@ LispPTR COM_getfreeblock(register LispPTR *args)
|
||||
void separate_version(char *name, char *ver, int checkp)
|
||||
{
|
||||
register char *start, *end, *cp;
|
||||
register int ver_no;
|
||||
register unsigned ver_no;
|
||||
size_t len;
|
||||
char ver_buf[VERSIONLEN];
|
||||
|
||||
@@ -2397,10 +2401,10 @@ void separate_version(char *name, char *ver, int checkp)
|
||||
*(start - 1) = '\0';
|
||||
*end = '\0';
|
||||
/*
|
||||
* Use atoi to eliminate leading 0s.
|
||||
* Use strtoul() to eliminate leading 0s.
|
||||
*/
|
||||
ver_no = atoi(start + 1);
|
||||
sprintf(ver_buf, "%d", ver_no);
|
||||
ver_no = strtoul(start + 1, (char **)NULL, 10);
|
||||
sprintf(ver_buf, "%u", ver_no);
|
||||
strcpy(ver, ver_buf);
|
||||
return;
|
||||
} else {
|
||||
@@ -2502,8 +2506,8 @@ int true_name(register char *path)
|
||||
#ifdef DOS
|
||||
char drive[1];
|
||||
#endif
|
||||
register char *sp, *cp;
|
||||
register int type, c;
|
||||
register char c, *sp, *cp;
|
||||
register int type;
|
||||
|
||||
if (strcmp(path, "/") == 0) return (-1);
|
||||
|
||||
@@ -3025,7 +3029,7 @@ static int get_version_array(char *dir, char *file, FileName *varray, CurrentVAr
|
||||
* separator_version guarantees ver is a numeric
|
||||
* string.
|
||||
*/
|
||||
svarray->version_no = atoi(ver);
|
||||
svarray->version_no = strtoul(ver, (char **)NULL, 10);
|
||||
}
|
||||
svarray++;
|
||||
}
|
||||
@@ -3119,7 +3123,7 @@ static int get_version_array(char *dir, char *file, FileName *varray, CurrentVAr
|
||||
* separator_version guarantees ver is a numeric
|
||||
* string.
|
||||
*/
|
||||
svarray->version_no = atoi(ver);
|
||||
svarray->version_no = strtoul(ver, (char **)NULL, 10);
|
||||
}
|
||||
svarray++;
|
||||
}
|
||||
@@ -3263,7 +3267,7 @@ static int maintain_version(char *file, FileName *varray, int forcep)
|
||||
* is versioned one higher than the existing highest version.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(ver, "%d", max_no + 1);
|
||||
sprintf(ver, "%u", max_no + 1);
|
||||
/*
|
||||
* The old file should have the same case name as the versionless
|
||||
* file.
|
||||
@@ -3395,7 +3399,8 @@ static int get_versionless(FileName *varray, char *file, char *dir)
|
||||
|
||||
static int check_vless_link(char *vless, FileName *varray, char *to_file, int *highest_p)
|
||||
{
|
||||
register int rval, max_no, found;
|
||||
register int rval, found;
|
||||
unsigned max_no;
|
||||
ino_t vless_ino;
|
||||
struct stat sbuf;
|
||||
char dir[MAXPATHLEN], name[MAXNAMLEN], ver[VERSIONLEN];
|
||||
@@ -3498,7 +3503,7 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
{
|
||||
char name[MAXPATHLEN], vless[MAXPATHLEN], to_file[MAXPATHLEN];
|
||||
char ver[VERSIONLEN], vbuf[VERSIONLEN];
|
||||
register int ver_no, max_no;
|
||||
register unsigned ver_no, max_no;
|
||||
int highest_p;
|
||||
register FileName *entry;
|
||||
|
||||
@@ -3528,7 +3533,7 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -3552,7 +3557,7 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
} else {
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
if (ver_no == 1) {
|
||||
/*
|
||||
* Version 1 is specified. The versionless file is
|
||||
@@ -3586,13 +3591,13 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* link missing versionless file.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(vbuf, "%d", max_no + 1);
|
||||
sprintf(vbuf, "%u", max_no + 1);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
} else {
|
||||
/* A version is specified. */
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
if (ver_no == max_no + 1) {
|
||||
/*
|
||||
@@ -3601,7 +3606,7 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* is dealt with as a version of the link
|
||||
* missing versionless file.
|
||||
*/
|
||||
sprintf(vbuf, "%d", ver_no);
|
||||
sprintf(vbuf, "%u", ver_no);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
@@ -3640,7 +3645,7 @@ static int get_old(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -3697,7 +3702,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
{
|
||||
char name[MAXPATHLEN], vless[MAXPATHLEN], to_file[MAXPATHLEN];
|
||||
char ver[VERSIONLEN], vbuf[VERSIONLEN];
|
||||
register int ver_no, min_no;
|
||||
register unsigned ver_no, min_no;
|
||||
int highest_p;
|
||||
register FileName *entry;
|
||||
|
||||
@@ -3727,7 +3732,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -3751,7 +3756,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
} else {
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
if (ver_no == 1) {
|
||||
/*
|
||||
* Version 1 is specified. The versionless file is
|
||||
@@ -3788,7 +3793,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
return (1);
|
||||
} else {
|
||||
/* A version is specified. */
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindHighestVersion(varray, entry, min_no);
|
||||
if (ver_no == min_no + 1) {
|
||||
/*
|
||||
@@ -3797,7 +3802,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* is dealt with as a version of the link
|
||||
* missing versionless file.
|
||||
*/
|
||||
sprintf(vbuf, "%d", ver_no);
|
||||
sprintf(vbuf, "%u", ver_no);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
@@ -3836,7 +3841,7 @@ static int get_oldest(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -3894,7 +3899,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
{
|
||||
char name[MAXPATHLEN], vless[MAXPATHLEN], to_file[MAXPATHLEN];
|
||||
char ver[VERSIONLEN], vbuf[VERSIONLEN];
|
||||
register int ver_no, max_no;
|
||||
register unsigned ver_no, max_no;
|
||||
int highest_p;
|
||||
register FileName *entry;
|
||||
|
||||
@@ -3942,7 +3947,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* the existing highest version.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(vbuf, "%d", max_no + 1);
|
||||
sprintf(vbuf, "%u", max_no + 1);
|
||||
/*
|
||||
* We will use the file name of the existing highest
|
||||
* versioned file as the name of the new file, so that
|
||||
@@ -3960,7 +3965,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -3998,7 +4003,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
strcpy(afile, vfile);
|
||||
return (1);
|
||||
} else {
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
if (ver_no == 1) {
|
||||
/*
|
||||
* Version 1 is specified. The versionless file is
|
||||
@@ -4034,13 +4039,13 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* missing versionless file.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(vbuf, "%d", max_no + 2);
|
||||
sprintf(vbuf, "%u", max_no + 2);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vfile);
|
||||
return (1);
|
||||
} else {
|
||||
/* A version is specified. */
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
if (ver_no == max_no + 1) {
|
||||
/*
|
||||
@@ -4049,7 +4054,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* is dealt with as a version of the link
|
||||
* missing versionless file.
|
||||
*/
|
||||
sprintf(vbuf, "%d", ver_no);
|
||||
sprintf(vbuf, "%u", ver_no);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
@@ -4097,7 +4102,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* new file.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(vbuf, "%d", max_no + 1);
|
||||
sprintf(vbuf, "%u", max_no + 1);
|
||||
/*
|
||||
* We will use the name of the highest versioned file
|
||||
* as the name of the new file.
|
||||
@@ -4114,7 +4119,7 @@ static int get_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -4188,7 +4193,7 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
{
|
||||
char name[MAXPATHLEN], vless[MAXPATHLEN], to_file[MAXPATHLEN];
|
||||
char ver[VERSIONLEN], vbuf[VERSIONLEN];
|
||||
register int ver_no, max_no;
|
||||
register unsigned ver_no, max_no;
|
||||
int highest_p;
|
||||
register FileName *entry;
|
||||
|
||||
@@ -4240,7 +4245,7 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
@@ -4278,7 +4283,7 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
} else {
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
if (ver_no == 1) {
|
||||
/*
|
||||
* Version 1 is specified. The versionless file is
|
||||
@@ -4313,13 +4318,13 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* link missing versionless file.
|
||||
*/
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
sprintf(vbuf, "%d", max_no + 1);
|
||||
sprintf(vbuf, "%u", max_no + 1);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
} else {
|
||||
/* A version is specified. */
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindHighestVersion(varray, entry, max_no);
|
||||
if (ver_no == max_no + 1) {
|
||||
/*
|
||||
@@ -4328,7 +4333,7 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* is dealt with as a version of the link
|
||||
* missing versionless file.
|
||||
*/
|
||||
sprintf(vbuf, "%d", ver_no);
|
||||
sprintf(vbuf, "%u", ver_no);
|
||||
ConcNameAndVersion(vless, vbuf, vfile);
|
||||
strcpy(afile, vless);
|
||||
return (1);
|
||||
@@ -4384,7 +4389,7 @@ static int get_old_new(char *dir, FileName *varray, char *afile, char *vfile)
|
||||
* varray and try to find the file with the specified
|
||||
* version.
|
||||
*/
|
||||
ver_no = atoi(ver);
|
||||
ver_no = strtoul(ver, (char **)NULL, 10);
|
||||
FindSpecifiedVersion(varray, entry, ver_no);
|
||||
if (entry != NULL) {
|
||||
ConcDirAndName(dir, entry->name, afile);
|
||||
|
||||
@@ -27,9 +27,6 @@ DspInterface currentdsp = &curdsp;
|
||||
#ifdef XWINDOW
|
||||
extern int LispDisplayRequestedWidth;
|
||||
extern int LispDisplayRequestedHeight;
|
||||
|
||||
extern DspInterface X_init(DspInterface dsp, char *lispbitmap, int width_hint, int height_hint,
|
||||
int depth_hint);
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef DOS
|
||||
|
||||
@@ -21,9 +21,11 @@
|
||||
|
||||
#include "dspsubrsdefs.h"
|
||||
#include "commondefs.h"
|
||||
#ifdef XWINDOW
|
||||
#if defined(XWINDOW)
|
||||
#include "xcursordefs.h"
|
||||
#include "xlspwindefs.h"
|
||||
#elif defined(SDL)
|
||||
#include "sdldefs.h"
|
||||
#endif
|
||||
|
||||
extern int DebugDSP;
|
||||
@@ -72,6 +74,13 @@ LispPTR DSP_VideoColor(LispPTR *args) /* args[0] : black flag */
|
||||
return ATOM_T;
|
||||
else
|
||||
return NIL;
|
||||
#elif defined(SDL)
|
||||
invert = args[0] & 0xFFFF;
|
||||
sdl_set_invert(invert);
|
||||
if (invert)
|
||||
return ATOM_T;
|
||||
else
|
||||
return NIL;
|
||||
#else
|
||||
return NIL;
|
||||
#endif
|
||||
@@ -96,9 +105,11 @@ void DSP_Cursor(LispPTR *args, int argnum)
|
||||
extern int LastCursorX, LastCursorY;
|
||||
|
||||
|
||||
#ifdef XWINDOW
|
||||
#if defined(XWINDOW)
|
||||
/* For X-Windows, set the cursor to the given location. */
|
||||
Set_XCursor((int)(args[0] & 0xFFFF), (int)(args[1] & 0xFFFF));
|
||||
#elif defined(SDL)
|
||||
sdl_setCursor((int)(args[0] & 0xFFFF), (int)(args[1] & 0xFFFF));
|
||||
#endif /* XWINDOW */
|
||||
}
|
||||
|
||||
@@ -118,6 +129,11 @@ void DSP_SetMousePos(register LispPTR *args)
|
||||
if (Mouse_Included)
|
||||
set_Xmouseposition((int)(GetSmalldata(args[0])), (int)(GetSmalldata(args[1])));
|
||||
#endif /* XWINDOW */
|
||||
#ifdef SDL
|
||||
int x = (int)(GetSmalldata(args[0]));
|
||||
int y = (int)(GetSmalldata(args[1]));
|
||||
sdl_setMousePosition(x, y);
|
||||
#endif /* SDL */
|
||||
}
|
||||
|
||||
/****************************************************
|
||||
@@ -178,8 +194,10 @@ void flip_cursor() {
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef XWINDOW
|
||||
#if defined(XWINDOW)
|
||||
/* JDS 011213: 15- cur y, as function does same! */
|
||||
Set_XCursor(Current_Hot_X, 15 - Current_Hot_Y);
|
||||
#elif defined(SDL)
|
||||
sdl_setCursor(0, 0); // TODO: keep track of the current hot_x and hot_y
|
||||
#endif /* XWINDOW */
|
||||
}
|
||||
|
||||
@@ -742,7 +742,7 @@ static int check_filter(u_char *buffer)
|
||||
static void init_uid() {
|
||||
int rid;
|
||||
rid = getuid();
|
||||
seteuid(rid);
|
||||
setuid(rid);
|
||||
}
|
||||
#endif /* MAIKO_ENABLE_ETHERNET */
|
||||
|
||||
@@ -830,7 +830,7 @@ void init_ether() {
|
||||
/* JDS 991228 remove perror("Can't open network; XNS unavailable.\n"); */
|
||||
ether_fd = -1;
|
||||
}
|
||||
seteuid(getuid());
|
||||
setuid(getuid());
|
||||
}
|
||||
#elif defined(USE_NIT)
|
||||
#ifndef OS4
|
||||
@@ -952,7 +952,7 @@ void init_ether() {
|
||||
perror("Can't open network; XNS unavailable.\n");
|
||||
ether_fd = -1;
|
||||
}
|
||||
seteuid(getuid());
|
||||
setuid(getuid());
|
||||
}
|
||||
|
||||
#endif /* OS4 */
|
||||
|
||||
@@ -66,6 +66,7 @@ extern DspInterface currentdsp;
|
||||
int LispWindowFd = -1;
|
||||
int FrameBufferFd = -1;
|
||||
|
||||
extern int sdl_displaywidth, sdl_displayheight, sdl_pixelscale;
|
||||
int displaywidth, displayheight, DisplayRasterWidth, DisplayType;
|
||||
int DisplayByteSize;
|
||||
DLword *DisplayRegion68k; /* 68k addr of #{}22,0 */
|
||||
@@ -89,6 +90,10 @@ extern DLword *ColorDisplayRegion68k;
|
||||
extern int MonoOrColor;
|
||||
#endif /* COLOR */
|
||||
|
||||
#ifdef SDL
|
||||
extern void sdl_notify_damage(int, int, int, int);
|
||||
#endif /* SDL */
|
||||
|
||||
#ifdef XWINDOW
|
||||
DLword *DisplayRegion68k_end_addr;
|
||||
extern int *Xdisplay; /* DAANGER -jarl nilsson 27-apr-92 */
|
||||
@@ -180,7 +185,10 @@ void init_display2(DLword *display_addr, int display_max)
|
||||
displaywidth = currentdsp->Display.width;
|
||||
displayheight = currentdsp->Display.height;
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#if (defined(SDL))
|
||||
displaywidth = sdl_displaywidth;
|
||||
displayheight = sdl_displayheight;
|
||||
#endif /* SDL */
|
||||
DisplayRasterWidth = displaywidth / BITSPER_DLWORD;
|
||||
|
||||
if ((displaywidth * displayheight) > display_max) { displayheight = display_max / displaywidth; }
|
||||
@@ -194,7 +202,9 @@ void init_display2(DLword *display_addr, int display_max)
|
||||
DisplayType = SUN2BW;
|
||||
DisplayRegion68k_end_addr = DisplayRegion68k + DisplayRasterWidth * displayheight;
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
DisplayType = SUN2BW;
|
||||
#endif /* SDL */
|
||||
init_cursor();
|
||||
DisplayByteSize = ((displaywidth * displayheight / 8 + (getpagesize() - 1)) & -getpagesize());
|
||||
|
||||
@@ -266,7 +276,10 @@ in_display_segment(baseaddr)
|
||||
/************************************************************************/
|
||||
|
||||
void flush_display_buffer() {
|
||||
|
||||
// printf("flush_display_buffer\n");
|
||||
#ifdef SDL
|
||||
sdl_notify_damage(0, 0, sdl_displaywidth, sdl_displayheight);
|
||||
#endif
|
||||
#ifdef XWINDOW
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, currentdsp->Visible.x,
|
||||
currentdsp->Visible.y, currentdsp->Visible.width,
|
||||
@@ -297,7 +310,10 @@ void flush_display_buffer() {
|
||||
|
||||
void flush_display_region(int x, int y, int w, int h)
|
||||
{
|
||||
|
||||
// printf("flush_display_region %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_notify_damage(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_region x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
@@ -340,7 +356,10 @@ void flush_display_lineregion(UNSIGNED x, DLword *ybase, UNSIGNED w, UNSIGNED h)
|
||||
{
|
||||
int y;
|
||||
y = ((DLword *)ybase - DisplayRegion68k) / DLWORD_PERLINE;
|
||||
|
||||
// printf("flush_display_lineregion %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_notify_damage(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_lineregion x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
@@ -371,7 +390,10 @@ void flush_display_ptrregion(DLword *ybase, UNSIGNED bitoffset, UNSIGNED w, UNSI
|
||||
baseoffset = (((DLword *)ybase) - DisplayRegion68k);
|
||||
y = baseoffset / DLWORD_PERLINE;
|
||||
x = bitoffset + (BITSPERWORD * (baseoffset - (DLWORD_PERLINE * y)));
|
||||
|
||||
// printf("flush_display_ptrregion %d %d %d %d\n", x, y, w, h);
|
||||
#ifdef SDL
|
||||
sdl_notify_damage(x, y, w, h);
|
||||
#endif
|
||||
#if (defined(XWINDOW) || defined(DOS))
|
||||
TPRINT(("Enter flush_display_ptrregion\n x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
|
||||
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
|
||||
|
||||
@@ -273,6 +273,7 @@ void set_kbd_iopointers() {
|
||||
#define KB_HP9000 (10 + MIN_KEYTYPE) /* TODO: Can we remove this? */
|
||||
#define KB_X (11 + MIN_KEYTYPE)
|
||||
#define KB_DOS (12 + MIN_KEYTYPE)
|
||||
#define KB_SDL (13 + MIN_KEYTYPE)
|
||||
|
||||
/* KB_SUN4 not defined in older OS versions */
|
||||
#ifndef KB_SUN4
|
||||
@@ -432,6 +433,8 @@ void keyboardtype(int fd)
|
||||
type = KB_X;
|
||||
#elif DOS
|
||||
type = KB_DOS;
|
||||
#elif SDL
|
||||
type = KB_SDL;
|
||||
#endif /* XWINDOW */
|
||||
} /* if end */
|
||||
else {
|
||||
@@ -447,6 +450,8 @@ void keyboardtype(int fd)
|
||||
type = KB_X;
|
||||
else if (strcmp("x", key) == 0)
|
||||
type = KB_X;
|
||||
else if (strcmp("sdl", key) == 0)
|
||||
type = KB_SDL;
|
||||
else
|
||||
type = KB_SUN3; /* default */
|
||||
}
|
||||
@@ -483,7 +488,11 @@ void keyboardtype(int fd)
|
||||
InterfacePage->devconfig |= KB_SUN3 - MIN_KEYTYPE; /* 10 */
|
||||
break;
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
case KB_SDL:
|
||||
InterfacePage->devconfig |= KB_SUN3 - MIN_KEYTYPE; /* 10 */
|
||||
break;
|
||||
#endif /* SDL */
|
||||
#ifdef DOS
|
||||
case KB_DOS:
|
||||
SUNLispKeyMap = DOSLispKeyMap_101;
|
||||
|
||||
@@ -139,8 +139,7 @@ void init_ifpage(int sysout_size) {
|
||||
|
||||
#ifdef BIGVM
|
||||
/* For BIGVM system, save the value in \LASTVMEMFILEPAGE for lisp's use */
|
||||
if ((LispPTR)LASTVMEMFILEPAGE_word != 0xFFFFFFFF)
|
||||
*LASTVMEMFILEPAGE_word = InterfacePage->dllastvmempage;
|
||||
*LASTVMEMFILEPAGE_word = InterfacePage->dllastvmempage;
|
||||
#endif /* BIGVM */
|
||||
|
||||
/* unfortunately, Lisp only looks at a 16 bit serial number */
|
||||
|
||||
@@ -58,7 +58,9 @@ void Mouse_hndlr(void); /* Fields mouse events from driver */
|
||||
|
||||
#include "keyeventdefs.h"
|
||||
#include "osmsgdefs.h"
|
||||
#ifdef XWINDOW
|
||||
#include "xwinmandefs.h"
|
||||
#endif
|
||||
|
||||
#ifdef MAIKO_ENABLE_ETHERNET
|
||||
#include "etherdefs.h"
|
||||
@@ -133,10 +135,6 @@ extern DLword *DisplayRegion68k;
|
||||
static struct timeval SelectTimeout = {0, 0};
|
||||
#endif /* DOS */
|
||||
|
||||
#ifdef XWINDOW
|
||||
extern volatile sig_atomic_t Event_Req;
|
||||
#endif /* XWINDOW */
|
||||
|
||||
extern MISCSTATS *MiscStats;
|
||||
LispPTR *LASTUSERACTION68k;
|
||||
LispPTR *CLastUserActionCell68k;
|
||||
@@ -187,7 +185,7 @@ LispPTR *MOUSECHORDTICKS68k;
|
||||
/**NEW GLOBAL***-> will be moved***/
|
||||
LispPTR *KEYBOARDEVENTQUEUE68k;
|
||||
LispPTR *KEYBUFFERING68k;
|
||||
int KBDEventFlg = NIL;
|
||||
int KBDEventFlg = 0;
|
||||
DLword *CTopKeyevent;
|
||||
|
||||
LispPTR DOBUFFEREDTRANSITION_index;
|
||||
@@ -213,20 +211,12 @@ DLword ColorCursor_savebitmap[CURSORWIDTH / COLORPIXELS_IN_DLWORD * CURSORHEIGHT
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* G E T S I G N A L D A T A */
|
||||
/* */
|
||||
/* Handler for the SIGIO interrupt, which happens */
|
||||
/* 1. When a key transition happens */
|
||||
/* 2. On mouse moves */
|
||||
/* 3. When TCP input becomes available. */
|
||||
/* 4. When a NIT ethernet packet becomes available. */
|
||||
/* 5. When a console/log/stderr msg needs to be printed. */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/* p r o c e s s _ i o _ e v e n t s */
|
||||
/* */
|
||||
/* Periodically, or After a SIGIO interrupt which happens */
|
||||
/* 1. When TCP input becomes available. */
|
||||
/* 2. When a NIT ethernet packet becomes available. */
|
||||
/* 3. When a console/log/stderr msg needs to be printed. */
|
||||
/* */
|
||||
/* */
|
||||
/* Statics: LispReadFds A 32-bit vector with a 1 for each */
|
||||
@@ -256,49 +246,16 @@ DLword ColorCursor_savebitmap[CURSORWIDTH / COLORPIXELS_IN_DLWORD * CURSORHEIGHT
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
void getsignaldata(int sig)
|
||||
void process_io_events()
|
||||
{
|
||||
#ifndef DOS
|
||||
fd_set rfds, efds;
|
||||
fd_set rfds;
|
||||
u_int iflags;
|
||||
int i;
|
||||
|
||||
#ifdef XWINDOW
|
||||
#if defined(sun)
|
||||
if (Event_Req) {
|
||||
if (!XLocked++)
|
||||
getXsignaldata(currentdsp);
|
||||
else
|
||||
XNeedSignal = 1;
|
||||
Event_Req = FALSE;
|
||||
XLocked--;
|
||||
}
|
||||
#endif
|
||||
#endif /* XWINDOW */
|
||||
|
||||
/* #ifndef KBINT */
|
||||
/* FD_COPY would be preferred but uses deprecated bcopy() on macOS. Why? */
|
||||
memcpy(&rfds, &LispReadFds, sizeof(rfds));
|
||||
memcpy(&efds, &LispReadFds, sizeof(efds));
|
||||
|
||||
/* label and ifs not needed if only keyboard on SIGIO */
|
||||
getmore:
|
||||
if (select(32, &rfds, NULL, &efds, &SelectTimeout) >= 0)
|
||||
{
|
||||
/* need to print out fd sets...
|
||||
DBPRINT(("SIGIO: fd mask(r/e) = 0x%x/0x%x.\n", rfds, efds));
|
||||
*/
|
||||
|
||||
|
||||
#ifdef XWINDOW
|
||||
if (FD_ISSET(ConnectionNumber(currentdsp->display_id), &rfds)) {
|
||||
if (!XLocked)
|
||||
getXsignaldata(currentdsp);
|
||||
else
|
||||
XNeedSignal = 1;
|
||||
}
|
||||
|
||||
#endif /* XWINDOW */
|
||||
if (select(32, &rfds, NULL, NULL, &SelectTimeout) > 0) {
|
||||
|
||||
#ifdef MAIKO_ENABLE_ETHERNET
|
||||
if (ether_fd >= 0 && FD_ISSET(ether_fd, &rfds)) { /* Raw ethernet (NIT) I/O happened, so handle it. */
|
||||
@@ -338,7 +295,7 @@ getmore:
|
||||
}
|
||||
/* #endif */
|
||||
#endif /* DOS */
|
||||
} /* end getsignaldata */
|
||||
} /* end process_io_events */
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
#include <X11/Xutil.h>
|
||||
#define LDEX "ldex"
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
#define LDESDL "ldesdl"
|
||||
#endif
|
||||
#define LDEMONO "ldesingle"
|
||||
#define LDECOLOR "ldemulti"
|
||||
#define LDETRUECOLOR "ldetruecolor"
|
||||
@@ -133,7 +135,9 @@ int main(int argc, char *argv[])
|
||||
} /* end if */
|
||||
}
|
||||
#endif /* XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
strcpy(filetorun,LDESDL);
|
||||
#endif /* SDL */
|
||||
#ifdef USESUNSCREEN
|
||||
if ((FrameBufferFd = open("/dev/fb", O_RDWR)) < 0) {
|
||||
fprintf(stderr, "ldeboot: can't open FrameBuffer\n");
|
||||
@@ -187,7 +191,6 @@ int main(int argc, char *argv[])
|
||||
fork_Unix();
|
||||
|
||||
/* start ldemono or ldecolor */
|
||||
|
||||
if (filetorun[0] == '\0') {
|
||||
fprintf(stderr, "Unable to determine what display program to run.\n");
|
||||
exit(1);
|
||||
|
||||
@@ -214,7 +214,7 @@ int main(int argc, char *argv[]) {
|
||||
ether_fd = -1;
|
||||
/* exit(); */
|
||||
}
|
||||
seteuid(getuid());
|
||||
setuid(getuid());
|
||||
}
|
||||
|
||||
/* OK, right here do other stuff like scan args */
|
||||
|
||||
212
src/main.c
212
src/main.c
@@ -75,7 +75,6 @@
|
||||
DLword *Lisp_world; /* lispworld */
|
||||
|
||||
/********** 68k address for Lisp Space **********/
|
||||
DLword *Atomspace;
|
||||
DLword *Stackspace;
|
||||
DLword *Plistspace;
|
||||
DLword *DTDspace;
|
||||
@@ -85,8 +84,6 @@ DLword *Pnamespace;
|
||||
DLword *AtomSpace;
|
||||
DLword *Defspace;
|
||||
DLword *Valspace;
|
||||
DLword *Spospspace;
|
||||
DLword *Snegspace;
|
||||
|
||||
/********** For Virtual Memory Management **********/
|
||||
#ifdef BIGVM
|
||||
@@ -124,7 +121,6 @@ DLword *HTcoll;
|
||||
DLword *DisplayRegion;
|
||||
int DisplayInitialized = NIL;
|
||||
|
||||
DLword *Arrayspace;
|
||||
DLword *MDS_space_bottom;
|
||||
DLword *PnCharspace;
|
||||
struct dtd *ListpDTD;
|
||||
@@ -210,7 +206,8 @@ int UnixPipeIn;
|
||||
int UnixPipeOut;
|
||||
int UnixPID;
|
||||
int please_fork = 1;
|
||||
|
||||
/* disable X11 scroll bars if requested */
|
||||
int noscroll = 0;
|
||||
/*** STACK handle staff(Takeshi) **/
|
||||
LispPTR *STACKOVERFLOW_word;
|
||||
LispPTR *GuardStackAddr_word;
|
||||
@@ -239,10 +236,6 @@ int display_max = 65536 * 16 * 2;
|
||||
/* diagnostic flag for sysout dumping */
|
||||
extern int maxpages;
|
||||
|
||||
/** For call makepathname inside main() **/
|
||||
extern int *Lisp_errno;
|
||||
extern int Dummy_errno; /* If errno cell is not provided by Lisp, dummy_errno is used. */
|
||||
|
||||
char sysout_name[MAXPATHLEN]; /* Set by read_Xoption, in the X version. */
|
||||
int sysout_size = 0; /* ditto */
|
||||
|
||||
@@ -252,7 +245,9 @@ int flushing = FALSE; /* see dbprint.h if set, all debug/trace printing will cal
|
||||
#include "devif.h"
|
||||
extern DspInterface currentdsp;
|
||||
#endif /* DOS || XWINDOW */
|
||||
|
||||
#ifdef SDL
|
||||
extern int init_SDL(char*, int, int, int);
|
||||
#endif
|
||||
extern time_t MDate;
|
||||
extern int nokbdflag;
|
||||
extern int nomouseflag;
|
||||
@@ -290,7 +285,18 @@ const char *helpstring =
|
||||
-bw <pixels> The Medley screen borderwidth\n\
|
||||
-g[eometry] <geom>] The Medley screen geometry\n\
|
||||
-sc[reen] <w>x<h>] The Medley screen geometry\n";
|
||||
#else /* not DOS, not XWINDOW */
|
||||
#elif SDL
|
||||
const char *helpstring =
|
||||
"\n\
|
||||
either setenv LDESRCESYSOUT or do:\n\
|
||||
medley [<sysout-name>] [<options>]\n\
|
||||
-info Print general info about the system\n\
|
||||
-help Print this message\n\
|
||||
-pixelscale <n> The amount of pixels to show for one Medley screen pixel.\n\
|
||||
-sc[reen] <w>x<h>] The Medley screen geometry\n\
|
||||
-t <title> The window title\n\
|
||||
-title <title> The window title\n";
|
||||
#else /* not DOS, not XWINDOW, not SDL */
|
||||
const char *helpstring =
|
||||
"\n\
|
||||
either setenv LDESRCESYSOUT or do:\n\
|
||||
@@ -312,6 +318,10 @@ int main(int argc, char *argv[])
|
||||
char *envname;
|
||||
extern int TIMER_INTERVAL;
|
||||
extern fd_set LispReadFds;
|
||||
int tmpint;
|
||||
int width = 1024, height = 768;
|
||||
int pixelscale = 1;
|
||||
char *windowtitle = "Medley";
|
||||
#ifdef MAIKO_ENABLE_FOREIGN_FUNCTION_INTERFACE
|
||||
if (dld_find_executable(argv[0]) == 0) {
|
||||
perror("Name of executable not found.");
|
||||
@@ -338,9 +348,6 @@ int main(int argc, char *argv[])
|
||||
Barf and print the command line if tha fails
|
||||
*/
|
||||
|
||||
/* For call makepathname */
|
||||
Lisp_errno = &Dummy_errno;
|
||||
|
||||
i = 1;
|
||||
|
||||
if (argv[i] && ((strcmp(argv[i], "-info") == 0) || (strcmp(argv[i], "-INFO") == 0))) {
|
||||
@@ -360,13 +367,18 @@ int main(int argc, char *argv[])
|
||||
strncpy(sysout_name, envname, MAXPATHLEN);
|
||||
} else if ((envname = getenv("LDESOURCESYSOUT")) != NULL)
|
||||
strncpy(sysout_name, envname, MAXPATHLEN);
|
||||
else {
|
||||
#ifdef DOS
|
||||
else if (!makepathname("lisp.vm", sysout_name)
|
||||
strncpy(sysout_name, "lisp.vm", MAXPATHLEN);
|
||||
#else
|
||||
else if (!makepathname("~/lisp.virtualmem", sysout_name)
|
||||
if ((envname = getenv("HOME")) != NULL) {
|
||||
strncpy(sysout_name, envname, MAXPATHLEN);
|
||||
strncat(sysout_name, "/lisp.virtualmem", MAXPATHLEN - 17);
|
||||
}
|
||||
#endif /* DOS */
|
||||
|| access(sysout_name, R_OK)) {
|
||||
fprintf(stderr, "Couldn't find a sysout to run;\n");
|
||||
}
|
||||
if (access(sysout_name, R_OK)) {
|
||||
perror("Couldn't find a sysout to run");
|
||||
fprintf(stderr, "%s", helpstring);
|
||||
exit(1);
|
||||
}
|
||||
@@ -377,18 +389,32 @@ int main(int argc, char *argv[])
|
||||
/* -t and -m are undocumented and somewhat dangerous... */
|
||||
|
||||
if (!strcmp(argv[i], "-t")) { /**** timer interval ****/
|
||||
if (argc > ++i)
|
||||
TIMER_INTERVAL = atoi(argv[i]);
|
||||
else {
|
||||
if (argc > ++i) {
|
||||
errno = 0;
|
||||
tmpint = strtol(argv[i], (char **)NULL, 10);
|
||||
if (errno == 0 && tmpint > 0) {
|
||||
TIMER_INTERVAL = tmpint;
|
||||
} else {
|
||||
fprintf(stderr, "Bad value for -t (integer > 0)\n");
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -t\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
else if (!strcmp(argv[i], "-m")) { /**** sysout size ****/
|
||||
if (argc > ++i)
|
||||
sysout_size = atoi(argv[i]);
|
||||
else {
|
||||
if (argc > ++i) {
|
||||
errno = 0;
|
||||
tmpint = strtol(argv[i], (char **)NULL, 10);
|
||||
if (errno == 0 && tmpint > 0) {
|
||||
sysout_size = tmpint;
|
||||
} else {
|
||||
fprintf(stderr, "Bad value for -m (integer > 0)\n");
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -m\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -423,7 +449,40 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
|
||||
#endif /* DOS */
|
||||
#ifdef SDL
|
||||
else if ((strcmp(argv[i], "-sc") == 0) || (strcmp(argv[i], "-SC") == 0)) {
|
||||
if (argc > ++i) {
|
||||
int read = sscanf(argv[i], "%dx%d", &width, &height);
|
||||
if(read != 2) {
|
||||
fprintf(stderr, "Could not parse -sc argument %s\n", argv[i]);
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -sc\n");
|
||||
exit(1);
|
||||
}
|
||||
} else if ((strcmp(argv[i], "-pixelscale") == 0) || (strcmp(argv[i], "-PIXELSCALE") == 0)) {
|
||||
if (argc > ++i) {
|
||||
int read = sscanf(argv[i], "%d", &pixelscale);
|
||||
if(read != 1) {
|
||||
fprintf(stderr, "Could not parse -pixelscale argument %s\n", argv[i]);
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -pixelscale\n");
|
||||
exit(1);
|
||||
}
|
||||
} else if ((strcmp(argv[i], "-t") == 0) || (strcmp(argv[i], "-T") == 0)
|
||||
|| (strcmp(argv[i], "-title") == 0) || (strcmp(argv[i], "-TITLE") == 0)) {
|
||||
if (argc > ++i) {
|
||||
windowtitle = argv[i];
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -title\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* SDL */
|
||||
/* Can only do this under SUNOs, for now */
|
||||
else if (!strcmp(argv[i], "-E")) { /**** ethernet info ****/
|
||||
#ifdef MAIKO_ENABLE_ETHERNET
|
||||
@@ -453,9 +512,16 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
/* diagnostic flag for big vmem write() calls */
|
||||
else if (!strcmp(argv[i], "-xpages")) {
|
||||
if (argc > ++i)
|
||||
maxpages = atoi(argv[i]);
|
||||
else {
|
||||
if (argc > ++i) {
|
||||
errno = 0;
|
||||
tmpint = strtol(argv[i], (char **)NULL, 10);
|
||||
if (errno == 0 && tmpint > 0) {
|
||||
maxpages = tmpint;
|
||||
} else {
|
||||
fprintf(stderr, "Bad value for -xpages (integer > 0)\n");
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Missing argument after -xpages\n");
|
||||
exit(1);
|
||||
}
|
||||
@@ -467,8 +533,11 @@ int main(int argc, char *argv[])
|
||||
probemouse(); /* See if the mouse is connected. */
|
||||
#else
|
||||
if (getuid() != geteuid()) {
|
||||
fprintf(stderr, "Effective user is not real user. Setting euid to uid.\n");
|
||||
seteuid(getuid());
|
||||
fprintf(stderr, "Effective user is not real user. Resetting uid\n");
|
||||
if (setuid(getuid()) == -1) {
|
||||
fprintf(stderr, "Unable to reset user id to real user id\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
#endif /* DOS */
|
||||
|
||||
@@ -493,7 +562,9 @@ int main(int argc, char *argv[])
|
||||
#if defined(DOS) || defined(XWINDOW)
|
||||
make_dsp_instance(currentdsp, 0, 0, 0, 1); /* All defaults the first time */
|
||||
#endif /* DOS || XWINDOW */
|
||||
|
||||
#if defined(SDL)
|
||||
init_SDL(windowtitle, width, height, pixelscale);
|
||||
#endif /* SDL */
|
||||
/* Load sysout to VM space and returns real sysout_size(not 0) */
|
||||
sysout_size = sysout_loader(sysout_name, sysout_size);
|
||||
|
||||
@@ -592,87 +663,6 @@ void start_lisp() {
|
||||
dispatch();
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* m a k e p a t h n a m e */
|
||||
/* */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
int makepathname(char *src, char *dst)
|
||||
{
|
||||
register int len;
|
||||
register char *base, *cp;
|
||||
register struct passwd *pwd;
|
||||
char name[MAXPATHLEN];
|
||||
|
||||
base = src;
|
||||
switch (*base) {
|
||||
case '.':
|
||||
if (getcwd(dst, MAXPATHLEN) == 0)
|
||||
{ /* set working directory */
|
||||
*Lisp_errno = errno;
|
||||
return (0);
|
||||
}
|
||||
switch (*(base + 1)) {
|
||||
case '.':
|
||||
if (*(base + 2) == '/') { /* Now, base == "../xxxx" */
|
||||
cp = (char *)strrchr(dst, '/');
|
||||
if (cp == 0) return (0);
|
||||
*cp = '\0';
|
||||
strcat(dst, base + 2);
|
||||
return (1);
|
||||
} else
|
||||
return (0);
|
||||
case '/':
|
||||
/* Now, base == "./xxx" */
|
||||
strcat(dst, base + 1);
|
||||
return (1);
|
||||
default: return (0);
|
||||
}
|
||||
case '~':
|
||||
ERRSETJMP(0);
|
||||
if (*(base + 1) == '/') {
|
||||
/* path is "~/foo" */
|
||||
#ifdef DOS
|
||||
pwd = 0;
|
||||
#else
|
||||
TIMEOUT(pwd = getpwuid(getuid()));
|
||||
#endif /* DOS */
|
||||
if (pwd == NULL) {
|
||||
*Lisp_errno = errno;
|
||||
return (0);
|
||||
}
|
||||
#ifndef DOS
|
||||
sprintf(dst, "%s%s", pwd->pw_dir, base + 1);
|
||||
#endif
|
||||
return (1);
|
||||
} else {
|
||||
/* path is "~foo/" */
|
||||
if ((cp = (char *)strchr(base + 1, '/')) == 0)
|
||||
return (0);
|
||||
else {
|
||||
len = (UNSIGNED)cp - (UNSIGNED)base - 1;
|
||||
strncpy(name, base + 1, len);
|
||||
name[len] = '\0';
|
||||
#ifndef DOS
|
||||
TIMEOUT(pwd = getpwnam(name));
|
||||
#endif /* DOS */
|
||||
if (pwd == NULL) {
|
||||
*Lisp_errno = errno;
|
||||
return (0);
|
||||
}
|
||||
#ifndef DOS
|
||||
sprintf(dst, "%s%s", pwd->pw_dir, cp);
|
||||
#endif /* DOS */
|
||||
return (1);
|
||||
}
|
||||
}
|
||||
default: strcpy(dst, src); return (1);
|
||||
}
|
||||
}
|
||||
|
||||
void print_info_lines() {
|
||||
#if (RELEASE == 200)
|
||||
printf("Emulator for Medley release 2.0\n");
|
||||
|
||||
121
src/mkatom.c
121
src/mkatom.c
@@ -27,7 +27,6 @@
|
||||
compute_hash
|
||||
create_symbol
|
||||
compare_chars
|
||||
parse_number
|
||||
*/
|
||||
/**********************************************************************/
|
||||
|
||||
@@ -248,10 +247,11 @@ LispPTR compare_lisp_chars(register const char *char1, register const char *char
|
||||
/*
|
||||
Func name : make_atom
|
||||
|
||||
If the atom already existed then return
|
||||
else create new atom . Returns the Atom's index.
|
||||
Look up the atom index of an existing atom, or return 0xFFFFFFFF
|
||||
|
||||
This function does not handle FAT pname's.
|
||||
This function is a subset of \MKATOM (in LLBASIC), but only handles
|
||||
thin text atom names (no numbers, no 2-byte pnames).
|
||||
It MUST return the same atom index number as \MKATOM
|
||||
|
||||
Date : January 29, 1987
|
||||
Edited by : Takeshi Shimizu
|
||||
@@ -264,10 +264,8 @@ LispPTR compare_lisp_chars(register const char *char1, register const char *char
|
||||
*/
|
||||
/**********************************************************************/
|
||||
|
||||
LispPTR make_atom(const char *char_base, DLword offset, DLword length, short int non_numericp)
|
||||
/* if it is NIL then these chars are treated as NUMBER */
|
||||
LispPTR make_atom(const char *char_base, DLword offset, DLword length)
|
||||
{
|
||||
extern DLword *Spospspace;
|
||||
extern DLword *AtomHT;
|
||||
extern DLword *Pnamespace;
|
||||
extern DLword *AtomSpace;
|
||||
@@ -282,41 +280,34 @@ LispPTR make_atom(const char *char_base, DLword offset, DLword length, short int
|
||||
unsigned short first_char;
|
||||
|
||||
#ifdef TRACE2
|
||||
printf("TRACE: make_atom( %s , offset= %d, len= %d, non_numericp = %d)\n", char_base, offset,
|
||||
length, non_numericp);
|
||||
printf("TRACE: make_atom( %s , offset= %d, len= %d)\n", char_base, offset, length);
|
||||
#endif
|
||||
|
||||
first_char = (*(char_base + offset)) & 0xff;
|
||||
if (length != 0) {
|
||||
if (length == 1) /* one char. atoms */
|
||||
{
|
||||
if (first_char > 57) /* greater than '9 */
|
||||
return ((LispPTR)(ATOMoffset + (first_char - 10)));
|
||||
else if (first_char > 47) /* between '0 to '9 */
|
||||
return ((LispPTR)(S_POSITIVE + (first_char - 48)));
|
||||
/* fixed S_... mar-27-87 take */
|
||||
else /* other one char. atoms */
|
||||
return ((LispPTR)(ATOMoffset + first_char));
|
||||
} /* if(length==1.. end */
|
||||
else if ((non_numericp == NIL) && (first_char <= '9'))
|
||||
/* more than 10 arithmetic aon + - mixed atom process */
|
||||
{
|
||||
if ((hash_entry = parse_number(char_base + offset, length)) != 0)
|
||||
return ((LispPTR)hash_entry); /* if NIL that means THE ATOM is +- mixed litatom */
|
||||
/* 15 may 87 take */
|
||||
}
|
||||
|
||||
hash = compute_hash(char_base, offset, length);
|
||||
|
||||
} /* if(lengt.. end */
|
||||
else {
|
||||
switch (length) {
|
||||
case 0:
|
||||
/* the zero-length atom has hashcode 0 */
|
||||
hash = 0;
|
||||
first_char = 255;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
/* One-character atoms live in well known places, no need to hash */
|
||||
if (first_char > '9')
|
||||
return ((LispPTR)(ATOMoffset + (first_char - 10)));
|
||||
if (first_char >= '0' ) /* 0..9 */
|
||||
return ((LispPTR)(S_POSITIVE + (first_char - '0')));
|
||||
/* other one character atoms */
|
||||
return ((LispPTR)(ATOMoffset + first_char));
|
||||
|
||||
default:
|
||||
hash = compute_hash(char_base, offset, length);
|
||||
break;
|
||||
}
|
||||
|
||||
/* This point corresponds with LP in Lisp source */
|
||||
|
||||
/* following for loop never exits until it finds new hash entry or same atom */
|
||||
/* following for loop does not exit until it finds new hash entry or same atom */
|
||||
for (reprobe = Atom_reprobe(hash, first_char); (hash_entry = GETWORD(AtomHT + hash)) != 0;
|
||||
hash = ((hash + reprobe) & 0xffff)) {
|
||||
atom_index = hash_entry - 1;
|
||||
@@ -327,7 +318,7 @@ LispPTR make_atom(const char *char_base, DLword offset, DLword length, short int
|
||||
if ((length == GETBYTE(pname_base)) &&
|
||||
(compare_chars(++pname_base, char_base + offset, length) == T)) {
|
||||
DBPRINT(("FOUND the atom. \n"));
|
||||
return (atom_index); /* find already existed atom */
|
||||
return (atom_index); /* found existing atom */
|
||||
}
|
||||
DBPRINT(("HASH doesn't hit. reprobe!\n"));
|
||||
|
||||
@@ -338,65 +329,3 @@ LispPTR make_atom(const char *char_base, DLword offset, DLword length, short int
|
||||
return (0xffffffff);
|
||||
/** Don't create newatom now **/
|
||||
} /* make_atom end */
|
||||
|
||||
/*********************************************************************/
|
||||
/*
|
||||
Func name : parse_number
|
||||
|
||||
Desc : It can treat -65534 to 65535 integer
|
||||
Returns SMALLP PTR
|
||||
Date : 1,May 1987 Take
|
||||
15 May 87 take
|
||||
*/
|
||||
/*********************************************************************/
|
||||
|
||||
/* Assume this func. should be called with C string in "char_base" */
|
||||
LispPTR parse_number(const char *char_base, short int length) {
|
||||
register LispPTR sign_mask;
|
||||
register LispPTR val;
|
||||
register int radix;
|
||||
register int *cell68k;
|
||||
|
||||
#ifdef TRACE2
|
||||
printf("TRACE: parse_number()\n");
|
||||
#endif
|
||||
|
||||
/* Check for Radix 8(Q) postfixed ?? */
|
||||
if ((*(char_base + (length - 1))) == 'Q') {
|
||||
radix = 8;
|
||||
length--;
|
||||
} else
|
||||
radix = 10;
|
||||
|
||||
/* Check for Sign */
|
||||
sign_mask = S_POSITIVE;
|
||||
|
||||
if ((*(char_base) == '+') || (*(char_base) == '-')) {
|
||||
sign_mask = ((*char_base++) == '+') ? S_POSITIVE : S_NEGATIVE;
|
||||
length--;
|
||||
}
|
||||
|
||||
for (val = 0; length > 0; length--) {
|
||||
if ((((*char_base)) < '0') || ('9' < ((*char_base)))) return (NIL);
|
||||
val = radix * val + (*char_base++) - '0';
|
||||
}
|
||||
|
||||
if (val > 0xffffffff) error("parse_number : Overflow ...exceeded range of FIXP");
|
||||
|
||||
if ((sign_mask == S_POSITIVE) && (val > 0xffff)) {
|
||||
cell68k = (int *)createcell68k(TYPE_FIXP);
|
||||
*cell68k = val;
|
||||
return (LADDR_from_68k(cell68k));
|
||||
} else if ((sign_mask == S_NEGATIVE) && (val > 0xffff)) {
|
||||
cell68k = (int *)createcell68k(TYPE_FIXP);
|
||||
*cell68k = ~val + 1;
|
||||
return (LADDR_from_68k(cell68k));
|
||||
}
|
||||
|
||||
else if (sign_mask == S_NEGATIVE)
|
||||
return (sign_mask | (~((DLword)val) + 1));
|
||||
else {
|
||||
return (sign_mask | val);
|
||||
}
|
||||
}
|
||||
/* end parse_number */
|
||||
|
||||
@@ -253,7 +253,7 @@ rs232c_read() {
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* SIGIO handler getsignaldata and the successive
|
||||
* SIGIO handler, process_io_events, and the successive
|
||||
* rs232c_read has been called before Lisp prepares
|
||||
* the next buffer. Turn on RS232C_remain_data to
|
||||
* specify to read the remaining data after.
|
||||
|
||||
735
src/sdl.c
Normal file
735
src/sdl.c
Normal file
@@ -0,0 +1,735 @@
|
||||
#include <SDL.h>
|
||||
#include <SDL_keycode.h>
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
#include "sdldefs.h"
|
||||
#include "byteswapdefs.h"
|
||||
#include "lispemul.h"
|
||||
#include "lsptypes.h"
|
||||
#include "miscstat.h"
|
||||
#include "keyboard.h"
|
||||
#include "lspglob.h" // for IOPage
|
||||
#include "display.h" // for CURSORHEIGHT, DisplayRegion68k
|
||||
|
||||
/* if SDLRENDERING is defined, render to a texture rather than
|
||||
* using the window surface
|
||||
*/
|
||||
|
||||
#define SDLRENDERING 1
|
||||
|
||||
static SDL_Window *sdl_window = NULL;
|
||||
#if defined(SDLRENDERING)
|
||||
static SDL_Renderer *sdl_renderer = NULL;
|
||||
static SDL_RendererInfo sdl_rendererinfo = {0};
|
||||
static SDL_Texture *sdl_texture = NULL;
|
||||
#else
|
||||
static SDL_Surface *sdl_windowsurface = NULL;
|
||||
static SDL_Surface *sdl_buffersurface = NULL;
|
||||
static int buffer_size = 0;
|
||||
static void *buffer = NULL;
|
||||
#endif
|
||||
static Uint32 sdl_white;
|
||||
static Uint32 sdl_black;
|
||||
static Uint32 sdl_foreground;
|
||||
static Uint32 sdl_background;
|
||||
static int sdl_bytesperpixel;
|
||||
static SDL_PixelFormat *sdl_pixelformat;
|
||||
|
||||
extern void kb_trans(u_short keycode, u_short upflg);
|
||||
extern int error(const char *s);
|
||||
|
||||
extern int KBDEventFlg;
|
||||
/* clang-format off */
|
||||
int keymap[] = {
|
||||
0, SDLK_5,
|
||||
1, SDLK_4,
|
||||
2, SDLK_6,
|
||||
3, SDLK_e,
|
||||
4, SDLK_7,
|
||||
5, SDLK_d,
|
||||
6, SDLK_u,
|
||||
7, SDLK_v,
|
||||
8, SDLK_RIGHTPAREN,
|
||||
8, SDLK_0,
|
||||
9, SDLK_k,
|
||||
10, SDLK_MINUS,
|
||||
11, SDLK_p,
|
||||
12, SDLK_SLASH,
|
||||
13, SDLK_KP_PERIOD,
|
||||
14, SDLK_SCROLLLOCK,
|
||||
15, SDLK_BACKSPACE,
|
||||
16, SDLK_3,
|
||||
17, SDLK_2,
|
||||
18, SDLK_w,
|
||||
19, SDLK_q,
|
||||
20, SDLK_s,
|
||||
21, SDLK_a,
|
||||
22, SDLK_LEFTPAREN,
|
||||
22, SDLK_9,
|
||||
23, SDLK_i,
|
||||
24, SDLK_x,
|
||||
25, SDLK_o,
|
||||
26, SDLK_l,
|
||||
27, SDLK_COMMA,
|
||||
28, SDLK_QUOTE,
|
||||
29, SDLK_RIGHTBRACKET,
|
||||
31, SDLK_LALT, /* Meta, Sun-4 usual key */
|
||||
32, SDLK_1,
|
||||
33, SDLK_ESCAPE,
|
||||
34, SDLK_TAB,
|
||||
35, SDLK_f,
|
||||
36, SDLK_LCTRL,
|
||||
37, SDLK_c,
|
||||
38, SDLK_j,
|
||||
39, SDLK_b,
|
||||
40, SDLK_z,
|
||||
41, SDLK_LSHIFT,
|
||||
42, SDLK_PERIOD,
|
||||
43, SDLK_SEMICOLON,
|
||||
43, SDLK_COLON,
|
||||
44, SDLK_RETURN,
|
||||
45, SDLK_BACKQUOTE,
|
||||
47, SDLK_RCTRL,
|
||||
48, SDLK_r,
|
||||
49, SDLK_t,
|
||||
50, SDLK_g,
|
||||
51, SDLK_y,
|
||||
52, SDLK_h,
|
||||
53, SDLK_8,
|
||||
54, SDLK_n,
|
||||
55, SDLK_m,
|
||||
56, SDLK_CAPSLOCK,
|
||||
57, SDLK_SPACE,
|
||||
58, SDLK_LEFTBRACKET,
|
||||
59, SDLK_EQUALS,
|
||||
60, SDLK_RSHIFT,
|
||||
61, SDLK_F11,
|
||||
61, SDLK_PAUSE,
|
||||
62, SDLK_HOME,
|
||||
63, SDLK_PAGEUP,
|
||||
64, SDLK_KP_EQUALS,
|
||||
65, SDLK_KP_DIVIDE,
|
||||
66, SDLK_F7,
|
||||
67, SDLK_F4,
|
||||
68, SDLK_F5,
|
||||
69, SDLK_KP_2,
|
||||
70, SDLK_KP_3,
|
||||
// 71, XK_Linefeed,
|
||||
// 73, XK_Numlock,
|
||||
76, SDLK_KP_ENTER,
|
||||
80, SDLK_F9,
|
||||
81, SDLK_KP_7,
|
||||
82, SDLK_KP_8,
|
||||
83, SDLK_KP_9,
|
||||
84, SDLK_KP_4,
|
||||
85, SDLK_KP_5,
|
||||
86, SDLK_LALT, /* (sun left-diamond key) */
|
||||
87, SDLK_KP_6,
|
||||
89, SDLK_INSERT,
|
||||
90, SDLK_END,
|
||||
91, SDLK_F12,
|
||||
92, SDLK_PRINTSCREEN, // is this XK_Print??
|
||||
93, SDLK_MODE, // is this XK_Mode_switch
|
||||
94, SDLK_KP_1,
|
||||
95, SDLK_KP_MULTIPLY,
|
||||
96, SDLK_KP_MINUS,
|
||||
97, SDLK_HELP,
|
||||
98, SDLK_KP_0,
|
||||
99, SDLK_F2,
|
||||
100, SDLK_F3,
|
||||
101, SDLK_F6,
|
||||
102, SDLK_KP_PLUS,
|
||||
104, SDLK_F8,
|
||||
105, SDLK_BACKSLASH,
|
||||
106, SDLK_F10,
|
||||
107, SDLK_F11,
|
||||
108, SDLK_F12,
|
||||
-1, -1
|
||||
};
|
||||
/* clang-format on */
|
||||
static const DLword bitmask[16] = {1 << 15, 1 << 14, 1 << 13, 1 << 12, 1 << 11, 1 << 10,
|
||||
1 << 9, 1 << 8, 1 << 7, 1 << 6, 1 << 5, 1 << 4,
|
||||
1 << 3, 1 << 2, 1 << 1, 1 << 0};
|
||||
// all of the following are overwritten, the values here are irrelevant defaults!
|
||||
// actual size of the lisp display in pixels.
|
||||
int sdl_displaywidth = 0;
|
||||
int sdl_displayheight = 0;
|
||||
// current size of the window, in pixels
|
||||
int sdl_windowwidth = 0;
|
||||
int sdl_windowheight = 0;
|
||||
// each pixel is shown as this many pixels
|
||||
int sdl_pixelscale = 0;
|
||||
extern DLword *EmKbdAd068K, *EmKbdAd168K, *EmKbdAd268K, *EmKbdAd368K, *EmKbdAd468K, *EmKbdAd568K,
|
||||
*EmRealUtilin68K;
|
||||
extern DLword *EmCursorBitMap68K;
|
||||
extern DLword *CTopKeyevent;
|
||||
extern int URaid_req;
|
||||
extern LispPTR *KEYBUFFERING68k;
|
||||
|
||||
void DoRing() {
|
||||
DLword w, r;
|
||||
KBEVENT *kbevent;
|
||||
|
||||
do_ring:
|
||||
/* DEL is not generally present on a Mac X keyboard, Ctrl-shift-ESC would be 18496 */
|
||||
if (((*EmKbdAd268K) & 2113) == 0) { /*Ctrl-shift-NEXT*/
|
||||
error("****** EMERGENCY Interrupt ******");
|
||||
*EmKbdAd268K = KB_ALLUP; /*reset*/
|
||||
((RING *)CTopKeyevent)->read = 0; /* reset queue */
|
||||
((RING *)CTopKeyevent)->write = MINKEYEVENT;
|
||||
/*return(0);*/
|
||||
} else if (((*EmKbdAd268K) & 2114) == 0) { /* Ctrl-Shift-DEL */
|
||||
*EmKbdAd268K = KB_ALLUP; /*reset*/
|
||||
URaid_req = T;
|
||||
((RING *)CTopKeyevent)->read = 0; /* reset queue */
|
||||
((RING *)CTopKeyevent)->write = MINKEYEVENT;
|
||||
/*return(0);*/
|
||||
}
|
||||
|
||||
#ifdef OS4_TYPE4BUG
|
||||
else if (((*EmKbdAd268K) & 2120) == 0) { /* Ctrl-Shift-Return */
|
||||
*EmKbdAd268K = KB_ALLUP; /*reset*/
|
||||
URaid_req = T;
|
||||
((RING *)CTopKeyevent)->read = 0; /* reset queue */
|
||||
((RING *)CTopKeyevent)->write = MINKEYEVENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
r = RING_READ(CTopKeyevent);
|
||||
w = RING_WRITE(CTopKeyevent);
|
||||
|
||||
if (r == w) /* event queue FULL */
|
||||
goto KBnext;
|
||||
|
||||
kbevent = (KBEVENT *)(CTopKeyevent + w);
|
||||
/* RCLK(kbevent->time); */
|
||||
kbevent->W0 = *EmKbdAd068K;
|
||||
kbevent->W1 = *EmKbdAd168K;
|
||||
kbevent->W2 = *EmKbdAd268K;
|
||||
kbevent->W3 = *EmKbdAd368K;
|
||||
kbevent->W4 = *EmKbdAd468K;
|
||||
kbevent->W5 = *EmKbdAd568K;
|
||||
kbevent->WU = *EmRealUtilin68K;
|
||||
|
||||
if (r == 0) /* Queue was empty */
|
||||
((RING *)CTopKeyevent)->read = w;
|
||||
if (w >= MAXKEYEVENT)
|
||||
((RING *)CTopKeyevent)->write = MINKEYEVENT;
|
||||
else
|
||||
((RING *)CTopKeyevent)->write = w + KEYEVENTSIZE;
|
||||
|
||||
KBnext:
|
||||
if (*KEYBUFFERING68k == NIL) *KEYBUFFERING68k = ATOM_T;
|
||||
}
|
||||
|
||||
static int min(int a, int b) {
|
||||
if (a < b) return a;
|
||||
return b;
|
||||
}
|
||||
|
||||
static int display_update_needed = 0;
|
||||
|
||||
static int min_x = INT_MAX;
|
||||
static int min_y = INT_MAX;
|
||||
static int max_x = 0;
|
||||
static int max_y = 0;
|
||||
void sdl_notify_damage(int x, int y, int w, int h) {
|
||||
if (x < min_x) min_x = x;
|
||||
if (y < min_y) min_y = y;
|
||||
if (x + w > max_x) max_x = min(x + w, sdl_displaywidth - 1);
|
||||
if (y + h > max_y) max_y = min(y + h, sdl_displayheight - 1);
|
||||
display_update_needed = 1;
|
||||
}
|
||||
|
||||
/* a simple linked list to remember generated cursors
|
||||
* because cursors don't have any identifying information
|
||||
* except for the actual bitmap in Lisp, just cache that.
|
||||
* 16 DLwords, to give a 16x16 bitmap cursor.
|
||||
*/
|
||||
struct CachedCursor {
|
||||
struct CachedCursor *next;
|
||||
DLword EmCursorBitMap[CURSORHEIGHT];
|
||||
SDL_Cursor *cursor;
|
||||
} *sdl_cursorlist = NULL;
|
||||
|
||||
/*
|
||||
* given a 16-bit value and a repeat count modify an array
|
||||
* of bytes to contain the same bit pattern with each bit
|
||||
* repeated "reps" times consecutively in the output
|
||||
*/
|
||||
static void replicate_bits(int bits, int reps, Uint8 *out) {
|
||||
int dbyte = 0;
|
||||
int dbit = 7;
|
||||
for (int ibit = 15; ibit >= 0; --ibit) {
|
||||
for (int r = 0; r < reps; r++) {
|
||||
if (bits & (1 << ibit))
|
||||
out[dbyte] |= 1 << dbit;
|
||||
if (--dbit < 0) {
|
||||
dbyte++;
|
||||
dbit = 7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int cursor_equal_p(DLword *a, DLword *b) {
|
||||
for (int i = 0; i < CURSORHEIGHT; i++)
|
||||
if (a[i] != b[i]) return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Try to find cursor CURSOR on the sdl_cursorlist, if it isn't there, add it.
|
||||
* Return an SDL_Cursor that can be used directly.
|
||||
*/
|
||||
static SDL_Cursor *sdl_getOrAllocateCursor(DLword cursor[16], int hot_x, int hot_y) {
|
||||
hot_x = 0;
|
||||
hot_y = 0;
|
||||
/* try to find the cursor by checking the full bitmap */
|
||||
struct CachedCursor *pclp = NULL;
|
||||
struct CachedCursor *clp = sdl_cursorlist;
|
||||
SDL_Cursor *c;
|
||||
while (clp != NULL) {
|
||||
if (cursor_equal_p(clp->EmCursorBitMap, cursor) == TRUE) {
|
||||
/* if it's in the first two elements of the list, leave the order alone.
|
||||
* There is a high probability of flipping back and forth between two
|
||||
*/
|
||||
if (clp == sdl_cursorlist || pclp == sdl_cursorlist) {
|
||||
return clp->cursor;
|
||||
}
|
||||
/* otherwise unlink the found item and reinsert at the front */
|
||||
pclp->next = clp->next;
|
||||
clp->next = sdl_cursorlist;
|
||||
sdl_cursorlist = clp;
|
||||
return clp->cursor;
|
||||
}
|
||||
pclp = clp;
|
||||
clp = clp->next;
|
||||
}
|
||||
/* It isn't there, so build a new one */
|
||||
clp = (struct CachedCursor *)malloc(sizeof(struct CachedCursor));
|
||||
memcpy(clp->EmCursorBitMap, cursor, sizeof(clp->EmCursorBitMap));
|
||||
/* no scaling is an easy case, scale > 1 is harder */
|
||||
if (sdl_pixelscale == 1) {
|
||||
Uint8 sdl_cursor_data[32];
|
||||
for (int i = 0; i < 32; i++) sdl_cursor_data[i] = GETBYTE(((Uint8 *)cursor) + i);
|
||||
c = SDL_CreateCursor(sdl_cursor_data, sdl_cursor_data, 16, 16, hot_x, hot_y);
|
||||
} else {
|
||||
Uint8 *sdl_cursor_data = calloc(sdl_pixelscale * sdl_pixelscale, 32);
|
||||
/* fill in the cursor data expanded */
|
||||
for (int i = 0; i < 32; i += 2) {
|
||||
int v = GETBYTE(((Uint8 *)cursor) + i) << 8 | GETBYTE(((Uint8 *)cursor) + i + 1);
|
||||
int db = i * sdl_pixelscale * sdl_pixelscale;
|
||||
/* spread the bits out for the first copy of the row */
|
||||
replicate_bits(v, sdl_pixelscale, &sdl_cursor_data[db]);
|
||||
/* and then copy the replicated bits for the copies of the row */
|
||||
for (int j = 1; j < sdl_pixelscale; j++) {
|
||||
memcpy(&sdl_cursor_data[db + (j * 2 * sdl_pixelscale)], &sdl_cursor_data[db], 2 * sdl_pixelscale);
|
||||
}
|
||||
}
|
||||
c = SDL_CreateCursor(sdl_cursor_data, sdl_cursor_data, 16 * sdl_pixelscale, 16 * sdl_pixelscale, hot_x, hot_y);
|
||||
}
|
||||
if (c == NULL) printf("ERROR creating cursor: %s\n", SDL_GetError());
|
||||
clp->cursor = c;
|
||||
clp->next = sdl_cursorlist;
|
||||
sdl_cursorlist = clp;
|
||||
return clp->cursor;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read a cursor bitmap from lisp. Try to find a cached cursor, then use that.
|
||||
* Use HOT_X and HOT_Y as the cursor hotspot.
|
||||
* XXX: needs to deal with sdl_pixelscale > 1, and where is the hotspot?
|
||||
*/
|
||||
void sdl_setCursor(int hot_x, int hot_y) {
|
||||
SDL_Cursor *c = sdl_getOrAllocateCursor(EmCursorBitMap68K, hot_x, hot_y);
|
||||
SDL_SetCursor(c);
|
||||
}
|
||||
#if defined(SDLRENDERING)
|
||||
void sdl_bitblt_to_texture(int _x, int _y, int _w, int _h) {
|
||||
DLword *src = DisplayRegion68k;
|
||||
void *dst;
|
||||
int dstpitchbytes;
|
||||
int dstpitchpixels;
|
||||
const int bitsperword = 8 * sizeof(DLword);
|
||||
int sourcepitchwords = sdl_displaywidth / bitsperword;
|
||||
int xstart = _x / bitsperword;
|
||||
int xlimit = (_x + _w + bitsperword - 1) / bitsperword;
|
||||
int ystart = _y * sourcepitchwords;
|
||||
int ylimit = (_y + _h) * sourcepitchwords;
|
||||
SDL_Rect dstrect;
|
||||
// Avoid dealing with partial words in the update by stretching the source rectangle
|
||||
// left and right to cover complete units and lock the corresponding
|
||||
// region in the texture
|
||||
dstrect.x = xstart * bitsperword;
|
||||
dstrect.w = (xlimit * bitsperword) - dstrect.x;
|
||||
dstrect.y = _y;
|
||||
dstrect.h = _h;
|
||||
SDL_LockTexture(sdl_texture, &dstrect, &dst, &dstpitchbytes);
|
||||
dstpitchpixels = dstpitchbytes / sdl_bytesperpixel;
|
||||
int dy = 0;
|
||||
// for each line in the source image
|
||||
for (int sy = ystart; sy < ylimit; sy += sourcepitchwords, dy += dstpitchpixels) {
|
||||
// for each word in the line
|
||||
int dx = 0;
|
||||
for (int sx = xstart; sx < xlimit; sx++, dx += bitsperword) {
|
||||
int srcw = GETBASEWORD(src, sy + sx);
|
||||
// for each bit in the word
|
||||
for (int b = 0; b < bitsperword; b++) {
|
||||
((Uint32 *)dst)[dy + dx + b] = (srcw & bitmask[b]) ? sdl_foreground : sdl_background;
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_UnlockTexture(sdl_texture);
|
||||
}
|
||||
void sdl_bitblt_to_texture_exact(int _x, int _y, int _w, int _h) {
|
||||
DLword *src = DisplayRegion68k;
|
||||
void *dst;
|
||||
int dstpitchbytes;
|
||||
int dstpitchpixels;
|
||||
const int bitsperword = 8 * sizeof(DLword);
|
||||
int sourcepitchwords = sdl_displaywidth / bitsperword;
|
||||
int xstart = _x / bitsperword; // "word" index of first accessed word in line
|
||||
int xstartb = _x % bitsperword; // bit within word
|
||||
int xlimit = (_x + _w + bitsperword - 1) / bitsperword; // word index
|
||||
int ystart = _y * sourcepitchwords;
|
||||
int ylimit = (_y + _h) * sourcepitchwords;
|
||||
SDL_Rect dstrect = {.x = _x, .y = _y, .w = _w, .h = _h};
|
||||
SDL_LockTexture(sdl_texture, &dstrect, &dst, &dstpitchbytes);
|
||||
dstpitchpixels = dstpitchbytes / sdl_bytesperpixel;
|
||||
int dy = 0;
|
||||
// for each line in the source image
|
||||
for (int sy = ystart; sy < ylimit; sy += sourcepitchwords, dy += dstpitchpixels) {
|
||||
int dx = 0;
|
||||
int sx = xstart;
|
||||
int b = xstartb;
|
||||
int srcw = GETBASEWORD(src, sy + sx);
|
||||
// for each pixel within the dstination region line
|
||||
for (int dx = 0; dx < _w; dx++) {
|
||||
((Uint32 *)dst)[dy + dx] = (srcw & bitmask[b]) ? sdl_foreground : sdl_background;
|
||||
if (++b == bitsperword) {
|
||||
b = 0;
|
||||
sx++;
|
||||
srcw = GETBASEWORD(src, sy + sx);
|
||||
}
|
||||
}
|
||||
}
|
||||
SDL_UnlockTexture(sdl_texture);
|
||||
}
|
||||
#else
|
||||
void sdl_bitblt_to_buffer(int _x, int _y, int _w, int _h) {
|
||||
Uint32 *src = (Uint32 *)DisplayRegion68k;
|
||||
int width = sdl_displaywidth;
|
||||
int height = sdl_displayheight;
|
||||
int bpw = 8 * sizeof(Uint32);
|
||||
int pitch = sdl_displaywidth / bpw;
|
||||
int xlimit = (_x + _w + bpw - 1) / bpw;
|
||||
int ylimit = _y + _h;
|
||||
for (int y = _y; y < ylimit; y++) {
|
||||
int they = y * sdl_displaywidth;
|
||||
for (int x = _x / bpw; x < xlimit; x++) {
|
||||
int srcw = src[y * pitch + x];
|
||||
int thex = x * bpw;
|
||||
for (int b = 0; b < bpw; b++) {
|
||||
uint32_t px = 0;
|
||||
if (srcw & (1 << (bpw - 1 - b))) {
|
||||
px = sdl_foreground;
|
||||
} else {
|
||||
px = sdl_background;
|
||||
}
|
||||
int pxindex = they + thex + b;
|
||||
assert(pxindex >= 0 && pxindex < buffer_size);
|
||||
((Uint32 *)buffer)[pxindex] = px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
void sdl_bitblt_to_window_surface(int _x, int _y, int _w, int _h) {
|
||||
DLword *src = DisplayRegion68k;
|
||||
Uint32 *dst = (Uint32 *)sdl_windowsurface->pixels;
|
||||
int dstpitchbytes = sdl_windowsurface->pitch;
|
||||
int dstpitchpixels = dstpitchbytes / sdl_bytesperpixel;
|
||||
const int bitsperword = 8 * sizeof(DLword);
|
||||
int sourcepitchwords = sdl_displaywidth / bitsperword;
|
||||
int xstart = _x / bitsperword;
|
||||
int xlimit = (_x + _w + bitsperword - 1) / bitsperword;
|
||||
int ystart = _y * sourcepitchwords;
|
||||
int ylimit = (_y + _h) * sourcepitchwords;
|
||||
int dy = _y * dstpitchpixels;
|
||||
// for each line in the source image
|
||||
for (int sy = ystart; sy < ylimit; sy += sourcepitchwords, dy += dstpitchpixels) {
|
||||
// for each word in the line
|
||||
int dx = (_x / bitsperword) * bitsperword;
|
||||
for (int sx = xstart; sx < xlimit; sx++, dx += bitsperword) {
|
||||
int srcw = GETBASEWORD(src, sy + sx);
|
||||
// for each bit in the word
|
||||
for (int b = 0; b < bitsperword; b++) {
|
||||
((Uint32 *)dst)[dy + dx + b] = (srcw & bitmask[b]) ? sdl_foreground : sdl_background;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
static int map_key(SDL_Keycode k) {
|
||||
for (int i = 0; keymap[i] != -1; i += 2) {
|
||||
if (keymap[i + 1] == k) return keymap[i];
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
#define KEYCODE_OFFSET 0
|
||||
static void handle_keydown(SDL_Keycode k, unsigned short mod) {
|
||||
int lk = map_key(k);
|
||||
if (lk == -1) {
|
||||
printf("No mapping for key %s\n", SDL_GetKeyName(k));
|
||||
} else {
|
||||
printf("dn %s -> lisp keycode %d (0x%x)\n", SDL_GetKeyName(k), lk, mod);
|
||||
kb_trans(lk - KEYCODE_OFFSET, FALSE);
|
||||
DoRing();
|
||||
if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
}
|
||||
}
|
||||
static void handle_keyup(SDL_Keycode k, unsigned short mod) {
|
||||
int lk = map_key(k);
|
||||
if (lk == -1) {
|
||||
printf("No mapping for key %s\n", SDL_GetKeyName(k));
|
||||
} else {
|
||||
printf("up %s -> lisp keycode %d (0x%x)\n", SDL_GetKeyName(k), lk, mod);
|
||||
kb_trans(lk - KEYCODE_OFFSET, TRUE);
|
||||
DoRing();
|
||||
if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
}
|
||||
}
|
||||
extern DLword *EmCursorX68K, *EmCursorY68K;
|
||||
extern DLword *EmMouseX68K, *EmMouseY68K, *EmKbdAd068K, *EmRealUtilin68K;
|
||||
extern LispPTR *CLastUserActionCell68k;
|
||||
extern MISCSTATS *MiscStats;
|
||||
|
||||
/* bits within the EmRealUtilin word */
|
||||
#define KEYSET_LEFT 8
|
||||
#define KEYSET_LEFTMIDDLE 9
|
||||
#define KEYSET_MIDDLE 10
|
||||
#define KEYSET_RIGHTMIDDLE 11
|
||||
#define KEYSET_RIGHT 12
|
||||
/* Mouse buttons */
|
||||
#define MOUSE_LEFT 13
|
||||
#define MOUSE_RIGHT 14
|
||||
#define MOUSE_MIDDLE 15
|
||||
static void sdl_update_viewport(int width, int height) {
|
||||
/* XXX: needs work */
|
||||
int w = width / 32 * 32;
|
||||
if (w > sdl_displaywidth * sdl_pixelscale) w = sdl_displaywidth * sdl_pixelscale;
|
||||
int h = height / 32 * 32;
|
||||
if (h > sdl_displayheight * sdl_pixelscale) h = sdl_displayheight * sdl_pixelscale;
|
||||
SDL_Rect r;
|
||||
r.x = 0;
|
||||
r.y = 0;
|
||||
r.w = w;
|
||||
r.h = h;
|
||||
#if defined(SDLRENDERING)
|
||||
SDL_RenderSetViewport(sdl_renderer, &r);
|
||||
#endif
|
||||
printf("new viewport: %d / %d\n", w, h);
|
||||
}
|
||||
static int last_keystate[512] = {0};
|
||||
void sdl_set_invert(int flag) {
|
||||
if (flag) {
|
||||
sdl_foreground = sdl_white;
|
||||
sdl_background = sdl_black;
|
||||
} else {
|
||||
sdl_foreground = sdl_black;
|
||||
sdl_background = sdl_white;
|
||||
}
|
||||
sdl_notify_damage(0, 0, sdl_displaywidth, sdl_displayheight);
|
||||
}
|
||||
void sdl_setMousePosition(int x, int y) {
|
||||
SDL_WarpMouseInWindow(sdl_window, x * sdl_pixelscale, y * sdl_pixelscale);
|
||||
}
|
||||
#if defined(SDLRENDERING)
|
||||
void sdl_update_display() {
|
||||
sdl_bitblt_to_texture(min_x, min_y, max_x - min_x, max_y - min_y);
|
||||
SDL_RenderCopy(sdl_renderer, sdl_texture, NULL, NULL);
|
||||
SDL_RenderPresent(sdl_renderer);
|
||||
}
|
||||
#else
|
||||
void sdl_update_display() {
|
||||
SDL_Rect r, s;
|
||||
|
||||
r.x = min_x;
|
||||
r.y = min_y;
|
||||
r.w = max_x - min_x;
|
||||
r.h = max_y - min_y;
|
||||
if (sdl_pixelscale == 1) {
|
||||
sdl_bitblt_to_window_surface(r.x, r.y, r.w, r.h);
|
||||
SDL_UpdateWindowSurfaceRects(sdl_window, &r, 1);
|
||||
} else {
|
||||
s.x = r.x * sdl_pixelscale;
|
||||
s.y = r.y * sdl_pixelscale;
|
||||
s.w = r.w * sdl_pixelscale;
|
||||
s.h = r.h * sdl_pixelscale;
|
||||
sdl_bitblt_to_buffer(r.x, r.y, r.w, r.h);
|
||||
SDL_LowerBlitScaled(sdl_buffersurface, &r, sdl_windowsurface, &s);
|
||||
SDL_UpdateWindowSurfaceRects(sdl_window, &s, 1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
int process_events_time = 0;
|
||||
void process_SDLevents() {
|
||||
SDL_Event event;
|
||||
while (SDL_PollEvent(&event)) {
|
||||
switch (event.type) {
|
||||
case SDL_QUIT:
|
||||
printf("quitting\n");
|
||||
exit(0);
|
||||
break;
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (event.window.event) {
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
/* XXX: what about integer multiple of 32 requirements here? */
|
||||
sdl_windowwidth = event.window.data1;
|
||||
sdl_windowheight = event.window.data2;
|
||||
sdl_update_viewport(sdl_windowwidth, sdl_windowheight);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
printf("dn ts: %x, type: %x, state: %x, repeat: %x, scancode: %x, sym: %x <%s>, mod: %x\n",
|
||||
event.key.timestamp, event.key.type, event.key.state, event.key.repeat,
|
||||
event.key.keysym.scancode, event.key.keysym.sym,
|
||||
SDL_GetKeyName(event.key.keysym.sym), event.key.keysym.mod);
|
||||
if (event.key.repeat) {
|
||||
/* Lisp needs to see the UP transition before the DOWN transition */
|
||||
handle_keyup(event.key.keysym.sym, event.key.keysym.mod);
|
||||
}
|
||||
handle_keydown(event.key.keysym.sym, event.key.keysym.mod);
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
printf("up ts: %x, type: %x, state: %x, repeat: %x, scancode: %x, sym: %x <%s>, mod: %x\n",
|
||||
event.key.timestamp, event.key.type, event.key.state, event.key.repeat,
|
||||
event.key.keysym.scancode, event.key.keysym.sym,
|
||||
SDL_GetKeyName(event.key.keysym.sym), event.key.keysym.mod);
|
||||
handle_keyup(event.key.keysym.sym, event.key.keysym.mod);
|
||||
break;
|
||||
case SDL_MOUSEMOTION: {
|
||||
int x, y;
|
||||
SDL_GetMouseState(&x, &y);
|
||||
x /= sdl_pixelscale;
|
||||
y /= sdl_pixelscale;
|
||||
*CLastUserActionCell68k = MiscStats->secondstmp;
|
||||
*EmCursorX68K = (*((DLword *)EmMouseX68K)) = (short)(x & 0xFFFF);
|
||||
*EmCursorY68K = (*((DLword *)EmMouseY68K)) = (short)(y & 0xFFFF);
|
||||
DoRing();
|
||||
if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEBUTTONDOWN: {
|
||||
int button = event.button.button;
|
||||
switch (button) {
|
||||
case 1: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_LEFT, FALSE); break;
|
||||
case 2: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_MIDDLE, FALSE); break;
|
||||
case 3: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_RIGHT, FALSE); break;
|
||||
case 4: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_LEFT, FALSE); break;
|
||||
case 5: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_LEFTMIDDLE, FALSE); break;
|
||||
case 6: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_RIGHT, FALSE); break;
|
||||
case 7: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_RIGHTMIDDLE, FALSE); break;
|
||||
}
|
||||
DoRing();
|
||||
if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEBUTTONUP: {
|
||||
int button = event.button.button;
|
||||
switch (button) {
|
||||
case 1: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_LEFT, TRUE); break;
|
||||
case 2: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_MIDDLE, TRUE); break;
|
||||
case 3: PUTBASEBIT68K(EmRealUtilin68K, MOUSE_RIGHT, TRUE); break;
|
||||
case 4: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_LEFT, TRUE); break;
|
||||
case 5: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_LEFTMIDDLE, TRUE); break;
|
||||
case 6: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_RIGHT, TRUE); break;
|
||||
case 7: PUTBASEBIT68K(EmRealUtilin68K, KEYSET_RIGHTMIDDLE, TRUE); break;
|
||||
}
|
||||
DoRing();
|
||||
if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEWHEEL:
|
||||
printf("mousewheel mouse %d x %d y %d direction %s\n", event.wheel.which, event.wheel.x,
|
||||
event.wheel.y,
|
||||
event.wheel.direction == SDL_MOUSEWHEEL_NORMAL ? "normal" : "flipped");
|
||||
break;
|
||||
/* case SDL_KEYMAPCHANGED: */
|
||||
/* printf("SDL_KEYMAPCHANGED\n"); break; */
|
||||
/* case SDL_TEXTINPUT: */
|
||||
/* printf("SDL_TEXTINPUT\n"); break; */
|
||||
default: printf("other event type: %d\n", event.type);
|
||||
}
|
||||
}
|
||||
if (display_update_needed) {
|
||||
sdl_update_display();
|
||||
display_update_needed = 0;
|
||||
min_x = min_y = INT_MAX;
|
||||
max_x = max_y = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int init_SDL(char *windowtitle, int w, int h, int s) {
|
||||
sdl_pixelscale = s;
|
||||
// width must be multiple of 32
|
||||
w = (w + 31) / 32 * 32;
|
||||
sdl_displaywidth = w;
|
||||
sdl_displayheight = h;
|
||||
sdl_windowwidth = w * s;
|
||||
sdl_windowheight = h * s;
|
||||
int width = sdl_displaywidth;
|
||||
int height = sdl_displayheight;
|
||||
printf("requested width: %d, height: %d\n", width, height);
|
||||
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
|
||||
printf("SDL could not be initialized. SDL_Error: %s\n", SDL_GetError());
|
||||
return 1;
|
||||
}
|
||||
printf("initialised\n");
|
||||
sdl_window = SDL_CreateWindow(windowtitle, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
||||
sdl_windowwidth, sdl_windowheight, 0);
|
||||
printf("Window created\n");
|
||||
if (sdl_window == NULL) {
|
||||
printf("Window could not be created. SDL_Error: %s\n", SDL_GetError());
|
||||
return 2;
|
||||
}
|
||||
#if defined(SDLRENDERING)
|
||||
printf("Creating renderer...\n");
|
||||
sdl_renderer = SDL_CreateRenderer(sdl_window, -1, SDL_RENDERER_ACCELERATED);
|
||||
if (NULL == sdl_renderer) {
|
||||
printf("SDL Error: %s\n", SDL_GetError());
|
||||
return 3;
|
||||
}
|
||||
SDL_GetRendererInfo(sdl_renderer, &sdl_rendererinfo);
|
||||
SDL_SetRenderDrawColor(sdl_renderer, 127, 127, 127, 255);
|
||||
SDL_RenderClear(sdl_renderer);
|
||||
SDL_RenderPresent(sdl_renderer);
|
||||
SDL_RenderSetScale(sdl_renderer, 1.0, 1.0);
|
||||
printf("Creating texture...\n");
|
||||
sdl_pixelformat = SDL_AllocFormat(sdl_rendererinfo.texture_formats[0]);
|
||||
sdl_texture = SDL_CreateTexture(sdl_renderer, sdl_pixelformat->format,
|
||||
SDL_TEXTUREACCESS_STREAMING, width, height);
|
||||
sdl_black = SDL_MapRGB(sdl_pixelformat, 0, 0, 0);
|
||||
sdl_white = SDL_MapRGB(sdl_pixelformat, 255, 255, 255);
|
||||
sdl_foreground = sdl_black;
|
||||
sdl_background = sdl_white;
|
||||
sdl_bytesperpixel = sdl_pixelformat->BytesPerPixel;
|
||||
#else
|
||||
printf("Creating window surface and buffer surface\n");
|
||||
sdl_windowsurface = SDL_GetWindowSurface(sdl_window);
|
||||
sdl_pixelformat = sdl_windowsurface->format;
|
||||
sdl_black = SDL_MapRGB(sdl_pixelformat, 0, 0, 0);
|
||||
sdl_white = SDL_MapRGB(sdl_pixelformat, 255, 255, 255);
|
||||
sdl_foreground = sdl_black;
|
||||
sdl_background = sdl_white;
|
||||
sdl_bytesperpixel = sdl_pixelformat->BytesPerPixel;
|
||||
buffer_size = width * height * sdl_bytesperpixel;
|
||||
buffer = malloc(buffer_size);
|
||||
sdl_buffersurface = SDL_CreateRGBSurfaceWithFormatFrom(
|
||||
buffer, sdl_displaywidth, sdl_displayheight, sdl_bytesperpixel * 8,
|
||||
sdl_displaywidth * sdl_bytesperpixel, sdl_pixelformat->format);
|
||||
#endif
|
||||
printf("SDL initialised\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -99,7 +99,9 @@ int main(int argc, char **argv) {
|
||||
printf("setsysout version sysout-name\n");
|
||||
return (-1);
|
||||
}
|
||||
if ((version = atoi(argv[1])) == 0) {
|
||||
errno = 0;
|
||||
version = (int)strtol(argv[1], (char **)NULL, 10);
|
||||
if (errno || version <= 0) {
|
||||
printf("version must be an integer > 0.\n");
|
||||
return (-1);
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
#include "conspagedefs.h"
|
||||
#include "gcfinaldefs.h"
|
||||
#include "gchtfinddefs.h"
|
||||
#include "mkatomdefs.h"
|
||||
#include "testtooldefs.h"
|
||||
|
||||
#define MINARRAYBLOCKSIZE 4
|
||||
#define GUARDVMEMFULL 500
|
||||
@@ -374,7 +374,7 @@ LispPTR newpage(LispPTR base) {
|
||||
} else if (InterfacePage->key == IFPVALID_KEY) {
|
||||
*VMEM_FULL_STATE_word = ATOM_T;
|
||||
} else
|
||||
*VMEM_FULL_STATE_word = make_atom("DIRTY", 0, 5, 0);
|
||||
*VMEM_FULL_STATE_word = MAKEATOM("DIRTY");
|
||||
}
|
||||
|
||||
return (base);
|
||||
|
||||
39
src/subr.c
39
src/subr.c
@@ -29,6 +29,7 @@
|
||||
/***********************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include "lispemul.h"
|
||||
#include "address.h"
|
||||
#include "adr68k.h"
|
||||
@@ -62,6 +63,9 @@
|
||||
#include "unixcommdefs.h"
|
||||
#include "uutilsdefs.h"
|
||||
#include "vmemsavedefs.h"
|
||||
#ifdef MAIKO_ENABLE_FOREIGN_FUNCTION_INTERFACE
|
||||
#include "foreigndefs.h"
|
||||
#endif
|
||||
|
||||
extern LispPTR *PENDINGINTERRUPT68k;
|
||||
|
||||
@@ -336,17 +340,17 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
C_slowbltchar(args);
|
||||
break;
|
||||
|
||||
case 0215:
|
||||
case sb_UNCOLORIZE_BITMAP:
|
||||
POP_SUBR_ARGS;
|
||||
Uncolorize_Bitmap(args);
|
||||
break;
|
||||
|
||||
case 0216:
|
||||
case sb_COLORIZE_BITMAP:
|
||||
POP_SUBR_ARGS;
|
||||
Colorize_Bitmap(args);
|
||||
break;
|
||||
|
||||
case 0217:
|
||||
case sb_COLOR_8BPPDRAWLINE:
|
||||
POP_SUBR_ARGS;
|
||||
Draw_8BppColorLine(args);
|
||||
break;
|
||||
@@ -480,6 +484,7 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
|
||||
case sb_GET_NATIVE_ADDR_FROM_LISP_PTR:
|
||||
POP_SUBR_ARGS;
|
||||
/* XXX: this WILL NOT WORK if Lisp memory is allocated outside the low 4GB */
|
||||
ARITH_SWITCH(Addr68k_from_LADDR(args[0]), TopOfStack);
|
||||
break;
|
||||
|
||||
@@ -669,7 +674,7 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
TopOfStack = with_symbol(args[0], args[1], args[2], args[3], args[4], args[5]);
|
||||
break;
|
||||
|
||||
case 0222: /* Cause an interrupt to occur. Used by */
|
||||
case sb_CAUSE_INTERRUPT: /* Cause an interrupt to occur. Used by */
|
||||
/* Lisp INTERRUPTED to re-set an interrupt */
|
||||
/* when it's uninterruptible. */
|
||||
POP_SUBR_ARGS;
|
||||
@@ -682,7 +687,7 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
/*****************************************/
|
||||
/* foreign-function-call support subrs */
|
||||
/*****************************************/
|
||||
case sb_CALL_C_FN: {
|
||||
case sb_CALL_C_FUNCTION: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = call_c_fn(args); /* args[0]=fnaddr, args[1]=fn type */
|
||||
break;
|
||||
@@ -717,27 +722,27 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
TopOfStack = Mdld_function_executable_p(args);
|
||||
break;
|
||||
}
|
||||
case sb_DLD_LIST_UNDEFINED_SYM: {
|
||||
case sb_DLD_LIST_UNDEFINED_SYMBOLS: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = Mdld_list_undefined_sym();
|
||||
break;
|
||||
}
|
||||
case sb_MALLOC: {
|
||||
case sb_C_MALLOC: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = c_malloc(args);
|
||||
break;
|
||||
}
|
||||
case sb_FREE: {
|
||||
case sb_C_FREE: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = c_free(args);
|
||||
break;
|
||||
}
|
||||
case sb_PUT_C_BASEBYTE: {
|
||||
case sb_C_PUTBASEBYTE: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = put_c_basebyte(args);
|
||||
break;
|
||||
}
|
||||
case sb_GET_C_BASEBYTE: {
|
||||
case sb_C_GETBASEBYTE: {
|
||||
POP_SUBR_ARGS;
|
||||
TopOfStack = get_c_basebyte(args);
|
||||
break;
|
||||
@@ -779,6 +784,20 @@ void OP_subrcall(int subr_no, int argnum) {
|
||||
break;
|
||||
}
|
||||
#endif /* LPSOLVE */
|
||||
case sb_YIELD: {
|
||||
struct timespec rqts = {0, 833333};
|
||||
unsigned sleepnanos;
|
||||
POP_SUBR_ARGS;
|
||||
N_GETNUMBER(args[0], sleepnanos, ret_nil);
|
||||
if (sleepnanos > 999999999) {
|
||||
TopOfStack = NIL;
|
||||
break;
|
||||
}
|
||||
rqts.tv_nsec = sleepnanos;
|
||||
nanosleep(&rqts, NULL);
|
||||
TopOfStack = ATOM_T;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
char errtext[200];
|
||||
sprintf(errtext, "OP_subrcall: Invalid alpha byte 0%o", ((*(PC + 1)) & 0xff));
|
||||
|
||||
@@ -424,7 +424,7 @@ void dump_fnobj(LispPTR index)
|
||||
/************************************************************************/
|
||||
|
||||
/* Opcode names, by opcode */
|
||||
static const char *opcode_table[256] = {
|
||||
const char *opcode_table[256] = {
|
||||
"-X-",
|
||||
"CAR",
|
||||
"CDR",
|
||||
@@ -1018,7 +1018,7 @@ FX *get_nextFX(FX *fx) {
|
||||
} /* get_nextFX end */
|
||||
|
||||
LispPTR MAKEATOM(char *string) {
|
||||
return (make_atom(string, 0, strlen(string), 0));
|
||||
return (make_atom(string, 0, strlen(string)));
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
@@ -1032,7 +1032,7 @@ LispPTR MAKEATOM(char *string) {
|
||||
|
||||
LispPTR *MakeAtom68k(char *string) {
|
||||
LispPTR index;
|
||||
index = make_atom(string, 0, strlen(string), 0);
|
||||
index = make_atom(string, 0, strlen(string));
|
||||
if (index == 0xffffffff) {
|
||||
error("MakeAtom68k: no such atom found");
|
||||
}
|
||||
|
||||
64
src/timer.c
64
src/timer.c
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <setjmp.h>
|
||||
#include <signal.h>
|
||||
@@ -85,11 +86,9 @@ extern DspInterface currentdsp;
|
||||
* to get Alto time.
|
||||
*/
|
||||
|
||||
int TIMEOUT_TIME; /* For file system timeout */
|
||||
int TIMEOUT_TIME = 10; /* For file system timeout, seconds, default 10 */
|
||||
|
||||
#ifdef XWINDOW
|
||||
volatile sig_atomic_t Event_Req = FALSE;
|
||||
#endif /* XWINDOW */
|
||||
volatile sig_atomic_t IO_Signalled = FALSE;
|
||||
|
||||
static int gettime(int casep);
|
||||
|
||||
@@ -403,7 +402,7 @@ void update_timer() {
|
||||
/* TIMER_INTERVAL usec ~ 20 per second. This should live in some
|
||||
machine-configuration
|
||||
file somewhere - it can be changed as the -t parameter to lisp*/
|
||||
int TIMER_INTERVAL = 25000;
|
||||
int TIMER_INTERVAL = 10000;
|
||||
|
||||
extern int LispWindowFd;
|
||||
|
||||
@@ -423,10 +422,6 @@ static void int_timer_service(int sig)
|
||||
|
||||
Irq_Stk_Check = 0;
|
||||
Irq_Stk_End = 0;
|
||||
|
||||
#ifdef XWINDOW
|
||||
Event_Req = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
@@ -466,7 +461,7 @@ static void int_timer_init()
|
||||
|
||||
timer_action.sa_handler = int_timer_service;
|
||||
sigemptyset(&timer_action.sa_mask);
|
||||
timer_action.sa_flags = 0;
|
||||
timer_action.sa_flags = SA_RESTART;
|
||||
|
||||
if (sigaction(SIGVTALRM, &timer_action, NULL) == -1) {
|
||||
perror("sigaction: SIGVTALRM");
|
||||
@@ -496,15 +491,10 @@ void int_io_open(int fd)
|
||||
{
|
||||
#ifdef DOS
|
||||
/* would turn on DOS kbd signal handler here */
|
||||
#elif KBINT
|
||||
|
||||
#elseif defined(O_ASYNC)
|
||||
DBPRINT(("int_io_opening %d\n", fd));
|
||||
if (fcntl(fd, F_SETOWN, getpid()) == -1) {
|
||||
#ifdef DEBUG
|
||||
perror("fcntl F_SETOWN ERROR");
|
||||
#endif
|
||||
};
|
||||
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC) == -1) perror("fcntl F_SETFL error");
|
||||
if (fcntl(fd, F_SETOWN, getpid()) == -1) perror("fcntl F_SETOWN error");
|
||||
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_ASYNC) == -1) perror("fcntl F_SETFL on error");
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -512,11 +502,27 @@ void int_io_close(int fd)
|
||||
{
|
||||
#ifdef DOS
|
||||
/* Turn off signaller here */
|
||||
#elif KBINT
|
||||
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_ASYNC);
|
||||
#elseif defined(O_ASYNC)
|
||||
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) & ~O_ASYNC) == -1) perror("fcntl_F_SETFL off error");
|
||||
#endif
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* i n t _ i o _ s e r v i c e */
|
||||
/* */
|
||||
/* Handle SIGIO */
|
||||
/* */
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
static void int_io_service(int sig)
|
||||
{
|
||||
Irq_Stk_Check = 0;
|
||||
Irq_Stk_End = 0;
|
||||
IO_Signalled = TRUE;
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* i n t _ i o _ i n i t */
|
||||
@@ -531,7 +537,7 @@ void int_io_close(int fd)
|
||||
static void int_io_init() {
|
||||
#ifndef DOS
|
||||
struct sigaction io_action;
|
||||
io_action.sa_handler = getsignaldata;
|
||||
io_action.sa_handler = int_io_service;
|
||||
sigemptyset(&io_action.sa_mask);
|
||||
io_action.sa_flags = 0;
|
||||
|
||||
@@ -541,11 +547,6 @@ static void int_io_init() {
|
||||
DBPRINT(("I/O interrupts enabled\n"));
|
||||
}
|
||||
|
||||
#if defined(XWINDOW) && defined(I_SETSIG)
|
||||
if (ioctl(ConnectionNumber(currentdsp->display_id), I_SETSIG, S_INPUT) < 0)
|
||||
perror("ioctl on X fd - SETSIG for input handling failed");
|
||||
#endif
|
||||
|
||||
#if defined(USE_DLPI)
|
||||
DBPRINT(("INIT ETHER: Doing I_SETSIG.\n"));
|
||||
if (ether_fd > 0)
|
||||
@@ -710,13 +711,12 @@ static void int_file_init() {
|
||||
}
|
||||
|
||||
/* Set Timeout period */
|
||||
if ((envtime = getenv("LDEFILETIMEOUT")) == NULL) {
|
||||
TIMEOUT_TIME = 10;
|
||||
} else {
|
||||
if ((timeout_time = atoi(envtime)) > 0)
|
||||
envtime = getenv("LDEFILETIMEOUT");
|
||||
if (envtime != NULL) {
|
||||
errno = 0;
|
||||
timeout_time = (int)strtol(envtime, (char **)NULL, 10);
|
||||
if (errno == 0 && timeout_time > 0)
|
||||
TIMEOUT_TIME = timeout_time;
|
||||
else
|
||||
TIMEOUT_TIME = 10;
|
||||
}
|
||||
DBPRINT(("File timeout interrupts enabled\n"));
|
||||
}
|
||||
|
||||
10
src/ufs.c
10
src/ufs.c
@@ -156,7 +156,8 @@ exit_host_filesystem() {
|
||||
LispPTR UFS_getfilename(LispPTR *args)
|
||||
{
|
||||
register char *base;
|
||||
register int len, rval;
|
||||
size_t len;
|
||||
register int rval;
|
||||
char lfname[MAXPATHLEN], file[MAXPATHLEN];
|
||||
|
||||
ERRSETJMP(NIL);
|
||||
@@ -369,7 +370,8 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
{
|
||||
char dirname[MAXPATHLEN];
|
||||
char fullname[MAXPATHLEN];
|
||||
register int len, rval;
|
||||
size_t len;
|
||||
register int rval;
|
||||
register char *base;
|
||||
struct stat sbuf;
|
||||
|
||||
@@ -564,7 +566,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
case '~':
|
||||
if (*(cp + 1) == '>' || *(cp + 1) == '\0') {
|
||||
/* "~>" or "~" means the user's home directory. */
|
||||
TIMEOUT(pwd = getpwuid(getuid()));
|
||||
TIMEOUT0(pwd = getpwuid(getuid()));
|
||||
if (pwd == NULL) return (0);
|
||||
|
||||
strcpy(dst, pwd->pw_dir);
|
||||
@@ -588,7 +590,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
*/
|
||||
for (++cp, np = name; *cp != '\0' && *cp != '>';) *np++ = *cp++;
|
||||
*np = '\0';
|
||||
TIMEOUT(pwd = getpwnam(name));
|
||||
TIMEOUT0(pwd = getpwnam(name));
|
||||
if (pwd == NULL) return (0);
|
||||
|
||||
strcpy(dst, pwd->pw_dir);
|
||||
|
||||
@@ -247,14 +247,35 @@ void close_unix_descriptors(void) /* Get ready to shut Maiko down */
|
||||
|
||||
int FindUnixPipes(void) {
|
||||
char *envtmp;
|
||||
int inttmp;
|
||||
struct unixjob cleareduj;
|
||||
|
||||
DBPRINT(("Entering FindUnixPipes\n"));
|
||||
UnixPipeIn = UnixPipeOut = StartTime = UnixPID = -1;
|
||||
if ((envtmp = getenv("LDEPIPEIN"))) UnixPipeIn = atoi(envtmp);
|
||||
if ((envtmp = getenv("LDEPIPEOUT"))) UnixPipeOut = atoi(envtmp);
|
||||
if ((envtmp = getenv("LDESTARTTIME"))) StartTime = atoi(envtmp);
|
||||
if ((envtmp = getenv("LDEUNIXPID"))) UnixPID = atoi(envtmp);
|
||||
if ((envtmp = getenv("LDEPIPEIN"))) {
|
||||
errno = 0;
|
||||
inttmp = (int)strtol(envtmp, (char **)NULL, 10);
|
||||
if (errno == 0)
|
||||
UnixPipeIn = inttmp;
|
||||
}
|
||||
if ((envtmp = getenv("LDEPIPEOUT"))) {
|
||||
errno = 0;
|
||||
inttmp = (int)strtol(envtmp, (char **)NULL, 10);
|
||||
if (errno == 0)
|
||||
UnixPipeOut = inttmp;
|
||||
}
|
||||
if ((envtmp = getenv("LDESTARTTIME"))) {
|
||||
errno = 0;
|
||||
inttmp = (int)strtol(envtmp, (char **)NULL, 10);
|
||||
if (errno == 0)
|
||||
StartTime = inttmp;
|
||||
}
|
||||
if ((envtmp = getenv("LDEUNIXPID"))) {
|
||||
errno = 0;
|
||||
inttmp = (int)strtol(envtmp, (char **)NULL, 10);
|
||||
if (errno == 0)
|
||||
UnixPID = inttmp;
|
||||
}
|
||||
|
||||
/* This is a good place to initialize stuff like the UJ table */
|
||||
NPROCS = sysconf(_SC_OPEN_MAX);
|
||||
@@ -330,7 +351,7 @@ static int FindAvailablePty(char *Slave) {
|
||||
/* => byte count (<= 512), NIL (no data), or T (EOF) */
|
||||
/* 10 Set Window Size, Arg2 = rows, Arg3 = columns */
|
||||
/* 11 Fork PTY to Shell (obsoletes command 4) */
|
||||
/* Arg1 = termtype, Arg2 = csh command string */
|
||||
/* Arg1 = termtype, Arg2 = shell command string */
|
||||
/* => Job # or NIL */
|
||||
/* 12 Create Unix Socket */
|
||||
/* Arg1 = pathname to bind socket to (string) */
|
||||
|
||||
118
src/unixfork.c
118
src/unixfork.c
@@ -75,76 +75,78 @@ static inline ssize_t SAFEREAD(int f, char *b, int c)
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
/* Creates a PTY connection to a csh */
|
||||
/* Creates a PTY connection to a shell */
|
||||
|
||||
static int ForkUnixShell(int slot, char *PtySlave, char *termtype, char *shellarg)
|
||||
{
|
||||
int PID, SlaveFD;
|
||||
struct termios tio;
|
||||
char *argvec[4] = {NULL, NULL, NULL, NULL};
|
||||
char *shell = NULL;
|
||||
char *userShell = NULL;
|
||||
|
||||
PID = fork();
|
||||
|
||||
if (PID == 0) {
|
||||
char *argvec[4];
|
||||
|
||||
if (0 > setsid()) /* create us a new session for tty purposes */
|
||||
perror("setsid");
|
||||
|
||||
/* Open the slave side */
|
||||
SlaveFD = open(PtySlave, O_RDWR);
|
||||
if (SlaveFD == -1) {
|
||||
perror("Slave Open");
|
||||
perror(PtySlave);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#ifdef OS5
|
||||
ioctl(SlaveFD, I_PUSH, "ptem");
|
||||
ioctl(SlaveFD, I_PUSH, "ldterm");
|
||||
#endif /* OS5 */
|
||||
|
||||
/* Set up as basic display terminal: canonical erase,
|
||||
kill processing, echo, backspace to erase, echo ctrl
|
||||
chars as ^x, kill line by backspacing */
|
||||
tcgetattr(SlaveFD, &tio);
|
||||
tio.c_lflag |= ICANON | ECHO | ECHOE | ECHOCTL | ECHOKE;
|
||||
tcsetattr(SlaveFD, TCSANOW, &tio);
|
||||
|
||||
(void)dup2(SlaveFD, 0);
|
||||
(void)dup2(SlaveFD, 1);
|
||||
(void)dup2(SlaveFD, 2);
|
||||
(void)close(SlaveFD);
|
||||
|
||||
/* set the LDESHELL variable so the underlying .cshrc can see it and
|
||||
configure the shell appropriately, though this may not be so important any more */
|
||||
setenv("LDESHELL", "YES", 1);
|
||||
|
||||
if (termtype[0] != 0) { /* set the TERM environment var */
|
||||
setenv("TERM", termtype, 1);
|
||||
}
|
||||
/* Start up csh */
|
||||
argvec[0] = "csh";
|
||||
if (shellarg[0] != 0) { /* setup to run command */
|
||||
argvec[1] = "-c"; /* read commands from next arg */
|
||||
argvec[2] = shellarg;
|
||||
argvec[3] = (char *)0;
|
||||
} else
|
||||
argvec[1] = (char *)0;
|
||||
|
||||
execv("/bin/csh", argvec);
|
||||
|
||||
/* Should never get here */
|
||||
perror("execv");
|
||||
exit(0);
|
||||
} else { /* not the forked process. */
|
||||
if (PID != 0) {
|
||||
if (shellarg != shcom) free(shellarg);
|
||||
return (PID);
|
||||
}
|
||||
|
||||
/* Set the process group so all the kids get the bullet too
|
||||
if (setpgrp(PID, PID) != 0)
|
||||
perror("setpgrp"); */
|
||||
if (0 > setsid()) /* create us a new session for tty purposes */
|
||||
perror("setsid");
|
||||
|
||||
return (PID);
|
||||
/* Open the slave side */
|
||||
SlaveFD = open(PtySlave, O_RDWR);
|
||||
if (SlaveFD == -1) {
|
||||
perror("Slave Open");
|
||||
perror(PtySlave);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#ifdef OS5
|
||||
ioctl(SlaveFD, I_PUSH, "ptem");
|
||||
ioctl(SlaveFD, I_PUSH, "ldterm");
|
||||
#endif /* OS5 */
|
||||
|
||||
/* Set up as basic display terminal: canonical erase,
|
||||
kill processing, echo, backspace to erase, echo ctrl
|
||||
chars as ^x, kill line by backspacing */
|
||||
tcgetattr(SlaveFD, &tio);
|
||||
tio.c_lflag |= ICANON | ECHO | ECHOE | ECHOCTL | ECHOKE;
|
||||
tcsetattr(SlaveFD, TCSANOW, &tio);
|
||||
|
||||
(void)dup2(SlaveFD, 0);
|
||||
(void)dup2(SlaveFD, 1);
|
||||
(void)dup2(SlaveFD, 2);
|
||||
(void)close(SlaveFD);
|
||||
|
||||
/* set the LDESHELL variable so the underlying shell initialization can see it and
|
||||
configure the shell appropriately, though this may not be so important any more */
|
||||
setenv("LDESHELL", "YES", 1);
|
||||
|
||||
if (termtype[0] != 0) { /* set the TERM environment var */
|
||||
setenv("TERM", termtype, 1);
|
||||
}
|
||||
/* Start up shell -- use SHELL environment variable as long as it's in /etc/shells */
|
||||
shell = getenv("SHELL");
|
||||
for (userShell = getusershell(); userShell != NULL && strcmp(shell, userShell) != 0; userShell = getusershell());
|
||||
if (userShell == NULL) {
|
||||
perror("$(SHELL) not found in /etc/shells");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* argvec entries initialized to NULL */
|
||||
argvec[0] = strrchr(userShell, '/') + 1;
|
||||
if (shellarg[0] != 0) { /* setup to run command */
|
||||
argvec[1] = "-c"; /* read commands from next arg */
|
||||
argvec[2] = shellarg;
|
||||
}
|
||||
|
||||
execv(userShell, argvec);
|
||||
|
||||
/* Should never get here */
|
||||
perror("execv");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* fork_Unix is the secondary process spawned right after LISP is
|
||||
|
||||
65
src/uraid.c
65
src/uraid.c
@@ -19,6 +19,7 @@
|
||||
/************************************************************************/
|
||||
/************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
@@ -285,7 +286,7 @@ LispPTR parse_atomstring(char *string)
|
||||
namelen = cnt - 1;
|
||||
|
||||
if ((packagelen == 0) || (strncmp(packageptr, "IL", packagelen) == 0)) { /* default IL: */
|
||||
aindex = make_atom(nameptr, 0, namelen, T);
|
||||
aindex = make_atom(nameptr, 0, namelen);
|
||||
if (aindex == 0xffffffff) {
|
||||
printf("trying IL:\n");
|
||||
aindex = get_package_atom(nameptr, namelen, "INTERLISP", 9, 0);
|
||||
@@ -349,6 +350,7 @@ unsigned int uGetTN(unsigned int address) {
|
||||
|
||||
LispPTR uraid_commands() {
|
||||
int num, address, val;
|
||||
char *endpointer;
|
||||
LispPTR index;
|
||||
DefCell *defcell68k;
|
||||
#ifndef DOS
|
||||
@@ -383,7 +385,9 @@ LispPTR uraid_commands() {
|
||||
printf("DUMP-STACK: f decimal-FXnumber\n");
|
||||
return (T);
|
||||
}
|
||||
if (sscanf(URaid_arg1, "%d", &num) <= 0) { /* com read fails */
|
||||
errno = 0;
|
||||
num = strtoul(URaid_arg1, &endpointer, 10);
|
||||
if (errno != 0 || *endpointer != '\0') { /* com read fails */
|
||||
printf("Illegal argument, not decimal number\n");
|
||||
return (T);
|
||||
}
|
||||
@@ -511,7 +515,9 @@ LispPTR uraid_commands() {
|
||||
printf("PRINT-INSTANCE: O HEX-LispAddress\n");
|
||||
return (T);
|
||||
}
|
||||
if (sscanf(URaid_arg1, "%x", &objaddr) <= 0) {
|
||||
errno = 0;
|
||||
objaddr = strtoul(URaid_arg1, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg not HEX number\n");
|
||||
return (T);
|
||||
}
|
||||
@@ -524,7 +530,9 @@ LispPTR uraid_commands() {
|
||||
}
|
||||
|
||||
/**HEXNUMP(URaid_arg1,"Not Address");**/
|
||||
if (sscanf(URaid_arg1, "%x", &address) <= 0) {
|
||||
errno = 0;
|
||||
address = strtoul(URaid_arg1, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg not HEX number\n");
|
||||
return (T);
|
||||
}
|
||||
@@ -609,17 +617,21 @@ LispPTR uraid_commands() {
|
||||
printf("HEX-DUMP: x Xaddress [Xnum]\n");
|
||||
return (T);
|
||||
}
|
||||
if (sscanf(URaid_arg1, "%x", &address) <= 0) { /* arg1 not HEX */
|
||||
errno = 0;
|
||||
address = strtoul(URaid_arg1, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg(Xaddress) not Xaddress\n");
|
||||
return (T);
|
||||
}
|
||||
switch (sscanf(URaid_arg2, "%x", &num)) {
|
||||
case -1: /* Use defaultval for word-num */ num = XDUMPW; break;
|
||||
case 0: /* Illegal number */
|
||||
if (URaid_arg2[0] == '\0') {
|
||||
num = XDUMPW;
|
||||
} else {
|
||||
errno = 0;
|
||||
num = strtol(URaid_arg2, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg(Xnum) not Xnum\n");
|
||||
return (T);
|
||||
/* break; */
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
if (num < 0) {
|
||||
printf("Dump words num should be positive\n");
|
||||
@@ -657,7 +669,9 @@ LispPTR uraid_commands() {
|
||||
} else if (*URaid_arg2 == 'T')
|
||||
val = ATOM_T;
|
||||
else {
|
||||
if (sscanf(URaid_arg2, "%d", &val) == -1) {
|
||||
errno = 0;
|
||||
val = strtol(URaid_arg2, &endpointer, 10);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf(" Bad value\n");
|
||||
return (T);
|
||||
} else {
|
||||
@@ -691,11 +705,15 @@ LispPTR uraid_commands() {
|
||||
HEXNUMP(URaid_arg2,"Not Proper Value");
|
||||
***/
|
||||
|
||||
if (sscanf(URaid_arg1, "%x", &address) <= 0) {
|
||||
errno = 0;
|
||||
address = strtol(URaid_arg1, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg(Xaddress) not Xaddress\n");
|
||||
return (T);
|
||||
}
|
||||
if (sscanf(URaid_arg2, "%x", &val) <= 0) {
|
||||
errno = 0;
|
||||
val = strtol(URaid_arg2, &endpointer, 16);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Arg(Xval) not Xaddress\n");
|
||||
return (T);
|
||||
}
|
||||
@@ -777,10 +795,6 @@ LispPTR uraid_commands() {
|
||||
printf("VMEMSAVE: v filename (it's NOT bootable)\n");
|
||||
return (T);
|
||||
}
|
||||
#ifndef DISPLAYBUFFER
|
||||
copy_region(HideDisp68k, DisplayRegion68k, DisplayRasterWidth, displayheight);
|
||||
#endif /* DISPLAYBUFFER */
|
||||
|
||||
if (vmem_save(URaid_arg1) != NIL) {
|
||||
#ifndef DISPLAYBUFFER
|
||||
clear_display();
|
||||
@@ -795,13 +809,14 @@ LispPTR uraid_commands() {
|
||||
case '(':
|
||||
if (URaid_argnum == 1)
|
||||
num = 2;
|
||||
|
||||
else if ((URaid_arg1[0] < '0') || (URaid_arg1[0] > '9')) {
|
||||
printf("Illegal argument, not number\n");
|
||||
return (T);
|
||||
} else
|
||||
sscanf(URaid_arg1, "%d", &num);
|
||||
|
||||
else {
|
||||
errno = 0;
|
||||
num = strtoul(URaid_arg1, &endpointer, 10);
|
||||
if (errno != 0 || *endpointer != '\0') {
|
||||
printf("Illegal argument, not number\n");
|
||||
return (T);
|
||||
}
|
||||
}
|
||||
PrintMaxLevel = num;
|
||||
printf("PrintLevel is set to %d.", num);
|
||||
break;
|
||||
@@ -979,7 +994,7 @@ int device_after_raid() {
|
||||
|
||||
|
||||
#ifdef MAIKO_ENABLE_ETHERNET
|
||||
FD_SET(ether_fd, &LispReadFds);
|
||||
if (ether_fd > 0) FD_SET(ether_fd, &LispReadFds);
|
||||
#endif /* MAIKO_ENABLE_ETHERNET */
|
||||
|
||||
#ifdef XWINDOW
|
||||
|
||||
@@ -114,7 +114,7 @@ int c_string_to_lisp_string(char *C, LispPTR Lisp) {
|
||||
register size_t i;
|
||||
register char *dp;
|
||||
for (i = 0, dp = C; i < length + 1; i++) {
|
||||
int ch = *dp++;
|
||||
char ch = *dp++;
|
||||
#ifdef DOS
|
||||
if (ch == '\\') dp++; /* skip 2nd \ in \\ in C strings */
|
||||
#endif /* DOS */
|
||||
|
||||
39
src/xc.c
39
src/xc.c
@@ -99,6 +99,9 @@
|
||||
#include "ubf3defs.h"
|
||||
#include "unwinddefs.h"
|
||||
#include "vars3defs.h"
|
||||
#ifdef XWINDOW
|
||||
#include "xwinmandefs.h"
|
||||
#endif
|
||||
#include "z2defs.h"
|
||||
|
||||
#ifdef DOS
|
||||
@@ -108,8 +111,14 @@ extern IOPAGE *IOPage68K;
|
||||
extern KbdInterface currentkbd;
|
||||
extern DspInterface currentdsp;
|
||||
extern MouseInterface currentmouse;
|
||||
#elif defined(XWINDOW)
|
||||
extern DspInterface currentdsp;
|
||||
#endif /* DOS */
|
||||
|
||||
#ifdef SDL
|
||||
extern void process_SDLevents();
|
||||
#endif
|
||||
|
||||
typedef struct conspage ConsPage;
|
||||
typedef ByteCode *InstPtr;
|
||||
|
||||
@@ -141,11 +150,8 @@ register LispPTR tscache asm("bx");
|
||||
#define PVARL PVar
|
||||
#define IVARL IVar
|
||||
|
||||
#ifdef XWINDOW
|
||||
extern volatile sig_atomic_t Event_Req; /* != 0 when it's time to check X events
|
||||
on machines that don't get them reliably
|
||||
(e.g. Suns running OpenWindows) */
|
||||
#endif /* XWINDOW */
|
||||
/* used by SIGIO signal handler to indicate I/O may be possible */
|
||||
extern volatile sig_atomic_t IO_Signalled;
|
||||
|
||||
#ifdef PCTRACE
|
||||
/* For keeping a trace table (ring buffer) of 100 last PCs */
|
||||
@@ -1112,17 +1118,26 @@ check_interrupt:
|
||||
Irq_Stk_End = (UNSIGNED)EndSTKP;
|
||||
}
|
||||
|
||||
/* Check for an IRQ request */
|
||||
/* This is a good time to process keyboard/mouse and ethernet I/O
|
||||
* X events are not managed in the async/SIGIO code while
|
||||
* raw ethernet, serial port, and socket connections are.
|
||||
* If the system is configured with SIGIO handling we have a hint
|
||||
* that allows us to cheaply skip if there's nothing to do
|
||||
*/
|
||||
#ifdef XWINDOW
|
||||
process_Xevents(currentdsp);
|
||||
#endif
|
||||
#ifdef SDL
|
||||
process_SDLevents();
|
||||
#endif
|
||||
if (IO_Signalled) {
|
||||
IO_Signalled = FALSE;
|
||||
process_io_events();
|
||||
}
|
||||
|
||||
if ((Irq_Stk_End <= 0) || (Irq_Stk_Check <= 0) || need_irq) {
|
||||
if (StkOffset_from_68K(CSTKPTR) > InterfacePage->stackbase) {
|
||||
/* Interrupts not Disabled */
|
||||
/* XXX: what on earth is this code trying to accomplish by calling
|
||||
getsignaldata
|
||||
*/
|
||||
#if !defined(KBINT) || defined(OS4)
|
||||
getsignaldata(0);
|
||||
#endif
|
||||
EXT;
|
||||
update_timer();
|
||||
|
||||
|
||||
44
src/xinit.c
44
src/xinit.c
@@ -30,6 +30,7 @@
|
||||
#include "adr68k.h"
|
||||
#include "xinitdefs.h"
|
||||
#include "dspifdefs.h"
|
||||
#include "timerdefs.h"
|
||||
#include "xbbtdefs.h"
|
||||
#include "xlspwindefs.h"
|
||||
#include "xwinmandefs.h"
|
||||
@@ -50,6 +51,7 @@
|
||||
extern DLword *Lisp_world;
|
||||
extern char Display_Name[128];
|
||||
extern DLword *DisplayRegion68k;
|
||||
extern int noscroll;
|
||||
bool Lisp_Xinitialized = false;
|
||||
int xsync = False;
|
||||
|
||||
@@ -65,7 +67,6 @@ Colormap Colors;
|
||||
|
||||
volatile sig_atomic_t XLocked = 0; /* non-zero while doing X ops, to avoid signals */
|
||||
volatile sig_atomic_t XNeedSignal = 0; /* T if an X interrupt happened while XLOCK asserted */
|
||||
extern fd_set LispReadFds;
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -86,15 +87,16 @@ void init_Xevent(DspInterface dsp)
|
||||
|
||||
XSelectInput(dsp->display_id, dsp->LispWindow, dsp->EnableEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->DisplayWindow, dsp->EnableEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->HorScrollBar, BarMask);
|
||||
XSelectInput(dsp->display_id, dsp->VerScrollBar, BarMask);
|
||||
XSelectInput(dsp->display_id, dsp->HorScrollButton, NoEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->VerScrollButton, NoEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->NEGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->SEGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->SWGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->NWGrav, GravMask);
|
||||
|
||||
if (noscroll == 0) {
|
||||
XSelectInput(dsp->display_id, dsp->HorScrollBar, BarMask);
|
||||
XSelectInput(dsp->display_id, dsp->VerScrollBar, BarMask);
|
||||
XSelectInput(dsp->display_id, dsp->HorScrollButton, NoEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->VerScrollButton, NoEventMask);
|
||||
XSelectInput(dsp->display_id, dsp->NEGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->SEGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->SWGrav, GravMask);
|
||||
XSelectInput(dsp->display_id, dsp->NWGrav, GravMask);
|
||||
}
|
||||
} /*end init_Xevent */
|
||||
|
||||
/************************************************************************/
|
||||
@@ -108,13 +110,11 @@ void lisp_Xexit(DspInterface dsp)
|
||||
{
|
||||
assert(Lisp_Xinitialized);
|
||||
|
||||
#if defined(OS5) && defined(I_SETSIG)
|
||||
ioctl(ConnectionNumber(dsp->display_id), I_SETSIG, 0); /* so no interrupts happen during */
|
||||
#endif
|
||||
|
||||
XLOCK;
|
||||
XDestroySubwindows(dsp->display_id, dsp->LispWindow);
|
||||
XDestroyWindow(dsp->display_id, dsp->LispWindow);
|
||||
XCloseDisplay(dsp->display_id);
|
||||
XUNLOCK(dsp);
|
||||
|
||||
Lisp_Xinitialized = false;
|
||||
} /* end lisp_Xexit */
|
||||
@@ -178,9 +178,6 @@ void Open_Display(DspInterface dsp)
|
||||
{
|
||||
assert(Lisp_Xinitialized == false);
|
||||
|
||||
FD_SET(ConnectionNumber(dsp->display_id), &LispReadFds);
|
||||
fcntl(ConnectionNumber(dsp->display_id), F_SETOWN, getpid());
|
||||
|
||||
/****************************************************/
|
||||
/* If debugging, set the X connection so that */
|
||||
/* we run synchronized--so a debugger can */
|
||||
@@ -198,7 +195,7 @@ void Open_Display(DspInterface dsp)
|
||||
|
||||
Create_LispWindow(dsp); /* Make the main window */
|
||||
Lisp_Xinitialized = true;
|
||||
init_Xevent(dsp); /* Turn on the intrpts. */
|
||||
init_Xevent(dsp); /* Turn on the event reporting */
|
||||
} /* end OpenDisplay */
|
||||
|
||||
/*********************************************************************/
|
||||
@@ -225,7 +222,7 @@ void Open_Display(DspInterface dsp)
|
||||
/* */
|
||||
/*********************************************************************/
|
||||
|
||||
DspInterface X_init(DspInterface dsp, char *lispbitmap, int width_hint, int height_hint,
|
||||
DspInterface X_init(DspInterface dsp, LispPTR lispbitmap, int width_hint, int height_hint,
|
||||
int depth_hint)
|
||||
{
|
||||
Screen *Xscreen;
|
||||
@@ -242,8 +239,13 @@ DspInterface X_init(DspInterface dsp, char *lispbitmap, int width_hint, int heig
|
||||
Xscreen = ScreenOfDisplay(dsp->display_id, DefaultScreen(dsp->display_id));
|
||||
|
||||
/* Set the scrollbar and border widths */
|
||||
dsp->ScrollBarWidth = SCROLL_WIDTH;
|
||||
dsp->InternalBorderWidth = DEF_BDRWIDE;
|
||||
if (noscroll == 0) {
|
||||
dsp->ScrollBarWidth = SCROLL_WIDTH;
|
||||
dsp->InternalBorderWidth = DEF_BDRWIDE;
|
||||
} else {
|
||||
dsp->ScrollBarWidth = 0;
|
||||
dsp->InternalBorderWidth = 0;
|
||||
}
|
||||
|
||||
dsp->Visible.x = LispDisplayRequestedX;
|
||||
dsp->Visible.y = LispDisplayRequestedY;
|
||||
|
||||
150
src/xlspwin.c
150
src/xlspwin.c
@@ -58,6 +58,7 @@ Cursor WaitCursor, DefaultCursor, VertScrollCursor, VertThumbCursor, ScrollUpCur
|
||||
|
||||
extern int LispWindowRequestedX, LispWindowRequestedY;
|
||||
extern unsigned LispWindowRequestedWidth, LispWindowRequestedHeight;
|
||||
extern int noscroll;
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
@@ -187,86 +188,87 @@ void Create_LispWindow(DspInterface dsp)
|
||||
set_Xcursor(dsp, scrollup_cursor.cuimage, (int)scrollup_cursor.cuhotspotx,
|
||||
(int)(15 - scrollup_cursor.cuhotspoty), &ScrollUpCursor, 0);
|
||||
|
||||
/********************************/
|
||||
/* Make all the toolkit windows */
|
||||
/********************************/
|
||||
dsp->VerScrollBar = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2,
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
dsp->Visible.height, dsp->InternalBorderWidth,
|
||||
BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
DefineCursor(dsp, dsp->VerScrollBar, &VertScrollCursor);
|
||||
XMapWindow(dsp->display_id, dsp->VerScrollBar);
|
||||
if (noscroll == 0) {
|
||||
/********************************/
|
||||
/* Make all the toolkit windows */
|
||||
/********************************/
|
||||
dsp->VerScrollBar = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2,
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
dsp->Visible.height, dsp->InternalBorderWidth,
|
||||
BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
DefineCursor(dsp, dsp->VerScrollBar, &VertScrollCursor);
|
||||
XMapWindow(dsp->display_id, dsp->VerScrollBar);
|
||||
|
||||
dsp->HorScrollBar = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow,
|
||||
0 - dsp->InternalBorderWidth, Row2, /* y */
|
||||
dsp->Visible.width, /* width */
|
||||
dsp->ScrollBarWidth, dsp->InternalBorderWidth,
|
||||
BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
DefineCursor(dsp, dsp->HorScrollBar, &HorizScrollCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->HorScrollBar, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XMapWindow(dsp->display_id, dsp->HorScrollBar);
|
||||
dsp->HorScrollBar = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow,
|
||||
0 - dsp->InternalBorderWidth, Row2, /* y */
|
||||
dsp->Visible.width, /* width */
|
||||
dsp->ScrollBarWidth, dsp->InternalBorderWidth,
|
||||
BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
DefineCursor(dsp, dsp->HorScrollBar, &HorizScrollCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->HorScrollBar, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XMapWindow(dsp->display_id, dsp->HorScrollBar);
|
||||
|
||||
dsp->VerScrollButton = XCreateSimpleWindow(
|
||||
dsp->display_id, dsp->VerScrollBar, 0 - dsp->InternalBorderWidth, /* x */
|
||||
(int)((dsp->Visible.y * dsp->Visible.height) / dsp->Display.height), /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
(int)((dsp->Visible.height * dsp->Visible.height) / dsp->Display.height) + 1,
|
||||
dsp->InternalBorderWidth, BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->VerScrollButton, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->VerScrollButton, dsp->ScrollBarPixmap);
|
||||
XClearWindow(dsp->display_id, dsp->VerScrollButton);
|
||||
XMapWindow(dsp->display_id, dsp->VerScrollButton);
|
||||
dsp->VerScrollButton = XCreateSimpleWindow(
|
||||
dsp->display_id, dsp->VerScrollBar, 0 - dsp->InternalBorderWidth, /* x */
|
||||
(int)((dsp->Visible.y * dsp->Visible.height) / dsp->Display.height), /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
(int)((dsp->Visible.height * dsp->Visible.height) / dsp->Display.height) + 1,
|
||||
dsp->InternalBorderWidth, BlackPixelOfScreen(screen), WhitePixelOfScreen(screen));
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->VerScrollButton, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->VerScrollButton, dsp->ScrollBarPixmap);
|
||||
XClearWindow(dsp->display_id, dsp->VerScrollButton);
|
||||
XMapWindow(dsp->display_id, dsp->VerScrollButton);
|
||||
|
||||
dsp->HorScrollButton = XCreateSimpleWindow(
|
||||
dsp->display_id, dsp->HorScrollBar,
|
||||
(int)((dsp->Visible.x * dsp->Visible.width) / dsp->Display.width),
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
(int)((dsp->Visible.width * dsp->Visible.width) / dsp->Display.width) + 1,
|
||||
dsp->ScrollBarWidth, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->HorScrollButton, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->HorScrollButton, dsp->ScrollBarPixmap);
|
||||
XClearWindow(dsp->display_id, dsp->HorScrollButton);
|
||||
XMapWindow(dsp->display_id, dsp->HorScrollButton);
|
||||
dsp->HorScrollButton = XCreateSimpleWindow(
|
||||
dsp->display_id, dsp->HorScrollBar,
|
||||
(int)((dsp->Visible.x * dsp->Visible.width) / dsp->Display.width),
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
(int)((dsp->Visible.width * dsp->Visible.width) / dsp->Display.width) + 1,
|
||||
dsp->ScrollBarWidth, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->HorScrollButton, CWOverrideRedirect,
|
||||
&Lisp_SetWinAttributes);
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->HorScrollButton, dsp->ScrollBarPixmap);
|
||||
XClearWindow(dsp->display_id, dsp->HorScrollButton);
|
||||
XMapWindow(dsp->display_id, dsp->HorScrollButton);
|
||||
|
||||
dsp->NWGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2, Row2, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->NWGrav, dsp->GravityOnPixmap);
|
||||
DefineCursor(dsp, dsp->NWGrav, &DefaultCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->NWGrav, CWOverrideRedirect, &Lisp_SetWinAttributes);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->NWGrav);
|
||||
dsp->NWGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2, Row2, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->NWGrav, dsp->GravityOnPixmap);
|
||||
DefineCursor(dsp, dsp->NWGrav, &DefaultCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->NWGrav, CWOverrideRedirect, &Lisp_SetWinAttributes);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->NWGrav);
|
||||
|
||||
dsp->SEGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col3, Row3, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->SEGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->SEGrav, &DefaultCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->SEGrav, CWOverrideRedirect, &Lisp_SetWinAttributes);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->SEGrav);
|
||||
dsp->SEGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col3, Row3, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->SEGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->SEGrav, &DefaultCursor);
|
||||
XChangeWindowAttributes(dsp->display_id, dsp->SEGrav, CWOverrideRedirect, &Lisp_SetWinAttributes);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->SEGrav);
|
||||
|
||||
dsp->SWGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2, Row3, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->SWGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->SWGrav, &DefaultCursor);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->SWGrav);
|
||||
|
||||
dsp->NEGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col3, Row2, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->NEGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->NEGrav, &DefaultCursor);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->NEGrav);
|
||||
dsp->SWGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col2, Row3, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->SWGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->SWGrav, &DefaultCursor);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->SWGrav);
|
||||
|
||||
dsp->NEGrav = XCreateSimpleWindow(dsp->display_id, dsp->LispWindow, Col3, Row2, GravSize,
|
||||
GravSize, dsp->InternalBorderWidth, BlackPixelOfScreen(screen),
|
||||
WhitePixelOfScreen(screen));
|
||||
XSetWindowBackgroundPixmap(dsp->display_id, dsp->NEGrav, dsp->GravityOffPixmap);
|
||||
DefineCursor(dsp, dsp->NEGrav, &DefaultCursor);
|
||||
XClearWindow(dsp->display_id, dsp->NWGrav);
|
||||
XMapWindow(dsp->display_id, dsp->NEGrav);
|
||||
}
|
||||
/* DefineCursor( dsp, dsp->DisplayWindow, &WaitCursor ); */
|
||||
|
||||
XLOCK;
|
||||
@@ -340,8 +342,8 @@ void DoRing() {
|
||||
KBEVENT *kbevent;
|
||||
|
||||
TPRINT(("TRACE: DoRing()\n"));
|
||||
|
||||
do_ring:
|
||||
/* DEL is not generally present on a Mac X keyboard, Ctrl-shift-ESC would be 18496 */
|
||||
if (((*EmKbdAd268K) & 2113) == 0) { /*Ctrl-shift-NEXT*/
|
||||
error("****** EMERGENCY Interrupt ******");
|
||||
*EmKbdAd268K = KB_ALLUP; /*reset*/
|
||||
|
||||
21
src/xrdopt.c
21
src/xrdopt.c
@@ -11,6 +11,7 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -67,6 +68,7 @@ static XrmOptionDescRec opTable[] = {
|
||||
{"-m", "*memory", XrmoptionSepArg, (XPointer)NULL},
|
||||
{"-NF", "*NoFork", XrmoptionIsArg, (XPointer)NULL},
|
||||
{"-NoFork", "*NoFork", XrmoptionIsArg, (XPointer)NULL},
|
||||
{"-noscroll", "*noscroll", XrmoptionIsArg, (XPointer) NULL},
|
||||
{"-INIT", "*Init", XrmoptionIsArg, (XPointer)NULL},
|
||||
{"-EtherNet", "*EtherNet", XrmoptionSepArg, (XPointer)NULL},
|
||||
{"-E", "*EtherNet", XrmoptionSepArg, (XPointer)NULL},
|
||||
@@ -84,7 +86,7 @@ char Window_Title[255];
|
||||
char Icon_Title[255];
|
||||
|
||||
extern char sysout_name[];
|
||||
extern int sysout_size, for_makeinit, please_fork;
|
||||
extern int sysout_size, for_makeinit, please_fork, noscroll;
|
||||
/* diagnostic flag for sysout dumping */
|
||||
/* extern int maxpages; */
|
||||
|
||||
@@ -172,8 +174,7 @@ void read_Xoption(int *argc, char *argv[])
|
||||
}
|
||||
|
||||
sysout_name[0] = '\0';
|
||||
if (*argc == 2) /* There was probably a sysoutarg */
|
||||
{
|
||||
if (*argc == 2) { /* There was probably a sysoutarg */
|
||||
(void)strncpy(sysout_name, argv[1], PATH_MAX - 1);
|
||||
} else if ((envname = getenv("LDESRCESYSOUT")) != NULL) {
|
||||
strncpy(sysout_name, envname, PATH_MAX - 1);
|
||||
@@ -183,8 +184,9 @@ void read_Xoption(int *argc, char *argv[])
|
||||
envname = getenv("HOME");
|
||||
(void)strcat(sysout_name, envname);
|
||||
(void)strcat(sysout_name, "/lisp.virtualmem");
|
||||
|
||||
if (access(sysout_name, R_OK) != 0) { (void)strcat(sysout_name, ""); }
|
||||
}
|
||||
if (access(sysout_name, R_OK) != 0) {
|
||||
sysout_name[0] = '\0';
|
||||
}
|
||||
|
||||
/* In order to access other DB's we have to open the main display now */
|
||||
@@ -277,6 +279,10 @@ void read_Xoption(int *argc, char *argv[])
|
||||
please_fork = 0;
|
||||
}
|
||||
|
||||
if (XrmGetResource(rDB, "ldex.noscroll", "Ldex.noscroll", str_type, &value) == True) {
|
||||
noscroll = 1;
|
||||
}
|
||||
|
||||
/* if (XrmGetResource(rDB,
|
||||
"ldex.maxpages",
|
||||
"Ldex.maxpages",
|
||||
@@ -287,7 +293,10 @@ void read_Xoption(int *argc, char *argv[])
|
||||
*/
|
||||
if (XrmGetResource(rDB, "ldex.memory", "Ldex.memory", str_type, &value) == True) {
|
||||
(void)strncpy(tmp, value.addr, (int)value.size);
|
||||
sysout_size = atoi(tmp);
|
||||
errno = 0;
|
||||
i = (int)strtol(tmp, (char **)NULL, 10);
|
||||
if (errno == 0 && i > 0)
|
||||
sysout_size = i;
|
||||
}
|
||||
|
||||
if (XrmGetResource(rDB, "ldex.Init", "Ldex.Init", str_type, &value) == True) { for_makeinit = 1; }
|
||||
|
||||
@@ -30,7 +30,7 @@ int Mouse_Included = FALSE;
|
||||
|
||||
extern Cursor WaitCursor, DefaultCursor, VertScrollCursor, VertThumbCursor, ScrollUpCursor,
|
||||
ScrollDownCursor, HorizScrollCursor, HorizThumbCursor, ScrollLeftCursor, ScrollRightCursor;
|
||||
|
||||
extern int noscroll;
|
||||
extern DspInterface currentdsp;
|
||||
|
||||
extern DLword *EmCursorX68K, *EmCursorY68K;
|
||||
@@ -109,33 +109,35 @@ static void lisp_Xconfigure(DspInterface dsp, int x, int y, int lspWinWidth, int
|
||||
XLOCK;
|
||||
XMoveResizeWindow(dsp->display_id, dsp->DisplayWindow, 0, 0, dsp->Visible.width,
|
||||
dsp->Visible.height);
|
||||
/* Scroll bars */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->VerScrollBar, Col2, 0 - dsp->InternalBorderWidth, /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
dsp->Visible.height); /* height */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->HorScrollBar, 0 - dsp->InternalBorderWidth, Row2, /* y */
|
||||
dsp->Visible.width, /* width */
|
||||
dsp->ScrollBarWidth); /* height */
|
||||
if (noscroll == 0) {
|
||||
/* Scroll bars */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->VerScrollBar, Col2, 0 - dsp->InternalBorderWidth, /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
dsp->Visible.height); /* height */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->HorScrollBar, 0 - dsp->InternalBorderWidth, Row2, /* y */
|
||||
dsp->Visible.width, /* width */
|
||||
dsp->ScrollBarWidth); /* height */
|
||||
|
||||
/* Scroll buttons */
|
||||
XMoveResizeWindow(
|
||||
dsp->display_id, dsp->HorScrollButton,
|
||||
(int)((dsp->Visible.x * dsp->Visible.width) / dsp->Display.width), /* x */
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
(int)((dsp->Visible.width * dsp->Visible.width) / dsp->Display.width) + 1, /* width */
|
||||
dsp->ScrollBarWidth); /* height */
|
||||
XMoveResizeWindow(
|
||||
dsp->display_id, dsp->VerScrollButton, 0 - dsp->InternalBorderWidth, /* x */
|
||||
(int)((dsp->Visible.y * dsp->Visible.height) / dsp->Display.height), /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
(int)((dsp->Visible.height * dsp->Visible.height) / dsp->Display.height) + 1); /* height */
|
||||
/* Scroll buttons */
|
||||
XMoveResizeWindow(
|
||||
dsp->display_id, dsp->HorScrollButton,
|
||||
(int)((dsp->Visible.x * dsp->Visible.width) / dsp->Display.width), /* x */
|
||||
0 - dsp->InternalBorderWidth, /* y */
|
||||
(int)((dsp->Visible.width * dsp->Visible.width) / dsp->Display.width) + 1, /* width */
|
||||
dsp->ScrollBarWidth); /* height */
|
||||
XMoveResizeWindow(
|
||||
dsp->display_id, dsp->VerScrollButton, 0 - dsp->InternalBorderWidth, /* x */
|
||||
(int)((dsp->Visible.y * dsp->Visible.height) / dsp->Display.height), /* y */
|
||||
dsp->ScrollBarWidth, /* width */
|
||||
(int)((dsp->Visible.height * dsp->Visible.height) / dsp->Display.height) + 1); /* height */
|
||||
|
||||
/* Gravity windows */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->NWGrav, Col2, Row2, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->NEGrav, Col3, Row2, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->SEGrav, Col3, Row3, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->SWGrav, Col2, Row3, GravSize, GravSize);
|
||||
Scroll(dsp, dsp->Visible.x, dsp->Visible.y);
|
||||
/* Gravity windows */
|
||||
XMoveResizeWindow(dsp->display_id, dsp->NWGrav, Col2, Row2, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->NEGrav, Col3, Row2, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->SEGrav, Col3, Row3, GravSize, GravSize);
|
||||
XMoveResizeWindow(dsp->display_id, dsp->SWGrav, Col2, Row3, GravSize, GravSize);
|
||||
Scroll(dsp, dsp->Visible.x, dsp->Visible.y);
|
||||
}
|
||||
XFlush(dsp->display_id);
|
||||
XUNLOCK(dsp);
|
||||
} /* end lisp_Xconfigure */
|
||||
@@ -171,7 +173,7 @@ void beep_Xkeyboard(DspInterface dsp)
|
||||
|
||||
/************************************************************************/
|
||||
/* */
|
||||
/* g e t X s i g n a l d a t a */
|
||||
/* p r o c e s s _ X e v e n t s */
|
||||
/* */
|
||||
/* Take X key/mouse events and turn them into Lisp events */
|
||||
/* */
|
||||
@@ -179,7 +181,7 @@ void beep_Xkeyboard(DspInterface dsp)
|
||||
|
||||
extern int Current_Hot_X, Current_Hot_Y; /* Cursor hotspot */
|
||||
|
||||
void getXsignaldata(DspInterface dsp)
|
||||
void process_Xevents(DspInterface dsp)
|
||||
{
|
||||
XEvent report;
|
||||
|
||||
@@ -193,8 +195,6 @@ void getXsignaldata(DspInterface dsp)
|
||||
(short)((report.xmotion.x + dsp->Visible.x) & 0xFFFF) - Current_Hot_X;
|
||||
*EmCursorY68K = (*((DLword *)EmMouseY68K)) =
|
||||
(short)((report.xmotion.y + dsp->Visible.y) & 0xFFFF) - Current_Hot_Y;
|
||||
DoRing();
|
||||
if ((KBDEventFlg) > 0) Irq_Stk_End = Irq_Stk_Check = 0;
|
||||
break;
|
||||
case KeyPress:
|
||||
kb_trans(SUNLispKeyMap[(report.xkey.keycode) - KEYCODE_OFFSET], FALSE);
|
||||
@@ -342,4 +342,4 @@ void getXsignaldata(DspInterface dsp)
|
||||
Set_BitGravity(&report.xbutton, dsp, dsp->NWGrav, NorthWestGravity);
|
||||
XFlush(dsp->display_id);
|
||||
} /* end while */
|
||||
} /* end getXsignaldata() */
|
||||
} /* end process_Xevents */
|
||||
|
||||
Reference in New Issue
Block a user