diff --git a/.github/workflows/Dockerfile_medley b/.github/workflows/Dockerfile_medley index 9f2af48a..cd78d73b 100644 --- a/.github/workflows/Dockerfile_medley +++ b/.github/workflows/Dockerfile_medley @@ -57,8 +57,8 @@ RUN apt-get update \ echo "x86_64"; \ fi \ ) \ - && deb="medley-full-${MEDLEY_RELEASE#medley-}" \ - && deb=${deb}_${MAIKO_RELEASE#maiko-}-linux-${p}.deb \ + && deb="medley-full-linux-${p}-${MEDLEY_RELEASE#medley-}" \ + && deb=${deb}_${MAIKO_RELEASE#maiko-}.deb \ && apt-get install -y /tmp/${deb} \ && chown --recursive root:root /usr/local/interlisp \ && (if [ -n "$(which unminimize)" ]; then (yes | unminimize); fi) diff --git a/.github/workflows/buildDocker.yml b/.github/workflows/buildDocker.yml index 13fea618..c7e07ad5 100644 --- a/.github/workflows/buildDocker.yml +++ b/.github/workflows/buildDocker.yml @@ -160,7 +160,7 @@ jobs: - name: Get info about Miako and Medley releases id: release_info run: | - regex="^[^0-9]*\([^_]*\)_\([^-]*-[^-]*\)-\([^-]*\)-\([^.]*\).*\$" + regex="^medley-full-[^-]*-[^-]*-\([^_]*\)_\(.*\).deb\$" ls -1 release_debs | head -n 1 > debname.tmp medley_release="medley-$(sed -e "s/${regex}/\1/" debname.tmp)" maiko_release="maiko-$(sed -e "s/${regex}/\2/" debname.tmp)" @@ -168,6 +168,8 @@ jobs: echo "MEDLEY_RELEASE=${medley_release}" >> ${GITHUB_ENV} echo "MAIKO_RELEASE=${maiko_release}" >> ${GITHUB_ENV} + # regex="^[^0-9]*\([^_]*\)_\([^-]*-[^-]*\)-\([^-]*\)-\([^.]*\).*\$" + # Set repo env variables - name: Set repo/docker env variables id: repo_env diff --git a/.github/workflows/buildLoadup.yml b/.github/workflows/buildLoadup.yml index 635d0a8a..5020c147 100644 --- a/.github/workflows/buildLoadup.yml +++ b/.github/workflows/buildLoadup.yml @@ -128,6 +128,8 @@ jobs: combined_release_tag: ${{ steps.job_outputs.outputs.COMBINED_RELEASE_TAG }} medley_release_tag: ${{ steps.job_outputs.outputs.MEDLEY_RELEASE_TAG }} medley_short_release_tag: ${{ steps.job_outputs.outputs.MEDLEY_SHORT_RELEASE_TAG }} + debs_filename_base: ${{ steps.debs.outputs.DEBS_FILENAME_BASE }} + maiko_release_tag: ${{ steps.job_outputs.outputs.MAIKO_RELEASE_TAG }} artifacts_filename_template: ${{ steps.job_outputs.outputs.ARTIFACTS_FILENAME_TEMPLATE }} release_url: ${{ steps.push.outputs.html_url }} @@ -154,7 +156,7 @@ jobs: id: tag uses: ./../actions/release-tag-action - # Get Maiko release information, retrieves the name of the latest + # Get Maiko release information, retrieves the name of the latest (draft) # release. Used to download the correct Maiko release # Find latest release (draft or normal) - name: Get maiko release information @@ -176,7 +178,6 @@ jobs: echo "maiko_tag=${tag}" >> ${GITHUB_OUTPUT} env: GITHUB_TOKEN: ${{ secrets.MAIKO_TOKEN }} - # Setup environment variables & establish job outputs - name: Setup Environment Variables run: | @@ -198,6 +199,7 @@ jobs: echo "COMBINED_RELEASE_TAG=${COMBINED_RELEASE_TAG}" >> ${GITHUB_OUTPUT} echo "MEDLEY_RELEASE_TAG=${MEDLEY_RELEASE_TAG}" >> ${GITHUB_OUTPUT} echo "MEDLEY_SHORT_RELEASE_TAG=${MEDLEY_SHORT_RELEASE_TAG}" >> ${GITHUB_OUTPUT} + echo "MAIKO_RELEASE_TAG=${MAIKO_RELEASE_TAG}" >> $GITHUB_OUTPUT; echo "ARTIFACTS_FILENAME_TEMPLATE=${ARTIFACTS_FILENAME_TEMPLATE}" >> ${GITHUB_OUTPUT} # Setup some needed dirs in workspace @@ -337,6 +339,17 @@ jobs: omitNameDuringUpdate: true omitPrereleaseDuringUpdate: true + - name: Rename medley tar for the x86_64 platform + run: | + cd ${{ env.TARS_DIR }} + mv medley-full-linux-x86_64-*.tgz medley.tgz + + - name: Save medley tar for use in cygwin installers + uses: actions/upload-artifact@v3 + with: + name: medley-tar + path: | + ${{ env.TARS_DIR }}/medley.tgz # JOB: macos_installer ############################################################## @@ -371,8 +384,7 @@ jobs: echo "MACOS_DIR=${MACOS_DIR}" >>${GITHUB_ENV} echo "ARTIFACTS_DIR=${MACOS_DIR}/artifacts" >>${GITHUB_ENV} echo "TARBALL_DIR=${MACOS_DIR}/tmp/tarballs" >>${GITHUB_ENV} - echo "MEDLEY_RELEASE_TAG=${{ needs.loadup.outputs.medley_release_tag }}" \ - >>${GITHUB_ENV} + echo "MEDLEY_RELEASE_TAG=${{ needs.loadup.outputs.medley_release_tag }}" >>${GITHUB_ENV} echo "ARTIFACTS_FILENAME_TEMPLATE=${{ needs.loadup.outputs.artifacts_filename_template }}" >>${GITHUB_ENV} # Create tarball dir @@ -410,23 +422,23 @@ jobs: -# JOB: windows_installer ############################################################# +# JOB: cygwin_installer ############################################################# # # Create the Windows installer, push it up to the release on github and # update the downloads page on OIO # - windows_installer: + cygwin_installer: - runs-on: windows-latest + runs-on: windows-2022 - needs: [inputs, sentry, loadup] + needs: [inputs, sentry, loadup, linux_installer] if: | needs.sentry.outputs.release_not_built == 'true' || needs.inputs.outputs.force == 'true' outputs: - windows_installer_filename: ${{ steps.jobout.outputs.INSTALLER_FILENAME }} + cygwin_installer: ${{ steps.compile_iss.outputs.CYGWIN_INSTALLER }} steps: @@ -446,21 +458,57 @@ jobs: echo "MEDLEY_SHORT_RELEASE_TAG=$msrt" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append $aft="${{ needs.loadup.outputs.artifacts_filename_template }}" echo "ARTIFACTS_FILENAME_TEMPLATE=$aft" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + $debs="${{ needs.loadup.outputs.debs_filename_base }}" + echo "DEBS_FILENAME_BASE=$debs" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + + # Retrieve medley tars from artifact store + - name: Retrieve medley tar + uses: actions/download-artifact@v3 + with: + name: medley-tar + path: installers/cygwin/ + + # Download maiko cygwin build + - name: Retrieve maiko cygwin build + shell: powershell + env: + GH_TOKEN: ${{ secrets.MAIKO_TOKEN }} + run: | + gh release download ${{ needs.loadup.outputs.maiko_release_tag }} --repo interlisp/maiko --pattern ${{ needs.loadup.outputs.maiko_release_tag }}-cygwin.x86_64.tgz --output installers\cygwin\maiko-cygwin.x86_64.tgz + + # Download cygwin installer to be included by medley.iss + - name: Download cygwin installer + id: cygwin + shell: powershell + run: | + wget https://cygwin.com/setup-x86_64.exe -OutFile installers\cygwin\setup-x86_64.exe # Download vnc viewer - - name: Download vncviewer - shell: powershell - run: | - $url = "https://online.interlisp.org/downloads/vncviewer64-1.12.0.exe" - $output = "installers\win\vncviewer64-1.12.0.exe" - (New-Object System.Net.WebClient).DownloadFile($url, $output) + #- name: Download vncviewer + # shell: powershell + # run: | + # $url = "https://sourceforge.net/projects/tigervnc/files/stable/1.12.0/vncviewer64-1.12.0.exe" + # $output = "installers\win\vncviewer64-1.12.0.exe" + # (New-Object System.Net.WebClient).DownloadFile($url, $output) # Run iscc.exe to compile the installer - - name: Compile medley.iss + #- name: Compile medley.iss + # shell: powershell + # run: | + # iscc installers\win\medley.iss + # $filename="medley-install_${env:COMBINED_RELEASE_TAG}_x64.exe" + # echo "INSTALLER_FILENAME=$filename" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + + # Run iscc.exe to compile the installer + - name: Compile cygwin_medley.iss + id: compile_iss shell: powershell run: | - iscc installers\win\medley.iss - + $Env:CYGWIN_INSTALLER_BASE="medley-full-cygwin-x86_64-${env:COMBINED_RELEASE_TAG}" + $CYGWIN_INSTALLER="${Env:CYGWIN_INSTALLER_BASE}.exe" + echo "CYGWIN_INSTALLER=$CYGWIN_INSTALLER" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + echo "CYGWIN_INSTALLER=$CYGWIN_INSTALLER" | Out-File -FilePath $Env:GITHUB_OUTPUT -Encoding utf8 -Append + iscc installers\cygwin\medley.iss # Upload windows installer to release - name: Upload windows installer to release @@ -468,7 +516,7 @@ jobs: uses: ncipollo/release-action@v1 with: allowUpdates: true - artifacts: installers/win/medley-*.exe + artifacts: installers/cygwin/${{ env.CYGWIN_INSTALLER }} tag: ${{ env.MEDLEY_RELEASE_TAG }} token: ${{ secrets.GITHUB_TOKEN }} omitBodyDuringUpdate: true @@ -487,7 +535,7 @@ jobs: runs-on: ubuntu-latest - needs: [inputs, sentry, loadup, linux_installer, macos_installer, windows_installer] + needs: [inputs, sentry, loadup, linux_installer, macos_installer, cygwin_installer] if: | needs.sentry.outputs.release_not_built == 'true' || needs.inputs.outputs.force == 'true' @@ -503,6 +551,8 @@ jobs: echo "MEDLEY_RELEASE_TAG=${mrt}" >>${GITHUB_ENV} msrt="${{ needs.loadup.outputs.medley_short_release_tag }}" echo "MEDLEY_SHORT_RELEASE_TAG=${msrt}" >>${GITHUB_ENV} + cyginst="${{ needs.cygwin_installer.outputs.cygwin_installer }}" + echo "CYGWIN_INSTALLER=${cyginst}" >>${GITHUB_ENV} # Checkout latest commit - name: Checkout Medley @@ -514,7 +564,7 @@ jobs: # So this will be the final update before creating downloads page # and we can use its url for the page - run: echo "placeholder" >placeholder.txt - - name: Upload windows installer to release + - name: Upload windows placeholder.txt to release id: pushph uses: ncipollo/release-action@v1 with: @@ -552,6 +602,7 @@ jobs: -e "s/@@@MEDLEY.SHORT.RELEASE.TAG@@@/${MEDLEY_SHORT_RELEASE_TAG}/g" \ -e "s/@@@COMBINED.RELEASE.TAG@@@/${COMBINED_RELEASE_TAG}/g" \ -e "s~@@@DOWNLOAD_URL@@@~${download_url}~g" \ + -e "s~@@@CYGWIN.INSTALLER@@@~${CYGWIN_INSTALLER}~g" \ < "${local_template}" > "${local_filename}" # Create sftp instruction file echo "-rm ${remote_filepath}.oldold" > batch @@ -566,6 +617,12 @@ jobs: env: SSH_KEY: ${{ secrets.OIO_SSH_KEY }} + # Remove placeholder.txt + - name: Remove placeholder.txt + run: | + gh release delete-asset ${{ env.MEDLEY_RELEASE_TAG }} placeholder.txt --yes + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # JOB: complete ##################################################################### diff --git a/.github/workflows/buildReleaseInclDocker.yml b/.github/workflows/buildReleaseInclDocker.yml index 5049109c..2f108c15 100644 --- a/.github/workflows/buildReleaseInclDocker.yml +++ b/.github/workflows/buildReleaseInclDocker.yml @@ -95,8 +95,7 @@ jobs: with: draft: ${{ needs.inputs.outputs.draft }} force: ${{ needs.inputs.outputs.force }} - secrets: - OIO_SSH_KEY: ${{ secrets.OIO_SSH_KEY }} + secrets: inherit ###################################################################################### @@ -108,9 +107,7 @@ jobs: with: draft: ${{ needs.inputs.outputs.draft }} force: ${{ needs.inputs.outputs.force }} - secrets: - DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} - DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + secrets: inherit ###################################################################################### diff --git a/greetfiles/APPS-INIT b/greetfiles/APPS-INIT index 462c7eda..8c83e70e 100644 --- a/greetfiles/APPS-INIT +++ b/greetfiles/APPS-INIT @@ -1,12 +1,11 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "19-Jan-2023 12:44:20" {DSK}frank>il>medley>gmedley>greetfiles>APPS-INIT.;9 21022 +(FILECREATED "16-Jun-2023 17:20:09" {DSK}frank>il>medley>gmedley>greetfiles>APPS-INIT.;11 21130 - :CHANGES-TO (VARS APPS-INITCOMS) - (FNS Apps.DoInit) + :CHANGES-TO (FNS Apps.DoInit) - :PREVIOUS-DATE "19-Jan-2023 11:57:40" {DSK}frank>il>medley>gmedley>greetfiles>APPS-INIT.;8 -) + :PREVIOUS-DATE "19-Jan-2023 12:44:20" +{DSK}frank>il>medley>gmedley>greetfiles>APPS-INIT.;10) (PRETTYCOMPRINT APPS-INITCOMS) @@ -170,7 +169,11 @@ (* ;; " create the Documentation and ROOMS, Notecards Activation Buttons, if needed") - (Apps.CreateButtons T]) + (Apps.CreateButtons T) + + (* ;; " Make sure Notecards doesn't try to load its HASH file in NC.PostGreet") + + (SETTOPVAL '\NC.SourceAccessFlg NIL]) (Apps.CreateButtons [LAMBDA (DoDocsToo) (* ; "Edited 13-Dec-2022 12:51 by frank") @@ -373,8 +376,8 @@ (BKSYSBUF " ") ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1146 20888 (Apps.InitNotecards 1156 . 5018) (Apps.DoInit 5020 . 8119) ( -Apps.CreateButtons 8121 . 16945) (Apps.CreateLabel 16947 . 17757) (Apps.ActivateCLOS 17759 . 19108) ( -Apps.ActivateRooms 19110 . 19961) (Apps.ShowDoc 19963 . 20112) (XCL-USER::EXEC_INTERLISP 20114 . 20886 + (FILEMAP (NIL (1109 20996 (Apps.InitNotecards 1119 . 4981) (Apps.DoInit 4983 . 8227) ( +Apps.CreateButtons 8229 . 17053) (Apps.CreateLabel 17055 . 17865) (Apps.ActivateCLOS 17867 . 19216) ( +Apps.ActivateRooms 19218 . 20069) (Apps.ShowDoc 20071 . 20220) (XCL-USER::EXEC_INTERLISP 20222 . 20994 ))))) STOP diff --git a/greetfiles/APPS-INIT.LCOM b/greetfiles/APPS-INIT.LCOM index bfa75964..67ca0727 100644 Binary files a/greetfiles/APPS-INIT.LCOM and b/greetfiles/APPS-INIT.LCOM differ diff --git a/installers/cygwin/.gitignore b/installers/cygwin/.gitignore new file mode 100644 index 00000000..041cf871 --- /dev/null +++ b/installers/cygwin/.gitignore @@ -0,0 +1,6 @@ +medley*.exe +medley*.tgz +maiko*.tgz +setup-x86_64.exe +medley.bat + diff --git a/installers/cygwin/Medley.ico b/installers/cygwin/Medley.ico new file mode 100644 index 00000000..6f0f1972 Binary files /dev/null and b/installers/cygwin/Medley.ico differ diff --git a/installers/cygwin/editpath/EditPath.iss b/installers/cygwin/editpath/EditPath.iss new file mode 100644 index 00000000..b70d571d --- /dev/null +++ b/installers/cygwin/editpath/EditPath.iss @@ -0,0 +1,165 @@ +; Copyright (C) 2021-2023 by Bill Stewart (bstewart at iname.com) +; +; This program is free software; you can redistribute it and/or modify it under +; the terms of the GNU Lesser General Public License as published by the Free +; Software Foundation; either version 3 of the License, or (at your option) any +; later version. +; +; This program is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +; FOR A PARTICULAR PURPOSE. See the GNU General Lesser Public License for more +; details. +; +; You should have received a copy of the GNU Lesser General Public License +; along with this program. If not, see https://www.gnu.org/licenses/. + +; Sample Inno Setup (https://www.jrsoftware.org/isinfo.php) script +; demonstrating use of PathMgr.dll. +; +; This script uses PathMgr.dll in the following ways: +; * Copies PathMgr.dll to the target machine (required for uninstall) +; * Defines a task in [Tasks] that should modify the Path +; * Imports the AddDirToPath() DLL function at setup time +; * Imports the RemoveDirFromPath() DLL function at uninstall time +; * Stores task state as custom setting using RegisterPreviousData() +; * Retrieves task state custom setting during setup and uninstall initialize +; * At post install, adds app dir to Path if task selected +; * At uninstall, removes dir from Path if custom setting present +; * Unloads and deletes DLL and removes app dir at uninstall deinitialize + +#if Ver < EncodeVer(6,0,0,0) + #error This script requires Inno Setup 6 or later +#endif + +[Setup] +AppId={{A17D2D05-C729-4F2A-9CC7-E04906C5A842} +AppName=EditPath +AppVersion=4.0.4.0 +UsePreviousAppDir=false +DefaultDirName={autopf}\EditPath +Uninstallable=true +OutputDir=. +OutputBaseFilename=EditPath_Setup +ArchitecturesInstallIn64BitMode=x64 +PrivilegesRequired=none +PrivilegesRequiredOverridesAllowed=dialog + +[Files] +; Install PathMgr.dll for use with both setup and uninstall; use +; uninsneveruninstall flag because DeinitializeSetup() will delete after +; unloading the DLL; install the 32-bit version of PathMgr.dll because both +; setup and uninstall executables are 32-bit +Source: "i386\PathMgr.dll"; DestDir: "{app}"; Flags: uninsneveruninstall + +; Other files to install on target system +Source: "i386\EditPath.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode() +Source: "x86_64\EditPath.exe"; DestDir: "{app}"; Check: Is64BitInstallMode() +Source: "EditPath.md"; DestDir: "{app}" + +[Tasks] +Name: modifypath; Description: "&Add to Path" + +[Code] +const + MODIFY_PATH_TASK_NAME = 'modifypath'; // Specify name of task + +var + PathIsModified: Boolean; // Cache task selection from previous installs + ApplicationUninstalled: Boolean; // Has application been uninstalled? + +// Import AddDirToPath() at setup time ('files:' prefix) +function DLLAddDirToPath(DirName: string; PathType, AddType: DWORD): DWORD; + external 'AddDirToPath@files:PathMgr.dll stdcall setuponly'; + +// Import RemoveDirFromPath() at uninstall time ('{app}\' prefix) +function DLLRemoveDirFromPath(DirName: string; PathType: DWORD): DWORD; + external 'RemoveDirFromPath@{app}\PathMgr.dll stdcall uninstallonly'; + +// Wrapper for AddDirToPath() DLL function +function AddDirToPath(const DirName: string): DWORD; +var + PathType, AddType: DWORD; +begin + // PathType = 0 - use system Path + // PathType = 1 - use user Path + // AddType = 0 - add to end of Path + // AddType = 1 - add to beginning of Path + if IsAdminInstallMode() then + PathType := 0 + else + PathType := 1; + AddType := 0; + result := DLLAddDirToPath(DirName, PathType, AddType); +end; + +// Wrapper for RemoveDirFromPath() DLL function +function RemoveDirFromPath(const DirName: string): DWORD; +var + PathType: DWORD; +begin + // PathType = 0 - use system Path + // PathType = 1 - use user Path + if IsAdminInstallMode() then + PathType := 0 + else + PathType := 1; + result := DLLRemoveDirFromPath(DirName, PathType); +end; + +procedure RegisterPreviousData(PreviousDataKey: Integer); +begin + // Store previous or current task selection as custom user setting + if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then + SetPreviousData(PreviousDataKey, MODIFY_PATH_TASK_NAME, 'true'); +end; + +function InitializeSetup(): Boolean; +begin + result := true; + // Was task selected during a previous install? + PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; +end; + +function InitializeUninstall(): Boolean; +begin + result := true; + // Was task selected during a previous install? + PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; + ApplicationUninstalled := false; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then + begin + // Add app directory to Path at post-install step if task selected + if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then + AddDirToPath(ExpandConstant('{app}')); + end; +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + if CurUninstallStep = usUninstall then + begin + // Remove app directory from path during uninstall if task was selected; + // use variable because we can't use WizardIsTaskSelected() at uninstall + if PathIsModified then + RemoveDirFromPath(ExpandConstant('{app}')); + end + else if CurUninstallStep = usPostUninstall then + begin + ApplicationUninstalled := true; + end; +end; + +procedure DeinitializeUninstall(); +begin + if ApplicationUninstalled then + begin + // Unload and delete PathMgr.dll and remove app dir when uninstalling + UnloadDLL(ExpandConstant('{app}\PathMgr.dll')); + DeleteFile(ExpandConstant('{app}\PathMgr.dll')); + RemoveDir(ExpandConstant('{app}')); + end; +end; diff --git a/installers/cygwin/editpath/EditPath.md b/installers/cygwin/editpath/EditPath.md new file mode 100644 index 00000000..29a716c2 --- /dev/null +++ b/installers/cygwin/editpath/EditPath.md @@ -0,0 +1,118 @@ +# EditPath + +EditPath is a Windows console (text-based, command-line) program for managing the system Path and user Path. + +# Author + +Bill Stewart - bstewart at iname dot com + +# License + +EditPath.exe is covered by the GNU Lesser Public License (LPGL). See the file `LICENSE` for details. + +# Download + +https://github.com/Bill-Stewart/PathMgr/releases/ + +# Background + +The system Path is found in the following location in the Windows registry: + +Root: `HKEY_LOCAL_MACHINE` +Subkey: `SYSTEM\CurrentControlSet\Control\Session Manager\Environment` +Value name: `Path` + +The current user Path is found in the following location in the registry: + +Root: `HKEY_CURRENT_USER` +Subkey: `Environment` +Value name: `Path` + +In both cases, the `Path` value is (or should be) the registry type `REG_EXPAND_SZ`, which means that it is a string that can contain values surrounded by `%` characters that Windows will automatically expand to environment variable values. (For example, `%SystemRoot%` will be expanded to `C:\Windows` on most systems.) + +The `Path` value contains a `;`-delimited list of directory names that the system should search for executables, library files, scripts, etc. Windows appends the content of the current user Path to the system Path and expands the environment variable references. The resulting string is set as the `Path` environment variable for processes. + +EditPath provides a command-line interface for managing the `Path` value in the system location (in `HKEY_LOCAL_MACHINE`) and the current user location (in `HKEY_CURRENT_USER`). + +# Usage + +The following describes the command-line usage for the program. Parameters are case-sensitive. + +**EditPath** [_options_] _type_ _action_ + +You must specify only one of the following _type_ parameters: + +| _type_ | Abbreviation | Description +| ------- | ------------ | ----------- +| **--system** | **-s** | Specifies the system Path +| **--user** | **-u** | Specifies the user Path + +You must specify only one of the following _action_ parameters: + +| _action_ | Abbreviation | Description +| -------- | ------------ | ----------- +| **--list** | **-l** | Lists directories in Path +| **--test "**_dirname_**"** | **-t "**_dirname_**"** | Tests if directory exists in Path +| **--add "**_dirname_**"** | **-a "**_dirname_**"** | Adds directory to Path +| **--remove "**_dirname_**"** | **-r "**_dirname_**"** | Removes directory from Path + +The following parameters are optional: + +| _options_ | Abbreviation | Description +| --------- | ------------ | ----------- +| **--quiet** | **-q** | Suppresses result messages +| **--expand** | **-x** | Expands environment variables (**--list** only) +| **--beginning** | **-b** | Adds to beginning of Path (**--add** only) + +# Exit Codes + +The following table lists typical exit codes when not using **--test** (**-t**). + +| Exit Code | Description +| --------- | ----------- +| 0 | No errors +| 2 | The Path value is not present in the registry +| 3 | The specified directory does not exist in the Path +| 5 | Access is denied +| 87 | Incorrect parameter(s) +| 183 | The specified directory already exists in the Path + +The following table lists typical exit codes when using **--test** (**-t**). + +| Exit Code | Description +| --------- | ----------- +| 1 | The specified directory exists in the unexpanded Path +| 2 | The specified directory exists in the expanded Path +| 3 | The specified directory does not exist in the Path + +# Remarks + +* Anything on the command line after **--test**, **--add**, or **--remove** is considered to be the argument for the parameter. To avoid ambiguity, specify the _action_ parameter last on the command line. + +* Uexpanded vs. expanded refers to whether the environment variable references (i.e., names between `%` characters) are expanded after retrieving the Path value from the registry. For example, `%SystemRoot%` is unexpanded but `C:\Windows` is expanded. + +* The **--add** (**-a**) parameter checks whether the specified directory exists in both the unexpanded and expanded copies of the Path before adding the directory. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--add C:\TestApp` will return exit code 183 (i.e., the directory already exists in the Path) because `%TESTAPP%` expands to `C:\TestApp`. + +* The **--remove** (**-r**) parameter does not expand environment variable references. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--remove "C:\TestApp"` will return exit code 3 (i.e., the directory does not exist in the Path) because **--remove** does not expand `%TESTAPP%` to `C:\TestApp`. For the command to succeed, you would have to specify `--remove "%TESTAPP%"` instead. + +* The program will exit with error code 87 if a parameter (or an argument to a parameter) is missing or not valid, if mutually exclusive parameters are specified, etc. + +* The program will exit with error code 5 if the current user does not have permission to update the Path value in the registry (for example, if you try to update the system Path using a standard user account or an unelevated administrator account). + +# Examples + +1. `EditPath --expand --system --list` + + This command outputs the directories in the system Path, with environment variables expanded. You can also write this command as `EditPath -x -s -l`. + +2. `EditPath --user --add "%LOCALAPPDATA%\Programs\MyApp"` + + Adds the specified directory name to the user Path. + +3. `EditPath -s -r "C:\Program Files\MyApp\bin"` + + Removes the specified directory from the system Path. + +4. `EditPath -s --test "C:\Program Files (x86)\MyApp\bin"` + + Returns an exit code of 3 if the specified directory is not in the system Path, 1 if the specified directory is in the unexpanded copy of the system Path, or 2 if the specified directory is in the expanded copy of the system Path. diff --git a/installers/cygwin/editpath/README.TXT b/installers/cygwin/editpath/README.TXT new file mode 100644 index 00000000..c922ee30 --- /dev/null +++ b/installers/cygwin/editpath/README.TXT @@ -0,0 +1,3 @@ +Editpath installed here is extracted from Release 1.04 from https://github.com/Bill-Stewart/PathMgr. + + diff --git a/installers/cygwin/editpath/i386/EditPath.exe b/installers/cygwin/editpath/i386/EditPath.exe new file mode 100644 index 00000000..7e9f2837 Binary files /dev/null and b/installers/cygwin/editpath/i386/EditPath.exe differ diff --git a/installers/cygwin/editpath/x86_64/EditPath.exe b/installers/cygwin/editpath/x86_64/EditPath.exe new file mode 100644 index 00000000..6e79f161 Binary files /dev/null and b/installers/cygwin/editpath/x86_64/EditPath.exe differ diff --git a/installers/cygwin/makeflix.iss b/installers/cygwin/makeflix.iss new file mode 100644 index 00000000..d74615b3 --- /dev/null +++ b/installers/cygwin/makeflix.iss @@ -0,0 +1,128 @@ +; -- makeflix.iss -- +; fgh 2016-08-19 + +#define x86_or_x64 "x86" +#define version "1.0.1" + +#if x86_or_x64 == "x86" +#define exe_dir "Win32" +#else +#define exe_dir "x64" +#endif + +[Setup] +ArchitecturesAllowed={#x86_or_x64} +AppName=Makeflix +AppVersion={#version} +AppPublisher=Lellan, Inc. +AppPublisherURL=http://www.lellan.com/ +AppCopyright=Copyright (C) 2012-2017 Lellan, Inc. +DefaultDirName={pf}\Lellan\Makeflix +DefaultGroupName=Lellan +UninstallDisplayIcon={app}\makeflix.exe +Compression=lzma2 +SolidCompression=yes +; "ArchitecturesInstallIn64BitMode=x64" requests that the install be +; done in "64-bit mode" on x64, meaning it should use the native +; 64-bit Program Files directory and the 64-bit view of the registry. +ArchitecturesInstallIn64BitMode=x64 +; Source Dir is lellan/toolchain/makeflix/windows +SourceDir="..\" +OutputDir="deploy" +OutputBaseFilename="makeflix_v{#version}_{#x86_or_x64}" +SetupIconFile="..\images\Lellan_Logo_20130221.ico" +LicenseFile="..\deploy\EULA.rtf" +DisableWelcomePage=no + +[Files] +Source: "makeflix\{#exe_dir}\Release\makeflix.exe"; DestDir: "{app}"; DestName: "makeflix.exe"; Flags: ignoreversion +Source: "deploy\DLLs\{#x86_or_x64}\Qt5Core.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "deploy\DLLs\{#x86_or_x64}\Qt5Gui.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "deploy\DLLs\{#x86_or_x64}\Qt5Widgets.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "deploy\DLLs\{#x86_or_x64}\Qt5Network.dll"; DestDir: "{app}"; Flags: ignoreversion +Source: "deploy\DLLs\{#x86_or_x64}\platforms\qwindows.dll"; DestDir: "{app}\platforms"; Flags: ignoreversion +Source: "deploy\gstreamer\{#x86_or_x64}\*"; DestDir: "{app}\gstreamer"; Flags: recursesubdirs ignoreversion +Source: "deploy\vc_redist\vc_redist.{#x86_or_x64}.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall +Source: "deploy\bonjour\Bonjour.{#x86_or_x64}.msi"; DestDir: "{tmp}" ; Flags: deleteafterinstall + +Source: "..\deploy\Makeflix_Open_Source_Libraries.pdf"; DestDir: "{app}" + +[Icons] +Name: "{group}\Makeflix"; Filename: "{app}\makeflix.exe" +Name: "{group}\Uninstall Makeflix"; Filename: "{uninstallexe}" + + +[Run] +#define VCmsg "Installing Microsoft Visual C++ Redistributable ..." +Filename: "{tmp}\vc_redist{#x86_or_x64}.exe"; StatusMsg: "{#VCmsg}"; Check: not VCinstalled +#define BonjourMsg "Installing Apple Bonjour support ..." +Filename: "msiexec"; Parameters: "/i {tmp}\Bonjour.{#x86_or_x64}.msi"; StatusMsg: "{#BonjourMsg}"; Check: not BonjourInstalled + +[Registry] +Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\makeflix.exe"; ValueType: string; ValueName: "(Default)"; ValueData: "{app}\makeflix.exe"; Flags: uninsdeletekey +Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\makeflix.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app}\gstreamer\bin"; Flags: uninsdeletekey + +[Code] +function VCinstalled: Boolean; + // By Michael Weiner + // Function for Inno Setup Compiler + // 13 November 2015 + // Modified by Frank G Halasz to handle WOW case + // 23 August 2016 + // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False. + // The programmer may set the year of redistributable to find; see below. + var + names: TArrayOfString; + i: Integer; + dName, key, year, platfm: String; + begin + // Year of redistributable to find; leave null to find installation for any year. + year := '2015'; + Result := False; + if Is64BitInstallMode then + begin + platfm := 'x64'; + key := 'Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall'; + end + else if not IsWin64 then + begin + platfm := 'x86'; + key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall'; + end + else + begin + platfm := 'x86'; + key := 'Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall'; + end; + // Get an array of all of the uninstall subkey names. + if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then + // Uninstall subkey names were found. + begin + i := 0 + while ((i < GetArrayLength(names)) and (Result = False)) do + // The loop will end as soon as one instance of a Visual C++ redistributable is found. + begin + // For each uninstall subkey, look for a DisplayName value. + // If not found, then the subkey name will be used instead. + if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then + dName := names[i]; + // See if the value contains both of the strings below. + Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) * Pos(platfm, dName) <> 0) + i := i + 1; + end; + end; + end; + + function BonjourInstalled: Boolean; + // Returns True if Apple Bonjour is installed, otherwise False. + // Ignores date/version of Bonjour. + begin + Result := False; + // If this key exists, then + // bonjour services must already be installed + if RegKeyExists(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\Bonjour Service') then + // Uninstall subkey names were found. + begin + Result := True; + end; + end; diff --git a/installers/cygwin/medley.iss b/installers/cygwin/medley.iss new file mode 100644 index 00000000..91cad4e5 --- /dev/null +++ b/installers/cygwin/medley.iss @@ -0,0 +1,85 @@ +;############################################################################### +;# +;# medley.iss - Inno Setup compiler script for creating a Windows +;# installer for cygwin and Medley on cygwin +;# +;# 2023-06-03 Frank Halasz +;# +;# Copyright 2023 Interlisp.org +;# +;############################################################################### + +#define x86_or_x64 "x64" +#if GetEnv('COMBINED_RELEASE_TAG') != "" +#define VERSION=GetEnv('COMBINED_RELEASE_TAG') +#else +#define VERSION="local" +#endif + +#if GetEnv('CYGWIN_INSTALLER_BASE') != "" +#define OUTFILE=GetEnv('CYGWIN_INSTALLER_BASE') +#else +#define OUTFILE="medley-full-cygwin-x86_64-local" +#endif + +[Setup] +PrivilegesRequired=lowest +ArchitecturesAllowed={#x86_or_x64} +AppName=Medley +AppVersion={#version} +AppPublisher=Interlisp.org +AppPublisherURL=https://interlisp.org/ +AppCopyright=Copyright (C) 2023 Interlisp.org +DefaultDirName={%USERPROFILE}\il +DefaultGroupName=Medley +Compression=lzma2 +SolidCompression=yes +; "ArchitecturesInstallIn64BitMode=x64" requests that the install be +; done in "64-bit mode" on x64, meaning it should use the native +; 64-bit Program Files directory and the 64-bit view of the registry. +ArchitecturesInstallIn64BitMode=x64 +OutputDir="." +OutputBaseFilename={#OUTFILE} +SetupIconFile="Medley.ico" +DisableWelcomePage=no +MissingRunOnceIdsWarning=no +DisableProgramGroupPage=yes +WizardImageFile=medley_logo.bmp +WizardSmallImageFile=medley_logo_small.bmp +WizardImageStretch=no +UninstallDisplayIcon="{app}\Medley.ico" +UninstallFilesDir={app}\uninstall +UsePreviousAppDir=no + +[Dirs] +Name: "{app}\install"; Permissions: everyone-full +Name: "{app}\uninstall"; Permissions: everyone-full +Name: "{app}\cygwin"; Permissions: everyone-full + +[Files] +Source: "setup-x86_64.exe"; DestDir: "{app}\cygwin"; DestName: "setup-x86_64.exe"; Flags: ignoreversion +Source: "maiko-cygwin.x86_64.tgz"; DestDir: "{app}\install"; DestName: "maiko-cygwin.x86_64.tgz"; Flags: ignoreversion +Source: "medley.tgz"; DestDir: "{app}\install"; DestName: "medley.tgz"; Flags: ignoreversion +Source: "..\win\editpath\x86_64\EditPath.exe"; DestDir: "{app}\uninstall"; DestName: "EditPath.exe"; Flags: ignoreversion +Source: "Medley.ico"; DestDir: "{app}"; DestName: "Medley.ico"; Flags: ignoreversion + +[Icons] +Name: "{group}\Medley\Uninstall_Medley"; Filename: "{uninstallexe}" +; Name: "{group}\Medley\Medley"; Filename: "powershell"; Parameters: "-NoExit -File {app}\medley.ps1 --help"; IconFilename: "{app}\Medley.ico" + +[Run] +Filename: "{app}\cygwin\setup-x86_64.exe"; Parameters: "--quiet-mode --no-admin --wait --no-shortcuts --no-write-registry --verbose --root {app} --site http://www.gtlib.gatech.edu/pub/cygwin/ --only-site --local-package-dir {app}\cygwin --packages nano,xdg-utils"; StatusMsg: "Installing Cygwin ..." +Filename: "{app}\bin\bash"; Parameters: "-login -c 'sed -i -e s/^none/#none/ /etc/fstab && echo none / cygdrive binary,posix=0,user 0 0 >>/etc/fstab'"; Flags: runhidden +Filename: "tar"; Parameters: "-x -z -C {app} -f {app}\install\medley.tgz"; Flags: runhidden; StatusMsg: "Installing Medley ..." +Filename: "powershell"; Parameters: "remove-item -force -recurse {app}\maiko"; Flags: runhidden; StatusMsg: "Installing Maiko ..." +Filename: "tar"; Parameters: "-x -z -C {app} -f {app}\install\maiko-cygwin.x86_64.tgz"; Flags: runhidden; StatusMsg: "Installing Maiko ..." +; Recreate medley symbolic links (lost in tars) +Filename: "{app}\bin\bash"; Parameters: "-login -c 'cd /medley/scripts/medley && ln -s medley.command medley.sh && cd ../.. && ln -s /medley/scripts/medley/medley.sh medley'"; Flags: runhidden +; Create medley.bat +Filename: "powershell"; Parameters: "write-output \""{app}\bin\bash -login -c '/medley/scripts/medley/medley.sh %*'\"" | out-file medley.bat -Encoding ascii"; WorkingDir: "{app}"; Flags: runhidden; StatusMsg: "Creating medley.bat ..." +Filename: "{app}\uninstall\EditPath.exe"; Parameters: "--user --add {app}"; Flags: runhidden; StatusMsg: "Adding to PATH ..." +Filename: "powershell"; Parameters: "remove-item -recurse -force {app}\install"; Flags: runhidden; StatusMsg: "Cleaning up ..." + +[UninstallRun] +Filename: "{app}\uninstall\EditPath.exe"; Parameters: "--user --remove {app}"; Flags: runhidden + diff --git a/installers/cygwin/medley_logo.bmp b/installers/cygwin/medley_logo.bmp new file mode 100644 index 00000000..9efbe3af Binary files /dev/null and b/installers/cygwin/medley_logo.bmp differ diff --git a/installers/cygwin/medley_logo.png b/installers/cygwin/medley_logo.png new file mode 100644 index 00000000..24c466b6 Binary files /dev/null and b/installers/cygwin/medley_logo.png differ diff --git a/installers/cygwin/medley_logo_small.bmp b/installers/cygwin/medley_logo_small.bmp new file mode 100644 index 00000000..643d6ac4 Binary files /dev/null and b/installers/cygwin/medley_logo_small.bmp differ diff --git a/installers/downloads_page/medley_downloads.html b/installers/downloads_page/medley_downloads.html index 4e81d85d..b2ba6e6c 100644 --- a/installers/downloads_page/medley_downloads.html +++ b/installers/downloads_page/medley_downloads.html @@ -38,6 +38,9 @@

Release @@@MEDLEY.SHORT.RELEASE.TAG@@@ for ARM64 machines

+
  • WINDOWS 10/11 (Single install based on cygwin - Docker install deprecated)

    + +

    Release @@@MEDLEY.SHORT.RELEASE.TAG@@@ for Windows x64 machines

  • macOS 11 (Big Sur) and later - for both Intel and Apple Silicon

  • -
  • WINDOWS 10/11 (Medley running within Cygwin)

    - -

    Not available

  • diff --git a/installers/downloads_page/medley_downloads.md b/installers/downloads_page/medley_downloads.md index cd87f574..d2df64d1 100644 --- a/installers/downloads_page/medley_downloads.md +++ b/installers/downloads_page/medley_downloads.md @@ -34,6 +34,10 @@ [Release @@@MEDLEY.SHORT.RELEASE.TAG@@@ for ARM64 machines](@@@DOWNLOAD_URL@@@/medley-full-wsl-aarch64-@@@COMBINED.RELEASE.TAG@@@.tgz) + * ## WINDOWS 10/11 (Single install based on cygwin - Docker install deprecated) + + [Release @@@MEDLEY.SHORT.RELEASE.TAG@@@ for Windows x64 machines](@@@DOWNLOAD_URL@@@/@@@CYGWIN.INSTALLER@@@) + * ## macOS 11 (Big Sur) and later - for both Intel and Apple Silicon * ### DMG Installer @@ -43,12 +47,3 @@ * ### ZIP Installer [Release @@@MEDLEY.SHORT.RELEASE.TAG@@@](@@@DOWNLOAD_URL@@@/medley-full-macos-universal-@@@COMBINED.RELEASE.TAG@@@.zip) - - * ## WINDOWS 10/11 (Medley running within Cygwin) - - Not available - - - - - diff --git a/installers/win/editpath/EditPath.iss b/installers/win/editpath/EditPath.iss index 0312dcaa..b70d571d 100644 --- a/installers/win/editpath/EditPath.iss +++ b/installers/win/editpath/EditPath.iss @@ -1,165 +1,165 @@ -; Copyright (C) 2021-2023 by Bill Stewart (bstewart at iname.com) -; -; This program is free software; you can redistribute it and/or modify it under -; the terms of the GNU Lesser General Public License as published by the Free -; Software Foundation; either version 3 of the License, or (at your option) any -; later version. -; -; This program is distributed in the hope that it will be useful, but WITHOUT -; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -; FOR A PARTICULAR PURPOSE. See the GNU General Lesser Public License for more -; details. -; -; You should have received a copy of the GNU Lesser General Public License -; along with this program. If not, see https://www.gnu.org/licenses/. - -; Sample Inno Setup (https://www.jrsoftware.org/isinfo.php) script -; demonstrating use of PathMgr.dll. -; -; This script uses PathMgr.dll in the following ways: -; * Copies PathMgr.dll to the target machine (required for uninstall) -; * Defines a task in [Tasks] that should modify the Path -; * Imports the AddDirToPath() DLL function at setup time -; * Imports the RemoveDirFromPath() DLL function at uninstall time -; * Stores task state as custom setting using RegisterPreviousData() -; * Retrieves task state custom setting during setup and uninstall initialize -; * At post install, adds app dir to Path if task selected -; * At uninstall, removes dir from Path if custom setting present -; * Unloads and deletes DLL and removes app dir at uninstall deinitialize - -#if Ver < EncodeVer(6,0,0,0) - #error This script requires Inno Setup 6 or later -#endif - -[Setup] -AppId={{A17D2D05-C729-4F2A-9CC7-E04906C5A842} -AppName=EditPath -AppVersion=4.0.4.0 -UsePreviousAppDir=false -DefaultDirName={autopf}\EditPath -Uninstallable=true -OutputDir=. -OutputBaseFilename=EditPath_Setup -ArchitecturesInstallIn64BitMode=x64 -PrivilegesRequired=none -PrivilegesRequiredOverridesAllowed=dialog - -[Files] -; Install PathMgr.dll for use with both setup and uninstall; use -; uninsneveruninstall flag because DeinitializeSetup() will delete after -; unloading the DLL; install the 32-bit version of PathMgr.dll because both -; setup and uninstall executables are 32-bit -Source: "i386\PathMgr.dll"; DestDir: "{app}"; Flags: uninsneveruninstall - -; Other files to install on target system -Source: "i386\EditPath.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode() -Source: "x86_64\EditPath.exe"; DestDir: "{app}"; Check: Is64BitInstallMode() -Source: "EditPath.md"; DestDir: "{app}" - -[Tasks] -Name: modifypath; Description: "&Add to Path" - -[Code] -const - MODIFY_PATH_TASK_NAME = 'modifypath'; // Specify name of task - -var - PathIsModified: Boolean; // Cache task selection from previous installs - ApplicationUninstalled: Boolean; // Has application been uninstalled? - -// Import AddDirToPath() at setup time ('files:' prefix) -function DLLAddDirToPath(DirName: string; PathType, AddType: DWORD): DWORD; - external 'AddDirToPath@files:PathMgr.dll stdcall setuponly'; - -// Import RemoveDirFromPath() at uninstall time ('{app}\' prefix) -function DLLRemoveDirFromPath(DirName: string; PathType: DWORD): DWORD; - external 'RemoveDirFromPath@{app}\PathMgr.dll stdcall uninstallonly'; - -// Wrapper for AddDirToPath() DLL function -function AddDirToPath(const DirName: string): DWORD; -var - PathType, AddType: DWORD; -begin - // PathType = 0 - use system Path - // PathType = 1 - use user Path - // AddType = 0 - add to end of Path - // AddType = 1 - add to beginning of Path - if IsAdminInstallMode() then - PathType := 0 - else - PathType := 1; - AddType := 0; - result := DLLAddDirToPath(DirName, PathType, AddType); -end; - -// Wrapper for RemoveDirFromPath() DLL function -function RemoveDirFromPath(const DirName: string): DWORD; -var - PathType: DWORD; -begin - // PathType = 0 - use system Path - // PathType = 1 - use user Path - if IsAdminInstallMode() then - PathType := 0 - else - PathType := 1; - result := DLLRemoveDirFromPath(DirName, PathType); -end; - -procedure RegisterPreviousData(PreviousDataKey: Integer); -begin - // Store previous or current task selection as custom user setting - if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then - SetPreviousData(PreviousDataKey, MODIFY_PATH_TASK_NAME, 'true'); -end; - -function InitializeSetup(): Boolean; -begin - result := true; - // Was task selected during a previous install? - PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; -end; - -function InitializeUninstall(): Boolean; -begin - result := true; - // Was task selected during a previous install? - PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; - ApplicationUninstalled := false; -end; - -procedure CurStepChanged(CurStep: TSetupStep); -begin - if CurStep = ssPostInstall then - begin - // Add app directory to Path at post-install step if task selected - if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then - AddDirToPath(ExpandConstant('{app}')); - end; -end; - -procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); -begin - if CurUninstallStep = usUninstall then - begin - // Remove app directory from path during uninstall if task was selected; - // use variable because we can't use WizardIsTaskSelected() at uninstall - if PathIsModified then - RemoveDirFromPath(ExpandConstant('{app}')); - end - else if CurUninstallStep = usPostUninstall then - begin - ApplicationUninstalled := true; - end; -end; - -procedure DeinitializeUninstall(); -begin - if ApplicationUninstalled then - begin - // Unload and delete PathMgr.dll and remove app dir when uninstalling - UnloadDLL(ExpandConstant('{app}\PathMgr.dll')); - DeleteFile(ExpandConstant('{app}\PathMgr.dll')); - RemoveDir(ExpandConstant('{app}')); - end; -end; +; Copyright (C) 2021-2023 by Bill Stewart (bstewart at iname.com) +; +; This program is free software; you can redistribute it and/or modify it under +; the terms of the GNU Lesser General Public License as published by the Free +; Software Foundation; either version 3 of the License, or (at your option) any +; later version. +; +; This program is distributed in the hope that it will be useful, but WITHOUT +; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +; FOR A PARTICULAR PURPOSE. See the GNU General Lesser Public License for more +; details. +; +; You should have received a copy of the GNU Lesser General Public License +; along with this program. If not, see https://www.gnu.org/licenses/. + +; Sample Inno Setup (https://www.jrsoftware.org/isinfo.php) script +; demonstrating use of PathMgr.dll. +; +; This script uses PathMgr.dll in the following ways: +; * Copies PathMgr.dll to the target machine (required for uninstall) +; * Defines a task in [Tasks] that should modify the Path +; * Imports the AddDirToPath() DLL function at setup time +; * Imports the RemoveDirFromPath() DLL function at uninstall time +; * Stores task state as custom setting using RegisterPreviousData() +; * Retrieves task state custom setting during setup and uninstall initialize +; * At post install, adds app dir to Path if task selected +; * At uninstall, removes dir from Path if custom setting present +; * Unloads and deletes DLL and removes app dir at uninstall deinitialize + +#if Ver < EncodeVer(6,0,0,0) + #error This script requires Inno Setup 6 or later +#endif + +[Setup] +AppId={{A17D2D05-C729-4F2A-9CC7-E04906C5A842} +AppName=EditPath +AppVersion=4.0.4.0 +UsePreviousAppDir=false +DefaultDirName={autopf}\EditPath +Uninstallable=true +OutputDir=. +OutputBaseFilename=EditPath_Setup +ArchitecturesInstallIn64BitMode=x64 +PrivilegesRequired=none +PrivilegesRequiredOverridesAllowed=dialog + +[Files] +; Install PathMgr.dll for use with both setup and uninstall; use +; uninsneveruninstall flag because DeinitializeSetup() will delete after +; unloading the DLL; install the 32-bit version of PathMgr.dll because both +; setup and uninstall executables are 32-bit +Source: "i386\PathMgr.dll"; DestDir: "{app}"; Flags: uninsneveruninstall + +; Other files to install on target system +Source: "i386\EditPath.exe"; DestDir: "{app}"; Check: not Is64BitInstallMode() +Source: "x86_64\EditPath.exe"; DestDir: "{app}"; Check: Is64BitInstallMode() +Source: "EditPath.md"; DestDir: "{app}" + +[Tasks] +Name: modifypath; Description: "&Add to Path" + +[Code] +const + MODIFY_PATH_TASK_NAME = 'modifypath'; // Specify name of task + +var + PathIsModified: Boolean; // Cache task selection from previous installs + ApplicationUninstalled: Boolean; // Has application been uninstalled? + +// Import AddDirToPath() at setup time ('files:' prefix) +function DLLAddDirToPath(DirName: string; PathType, AddType: DWORD): DWORD; + external 'AddDirToPath@files:PathMgr.dll stdcall setuponly'; + +// Import RemoveDirFromPath() at uninstall time ('{app}\' prefix) +function DLLRemoveDirFromPath(DirName: string; PathType: DWORD): DWORD; + external 'RemoveDirFromPath@{app}\PathMgr.dll stdcall uninstallonly'; + +// Wrapper for AddDirToPath() DLL function +function AddDirToPath(const DirName: string): DWORD; +var + PathType, AddType: DWORD; +begin + // PathType = 0 - use system Path + // PathType = 1 - use user Path + // AddType = 0 - add to end of Path + // AddType = 1 - add to beginning of Path + if IsAdminInstallMode() then + PathType := 0 + else + PathType := 1; + AddType := 0; + result := DLLAddDirToPath(DirName, PathType, AddType); +end; + +// Wrapper for RemoveDirFromPath() DLL function +function RemoveDirFromPath(const DirName: string): DWORD; +var + PathType: DWORD; +begin + // PathType = 0 - use system Path + // PathType = 1 - use user Path + if IsAdminInstallMode() then + PathType := 0 + else + PathType := 1; + result := DLLRemoveDirFromPath(DirName, PathType); +end; + +procedure RegisterPreviousData(PreviousDataKey: Integer); +begin + // Store previous or current task selection as custom user setting + if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then + SetPreviousData(PreviousDataKey, MODIFY_PATH_TASK_NAME, 'true'); +end; + +function InitializeSetup(): Boolean; +begin + result := true; + // Was task selected during a previous install? + PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; +end; + +function InitializeUninstall(): Boolean; +begin + result := true; + // Was task selected during a previous install? + PathIsModified := GetPreviousData(MODIFY_PATH_TASK_NAME, '') = 'true'; + ApplicationUninstalled := false; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssPostInstall then + begin + // Add app directory to Path at post-install step if task selected + if PathIsModified or WizardIsTaskSelected(MODIFY_PATH_TASK_NAME) then + AddDirToPath(ExpandConstant('{app}')); + end; +end; + +procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); +begin + if CurUninstallStep = usUninstall then + begin + // Remove app directory from path during uninstall if task was selected; + // use variable because we can't use WizardIsTaskSelected() at uninstall + if PathIsModified then + RemoveDirFromPath(ExpandConstant('{app}')); + end + else if CurUninstallStep = usPostUninstall then + begin + ApplicationUninstalled := true; + end; +end; + +procedure DeinitializeUninstall(); +begin + if ApplicationUninstalled then + begin + // Unload and delete PathMgr.dll and remove app dir when uninstalling + UnloadDLL(ExpandConstant('{app}\PathMgr.dll')); + DeleteFile(ExpandConstant('{app}\PathMgr.dll')); + RemoveDir(ExpandConstant('{app}')); + end; +end; diff --git a/installers/win/editpath/EditPath.md b/installers/win/editpath/EditPath.md index bce1768a..29a716c2 100644 --- a/installers/win/editpath/EditPath.md +++ b/installers/win/editpath/EditPath.md @@ -1,118 +1,118 @@ -# EditPath - -EditPath is a Windows console (text-based, command-line) program for managing the system Path and user Path. - -# Author - -Bill Stewart - bstewart at iname dot com - -# License - -EditPath.exe is covered by the GNU Lesser Public License (LPGL). See the file `LICENSE` for details. - -# Download - -https://github.com/Bill-Stewart/PathMgr/releases/ - -# Background - -The system Path is found in the following location in the Windows registry: - -Root: `HKEY_LOCAL_MACHINE` -Subkey: `SYSTEM\CurrentControlSet\Control\Session Manager\Environment` -Value name: `Path` - -The current user Path is found in the following location in the registry: - -Root: `HKEY_CURRENT_USER` -Subkey: `Environment` -Value name: `Path` - -In both cases, the `Path` value is (or should be) the registry type `REG_EXPAND_SZ`, which means that it is a string that can contain values surrounded by `%` characters that Windows will automatically expand to environment variable values. (For example, `%SystemRoot%` will be expanded to `C:\Windows` on most systems.) - -The `Path` value contains a `;`-delimited list of directory names that the system should search for executables, library files, scripts, etc. Windows appends the content of the current user Path to the system Path and expands the environment variable references. The resulting string is set as the `Path` environment variable for processes. - -EditPath provides a command-line interface for managing the `Path` value in the system location (in `HKEY_LOCAL_MACHINE`) and the current user location (in `HKEY_CURRENT_USER`). - -# Usage - -The following describes the command-line usage for the program. Parameters are case-sensitive. - -**EditPath** [_options_] _type_ _action_ - -You must specify only one of the following _type_ parameters: - -| _type_ | Abbreviation | Description -| ------- | ------------ | ----------- -| **--system** | **-s** | Specifies the system Path -| **--user** | **-u** | Specifies the user Path - -You must specify only one of the following _action_ parameters: - -| _action_ | Abbreviation | Description -| -------- | ------------ | ----------- -| **--list** | **-l** | Lists directories in Path -| **--test "**_dirname_**"** | **-t "**_dirname_**"** | Tests if directory exists in Path -| **--add "**_dirname_**"** | **-a "**_dirname_**"** | Adds directory to Path -| **--remove "**_dirname_**"** | **-r "**_dirname_**"** | Removes directory from Path - -The following parameters are optional: - -| _options_ | Abbreviation | Description -| --------- | ------------ | ----------- -| **--quiet** | **-q** | Suppresses result messages -| **--expand** | **-x** | Expands environment variables (**--list** only) -| **--beginning** | **-b** | Adds to beginning of Path (**--add** only) - -# Exit Codes - -The following table lists typical exit codes when not using **--test** (**-t**). - -| Exit Code | Description -| --------- | ----------- -| 0 | No errors -| 2 | The Path value is not present in the registry -| 3 | The specified directory does not exist in the Path -| 5 | Access is denied -| 87 | Incorrect parameter(s) -| 183 | The specified directory already exists in the Path - -The following table lists typical exit codes when using **--test** (**-t**). - -| Exit Code | Description -| --------- | ----------- -| 1 | The specified directory exists in the unexpanded Path -| 2 | The specified directory exists in the expanded Path -| 3 | The specified directory does not exist in the Path - -# Remarks - -* Anything on the command line after **--test**, **--add**, or **--remove** is considered to be the argument for the parameter. To avoid ambiguity, specify the _action_ parameter last on the command line. - -* Uexpanded vs. expanded refers to whether the environment variable references (i.e., names between `%` characters) are expanded after retrieving the Path value from the registry. For example, `%SystemRoot%` is unexpanded but `C:\Windows` is expanded. - -* The **--add** (**-a**) parameter checks whether the specified directory exists in both the unexpanded and expanded copies of the Path before adding the directory. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--add C:\TestApp` will return exit code 183 (i.e., the directory already exists in the Path) because `%TESTAPP%` expands to `C:\TestApp`. - -* The **--remove** (**-r**) parameter does not expand environment variable references. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--remove "C:\TestApp"` will return exit code 3 (i.e., the directory does not exist in the Path) because **--remove** does not expand `%TESTAPP%` to `C:\TestApp`. For the command to succeed, you would have to specify `--remove "%TESTAPP%"` instead. - -* The program will exit with error code 87 if a parameter (or an argument to a parameter) is missing or not valid, if mutually exclusive parameters are specified, etc. - -* The program will exit with error code 5 if the current user does not have permission to update the Path value in the registry (for example, if you try to update the system Path using a standard user account or an unelevated administrator account). - -# Examples - -1. `EditPath --expand --system --list` - - This command outputs the directories in the system Path, with environment variables expanded. You can also write this command as `EditPath -x -s -l`. - -2. `EditPath --user --add "%LOCALAPPDATA%\Programs\MyApp"` - - Adds the specified directory name to the user Path. - -3. `EditPath -s -r "C:\Program Files\MyApp\bin"` - - Removes the specified directory from the system Path. - -4. `EditPath -s --test "C:\Program Files (x86)\MyApp\bin"` - - Returns an exit code of 3 if the specified directory is not in the system Path, 1 if the specified directory is in the unexpanded copy of the system Path, or 2 if the specified directory is in the expanded copy of the system Path. +# EditPath + +EditPath is a Windows console (text-based, command-line) program for managing the system Path and user Path. + +# Author + +Bill Stewart - bstewart at iname dot com + +# License + +EditPath.exe is covered by the GNU Lesser Public License (LPGL). See the file `LICENSE` for details. + +# Download + +https://github.com/Bill-Stewart/PathMgr/releases/ + +# Background + +The system Path is found in the following location in the Windows registry: + +Root: `HKEY_LOCAL_MACHINE` +Subkey: `SYSTEM\CurrentControlSet\Control\Session Manager\Environment` +Value name: `Path` + +The current user Path is found in the following location in the registry: + +Root: `HKEY_CURRENT_USER` +Subkey: `Environment` +Value name: `Path` + +In both cases, the `Path` value is (or should be) the registry type `REG_EXPAND_SZ`, which means that it is a string that can contain values surrounded by `%` characters that Windows will automatically expand to environment variable values. (For example, `%SystemRoot%` will be expanded to `C:\Windows` on most systems.) + +The `Path` value contains a `;`-delimited list of directory names that the system should search for executables, library files, scripts, etc. Windows appends the content of the current user Path to the system Path and expands the environment variable references. The resulting string is set as the `Path` environment variable for processes. + +EditPath provides a command-line interface for managing the `Path` value in the system location (in `HKEY_LOCAL_MACHINE`) and the current user location (in `HKEY_CURRENT_USER`). + +# Usage + +The following describes the command-line usage for the program. Parameters are case-sensitive. + +**EditPath** [_options_] _type_ _action_ + +You must specify only one of the following _type_ parameters: + +| _type_ | Abbreviation | Description +| ------- | ------------ | ----------- +| **--system** | **-s** | Specifies the system Path +| **--user** | **-u** | Specifies the user Path + +You must specify only one of the following _action_ parameters: + +| _action_ | Abbreviation | Description +| -------- | ------------ | ----------- +| **--list** | **-l** | Lists directories in Path +| **--test "**_dirname_**"** | **-t "**_dirname_**"** | Tests if directory exists in Path +| **--add "**_dirname_**"** | **-a "**_dirname_**"** | Adds directory to Path +| **--remove "**_dirname_**"** | **-r "**_dirname_**"** | Removes directory from Path + +The following parameters are optional: + +| _options_ | Abbreviation | Description +| --------- | ------------ | ----------- +| **--quiet** | **-q** | Suppresses result messages +| **--expand** | **-x** | Expands environment variables (**--list** only) +| **--beginning** | **-b** | Adds to beginning of Path (**--add** only) + +# Exit Codes + +The following table lists typical exit codes when not using **--test** (**-t**). + +| Exit Code | Description +| --------- | ----------- +| 0 | No errors +| 2 | The Path value is not present in the registry +| 3 | The specified directory does not exist in the Path +| 5 | Access is denied +| 87 | Incorrect parameter(s) +| 183 | The specified directory already exists in the Path + +The following table lists typical exit codes when using **--test** (**-t**). + +| Exit Code | Description +| --------- | ----------- +| 1 | The specified directory exists in the unexpanded Path +| 2 | The specified directory exists in the expanded Path +| 3 | The specified directory does not exist in the Path + +# Remarks + +* Anything on the command line after **--test**, **--add**, or **--remove** is considered to be the argument for the parameter. To avoid ambiguity, specify the _action_ parameter last on the command line. + +* Uexpanded vs. expanded refers to whether the environment variable references (i.e., names between `%` characters) are expanded after retrieving the Path value from the registry. For example, `%SystemRoot%` is unexpanded but `C:\Windows` is expanded. + +* The **--add** (**-a**) parameter checks whether the specified directory exists in both the unexpanded and expanded copies of the Path before adding the directory. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--add C:\TestApp` will return exit code 183 (i.e., the directory already exists in the Path) because `%TESTAPP%` expands to `C:\TestApp`. + +* The **--remove** (**-r**) parameter does not expand environment variable references. For example, if the environment variable `TESTAPP` is set to `C:\TestApp` and `%TESTAPP%` is in the Path, specifying `--remove "C:\TestApp"` will return exit code 3 (i.e., the directory does not exist in the Path) because **--remove** does not expand `%TESTAPP%` to `C:\TestApp`. For the command to succeed, you would have to specify `--remove "%TESTAPP%"` instead. + +* The program will exit with error code 87 if a parameter (or an argument to a parameter) is missing or not valid, if mutually exclusive parameters are specified, etc. + +* The program will exit with error code 5 if the current user does not have permission to update the Path value in the registry (for example, if you try to update the system Path using a standard user account or an unelevated administrator account). + +# Examples + +1. `EditPath --expand --system --list` + + This command outputs the directories in the system Path, with environment variables expanded. You can also write this command as `EditPath -x -s -l`. + +2. `EditPath --user --add "%LOCALAPPDATA%\Programs\MyApp"` + + Adds the specified directory name to the user Path. + +3. `EditPath -s -r "C:\Program Files\MyApp\bin"` + + Removes the specified directory from the system Path. + +4. `EditPath -s --test "C:\Program Files (x86)\MyApp\bin"` + + Returns an exit code of 3 if the specified directory is not in the system Path, 1 if the specified directory is in the unexpanded copy of the system Path, or 2 if the specified directory is in the expanded copy of the system Path. diff --git a/library/BIGBITMAPS b/library/BIGBITMAPS index d8638ffe..a9484032 100644 --- a/library/BIGBITMAPS +++ b/library/BIGBITMAPS @@ -1,15 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) -(FILECREATED " 9-Jul-2022 09:41:26"  -|{DSK}kaplan>Local>medley3.5>working-medley>library>BIGBITMAPS.;12| 108851 +(FILECREATED "31-Jul-2023 13:39:50" |{WMEDLEY}BIGBITMAPS.;13| 109376 + + :EDIT-BY |rmk| :CHANGES-TO (VARS BIGBITMAPSCOMS) - (FNS \\GENERIC.DSPCREATE.DESTINATION.BITMAP?.BIGBM \\GENERIC.DSPCREATE.BIGBM - \\DSPCREATE.BIGBM) - (MACROS |\\SFInvert|) + (FNS BIGBITMAPEQUAL) - :PREVIOUS-DATE "26-Oct-2021 14:51:38" -|{DSK}kaplan>local>medley3.5>working-medley>library>BIGBITMAPS.;6|) + :PREVIOUS-DATE " 9-Jul-2022 09:41:26" |{WMEDLEY}BIGBITMAPS.;12|) ; Copyright (c) 1991, 1993-1994 by Venue. @@ -24,8 +22,8 @@ (MACROS |GetNewFragment|) (MACROS |\\SFInvert|)) (INITRECORDS BIGBM) - (FNS BIGBITMAPP BITBLT.BIGBM BITMAPCREATE.BIGBM BITMAPCREATE BITMAPCOPY BLTSHADE.BIGBM BITBLT - \\ORG.BITBLT \\BLTSHADE.DISPLAY \\RESHOWBORDER1) + (FNS BIGBITMAPP BITBLT.BIGBM BITMAPCREATE.BIGBM BITMAPCREATE BITMAPCOPY BIGBITMAPEQUAL + BLTSHADE.BIGBM BITBLT \\ORG.BITBLT \\BLTSHADE.DISPLAY \\RESHOWBORDER1) (FNS \\DRAWCIRCLE.BIGBM \\FILLCIRCLE.BIGBM \\DRAWELLIPSE.BIGBM \\DRAWCURVE.BIGBM \\DRAWLINE.BIGBM.DASH \\DRAWLINE.BIGBM.NODASH) (FNS \\GENERIC.DSPCREATE.DESTINATION.BITMAP?.BIGBM) @@ -353,6 +351,20 @@ 0 0 NIL NIL 'INPUT 'REPLACE 0) (RETURN NEWBITMAP)))) +(BIGBITMAPEQUAL + (LAMBDA (BM1 BM2) (* \; "Edited 31-Jul-2023 13:08 by rmk") + + (* |;;| "Fields may not be SMALLP") + + (AND (|type?| BIGBM |of| BM1) + (|type?| BIGBM |of| BM2) + (IEQP (|ffetch| (BIGBM BIGBMWIDTH) |of| BM1) + (|ffetch| (BIGBM BIGBMWIDTH) |of| BM2)) + (IEQP (|ffetch| (BIGBM BIGBMHEIGHT) |of| BM1) + (|ffetch| (BIGBM BIGBMHEIGHT) |of| BM2)) + (|for| B1 |in| (|ffetch| (BIGBM BIGBMLIST) |of| BM1) |as| B2 + |in| (|ffetch| (BIGBM BIGBMLIST) |of| BM2) |always| (EQUALBITMAPP B1 B2))))) + (BLTSHADE.BIGBM (LAMBDA (TEXTURE DESTINATION DESTLEFT DESTBOTTOM WIDTH HEIGHT OPERATION CLIPPINGREGION) (* \; "Edited 17-Oct-89 19:01 by takeshi") @@ -1699,15 +1711,15 @@ ) (PUTPROPS BIGBITMAPS COPYRIGHT ("Venue" 1991 1993 1994)) (DECLARE\: DONTCOPY - (FILEMAP (NIL (3546 48244 (BIGBITMAPP 3556 . 3702) (BITBLT.BIGBM 3704 . 14527) (BITMAPCREATE.BIGBM -14529 . 15871) (BITMAPCREATE 15873 . 17475) (BITMAPCOPY 17477 . 18012) (BLTSHADE.BIGBM 18014 . 21150) -(BITBLT 21152 . 22800) (\\ORG.BITBLT 22802 . 34371) (\\BLTSHADE.DISPLAY 34373 . 43611) ( -\\RESHOWBORDER1 43613 . 48242)) (48245 71523 (\\DRAWCIRCLE.BIGBM 48255 . 51618) (\\FILLCIRCLE.BIGBM -51620 . 55666) (\\DRAWELLIPSE.BIGBM 55668 . 60188) (\\DRAWCURVE.BIGBM 60190 . 64040) ( -\\DRAWLINE.BIGBM.DASH 64042 . 68401) (\\DRAWLINE.BIGBM.NODASH 68403 . 71521)) (71524 71893 ( -\\GENERIC.DSPCREATE.DESTINATION.BITMAP?.BIGBM 71534 . 71891)) (72025 85168 (DSPDESTINATION 72035 . -75933) (|\\SFFixY| 75935 . 81657) (|\\SFFixDestination| 81659 . 82842) (|\\SFFixClippingRegion| 82844 - . 85166)) (85169 93255 (\\SW2BM 85179 . 90203) (BITMAPHEIGHT 90205 . 90703) (BITMAPWIDTH 90705 . -91197) (|\\SFFixFont| 91199 . 92171) (BITSPERPIXEL 92173 . 93253)) (93256 108609 (COLORIZEBITMAP 93266 - . 96076) (\\BWTOCOLORBLT 96078 . 102671) (UNCOLORIZEBITMAP 102673 . 108607))))) + (FILEMAP (NIL (3364 48769 (BIGBITMAPP 3374 . 3520) (BITBLT.BIGBM 3522 . 14345) (BITMAPCREATE.BIGBM +14347 . 15689) (BITMAPCREATE 15691 . 17293) (BITMAPCOPY 17295 . 17830) (BIGBITMAPEQUAL 17832 . 18537) +(BLTSHADE.BIGBM 18539 . 21675) (BITBLT 21677 . 23325) (\\ORG.BITBLT 23327 . 34896) (\\BLTSHADE.DISPLAY + 34898 . 44136) (\\RESHOWBORDER1 44138 . 48767)) (48770 72048 (\\DRAWCIRCLE.BIGBM 48780 . 52143) ( +\\FILLCIRCLE.BIGBM 52145 . 56191) (\\DRAWELLIPSE.BIGBM 56193 . 60713) (\\DRAWCURVE.BIGBM 60715 . 64565 +) (\\DRAWLINE.BIGBM.DASH 64567 . 68926) (\\DRAWLINE.BIGBM.NODASH 68928 . 72046)) (72049 72418 ( +\\GENERIC.DSPCREATE.DESTINATION.BITMAP?.BIGBM 72059 . 72416)) (72550 85693 (DSPDESTINATION 72560 . +76458) (|\\SFFixY| 76460 . 82182) (|\\SFFixDestination| 82184 . 83367) (|\\SFFixClippingRegion| 83369 + . 85691)) (85694 93780 (\\SW2BM 85704 . 90728) (BITMAPHEIGHT 90730 . 91228) (BITMAPWIDTH 91230 . +91722) (|\\SFFixFont| 91724 . 92696) (BITSPERPIXEL 92698 . 93778)) (93781 109134 (COLORIZEBITMAP 93791 + . 96601) (\\BWTOCOLORBLT 96603 . 103196) (UNCOLORIZEBITMAP 103198 . 109132))))) STOP diff --git a/library/BIGBITMAPS.LCOM b/library/BIGBITMAPS.LCOM index a6454f38..4783daae 100644 Binary files a/library/BIGBITMAPS.LCOM and b/library/BIGBITMAPS.LCOM differ diff --git a/library/DANDELIONKEYBOARDS b/library/DANDELIONKEYBOARDS deleted file mode 100644 index cb8dba3d..00000000 --- a/library/DANDELIONKEYBOARDS +++ /dev/null @@ -1,171 +0,0 @@ -((EUROPEAN ((100 (53 197 NOLOCKSHIFT)) (101 (52 196 NOLOCKSHIFT)) (102 (54 198 NOLOCKSHIFT)) (103 ( -61887 61759 LOCKSHIFT)) (104 (55 199 NOLOCKSHIFT)) (105 (61888 61760 LOCKSHIFT)) (106 (61872 61744 -LOCKSHIFT)) (107 (61860 61732 LOCKSHIFT)) (108 (48 126 NOLOCKSHIFT)) (109 (61892 61764 LOCKSHIFT)) ( -110 (203 207 NOLOCKSHIFT)) (111 (61919 61791 LOCKSHIFT)) (112 (47 191 NOLOCKSHIFT)) (115 (8 8 -NOLOCKSHIFT) . IGNORE) (116 (51 195 NOLOCKSHIFT)) (117 (50 194 NOLOCKSHIFT)) (118 (61873 61745 -LOCKSHIFT)) (119 (61858 61730 LOCKSHIFT)) (120 (61874 61746 LOCKSHIFT)) (121 (61859 61731 LOCKSHIFT)) -(122 (57 202 NOLOCKSHIFT)) (123 (61886 61758 LOCKSHIFT)) (124 (61864 61736 LOCKSHIFT)) (125 (61903 -61775 LOCKSHIFT)) (126 (61908 61780 LOCKSHIFT)) (127 (241 225 LOCKSHIFT)) (128 (187 170 LOCKSHIFT)) ( -129 (249 233 LOCKSHIFT)) (132 (49 193 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (61905 61777 LOCKSHIFT)) (137 (61869 61741 LOCKSHIFT)) (138 (61877 61749 -LOCKSHIFT)) (139 (61906 61778 LOCKSHIFT)) (140 (251 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 ( -250 234 LOCKSHIFT)) (143 (59 58 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (171 186 LOCKSHIFT -)) (148 (61904 61776 LOCKSHIFT)) (149 (61920 61792 LOCKSHIFT)) (150 (61921 61793 LOCKSHIFT)) (151 ( -61857 61729 LOCKSHIFT)) (152 (61863 61735 LOCKSHIFT)) (153 (56 200 NOLOCKSHIFT)) (154 (61900 61772 -LOCKSHIFT)) (155 (239 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -246 230 LOCKSHIFT)) (159 (207 176 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (logic ((100 ( -53 37 NOLOCKSHIFT)) (101 (52 164 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (61258 61260 -NOLOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (61292 61293 NOLOCKSHIFT)) (106 (61271 61270 NOLOCKSHIFT) -) (107 (61284 61285 NOLOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (61307 61306 NOLOCKSHIFT)) (110 (45 -177 NOLOCKSHIFT)) (111 (61269 61268 LOCKSHIFT)) (112 (172 174 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . -IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (61240 61241 NOLOCKSHIFT)) (119 ( -61234 61235 NOLOCKSHIFT)) (120 (61266 61262 NOLOCKSHIFT)) (121 (61365 61365 NOLOCKSHIFT)) (122 (57 40 -NOLOCKSHIFT)) (123 (61275 61274 NOLOCKSHIFT)) (124 (61300 61299 NOLOCKSHIFT)) (125 (61273 61272 -NOLOCKSHIFT)) (126 (61282 61283 NOLOCKSHIFT)) (127 (61256 61257 NOLOCKSHIFT)) (128 (61356 61356 -NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) - (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (61250 61251 NOLOCKSHIFT)) (137 (61298 61297 NOLOCKSHIFT)) (138 - (61305 61303 NOLOCKSHIFT)) (139 (61265 61264 NOLOCKSHIFT)) (140 (61364 61364 NOLOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (61281 233 NOLOCKSHIFT)) (143 (61351 61351 NOLOCKSHIFT)) (144 (13 13 -NOLOCKSHIFT) . IGNORE) (145 (61357 61357 NOLOCKSHIFT)) (148 (61279 61278 NOLOCKSHIFT)) (149 (61239 -61238 NOLOCKSHIFT)) (150 (61290 61290 NOLOCKSHIFT)) (151 (61263 61261 NOLOCKSHIFT)) (152 (61295 61295 -NOLOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (61252 61253 NOLOCKSHIFT)) (155 (61254 61255 NOLOCKSHIFT) -) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (MATH ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 -NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (61284 61285 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 -(100 68 LOCKSHIFT)) (106 (174 61245 NOLOCKSHIFT)) (107 (61369 61363 NOLOCKSHIFT)) (108 (48 41 -NOLOCKSHIFT)) (109 (61254 61255 NOLOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (173 61246 LOCKSHIFT)) ( -112 (47 61300 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 (50 64 -NOLOCKSHIFT)) (118 (61282 61283 LOCKSHIFT)) (119 (61287 61286 NOLOCKSHIFT)) (120 (61301 61302 -NOLOCKSHIFT)) (121 (61351 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (175 61247 LOCKSHIFT)) (124 ( -180 184 LOCKSHIFT)) (125 (172 61244 LOCKSHIFT)) (126 (61256 61257 LOCKSHIFT)) (127 (44 61250 -NOLOCKSHIFT)) (128 (61298 61253 NOLOCKSHIFT)) (129 (93 61265 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) ( -133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 ( -61356 61362 LOCKSHIFT)) (138 (61254 61291 NOLOCKSHIFT)) (139 (98 61360 NOLOCKSHIFT)) (140 (61309 177 -LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 61251 NOLOCKSHIFT)) (143 (61299 61252 NOLOCKSHIFT)) ( -144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (95 94 NOLOCKSHIFT)) (148 (61358 82 LOCKSHIFT)) (149 (61296 -61266 NOLOCKSHIFT)) (150 (61305 61303 NOLOCKSHIFT)) (151 (61308 61267 LOCKSHIFT)) (152 (61288 72 -LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (61357 61361 NOLOCKSHIFT)) (155 (61292 61293 LOCKSHIFT)) ( -156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 61264 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) (101 ( -61396 61380 NOLOCKSHIFT)) (102 (61398 61382 NOLOCKSHIFT)) (103 (8557 8554 NOLOCKSHIFT)) (104 (61399 -61383 NOLOCKSHIFT)) (105 (61232 8743 NOLOCKSHIFT)) (106 (61346 8571 NOLOCKSHIFT)) (107 (188 86 -NOLOCKSHIFT)) (108 (61402 61386 NOLOCKSHIFT)) (109 (210 8738 NOLOCKSHIFT)) (110 (61437 61438 -NOLOCKSHIFT)) (111 (163 8558 NOLOCKSHIFT)) (112 (61248 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . -IGNORE) (116 (61395 61379 NOLOCKSHIFT)) (117 (61394 61378 NOLOCKSHIFT)) (118 (185 8553 NOLOCKSHIFT)) ( -119 (176 8546 NOLOCKSHIFT)) (120 (167 8744 NOLOCKSHIFT)) (121 (97 8745 NOLOCKSHIFT)) (122 (61401 61385 - NOLOCKSHIFT)) (123 (162 8570 NOLOCKSHIFT)) (124 (61437 88 NOLOCKSHIFT)) (125 (111 8569 NOLOCKSHIFT)) -(126 (61289 8737 NOLOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) (128 (39 34 NOLOCKSHIFT)) (129 (93 125 -NOLOCKSHIFT)) (132 (61393 61377 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (61233 8742 NOLOCKSHIFT)) (137 (61438 67 NOLOCKSHIFT)) (138 (8739 74 -NOLOCKSHIFT)) (139 (190 61436 NOLOCKSHIFT)) (140 (189 90 NOLOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) ( -142 (61249 62 NOLOCKSHIFT)) (143 (61352 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (95 -61280 NOLOCKSHIFT)) (148 (212 8574 NOLOCKSHIFT)) (149 (61354 8573 NOLOCKSHIFT)) (150 (61286 8741 -NOLOCKSHIFT)) (151 (165 8572 NOLOCKSHIFT)) (152 (61368 8740 NOLOCKSHIFT)) (153 (61400 61384 -NOLOCKSHIFT)) (154 (173 175 NOLOCKSHIFT)) (155 (172 174 NOLOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 - 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61406 61368 NOLOCKSHIFT)) (160 2SHIFTDOWN - . 2SHIFTUP)) DANDELION) (DVORAK ((100 (49 42 NOLOCKSHIFT)) (101 (51 41 NOLOCKSHIFT)) (102 (57 37 -NOLOCKSHIFT)) (103 (46 62 NOLOCKSHIFT)) (104 (48 38 NOLOCKSHIFT)) (105 (101 69 LOCKSHIFT)) (106 (103 -71 LOCKSHIFT)) (107 (107 75 LOCKSHIFT)) (108 (54 45 NOLOCKSHIFT)) (109 (116 84 LOCKSHIFT)) (110 (56 95 - NOLOCKSHIFT)) (111 (108 76 LOCKSHIFT)) (112 (122 90 LOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 - (53 40 NOLOCKSHIFT)) (117 (55 35 NOLOCKSHIFT)) (118 (44 60 NOLOCKSHIFT)) (119 (63 47 NOLOCKSHIFT)) ( -120 (111 79 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (52 164 NOLOCKSHIFT)) (123 (99 67 LOCKSHIFT)) ( -124 (113 81 LOCKSHIFT)) (125 (114 82 LOCKSHIFT)) (126 (110 78 LOCKSHIFT)) (127 (119 87 LOCKSHIFT)) ( -128 (44 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (33 64 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (117 85 LOCKSHIFT)) (137 (106 74 -LOCKSHIFT)) (138 (104 72 LOCKSHIFT)) (139 (120 88 LOCKSHIFT)) (140 (59 58 NOLOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (118 86 LOCKSHIFT)) (143 (115 83 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (145 (169 170 NOLOCKSHIFT)) (148 (112 80 LOCKSHIFT)) (149 (121 89 LOCKSHIFT)) (150 (105 73 -LOCKSHIFT)) (151 (102 70 LOCKSHIFT)) (152 (100 68 LOCKSHIFT)) (153 (50 162 NOLOCKSHIFT)) (154 (98 66 -LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (GREEK ((100 ( -53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (9830 69 LOCKSHIFT)) ( -104 (55 38 NOLOCKSHIFT)) (105 (9829 9797 LOCKSHIFT)) (106 (9849 9817 LOCKSHIFT)) (107 (115 9814 -LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (9837 9805 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (9843 - 9811 LOCKSHIFT)) (112 (47 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) - (117 (50 64 NOLOCKSHIFT)) (118 (9853 9821 LOCKSHIFT)) (119 (9835 9803 LOCKSHIFT)) (120 (9846 9814 -LOCKSHIFT)) (121 (9825 9793 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (9836 9804 LOCKSHIFT)) (124 ( -9851 9819 LOCKSHIFT)) (125 (9842 9810 LOCKSHIFT)) (126 (9838 9806 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT) -) (128 (39 34 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (9850 9818 LOCKSHIFT)) (137 (9841 9809 -LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (9826 66 LOCKSHIFT)) (140 (9833 9801 LOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (46 62 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (145 (95 94 NOLOCKSHIFT)) (148 (9845 9813 LOCKSHIFT)) (149 (9848 9816 LOCKSHIFT)) (150 (9828 -9796 LOCKSHIFT)) (151 (9852 9820 LOCKSHIFT)) (152 (9834 9802 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) ( -154 (9840 9808 LOCKSHIFT)) (155 (9839 9807 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT -) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) -DANDELION) (ITALIAN ((100 (53 61903 NOLOCKSHIFT)) (101 (52 61886 NOLOCKSHIFT)) (102 (54 61919 -NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 - LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 -NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (204 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) ( -116 (51 61872 NOLOCKSHIFT)) (117 (50 61858 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 -LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 -LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 -NOLOCKSHIFT)) (128 (39 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 - 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 -LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN - . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) ( -145 (95 170 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) ( -151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) ( -155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 -NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (SPANISH ((100 (53 -61904 NOLOCKSHIFT)) (101 (52 61887 NOLOCKSHIFT)) (102 (54 61920 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) - (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) -(108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) -(112 (204 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 61873 NOLOCKSHIFT)) (117 (50 -61858 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 ( -97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 ( -111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) (128 (59 58 NOLOCKSHIFT)) (129 -(203 187 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 -(98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) ( -143 (61900 61772 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (161 191 NOLOCKSHIFT)) (148 (114 -82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 - LOCKSHIFT)) (153 (56 61925 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 -LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (44 171 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (FRENCH ((100 (53 61905 NOLOCKSHIFT)) (101 (52 -61888 NOLOCKSHIFT)) (102 (54 61921 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) ( -105 (100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) ( -109 (107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (204 63 NOLOCKSHIFT)) -(115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 61874 NOLOCKSHIFT)) (117 (50 61859 NOLOCKSHIFT)) (118 (119 -87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 -NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 -LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) (128 (39 61857 NOLOCKSHIFT)) (129 (61872 61892 LOCKSHIFT)) (132 - (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 -70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 -LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 -13 NOLOCKSHIFT) . IGNORE) (145 (61869 61741 LOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 -LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 61919 -NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (61873 61877 LOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DANDELION) (GERMAN ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 -NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 - LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 -NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (251 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) ( -116 (51 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) ( -120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) ( -124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) ( -128 (39 34 NOLOCKSHIFT)) (129 (61863 61735 LOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT -)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . -1SHIFTUP) (142 (46 62 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 -(95 94 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 ( -121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 ( -109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (61908 61780 -LOCKSHIFT)) (159 (61925 61797 LOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DANDELION) (STANDARD-RUSSIAN (( -100 (34 52 NOLOCKSHIFT)) (101 (47 51 NOLOCKSHIFT)) (102 (58 53 NOLOCKSHIFT)) (103 (10085 10037 -LOCKSHIFT)) (104 (44 54 NOLOCKSHIFT)) (105 (10067 10019 LOCKSHIFT)) (106 (10068 10020 LOCKSHIFT)) (107 - (10078 10030 LOCKSHIFT)) (108 (63 57 NOLOCKSHIFT)) (109 (10077 10029 LOCKSHIFT)) (110 (37 48 -NOLOCKSHIFT)) (111 (10073 10025 LOCKSHIFT)) (112 (10071 10023 LOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . -IGNORE) (116 (45 50 NOLOCKSHIFT)) (117 (61352 49 NOLOCKSHIFT)) (118 (10088 10040 LOCKSHIFT)) (119 ( -10075 10027 LOCKSHIFT)) (120 (10093 10045 LOCKSHIFT)) (121 (10086 10038 LOCKSHIFT)) (122 (95 56 -NOLOCKSHIFT)) (123 (10090 10042 LOCKSHIFT)) (124 (10089 10041 LOCKSHIFT)) (125 (10091 10043 LOCKSHIFT) -) (126 (10069 10021 LOCKSHIFT)) (127 (10066 10018 LOCKSHIFT)) (128 (10095 10047 LOCKSHIFT)) (129 ( -10092 10044 LOCKSHIFT)) (132 (167 43 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (10065 10017 LOCKSHIFT)) (137 (10083 10035 LOCKSHIFT)) (138 (10080 10032 -LOCKSHIFT)) (139 (10074 10026 LOCKSHIFT)) (140 (10097 10049 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) ( -142 (10096 10048 LOCKSHIFT)) (143 (10072 10024 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (41 - 40 NOLOCKSHIFT)) (148 (10076 10028 LOCKSHIFT)) (149 (10070 10022 LOCKSHIFT)) (150 (10081 10033 -LOCKSHIFT)) (151 (10079 10031 LOCKSHIFT)) (152 (10082 10034 LOCKSHIFT)) (153 (46 55 NOLOCKSHIFT)) (154 - (10084 10036 LOCKSHIFT)) (155 (10094 10046 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (10087 10039 LOCKSHIFT)) (159 (33 61 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DANDELION)) \ No newline at end of file diff --git a/library/DORADOKEYBOARDS b/library/DORADOKEYBOARDS deleted file mode 100644 index 932aee54..00000000 --- a/library/DORADOKEYBOARDS +++ /dev/null @@ -1,171 +0,0 @@ -((EUROPEAN ((100 (53 197 NOLOCKSHIFT)) (101 (52 196 NOLOCKSHIFT)) (102 (54 198 NOLOCKSHIFT)) (103 ( -61887 61759 LOCKSHIFT)) (104 (55 199 NOLOCKSHIFT)) (105 (61888 61760 LOCKSHIFT)) (106 (61872 61744 -LOCKSHIFT)) (107 (61860 61732 LOCKSHIFT)) (108 (48 126 NOLOCKSHIFT)) (109 (61892 61764 LOCKSHIFT)) ( -110 (203 207 NOLOCKSHIFT)) (111 (61919 61791 LOCKSHIFT)) (112 (47 191 NOLOCKSHIFT)) (115 (1 1 -NOLOCKSHIFT) . IGNORE) (116 (51 195 NOLOCKSHIFT)) (117 (50 194 NOLOCKSHIFT)) (118 (61873 61745 -LOCKSHIFT)) (119 (61858 61730 LOCKSHIFT)) (120 (61874 61746 LOCKSHIFT)) (121 (61859 61731 LOCKSHIFT)) -(122 (57 202 NOLOCKSHIFT)) (123 (61886 61758 LOCKSHIFT)) (124 (61864 61736 LOCKSHIFT)) (125 (61903 -61775 LOCKSHIFT)) (126 (61908 61780 LOCKSHIFT)) (127 (241 225 LOCKSHIFT)) (128 (187 170 LOCKSHIFT)) ( -129 (249 233 LOCKSHIFT)) (132 (49 193 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (61905 61777 LOCKSHIFT)) (137 (61869 61741 LOCKSHIFT)) (138 (61877 61749 -LOCKSHIFT)) (139 (61906 61778 LOCKSHIFT)) (140 (251 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 ( -250 234 LOCKSHIFT)) (143 (59 58 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (171 186 LOCKSHIFT -)) (148 (61904 61776 LOCKSHIFT)) (149 (61920 61792 LOCKSHIFT)) (150 (61921 61793 LOCKSHIFT)) (151 ( -61857 61729 LOCKSHIFT)) (152 (61863 61735 LOCKSHIFT)) (153 (56 200 NOLOCKSHIFT)) (154 (61900 61772 -LOCKSHIFT)) (155 (239 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -246 230 LOCKSHIFT)) (159 (207 176 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (logic ((100 ( -53 37 NOLOCKSHIFT)) (101 (52 164 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (61258 61260 -NOLOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (61292 61293 NOLOCKSHIFT)) (106 (61271 61270 NOLOCKSHIFT) -) (107 (61284 61285 NOLOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (61307 61306 NOLOCKSHIFT)) (110 (45 -177 NOLOCKSHIFT)) (111 (61269 61268 LOCKSHIFT)) (112 (172 174 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . -IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (61240 61241 NOLOCKSHIFT)) (119 ( -61234 61235 NOLOCKSHIFT)) (120 (61266 61262 NOLOCKSHIFT)) (121 (61365 61365 NOLOCKSHIFT)) (122 (57 40 -NOLOCKSHIFT)) (123 (61275 61274 NOLOCKSHIFT)) (124 (61300 61299 NOLOCKSHIFT)) (125 (61273 61272 -NOLOCKSHIFT)) (126 (61282 61283 NOLOCKSHIFT)) (127 (61256 61257 NOLOCKSHIFT)) (128 (61356 61356 -NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) - (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (61250 61251 NOLOCKSHIFT)) (137 (61298 61297 NOLOCKSHIFT)) (138 - (61305 61303 NOLOCKSHIFT)) (139 (61265 61264 NOLOCKSHIFT)) (140 (61364 61364 NOLOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (61281 233 NOLOCKSHIFT)) (143 (61351 61351 NOLOCKSHIFT)) (144 (13 13 -NOLOCKSHIFT) . IGNORE) (145 (61357 61357 NOLOCKSHIFT)) (148 (61279 61278 NOLOCKSHIFT)) (149 (61239 -61238 NOLOCKSHIFT)) (150 (61290 61290 NOLOCKSHIFT)) (151 (61263 61261 NOLOCKSHIFT)) (152 (61295 61295 -NOLOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (61252 61253 NOLOCKSHIFT)) (155 (61254 61255 NOLOCKSHIFT) -) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (MATH ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 -NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (61284 61285 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 -(100 68 LOCKSHIFT)) (106 (174 61245 NOLOCKSHIFT)) (107 (61369 61363 NOLOCKSHIFT)) (108 (48 41 -NOLOCKSHIFT)) (109 (61254 61255 NOLOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (173 61246 LOCKSHIFT)) ( -112 (47 61300 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 (50 64 -NOLOCKSHIFT)) (118 (61282 61283 LOCKSHIFT)) (119 (61287 61286 NOLOCKSHIFT)) (120 (61301 61302 -NOLOCKSHIFT)) (121 (61351 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (175 61247 LOCKSHIFT)) (124 ( -180 184 LOCKSHIFT)) (125 (172 61244 LOCKSHIFT)) (126 (61256 61257 LOCKSHIFT)) (127 (44 61250 -NOLOCKSHIFT)) (128 (61298 61253 NOLOCKSHIFT)) (129 (93 61265 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) ( -133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 ( -61356 61362 LOCKSHIFT)) (138 (61254 61291 NOLOCKSHIFT)) (139 (98 61360 NOLOCKSHIFT)) (140 (61309 177 -LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 61251 NOLOCKSHIFT)) (143 (61299 61252 NOLOCKSHIFT)) ( -144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (95 94 NOLOCKSHIFT)) (148 (61358 82 LOCKSHIFT)) (149 (61296 -61266 NOLOCKSHIFT)) (150 (61305 61303 NOLOCKSHIFT)) (151 (61308 61267 LOCKSHIFT)) (152 (61288 72 -LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (61357 61361 NOLOCKSHIFT)) (155 (61292 61293 LOCKSHIFT)) ( -156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 61264 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) (101 ( -61396 61380 NOLOCKSHIFT)) (102 (61398 61382 NOLOCKSHIFT)) (103 (8557 8554 NOLOCKSHIFT)) (104 (61399 -61383 NOLOCKSHIFT)) (105 (61232 8743 NOLOCKSHIFT)) (106 (61346 8571 NOLOCKSHIFT)) (107 (188 86 -NOLOCKSHIFT)) (108 (61402 61386 NOLOCKSHIFT)) (109 (210 8738 NOLOCKSHIFT)) (110 (61437 61438 -NOLOCKSHIFT)) (111 (163 8558 NOLOCKSHIFT)) (112 (61248 63 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . -IGNORE) (116 (61395 61379 NOLOCKSHIFT)) (117 (61394 61378 NOLOCKSHIFT)) (118 (185 8553 NOLOCKSHIFT)) ( -119 (176 8546 NOLOCKSHIFT)) (120 (167 8744 NOLOCKSHIFT)) (121 (97 8745 NOLOCKSHIFT)) (122 (61401 61385 - NOLOCKSHIFT)) (123 (162 8570 NOLOCKSHIFT)) (124 (61437 88 NOLOCKSHIFT)) (125 (111 8569 NOLOCKSHIFT)) -(126 (61289 8737 NOLOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) (128 (39 34 NOLOCKSHIFT)) (129 (93 125 -NOLOCKSHIFT)) (132 (61393 61377 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (61233 8742 NOLOCKSHIFT)) (137 (61438 67 NOLOCKSHIFT)) (138 (8739 74 -NOLOCKSHIFT)) (139 (190 61436 NOLOCKSHIFT)) (140 (189 90 NOLOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) ( -142 (61249 62 NOLOCKSHIFT)) (143 (61352 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (95 -61280 NOLOCKSHIFT)) (148 (212 8574 NOLOCKSHIFT)) (149 (61354 8573 NOLOCKSHIFT)) (150 (61286 8741 -NOLOCKSHIFT)) (151 (165 8572 NOLOCKSHIFT)) (152 (61368 8740 NOLOCKSHIFT)) (153 (61400 61384 -NOLOCKSHIFT)) (154 (173 175 NOLOCKSHIFT)) (155 (172 174 NOLOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 - 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61406 61368 NOLOCKSHIFT)) (160 2SHIFTDOWN - . 2SHIFTUP)) DORADO) (DVORAK ((100 (49 42 NOLOCKSHIFT)) (101 (51 41 NOLOCKSHIFT)) (102 (57 37 -NOLOCKSHIFT)) (103 (46 62 NOLOCKSHIFT)) (104 (48 38 NOLOCKSHIFT)) (105 (101 69 LOCKSHIFT)) (106 (103 -71 LOCKSHIFT)) (107 (107 75 LOCKSHIFT)) (108 (54 45 NOLOCKSHIFT)) (109 (116 84 LOCKSHIFT)) (110 (56 95 - NOLOCKSHIFT)) (111 (108 76 LOCKSHIFT)) (112 (122 90 LOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) (116 - (53 40 NOLOCKSHIFT)) (117 (55 35 NOLOCKSHIFT)) (118 (44 60 NOLOCKSHIFT)) (119 (63 47 NOLOCKSHIFT)) ( -120 (111 79 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (52 164 NOLOCKSHIFT)) (123 (99 67 LOCKSHIFT)) ( -124 (113 81 LOCKSHIFT)) (125 (114 82 LOCKSHIFT)) (126 (110 78 LOCKSHIFT)) (127 (119 87 LOCKSHIFT)) ( -128 (44 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (33 64 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (117 85 LOCKSHIFT)) (137 (106 74 -LOCKSHIFT)) (138 (104 72 LOCKSHIFT)) (139 (120 88 LOCKSHIFT)) (140 (59 58 NOLOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (118 86 LOCKSHIFT)) (143 (115 83 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (145 (169 170 NOLOCKSHIFT)) (148 (112 80 LOCKSHIFT)) (149 (121 89 LOCKSHIFT)) (150 (105 73 -LOCKSHIFT)) (151 (102 70 LOCKSHIFT)) (152 (100 68 LOCKSHIFT)) (153 (50 162 NOLOCKSHIFT)) (154 (98 66 -LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (GREEK ((100 ( -53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (9830 69 LOCKSHIFT)) ( -104 (55 38 NOLOCKSHIFT)) (105 (9829 9797 LOCKSHIFT)) (106 (9849 9817 LOCKSHIFT)) (107 (115 9814 -LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (9837 9805 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (9843 - 9811 LOCKSHIFT)) (112 (47 63 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) - (117 (50 64 NOLOCKSHIFT)) (118 (9853 9821 LOCKSHIFT)) (119 (9835 9803 LOCKSHIFT)) (120 (9846 9814 -LOCKSHIFT)) (121 (9825 9793 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (9836 9804 LOCKSHIFT)) (124 ( -9851 9819 LOCKSHIFT)) (125 (9842 9810 LOCKSHIFT)) (126 (9838 9806 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT) -) (128 (39 34 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (9850 9818 LOCKSHIFT)) (137 (9841 9809 -LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (9826 66 LOCKSHIFT)) (140 (9833 9801 LOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (46 62 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (145 (95 94 NOLOCKSHIFT)) (148 (9845 9813 LOCKSHIFT)) (149 (9848 9816 LOCKSHIFT)) (150 (9828 -9796 LOCKSHIFT)) (151 (9852 9820 LOCKSHIFT)) (152 (9834 9802 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) ( -154 (9840 9808 LOCKSHIFT)) (155 (9839 9807 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT -) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) -DORADO) (ITALIAN ((100 (53 61903 NOLOCKSHIFT)) (101 (52 61886 NOLOCKSHIFT)) (102 (54 61919 -NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 - LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 -NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (204 63 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) ( -116 (51 61872 NOLOCKSHIFT)) (117 (50 61858 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 -LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 -LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 -NOLOCKSHIFT)) (128 (39 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 - 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 -LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN - . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) ( -145 (95 170 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) ( -151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) ( -155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 -NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (SPANISH ((100 (53 -61904 NOLOCKSHIFT)) (101 (52 61887 NOLOCKSHIFT)) (102 (54 61920 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) - (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) -(108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) -(112 (204 63 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) (116 (51 61873 NOLOCKSHIFT)) (117 (50 -61858 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 ( -97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 ( -111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) (128 (59 58 NOLOCKSHIFT)) (129 -(203 187 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 -(98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) ( -143 (61900 61772 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (161 191 NOLOCKSHIFT)) (148 (114 -82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 - LOCKSHIFT)) (153 (56 61925 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 -LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (44 171 NOLOCKSHIFT)) (159 (61 43 -NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (FRENCH ((100 (53 61905 NOLOCKSHIFT)) (101 (52 -61888 NOLOCKSHIFT)) (102 (54 61921 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) ( -105 (100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) ( -109 (107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (204 63 NOLOCKSHIFT)) -(115 (1 1 NOLOCKSHIFT) . IGNORE) (116 (51 61874 NOLOCKSHIFT)) (117 (50 61859 NOLOCKSHIFT)) (118 (119 -87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 -NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 -LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) (128 (39 61857 NOLOCKSHIFT)) (129 (61872 61892 LOCKSHIFT)) (132 - (49 33 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 -70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 -LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 -13 NOLOCKSHIFT) . IGNORE) (145 (61869 61741 LOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 -LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 61919 -NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (61873 61877 LOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DORADO) (GERMAN ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 -NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 - LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 -NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (251 63 NOLOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . IGNORE) ( -116 (51 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) ( -120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) ( -124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) ( -128 (39 34 NOLOCKSHIFT)) (129 (61863 61735 LOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (133 (92 124 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT -)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . -1SHIFTUP) (142 (46 62 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 -(95 94 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 ( -121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 ( -109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (61908 61780 -LOCKSHIFT)) (159 (61925 61797 LOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DORADO) (STANDARD-RUSSIAN (( -100 (34 52 NOLOCKSHIFT)) (101 (47 51 NOLOCKSHIFT)) (102 (58 53 NOLOCKSHIFT)) (103 (10085 10037 -LOCKSHIFT)) (104 (44 54 NOLOCKSHIFT)) (105 (10067 10019 LOCKSHIFT)) (106 (10068 10020 LOCKSHIFT)) (107 - (10078 10030 LOCKSHIFT)) (108 (63 57 NOLOCKSHIFT)) (109 (10077 10029 LOCKSHIFT)) (110 (37 48 -NOLOCKSHIFT)) (111 (10073 10025 LOCKSHIFT)) (112 (10071 10023 LOCKSHIFT)) (115 (1 1 NOLOCKSHIFT) . -IGNORE) (116 (45 50 NOLOCKSHIFT)) (117 (61352 49 NOLOCKSHIFT)) (118 (10088 10040 LOCKSHIFT)) (119 ( -10075 10027 LOCKSHIFT)) (120 (10093 10045 LOCKSHIFT)) (121 (10086 10038 LOCKSHIFT)) (122 (95 56 -NOLOCKSHIFT)) (123 (10090 10042 LOCKSHIFT)) (124 (10089 10041 LOCKSHIFT)) (125 (10091 10043 LOCKSHIFT) -) (126 (10069 10021 LOCKSHIFT)) (127 (10066 10018 LOCKSHIFT)) (128 (10095 10047 LOCKSHIFT)) (129 ( -10092 10044 LOCKSHIFT)) (132 (167 43 NOLOCKSHIFT)) (133 (92 124 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (10065 10017 LOCKSHIFT)) (137 (10083 10035 LOCKSHIFT)) (138 (10080 10032 -LOCKSHIFT)) (139 (10074 10026 LOCKSHIFT)) (140 (10097 10049 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) ( -142 (10096 10048 LOCKSHIFT)) (143 (10072 10024 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (145 (41 - 40 NOLOCKSHIFT)) (148 (10076 10028 LOCKSHIFT)) (149 (10070 10022 LOCKSHIFT)) (150 (10081 10033 -LOCKSHIFT)) (151 (10079 10031 LOCKSHIFT)) (152 (10082 10034 LOCKSHIFT)) (153 (46 55 NOLOCKSHIFT)) (154 - (10084 10036 LOCKSHIFT)) (155 (10094 10046 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (10087 10039 LOCKSHIFT)) (159 (33 61 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DORADO)) \ No newline at end of file diff --git a/library/DOVEKEYBOARDS b/library/DOVEKEYBOARDS deleted file mode 100644 index 364c1256..00000000 --- a/library/DOVEKEYBOARDS +++ /dev/null @@ -1,171 +0,0 @@ -((EUROPEAN ((100 (53 197 NOLOCKSHIFT)) (101 (52 196 NOLOCKSHIFT)) (102 (54 198 NOLOCKSHIFT)) (103 ( -61887 61759 LOCKSHIFT)) (104 (55 199 NOLOCKSHIFT)) (105 (61888 61760 LOCKSHIFT)) (106 (61872 61744 -LOCKSHIFT)) (107 (61860 61732 LOCKSHIFT)) (108 (48 126 NOLOCKSHIFT)) (109 (61892 61764 LOCKSHIFT)) ( -110 (203 207 NOLOCKSHIFT)) (111 (61919 61791 LOCKSHIFT)) (112 (47 191 NOLOCKSHIFT)) (115 (8 8 -NOLOCKSHIFT) . IGNORE) (116 (51 195 NOLOCKSHIFT)) (117 (50 194 NOLOCKSHIFT)) (118 (61873 61745 -LOCKSHIFT)) (119 (61858 61730 LOCKSHIFT)) (120 (61874 61746 LOCKSHIFT)) (121 (61859 61731 LOCKSHIFT)) -(122 (57 202 NOLOCKSHIFT)) (123 (61886 61758 LOCKSHIFT)) (124 (61864 61736 LOCKSHIFT)) (125 (61903 -61775 LOCKSHIFT)) (126 (61908 61780 LOCKSHIFT)) (127 (241 225 LOCKSHIFT)) (171 (187 170 LOCKSHIFT)) ( -129 (249 233 LOCKSHIFT)) (132 (49 193 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (61905 61777 LOCKSHIFT)) (137 (61869 61741 LOCKSHIFT)) (138 (61877 61749 -LOCKSHIFT)) (139 (61906 61778 LOCKSHIFT)) (140 (251 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 ( -250 234 LOCKSHIFT)) (143 (59 58 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (208 (171 186 LOCKSHIFT -)) (148 (61904 61776 LOCKSHIFT)) (149 (61920 61792 LOCKSHIFT)) (150 (61921 61793 LOCKSHIFT)) (151 ( -61857 61729 LOCKSHIFT)) (152 (61863 61735 LOCKSHIFT)) (153 (56 200 NOLOCKSHIFT)) (154 (61900 61772 -LOCKSHIFT)) (155 (239 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -246 230 LOCKSHIFT)) (159 (207 176 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (logic ((100 (53 37 - NOLOCKSHIFT)) (101 (52 164 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (61258 61260 NOLOCKSHIFT)) ( -104 (55 38 NOLOCKSHIFT)) (105 (61292 61293 NOLOCKSHIFT)) (106 (61271 61270 NOLOCKSHIFT)) (107 (61284 -61285 NOLOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (61307 61306 NOLOCKSHIFT)) (110 (45 177 NOLOCKSHIFT -)) (111 (61269 61268 LOCKSHIFT)) (112 (172 174 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 - 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (61240 61241 NOLOCKSHIFT)) (119 (61234 61235 -NOLOCKSHIFT)) (120 (61266 61262 NOLOCKSHIFT)) (121 (61365 61365 NOLOCKSHIFT)) (122 (57 40 NOLOCKSHIFT) -) (123 (61275 61274 NOLOCKSHIFT)) (124 (61300 61299 NOLOCKSHIFT)) (125 (61273 61272 NOLOCKSHIFT)) (126 - (61282 61283 NOLOCKSHIFT)) (127 (61256 61257 NOLOCKSHIFT)) (171 (61356 61356 NOLOCKSHIFT)) (129 (93 -125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) - . IGNORE) (135 (61250 61251 NOLOCKSHIFT)) (137 (61298 61297 NOLOCKSHIFT)) (138 (61305 61303 -NOLOCKSHIFT)) (139 (61265 61264 NOLOCKSHIFT)) (140 (61364 61364 NOLOCKSHIFT)) (141 1SHIFTDOWN . -1SHIFTUP) (142 (61281 233 NOLOCKSHIFT)) (143 (61351 61351 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (208 (61357 61357 NOLOCKSHIFT)) (148 (61279 61278 NOLOCKSHIFT)) (149 (61239 61238 NOLOCKSHIFT) -) (150 (61290 61290 NOLOCKSHIFT)) (151 (61263 61261 NOLOCKSHIFT)) (152 (61295 61295 NOLOCKSHIFT)) (153 - (56 42 NOLOCKSHIFT)) (154 (61252 61253 NOLOCKSHIFT)) (155 (61254 61255 NOLOCKSHIFT)) (156 LOCKDOWN . -LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 -2SHIFTDOWN . 2SHIFTUP)) DOVE) (MATH ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 -NOLOCKSHIFT)) (103 (61284 61285 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 ( -174 61245 NOLOCKSHIFT)) (107 (61369 61363 NOLOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (61254 61255 -NOLOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (173 61246 LOCKSHIFT)) (112 (47 61300 NOLOCKSHIFT)) (115 -(8 8 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (61282 61283 -LOCKSHIFT)) (119 (61287 61286 NOLOCKSHIFT)) (120 (61301 61302 NOLOCKSHIFT)) (121 (61351 65 LOCKSHIFT)) - (122 (57 40 NOLOCKSHIFT)) (123 (175 61247 LOCKSHIFT)) (124 (180 184 LOCKSHIFT)) (125 (172 61244 -LOCKSHIFT)) (126 (61256 61257 LOCKSHIFT)) (127 (44 61250 NOLOCKSHIFT)) (171 (61298 61253 NOLOCKSHIFT)) - (129 (93 61265 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 -NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (61356 61362 LOCKSHIFT)) (138 (61254 61291 -NOLOCKSHIFT)) (139 (98 61360 NOLOCKSHIFT)) (140 (61309 177 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) ( -142 (46 61251 NOLOCKSHIFT)) (143 (61299 61252 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (208 ( -95 94 NOLOCKSHIFT)) (148 (61358 82 LOCKSHIFT)) (149 (61296 61266 NOLOCKSHIFT)) (150 (61305 61303 -NOLOCKSHIFT)) (151 (61308 61267 LOCKSHIFT)) (152 (61288 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 -(61357 61361 NOLOCKSHIFT)) (155 (61292 61293 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (91 61264 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DOVE) (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) (101 (61396 61380 NOLOCKSHIFT)) (102 (61398 -61382 NOLOCKSHIFT)) (103 (8557 8554 NOLOCKSHIFT)) (104 (61399 61383 NOLOCKSHIFT)) (105 (61232 8743 -NOLOCKSHIFT)) (106 (61346 8571 NOLOCKSHIFT)) (107 (188 86 NOLOCKSHIFT)) (108 (61402 61386 NOLOCKSHIFT) -) (109 (210 8738 NOLOCKSHIFT)) (110 (61437 61438 NOLOCKSHIFT)) (111 (163 8558 NOLOCKSHIFT)) (112 ( -61248 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (61395 61379 NOLOCKSHIFT)) (117 (61394 -61378 NOLOCKSHIFT)) (118 (185 8553 NOLOCKSHIFT)) (119 (176 8546 NOLOCKSHIFT)) (120 (167 8744 -NOLOCKSHIFT)) (121 (97 8745 NOLOCKSHIFT)) (122 (61401 61385 NOLOCKSHIFT)) (123 (162 8570 NOLOCKSHIFT)) - (124 (61437 88 NOLOCKSHIFT)) (125 (111 8569 NOLOCKSHIFT)) (126 (61289 8737 NOLOCKSHIFT)) (127 (44 60 -NOLOCKSHIFT)) (171 (39 34 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (61393 61377 NOLOCKSHIFT)) ( -165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (61233 8742 NOLOCKSHIFT)) (137 - (61438 67 NOLOCKSHIFT)) (138 (8739 74 NOLOCKSHIFT)) (139 (190 61436 NOLOCKSHIFT)) (140 (189 90 -NOLOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (61249 62 NOLOCKSHIFT)) (143 (61352 58 NOLOCKSHIFT)) ( -144 (13 13 NOLOCKSHIFT) . IGNORE) (208 (95 61280 NOLOCKSHIFT)) (148 (212 8574 NOLOCKSHIFT)) (149 ( -61354 8573 NOLOCKSHIFT)) (150 (61286 8741 NOLOCKSHIFT)) (151 (165 8572 NOLOCKSHIFT)) (152 (61368 8740 -NOLOCKSHIFT)) (153 (61400 61384 NOLOCKSHIFT)) (154 (173 175 NOLOCKSHIFT)) (155 (172 174 NOLOCKSHIFT)) -(156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 NOLOCKSHIFT)) (159 (61406 -61368 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (DVORAK ((100 (49 42 NOLOCKSHIFT)) (101 (51 41 -NOLOCKSHIFT)) (102 (57 37 NOLOCKSHIFT)) (103 (46 62 NOLOCKSHIFT)) (104 (48 38 NOLOCKSHIFT)) (105 (101 -69 LOCKSHIFT)) (106 (103 71 LOCKSHIFT)) (107 (107 75 LOCKSHIFT)) (108 (54 45 NOLOCKSHIFT)) (109 (116 -84 LOCKSHIFT)) (110 (56 95 NOLOCKSHIFT)) (111 (108 76 LOCKSHIFT)) (112 (122 90 LOCKSHIFT)) (115 (8 8 -NOLOCKSHIFT) . IGNORE) (116 (53 40 NOLOCKSHIFT)) (117 (55 35 NOLOCKSHIFT)) (118 (44 60 NOLOCKSHIFT)) ( -119 (63 47 NOLOCKSHIFT)) (120 (111 79 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (52 164 NOLOCKSHIFT)) ( -123 (99 67 LOCKSHIFT)) (124 (113 81 LOCKSHIFT)) (125 (114 82 LOCKSHIFT)) (126 (110 78 LOCKSHIFT)) (127 - (119 87 LOCKSHIFT)) (171 (44 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (33 64 NOLOCKSHIFT)) ( -165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (117 85 LOCKSHIFT)) (137 (106 -74 LOCKSHIFT)) (138 (104 72 LOCKSHIFT)) (139 (120 88 LOCKSHIFT)) (140 (59 58 NOLOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (118 86 LOCKSHIFT)) (143 (115 83 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (208 (169 170 NOLOCKSHIFT)) (148 (112 80 LOCKSHIFT)) (149 (121 89 LOCKSHIFT)) (150 (105 73 -LOCKSHIFT)) (151 (102 70 LOCKSHIFT)) (152 (100 68 LOCKSHIFT)) (153 (50 162 NOLOCKSHIFT)) (154 (98 66 -LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 ( -91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (GREEK ((100 (53 37 -NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT)) (103 (9830 69 LOCKSHIFT)) (104 (55 -38 NOLOCKSHIFT)) (105 (9829 9797 LOCKSHIFT)) (106 (9849 9817 LOCKSHIFT)) (107 (115 9814 LOCKSHIFT)) ( -108 (48 41 NOLOCKSHIFT)) (109 (9837 9805 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (9843 9811 -LOCKSHIFT)) (112 (47 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 35 NOLOCKSHIFT)) (117 -(50 64 NOLOCKSHIFT)) (118 (9853 9821 LOCKSHIFT)) (119 (9835 9803 LOCKSHIFT)) (120 (9846 9814 LOCKSHIFT -)) (121 (9825 9793 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (9836 9804 LOCKSHIFT)) (124 (9851 9819 -LOCKSHIFT)) (125 (9842 9810 LOCKSHIFT)) (126 (9838 9806 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) (171 (39 - 34 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . -IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (9850 9818 LOCKSHIFT)) (137 (9841 9809 LOCKSHIFT)) (138 -(106 74 LOCKSHIFT)) (139 (9826 66 LOCKSHIFT)) (140 (9833 9801 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) -(142 (46 62 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (208 (95 94 -NOLOCKSHIFT)) (148 (9845 9813 LOCKSHIFT)) (149 (9848 9816 LOCKSHIFT)) (150 (9828 9796 LOCKSHIFT)) (151 - (9852 9820 LOCKSHIFT)) (152 (9834 9802 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (9840 9808 -LOCKSHIFT)) (155 (9839 9807 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) ( -158 (91 123 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (ITALIAN ((171 -(39 34 NOLOCKSHIFT)) (100 (53 61903 NOLOCKSHIFT)) (101 (52 61886 NOLOCKSHIFT)) (102 (54 61919 -NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 - LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 -NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (95 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 - (51 61872 NOLOCKSHIFT)) (117 (50 61857 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT) -) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) -(124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) -(171 (39 186 NOLOCKSHIFT)) (129 (93 125 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 27 -NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT -)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . -1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (208 - (95 170 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 - (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 -(109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (91 123 -NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (SPANISH ((208 (161 191 -NOLOCKSHIFT)) (171 (59 58 NOLOCKSHIFT)) (100 (53 61904 NOLOCKSHIFT)) (101 (52 61887 NOLOCKSHIFT)) (102 - (54 61920 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) ( -106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) ( -110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (95 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . -IGNORE) (116 (51 61873 NOLOCKSHIFT)) (117 (50 61858 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 -81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 - LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 171 -NOLOCKSHIFT)) (171 (59 58 NOLOCKSHIFT)) (129 (185 186 NOLOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 - 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 -LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN - . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (61900 61772 LOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . -IGNORE) (208 (161 191 NOLOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 -LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 61925 NOLOCKSHIFT)) (154 (110 -78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) ( -158 (169 170 NOLOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (FRENCH ((208 -(61869 61741 NOLOCKSHIFT)) (171 (39 61857 NOLOCKSHIFT)) (100 (53 61905 NOLOCKSHIFT)) (101 (52 61888 -NOLOCKSHIFT)) (102 (54 61921 NOLOCKSHIFT)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 ( -100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT)) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 ( -107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT)) (111 (112 80 LOCKSHIFT)) (112 (95 63 NOLOCKSHIFT)) (115 ( -1 1 NOLOCKSHIFT) . IGNORE) (116 (51 61874 NOLOCKSHIFT)) (117 (50 61859 NOLOCKSHIFT)) (118 (119 87 -LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 -NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 -LOCKSHIFT)) (127 (44 171 NOLOCKSHIFT)) (171 (39 61857 NOLOCKSHIFT)) (129 (61872 61892 LOCKSHIFT)) (132 - (49 33 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 - LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 -LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 187 NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 -13 NOLOCKSHIFT) . IGNORE) (208 (61869 61741 LOCKSHIFT)) (148 (114 82 LOCKSHIFT)) (149 (116 84 -LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) (152 (104 72 LOCKSHIFT)) (153 (56 61919 -NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) (156 LOCKDOWN . LOCKUP) (157 (32 32 -NOLOCKSHIFT) . IGNORE) (158 (61873 61877 LOCKSHIFT)) (159 (61 43 NOLOCKSHIFT)) (160 2SHIFTDOWN . -2SHIFTUP)) DOVE) (GERMAN ((100 (53 37 NOLOCKSHIFT)) (101 (52 36 NOLOCKSHIFT)) (102 (54 126 NOLOCKSHIFT -)) (103 (101 69 LOCKSHIFT)) (104 (55 38 NOLOCKSHIFT)) (105 (100 68 LOCKSHIFT)) (106 (117 85 LOCKSHIFT) -) (107 (118 86 LOCKSHIFT)) (108 (48 41 NOLOCKSHIFT)) (109 (107 75 LOCKSHIFT)) (110 (45 45 NOLOCKSHIFT) -) (111 (112 80 LOCKSHIFT)) (112 (251 63 NOLOCKSHIFT)) (115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (51 35 -NOLOCKSHIFT)) (117 (50 64 NOLOCKSHIFT)) (118 (119 87 LOCKSHIFT)) (119 (113 81 LOCKSHIFT)) (120 (115 83 - LOCKSHIFT)) (121 (97 65 LOCKSHIFT)) (122 (57 40 NOLOCKSHIFT)) (123 (105 73 LOCKSHIFT)) (124 (120 88 -LOCKSHIFT)) (125 (111 79 LOCKSHIFT)) (126 (108 76 LOCKSHIFT)) (127 (44 60 NOLOCKSHIFT)) (171 (39 34 -NOLOCKSHIFT)) (129 (61863 61735 LOCKSHIFT)) (132 (49 33 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . -IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (102 70 LOCKSHIFT)) (137 (99 67 LOCKSHIFT)) (138 (106 74 - LOCKSHIFT)) (139 (98 66 LOCKSHIFT)) (140 (122 90 LOCKSHIFT)) (141 1SHIFTDOWN . 1SHIFTUP) (142 (46 62 -NOLOCKSHIFT)) (143 (59 58 NOLOCKSHIFT)) (144 (13 13 NOLOCKSHIFT) . IGNORE) (208 (95 94 NOLOCKSHIFT)) ( -148 (114 82 LOCKSHIFT)) (149 (116 84 LOCKSHIFT)) (150 (103 71 LOCKSHIFT)) (151 (121 89 LOCKSHIFT)) ( -152 (104 72 LOCKSHIFT)) (153 (56 42 NOLOCKSHIFT)) (154 (110 78 LOCKSHIFT)) (155 (109 77 LOCKSHIFT)) ( -156 LOCKDOWN . LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (61908 61780 LOCKSHIFT)) (159 (61925 -61797 LOCKSHIFT)) (160 2SHIFTDOWN . 2SHIFTUP)) DOVE) (STANDARD-RUSSIAN ((208 (41 40 NOLOCKSHIFT)) (171 - (10073 10025 NOLOCKSHIFT)) (100 (34 52 NOLOCKSHIFT)) (101 (47 51 NOLOCKSHIFT)) (102 (58 53 -NOLOCKSHIFT)) (103 (10085 10037 LOCKSHIFT)) (104 (44 54 NOLOCKSHIFT)) (105 (10067 10019 LOCKSHIFT)) ( -106 (10068 10020 LOCKSHIFT)) (107 (10078 10030 LOCKSHIFT)) (108 (63 57 NOLOCKSHIFT)) (109 (10077 10029 - LOCKSHIFT)) (110 (37 48 NOLOCKSHIFT)) (111 (10073 10025 LOCKSHIFT)) (112 (10071 10023 LOCKSHIFT)) ( -115 (8 8 NOLOCKSHIFT) . IGNORE) (116 (45 50 NOLOCKSHIFT)) (117 (61352 49 NOLOCKSHIFT)) (118 (10088 -10040 LOCKSHIFT)) (119 (10075 10027 LOCKSHIFT)) (120 (10093 10045 LOCKSHIFT)) (121 (10086 10038 -LOCKSHIFT)) (122 (95 56 NOLOCKSHIFT)) (123 (10090 10042 LOCKSHIFT)) (124 (10089 10041 LOCKSHIFT)) (125 - (10091 10043 LOCKSHIFT)) (126 (10069 10021 LOCKSHIFT)) (127 (10066 10018 LOCKSHIFT)) (171 (10095 -10047 LOCKSHIFT)) (129 (10092 10044 LOCKSHIFT)) (132 (167 43 NOLOCKSHIFT)) (165 (27 27 NOLOCKSHIFT) . -IGNORE) (134 (9 9 NOLOCKSHIFT) . IGNORE) (135 (10065 10017 LOCKSHIFT)) (137 (10083 10035 LOCKSHIFT)) ( -138 (10080 10032 LOCKSHIFT)) (139 (10074 10026 LOCKSHIFT)) (140 (10097 10049 LOCKSHIFT)) (141 -1SHIFTDOWN . 1SHIFTUP) (142 (10096 10048 LOCKSHIFT)) (143 (10072 10024 LOCKSHIFT)) (144 (13 13 -NOLOCKSHIFT) . IGNORE) (208 (41 40 NOLOCKSHIFT)) (148 (10076 10028 LOCKSHIFT)) (149 (10070 10022 -LOCKSHIFT)) (150 (10081 10033 LOCKSHIFT)) (151 (10079 10031 LOCKSHIFT)) (152 (10082 10034 LOCKSHIFT)) -(153 (46 55 NOLOCKSHIFT)) (154 (10084 10036 LOCKSHIFT)) (155 (10094 10046 LOCKSHIFT)) (156 LOCKDOWN . -LOCKUP) (157 (32 32 NOLOCKSHIFT) . IGNORE) (158 (10087 10039 LOCKSHIFT)) (159 (33 61 NOLOCKSHIFT)) ( -160 2SHIFTDOWN . 2SHIFTUP)) DOVE)) \ No newline at end of file diff --git a/library/KEYBOARDEDITOR.LCOM b/library/KEYBOARDEDITOR.LCOM deleted file mode 100644 index afef840c..00000000 Binary files a/library/KEYBOARDEDITOR.LCOM and /dev/null differ diff --git a/library/MAIKOKEYBOARDS b/library/MAIKOKEYBOARDS deleted file mode 100644 index 46e72759..00000000 Binary files a/library/MAIKOKEYBOARDS and /dev/null differ diff --git a/library/PDFSTREAM b/library/PDFSTREAM new file mode 100644 index 00000000..1534669e --- /dev/null +++ b/library/PDFSTREAM @@ -0,0 +1,276 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 1-Oct-2023 20:53:05" {WMEDLEY}PDFSTREAM.;54 13917 + + :EDIT-BY rmk + + :CHANGES-TO (FNS SEE-PDF) + + :PREVIOUS-DATE " 1-Oct-2023 15:29:33" {WMEDLEY}PDFSTREAM.;53) + + +(PRETTYCOMPRINT PDFSTREAMCOMS) + +(RPAQQ PDFSTREAMCOMS + ((FILES (SYSLOAD) + POSTSCRIPTSTREAM) + [COMS (* ; "Hook into hardcopy interface") + [ADDVARS [PRINTERTYPES ((PDF) + (CANPRINT (PDF)) + (STATUS TRUE) + (PROPERTIES NILL) + (SEND POSTSCRIPTSEND) + (BITMAPSCALE POSTSCRIPT.BITMAPSCALE) + (BITMAPFILE (PDF.HARDCOPYW FILE BITMAP SCALEFACTOR REGION + ROTATION TITLE] + [PRINTFILETYPES (PDF (TEST PDFFILEP) + (EXTENSION (PDF)) + (CONVERSION (TEXT PDF.TEXT TEDIT PDF.TEDIT] + (IMAGESTREAMTYPES (PDF (OPENSTREAM OPEN-PDF-STREAM) + (FONTCREATE POSTSCRIPT.FONTCREATE) + (FONTSAVAILABLE POSTSCRIPT.FONTSAVAILABLE) + (CREATECHARSET \CREATECHARSET.PSC] + (VARS (DEFAULTPRINTERTYPE 'PDF)) + (FNS PDFFILEP PDF.HARDCOPYW PDF.TEXT PDF.TEDIT) + (P (FONTPROFILE.ADDDEVICE 'PDF 'POSTSCRIPT] + + (* ;; "") + + + (* ;; "Implementation of PDF streams") + + (INITVARS (PDFCONVERTER 'ps2pdf)) + (* ; "Mac with ghostscript?") + (ALISTS (PDF-CONVERTER-TEMPLATES ps2pdf pstopdf)) + (GLOBALVARS PDFCONVERTER PDF-CONVERTER-TEMPLATES) + (FNS OPEN-PDF-STREAM CLOSE-PDF-STREAM PS-TO-PDF) + (FNS SEE-PDF))) + +(FILESLOAD (SYSLOAD) + POSTSCRIPTSTREAM) + + + +(* ; "Hook into hardcopy interface") + + +(ADDTOVAR PRINTERTYPES ((PDF) + (CANPRINT (PDF)) + (STATUS TRUE) + (PROPERTIES NILL) + (SEND POSTSCRIPTSEND) + (BITMAPSCALE POSTSCRIPT.BITMAPSCALE) + (BITMAPFILE (PDF.HARDCOPYW FILE BITMAP SCALEFACTOR REGION ROTATION TITLE)))) + +(ADDTOVAR PRINTFILETYPES (PDF (TEST PDFFILEP) + (EXTENSION (PDF)) + (CONVERSION (TEXT PDF.TEXT TEDIT PDF.TEDIT)))) + +(ADDTOVAR IMAGESTREAMTYPES (PDF (OPENSTREAM OPEN-PDF-STREAM) + (FONTCREATE POSTSCRIPT.FONTCREATE) + (FONTSAVAILABLE POSTSCRIPT.FONTSAVAILABLE) + (CREATECHARSET \CREATECHARSET.PSC))) + +(RPAQQ DEFAULTPRINTERTYPE PDF) +(DEFINEQ + +(PDFFILEP + [LAMBDA (FILE) (* ; "Edited 23-Jun-2023 14:43 by rmk") + (* ; "Edited 5-Mar-93 21:40 by rmk:") + (* ; "Edited 14-Jan-93 10:56 by jds") + (OR (CL:MEMBER (UNPACKFILENAME.STRING FILE 'EXTENSION) + '("PDF") + :TEST + (FUNCTION STRING-EQUAL)) + (CL:WHEN (STREAMP FILE) + (SETFILEPTR FILE 0) + (PROG1 (AND (EQ (BIN FILE) + (CHARCODE %%)) + (EQ (BIN FILE) + (CHARCODE P)) + (EQ (BIN FILE) + (CHARCODE D)) + (EQ (BIN FILE) + (CHARCODE F))) + (SETFILEPTR FILE 0)))]) + +(PDF.HARDCOPYW + [LAMBDA (PDFFILE BITMAP SCALEFACTOR REGION Landscape? TITLE) + (* ; "Edited 24-Jul-2023 10:37 by rmk") + (* ; "Edited 23-Jun-2023 13:28 by rmk") + (* ; "Edited 6-Mar-2023 22:43 by rmk") + (LET ((PSTTMP (PACKFILENAME 'EXTENSION 'TMPPS 'BODY PDFFILE))) + (PS-TO-PDF (POSTSCRIPT.HARDCOPYW PSTTMP BITMAP SCALEFACTOR REGION Landscape? TITLE) + PDFFILE]) + +(PDF.TEXT + [LAMBDA (FILE PDFFILE FONTS HEADING TABS) (* ; "Edited 1-Oct-2023 15:24 by rmk") + (* ; "Edited 23-Jun-2023 13:23 by rmk") + (* ; "Edited 7-Mar-2023 08:39 by rmk") + (TEXTTOIMAGEFILE FILE PDFFILE 'PDF FONTS HEADING TABS `(REGION ,POSTSCRIPT.DEFAULT.PAGEREGION + ROTATION ,(NOT (NOT + POSTSCRIPT.TEXTFILE.LANDSCAPE + ]) + +(PDF.TEDIT + [LAMBDA (FILE PDFFILE) (* ; "Edited 23-Jun-2023 13:22 by rmk") + (* ; "Edited 7-Mar-2023 08:39 by rmk") + (LET ((TSTREAM (OPENTEXTSTREAM FILE))) + (TEDIT.FORMAT.HARDCOPY FILE PDFFILE T NIL NIL NIL 'PDF) + (CLOSEF TSTREAM]) +) + +(FONTPROFILE.ADDDEVICE 'PDF 'POSTSCRIPT) + + + +(* ;; "") + + + + +(* ;; "Implementation of PDF streams") + + +(RPAQ? PDFCONVERTER 'ps2pdf) + + + +(* ; "Mac with ghostscript?") + + +(ADDTOVAR PDF-CONVERTER-TEMPLATES (ps2pdf " " PSFILE " " PDFFILE " 2> " ERRORFILE) + (pstopdf " " PSFILE " -o " PDFFILE " 2> " ERRORFILE)) +(DECLARE%: DOEVAL@COMPILE DONTCOPY + +(GLOBALVARS PDFCONVERTER PDF-CONVERTER-TEMPLATES) +) +(DEFINEQ + +(OPEN-PDF-STREAM + [LAMBDA (FILE OPTIONS) (* ; "Edited 23-Sep-2023 15:38 by rmk") + (* ; "Edited 22-Sep-2023 11:04 by rmk") + (* ; "Edited 24-Jun-2023 14:49 by rmk") + + (* ;; "Open a temporary PS file, but set it up so that at closing it gets converted to PDF using an operating-system utility (if available), and then gets renamed to the original intended filename.") + + (* ;; "We have to stash the original filename someplace. We could put it in the tmp filename and then parse it out, but then we would have to worry about how unix filenames might parse against our {, }, etc. ") + + (* ;; + "Simplest thing for now is to just add an extra field at the end of the \POSTSCRIPTDATA record.") + + (* ;; "") + + (if [AND NIL (EQ 'LPT (FILENAMEFIELD FILE 'HOST] + then + (* ;; "If FILE is on the LPT device, we could just ssume that it can be printed directly, no point in converting. But then we would alo have to lie and give it a PDF extension so it thinks that we are heading to a PDF printer.") + + (OPENPOSTSCRIPTSTREAM FILE OPTIONS) + else (CL:UNLESS (OR (ASSOC (OR PDFCONVERTER (MKATOM (UNIX-GETENV "MEDLEY-PDFCONVERTER"))) + PDF-CONVERTER-TEMPLATES)) + (ERROR "POSTSCRIPT-to-PDF converter is not specified")) + (SETQ FILE (OR (AND (NEQ FILE T) + (OUTFILEP FILE)) + (ERROR "PDF target file not found" FILE))) + (LET ((PSSTREAM (OPENPOSTSCRIPTSTREAM (CONCAT "{UNIX}/tmp/medley-pdf-" (IDATE) + "-" + (RAND) + ".ps") + OPTIONS))) + (STREAMPROP PSSTREAM 'AFTERCLOSE (CONS (FUNCTION CLOSE-PDF-STREAM))) + (STREAMPROP PSSTREAM 'PDFTARGETINFO FILE) + PSSTREAM]) + +(CLOSE-PDF-STREAM + [LAMBDA (PSSTREAM) (* ; "Edited 22-Sep-2023 11:18 by rmk") + (* ; "Edited 24-Jul-2023 10:37 by rmk") + (* ; "Edited 17-Jul-2023 22:32 by rmk") + (* ; "Edited 24-Jun-2023 13:57 by rmk") + + (* ;; "PSSTREAM is a postscript (maybe in tmp) rendition of what is intended to end up as a pdf. If we are going directly to a printer, we can probably just pass it along without worrying about conversion. In fact, in that case we probably should not have bothered even setting up the PDF stream.") + + (* ;; "But for a file we execute the PDFCONVERTER as a shell command to make a pdf, and then we rename it to the intended filename") + + (STREAMPROP PSSTREAM 'AFTERCLOSE NIL) (* ; + "Maybe just remove only CLOSE-PDF-STREAMfrom the list?") + (LET ((TARGETINFO (STREAMPROP PSSTREAM 'PDFTARGETINFO NIL))) + (CL:IF TARGETINFO + (RENAMEFILE (PS-TO-PDF PSSTREAM) + TARGETINFO) + PSSTREAM)]) + +(PS-TO-PDF + [LAMBDA (PSFILE PDFFILE DONTDELETE) (* ; "Edited 1-Oct-2023 15:18 by rmk") + (* ; "Edited 23-Sep-2023 22:54 by rmk") + (* ; "Edited 23-Jul-2023 22:30 by rmk") + (* ; "Edited 24-Jun-2023 15:01 by rmk") + (* ; "Edited 16-Jul-2022 13:06 by rmk") + (* ; "Edited 8-Jul-2022 10:20 by rmk") + (* ; "Edited 7-May-2022 22:40 by rmk") + (* ; "Edited 7-Oct-2021 11:15 by rmk:") + + (* ;; "PSFILE is the name of a closed PS file on a DSK/UNIX device. This function uses the PDFCONVERTER utility to convert that to a parallel pdf file, which is then renamed to PDFFILE. ") + + (* ;; "DONTDELETE is just for debugging, keeps the /tmp/ files") + + (SETQ PSFILE (FULLNAME (TRUEFILENAME PSFILE))) + (CL:UNLESS (INFILEP PSFILE) + (ERROR "NO PS FILE TO CONVERT")) + (SETQ PDFFILE (if PDFFILE + then (TRUEFILENAME PDFFILE) + else (PACKFILENAME 'EXTENSION 'pdf 'BODY PSFILE))) + (LET ((ERRORFILE (PACKFILENAME 'EXTENSION 'error 'BODY PSFILE)) + COMPLETIONCODE) + + (* ;; "PROCESS-COMMAND is currently from GITFNS. Not sure whether ShellCommand in UNIXUTILS is appropriate.") + + (* ;; + "We have to map the filenames down to Unix conventions: (not pseudohost or host, slashes, etc.") + + [SETQ COMPLETIONCODE (PROCESS-COMMAND (CONCATLIST (SUBLIS + `((PSFILE \, (SLASHIT (TRUEFILENAME + PSFILE) + NIL T)) + (PDFFILE \, (SLASHIT (TRUEFILENAME + PDFFILE) + NIL T)) + (ERRORFILE \, (SLASHIT (TRUEFILENAME + ERRORFILE) + NIL T))) + (ASSOC (OR PDFCONVERTER + (MKATOM (UNIX-GETENV + "MEDLEY-PDFCONVERTER" + ))) + PDF-CONVERTER-TEMPLATES] + + (* ;; "Now use Medley names") + + (CLOSEF? PSFILE) + (CL:UNLESS DONTDELETE (DELFILE PSFILE)) + (CLOSEF? ERRORFILE) + (CL:WHEN (INFILEP ERRORFILE) + (CL:WHEN (IGREATERP (PROG1 (GETFILEINFO ERRORFILE 'LENGTH) + (CL:UNLESS DONTDELETE (DELFILE ERRORFILE))) + 0) + (ERROR "Cannot create PDF file for " PDFFILE))) + (CL:WHEN (IGREATERP COMPLETIONCODE 0) + (ERROR "Cannot create PDF file for " PDFFILE)) + PDFFILE]) +) +(DEFINEQ + +(SEE-PDF + [LAMBDA (PDFFILE) (* ; "Edited 1-Oct-2023 20:47 by rmk") + (* ; "Edited 26-Sep-2023 16:52 by rmk") + + (* ;; "Good for Mac, not sure about Windows etc.") + + (ShellCommand (CONCAT "open -a Preview " (UNIX-FILE-NAME (PACKFILENAME 'BODY PDFFILE 'EXTENSION + 'PDF) + 'INPUT]) +) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (3078 5692 (PDFFILEP 3088 . 4002) (PDF.HARDCOPYW 4004 . 4602) (PDF.TEXT 4604 . 5321) ( +PDF.TEDIT 5323 . 5690)) (6136 13355 (OPEN-PDF-STREAM 6146 . 8324) (CLOSE-PDF-STREAM 8326 . 9613) ( +PS-TO-PDF 9615 . 13353)) (13356 13894 (SEE-PDF 13366 . 13892))))) +STOP diff --git a/library/PDFSTREAM.LCOM b/library/PDFSTREAM.LCOM new file mode 100644 index 00000000..12da811e Binary files /dev/null and b/library/PDFSTREAM.LCOM differ diff --git a/library/UNIXUTILS b/library/UNIXUTILS index d841eb58..2150c55e 100644 --- a/library/UNIXUTILS +++ b/library/UNIXUTILS @@ -1,28 +1,40 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "18-Jan-2023 20:36:10" {DSK}frank>il>medley>gmedley>library>UNIXUTILS.;7 5091 +(FILECREATED " 8-Oct-2023 15:06:52" {DSK}frank>il>medley>gmedley>library>UNIXUTILS.;15 14696 - :CHANGES-TO (FNS ShellBrowser ShellBrowse ShellOpen) + :CHANGES-TO (FNS ShellOpen UNIX-FILE-NAME ShellBrowser ShellBrowse ShellOpener) (VARS UNIXUTILSCOMS) - (FUNCTIONS ShellWhich) - :PREVIOUS-DATE "18-Jan-2023 13:22:28" {DSK}frank>il>medley>gmedley>greetfiles>UNIXUTILS.;1 + :PREVIOUS-DATE " 8-Oct-2023 02:35:47" {DSK}frank>il>medley>gmedley>library>UNIXUTILS.;14 ) (PRETTYCOMPRINT UNIXUTILSCOMS) -(RPAQQ UNIXUTILSCOMS ((GLOBALVARS ShellBrowser) - (INITVARS (ShellBrowser)) - (FUNCTIONS ShellCommand ShellWhich) - (FNS ShellBrowser ShellBrowse))) +(RPAQQ UNIXUTILSCOMS + ((DECLARE%: EVAL@COMPILE DONTCOPY (* ; "For PROCESS-COMMAND") + (FILES (FROM LOADUPS) + EXPORTS.ALL)) + (GLOBALVARS ShellBrowser ShellOpener) + (INITVARS (ShellBrowser) + (ShellOpener)) + (FUNCTIONS ShellCommand ShellWhich) + (FNS ShellBrowser ShellBrowse ShellOpener ShellOpen PROCESS-COMMAND SLASHIT UNIX-FILE-NAME) + (PROPS (UNIXUTILS FILETYPE)))) +(DECLARE%: EVAL@COMPILE DONTCOPY + +(FILESLOAD (FROM LOADUPS) + EXPORTS.ALL) +) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS ShellBrowser) +(GLOBALVARS ShellBrowser ShellOpener) ) (RPAQ? ShellBrowser ) +(RPAQ? ShellOpener ) + (CL:DEFUN ShellCommand (Cmd &OPTIONAL (Output T)) (CL:WITH-OPEN-STREAM (s (CREATE-PROCESS-STREAM Cmd)) (CL:TAGBODY [SETFILEINFO s 'ENDOFSTREAMOP #'(CL:LAMBDA (s) @@ -34,62 +46,56 @@ (CL:DEFUN ShellWhich (Cmd) (* ; "Edited 18-Jan-2023 13:19 by FGH") [CL:WITH-OPEN-STREAM (S (OPENSTREAM '{NODIRCORE} 'BOTH)) - (ShellCommand (CONCAT "which " Cmd) + (ShellCommand (CONCAT "command -v " Cmd) S) (COND ((EQ (GETEOFPTR S) 0) NIL) (T (SETFILEPTR S 0) - (MKSTRING (READ S]) + (RSTRING S]) (DEFINEQ (ShellBrowser [LAMBDA NIL (* ; "Edited 18-Jan-2023 20:30 by FGH") - (OR ShellBrowser (SETQ ShellBrowser (LET (CMDPATH) - (if (STRPOS "darwin" (OR (UNIX-GETENV "OSTYPE") - (UNIX-GETENV "PATH"))) - then - (* ;; " MacOS") - "open" - elseif (SETQ CMDPATH (ShellWhich "wslview")) - then - (* ;; "windows with WSL") + (* ;; "Figure out the browser to use for the ShellOpen/ShellBrowse functions. ") - CMDPATH - elseif (SETQ CMDPATH (ShellWhich "xdg-open")) - then - (* ;; "Linux systems with xdg-utils installed ") + (* ;; " Ordinarily, this would be the same as the generic ShellOpener.") - CMDPATH - elseif (SETQ CMDPATH (ShellWhich "git")) - then - (* ;; " Systems with git installed") + (* ;; " But if a generic ShellOpener is not found, then there are some additional") - (CONCAT CMDPATH " web--browse") - (* ; "") - elseif (SETQ CMDPATH (ShellWhich "lynx")) - then - (* ;; " Systems with lynx installed") + (* ;; " possibilities that will work for http/https URLs. If one of these exists return it.") - (LET (CMDPATH2) - (if (SETQ CMDPATH2 (ShellWhich "xterm")) - then (CONCAT CMDPATH2 " -e " CMDPATH) - else (LIST CMDPATH))) - else - (* ;; - " Out of ideas - just return a dummy function") + (OR ShellBrowser (SETQ ShellBrowser + (if (NOT (STREQUAL (ShellOpener) + "true")) + then ShellOpener + else (LET (CMDPATH) + (if (SETQ CMDPATH (ShellWhich "git")) + then + (* ;; " Systems with git installed") - "true"]) + CMDPATH + elseif (SETQ CMDPATH (ShellWhich "lynx")) + then + (* ;; " Systems with lynx installed") + + (LET (CMDPATH2) + (if (SETQ CMDPATH2 (ShellWhich "xterm")) + then (CONCAT CMDPATH2 " -e " CMDPATH) + else (LIST CMDPATH))) + else + (* ;; " Out of ideas - just return a dummy function") + + "true"]) (ShellBrowse [LAMBDA (URL) (* ; "Edited 18-Jan-2023 20:32 by FGH") (* ;; " Open the web page specified by URL using an external browser via shell call") - (* ;; - " URL must start with http:// or https:// (case ireelevant) or this function will just return NIL.") + (* ;; " URL must start with http:// or https:// or file:/// (case ireelevant) or this function will just return NIL.") (* ;; " Returns T otherwise.") @@ -97,17 +103,189 @@ (if (OR (EQ (STRPOS "http://" (L-CASE URL)) 1) (EQ (STRPOS "https://" (L-CASE URL)) + 1) + (EQ (STRPOS "file:///" (L-CASE URL)) + 1)) + then (ShellOpen URL) + else NIL]) + +(ShellOpener + [LAMBDA NIL + + (* ;; "Find an %"opener%" that will open files (and URLs) using the appropriate/default app on this machine") + + (OR ShellOpener (SETQ ShellOpener (LET (CMDPATH) + (if (SETQ CMDPATH (ShellWhich "wslview")) + then + (* ;; "windows with WSL") + + CMDPATH + elseif (SETQ CMDPATH (ShellWhich "cygstart")) + then + (* ;; "windows with cygwin") + + CMDPATH + elseif (SETQ CMDPATH (ShellWhich "xdg-open")) + then + (* ;; "Linux systems with xdg-utils installed ") + + CMDPATH + elseif (SETQ CMDPATH (ShellWhich "open")) + then + (* ;; " MacOS open") + + CMDPATH + else + (* ;; + " Out of ideas - just return a dummy function") + + "true"]) + +(ShellOpen + [LAMBDA (FilenameOrURL) + + (* ;; "Open the file or URL using the generic %"opener%" for this machine via a shell call.") + + (* ;; " If FilenameOrURL starts with %"http://%" or %"https://%" or %"file:///%", then we use (ShellBrowser) as") + + (* ;; " the %"opener%" (which includes some browsers on a machine without a generic opener).") + + (* ;; + " Otherwise FilenameOrURL is assumed to be a filename and will be opened using (ShellOpener).") + + (* ;; " Returns T is all goes well; returns an error string if all does not go well") + + (SETQ FilenameOrURL (MKSTRING FilenameOrURL)) + (if (OR (EQ (STRPOS "http://" (L-CASE FilenameOrURL)) + 1) + (EQ (STRPOS "https://" (L-CASE FilenameOrURL)) + 1) + (EQ (STRPOS "file://" (L-CASE FilenameOrURL)) 1)) then (LET ((BROWSER (ShellBrowser))) - (if (LISTP BROWSER) - then (CHAT 'SHELL NIL (CONCAT (CAR BROWSER) - " '" URL "'")) - else (ShellCommand (CONCAT BROWSER " '" URL "'" - " >>/tmp/ShellBrowser-warnings-$$.txt"))) - T) - else NIL]) + (if (NOT (STREQUAL BROWSER "true")) + then (if (LISTP BROWSER) + then (CHAT 'SHELL NIL (CONCAT (CAR BROWSER) + " '" FilenameOrURL "'")) + else (ShellCommand (CONCAT BROWSER " '" FilenameOrURL "'" + " >>/tmp/ShellBrowser-warnings-$$.txt")) + T) + else (CONCAT "Unable to find a browser to open: " FilenameOrURL))) + else + (LET ((OPENER (ShellOpener)) + (UNIXFILE (UNIX-FILE-NAME FilenameOrURL 'INPUT T))) + (if (NOT UNIXFILE) + then (CONCAT "File not found: " FilenameOrURL) + elseif (NOT (STREQUAL OPENER "true")) + then (CL:WITH-OPEN-STREAM + (SHELLSTREAM (OPENSTREAM (CONCAT "{CORE}SHELLOUT" (RAND)) + 'BOTH)) + (ShellCommand (CONCAT OPENER " '" UNIXFILE "'" + " >>/tmp/ShellOpener-warnings-$$.txt") + SHELLSTREAM) + (if (EQ (GETFILEPTR SHELLSTREAM) + 0) + then T + else (LET* ((OUTSTRING (ALLOCSTRING (GETFILEPTR SHELLSTREAM) + " "))) + (CL:WITH-OPEN-STREAM (STRINGSTREAM (OPENSTRINGSTREAM OUTSTRING + 'OUTPUT)) + (SETFILEPTR SHELLSTREAM 0) + (CL:TAGBODY [SETFILEINFO SHELLSTREAM 'ENDOFSTREAMOP + #'(CL:LAMBDA (s) + (GO OUT] + (CL:LOOP (PRINTCCODE (READCCODE SHELLSTREAM) + STRINGSTREAM)) + OUT)) + OUTSTRING))) + else (CONCAT "Unable to find a file opener to open: " FilenameOrURL]) + +(PROCESS-COMMAND + [LAMBDA (CMD) (* ; "Edited 17-Jul-2022 08:17 by rmk") + + (* ;; "This sets up an asynchronous process and waits until it returns with an exit code. Typically 0 means success.") + + (CL:WITH-OPEN-STREAM (PS (CREATE-PROCESS-STREAM CMD)) + (BIND CODE WHILE (EQ T (SETQ CODE (OR (SUBRCALL UNIX-HANDLECOMM 7 (fetch (STREAM F1) + of PS)) + 0))) DO (BLOCK) FINALLY (RETURN CODE]) + +(SLASHIT + [LAMBDA (X LCASEDIRS NOHOST) (* ; "Edited 23-Sep-2023 15:27 by rmk") + + (* ;; "It would also be nice to use the generic unpackfilename/packfilename tools. But packfilename sticks in brackets again, and sticks a dot on when removing the version.") + + (* ;; "Perhaps this should be a per file-device operation that maps device names into the local file system.") + + (* ;; "This is a first approximation to a utility that converts a filename X on a host whose files physically reside in the local Unix file system into the strings that shell commands can use to reference that file. For now, this just involves replacing directory brackets with /, removing the host, and perhaps lower-casing the directory. It probably should be extended to deal with version number translation, for now it just keeps the ; version. ") + + (LET [LASTDIRPOS SLASHED (DIRPOS (ADD1 (OR (STRPOS "}" X) + 0] + [SETQ SLASHED (CONCATCODES (FOR I C FROM DIRPOS WHILE (SETQ C (NTHCHARCODE X I)) + COLLECT (SELCHARQ C + ((< >) + (SETQ LASTDIRPOS I) + (CHARCODE /)) + (/ (SETQ LASTDIRPOS I) + C) + C] + (CL:WHEN (AND LCASEDIRS LASTDIRPOS) + (SETQ LASTDIRPOS (ADD1 (IDIFFERENCE LASTDIRPOS DIRPOS))) + (SETQ SLASHED (CONCAT (L-CASE (SUBSTRING SLASHED 1 LASTDIRPOS)) + (OR (SUBSTRING SLASHED (ADD1 LASTDIRPOS)) + "")))) + (CL:IF (OR (EQ DIRPOS 1) + NOHOST) + SLASHED + (CONCAT (SUBSTRING X 1 (SUB1 DIRPOS)) + SLASHED))]) + +(UNIX-FILE-NAME + [LAMBDA (FILE ACCESS COPY) (* ; "Edited 1-Oct-2023 20:52 by rmk") + + (* ;; "Tries to return the string that would reference FILE in a Unix shell, for the use of PROCESS-COMMAND and ShellCommand. If VERSION is 1, it assumes that the Unix file is doesn't have the Medley version convention. If FILE does not have a corresponding Unix name, COPY is non-NIL, and ACCESS is INPUT, FILE will be copied to a unix tmp file (with COPY in its name) and that name will be returned.") + + (CL:WHEN (\GETSTREAM FILE ACCESS T) + (SETQ FILE (OR (FULLNAME FILE) + FILE))) (* ; "Might catch NODIRCORE") + (CL:WHEN FILE + (SETQ FILE (TRUEFILENAME FILE)) + (CL:UNLESS (STREAMP FILE) + [SETQ FILE (\GETFILENAME FILE (SELECTQ ACCESS + (OUTPUT 'NEW) + (INPUT 'OLD) + (NIL (SETQ ACCESS 'INPUT) + 'OLD) + (\ILLEGAL.ARG ACCESS]) + [SELECTQ (FILENAMEFIELD FILE 'HOST) + (UNIX [SUBSTRING FILE (ADD1 (CONSTANT (NCHARS "{UNIX}"]) + (DSK (LET [(VERSION (FILENAMEFIELD FILE 'VERSION] + (SETQ FILE (SLASHIT (PACKFILENAME 'HOST NIL 'VERSION NIL 'BODY FILE))) + (CL:IF (AND VERSION (IGREATERP VERSION 1)) + (CONCAT FILE (CL:IF (FILENAMEFIELD FILE 'EXTENSION) + "." + "") + "~" VERSION "~") + FILE))) + (CL:WHEN (AND COPY (EQ ACCESS 'INPUT) + FILE) + (RESETLST + (CL:WHEN (\GETSTREAM FILE 'INPUT T) (* ; "Hope is randaccess") + [RESETSAVE (GETFILEPTR FILE) + `(PROGN (SETFILEPTR ,FILE OLDVALUE]) + (COPYFILE FILE (CONCAT "{UNIX}/tmp/medley-" (L-CASE COPY) + "-" + (IDATE) + "-" + (RAND) + (CL:IF (FILENAMEFIELD FILE 'EXTENSION) + (CONCAT "." (FILENAMEFIELD FILE 'EXTENSION)) + "")))))])]) ) + +(PUTPROPS UNIXUTILS FILETYPE CL:COMPILE-FILE) (DECLARE%: DONTCOPY - (FILEMAP (NIL (764 1137 (ShellCommand 764 . 1137)) (1139 1538 (ShellWhich 1139 . 1538)) (1539 5068 ( -ShellBrowser 1549 . 4072) (ShellBrowse 4074 . 5066))))) + (FILEMAP (NIL (1144 1517 (ShellCommand 1144 . 1517)) (1519 1916 (ShellWhich 1519 . 1916)) (1917 14618 +(ShellBrowser 1927 . 3675) (ShellBrowse 3677 . 4362) (ShellOpener 4364 . 6052) (ShellOpen 6054 . 9357) + (PROCESS-COMMAND 9359 . 9972) (SLASHIT 9974 . 12016) (UNIX-FILE-NAME 12018 . 14616))))) STOP diff --git a/library/UNIXUTILS.DFASL b/library/UNIXUTILS.DFASL index a54d1561..8cfdae7d 100644 Binary files a/library/UNIXUTILS.DFASL and b/library/UNIXUTILS.DFASL differ diff --git a/library/VIRTUALKEYBOARDS.LCOM b/library/VIRTUALKEYBOARDS.LCOM deleted file mode 100644 index 3e108720..00000000 Binary files a/library/VIRTUALKEYBOARDS.LCOM and /dev/null differ diff --git a/library/tedit/TEDIT-WINDOW b/library/tedit/TEDIT-WINDOW index 5fb985f9..062703fa 100644 --- a/library/tedit/TEDIT-WINDOW +++ b/library/tedit/TEDIT-WINDOW @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "14-Jul-2022 16:55:53"  -{DSK}kaplan>local>medley3.5>working-medley>library>tedit>TEDIT-WINDOW.;1 180402 +(FILECREATED "20-Oct-2023 21:46:58" {MEDLEY}tedit>TEDIT-WINDOW.;7 180689 - :PREVIOUS-DATE "14-Jul-2022 11:08:01" -{DSK}kaplan>local>medley3.5>working-medley>library>newtedit>TEDIT-WINDOW.;2) + :EDIT-BY rmk + + :CHANGES-TO (FNS TEDIT.DEACTIVATE.WINDOW) + + :PREVIOUS-DATE "14-Jul-2022 16:55:53" {MEDLEY}tedit>TEDIT-WINDOW.;5) (PRETTYCOMPRINT TEDIT-WINDOWCOMS) @@ -1631,113 +1633,114 @@ (DEFINEQ (TEDIT.DEACTIVATE.WINDOW - [LAMBDA (W FORCEFLG DISCONNECTONLYFLG) (* ; "Edited 16-Oct-2021 18:51 by rmk:") + [LAMBDA (W FORCEFLG DISCONNECTONLYFLG) (* ; "Edited 20-Oct-2023 21:46 by rmk") + (* ; "Edited 16-Oct-2021 18:51 by rmk:") (* ;; "Deactivate the various button fns for this window") (PROG [(TEXTOBJ (WINDOWPROP W 'TEXTOBJ] (* ;  "Can't be a call to TEXTOBJ, since window may NOT have a textobj on it.") - (replace (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ with T) - [COND - ((AND TEXTOBJ (fetch (TEXTOBJ EDITOPACTIVE) of TEXTOBJ)) - - (* ;; "If something is going on, DON'T CLOSE THE WINDOW") - - (TEDIT.PROMPTPRINT TEXTOBJ "Not closed; edit operation in progress" T) - (RETURN 'DON'T)) - ((AND TEXTOBJ (PROCESSP (WINDOWPROP W 'PROCESS)) - (NOT (fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ)) - (NOT (fetch (TEXTOBJ TXTREADONLY) of TEXTOBJ)) - (NOT FORCEFLG)) (* ; - "This is an un-quit TEdit window. Try to QUIT out of TEdit.") - (COND - ((\TEDIT.QUIT W T)) - (T - (* ;; "Always return DON'T: If we didn't quit, we don't want to close the window; if we did quit, the window is closed already, and will be reopened to reclose it.") - - (RETURN 'DON'T] - (COND - ([AND TEXTOBJ (OR FORCEFLG (fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ) - (fetch (TEXTOBJ TXTREADONLY) of TEXTOBJ) - (NOT (PROCESSP (WINDOWPROP W 'PROCESS] - (* ; - "Only do this if it's a TEdit window, and has been QUIT out of.") + (CL:WHEN TEXTOBJ + (replace (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ with T) [COND - ((AND (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ) - (OPENWP (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ))) - (CLEARW (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ] - (\SHOWSEL (fetch (TEXTOBJ SEL) of TEXTOBJ) - NIL NIL) (* ; - "Before the window is closed, make SURE that the caret is down, or the window will reappear.") + ((fetch (TEXTOBJ EDITOPACTIVE) of TEXTOBJ) + + (* ;; "If something is going on, DON'T CLOSE THE WINDOW") + + (TEDIT.PROMPTPRINT TEXTOBJ "Not closed; edit operation in progress" T) + (RETURN 'DON'T)) + ((AND (PROCESSP (WINDOWPROP W 'PROCESS)) + (NOT (fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ)) + (NOT (fetch (TEXTOBJ TXTREADONLY) of TEXTOBJ)) + (NOT FORCEFLG)) (* ; + "This is an un-quit TEdit window. Try to QUIT out of TEdit.") + (COND + ((\TEDIT.QUIT W T)) + (T + (* ;; "Always return DON'T: If we didn't quit, we don't want to close the window; if we did quit, the window is closed already, and will be reopened to reclose it.") + + (RETURN 'DON'T] (COND - ((AND (\TEDIT.WINDOW.TITLE TEXTOBJ) - (OPENWP (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ)) - (OPENWP W) - (EQ W (CAR (fetch (TEXTOBJ \WINDOW) of TEXTOBJ))) - (NOT DISCONNECTONLYFLG)) - (\TEDIT.WINDOW.TITLE TEXTOBJ "Edit Window [Inactive]") + ([OR FORCEFLG (fetch (TEXTOBJ EDITFINISHEDFLG) of TEXTOBJ) + (fetch (TEXTOBJ TXTREADONLY) of TEXTOBJ) + (NOT (PROCESSP (WINDOWPROP W 'PROCESS] (* ; + "Only do this if it's a TEdit window, and has been QUIT out of.") + [COND + ((AND (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ) + (OPENWP (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ))) + (CLEARW (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ] + (\SHOWSEL (fetch (TEXTOBJ SEL) of TEXTOBJ) + NIL NIL) (* ; + "Before the window is closed, make SURE that the caret is down, or the window will reappear.") + (COND + ((AND (\TEDIT.WINDOW.TITLE TEXTOBJ) + (OPENWP (fetch (TEXTOBJ PROMPTWINDOW) of TEXTOBJ)) + (OPENWP W) + (EQ W (CAR (fetch (TEXTOBJ \WINDOW) of TEXTOBJ))) + (NOT DISCONNECTONLYFLG)) + (\TEDIT.WINDOW.TITLE TEXTOBJ "Edit Window [Inactive]") (* ;  "Reset the window's title to a known 'inactive' value") - )) - [COND - ((NOT DISCONNECTONLYFLG) - (for PANE in (REVERSE (CDR (fetch (TEXTOBJ \WINDOW) of TEXTOBJ))) - do - (* ;; "Run thru any split-off sub-panes, and reattach them, so we get a whole window back before the end of the world.") + )) + [COND + ((NOT DISCONNECTONLYFLG) + (for PANE in (REVERSE (CDR (fetch (TEXTOBJ \WINDOW) of TEXTOBJ))) + do + (* ;; "Run thru any split-off sub-panes, and reattach them, so we get a whole window back before the end of the world.") - (\TEDIT.UNSPLITW PANE)) - (replace (TEXTOBJ \WINDOW) of TEXTOBJ with NIL) - (COND - ((type? STREAM (fetch (TEXTOBJ TXTFILE) of TEXTOBJ)) + (\TEDIT.UNSPLITW PANE)) + (replace (TEXTOBJ \WINDOW) of TEXTOBJ with NIL) + (COND + ((type? STREAM (fetch (TEXTOBJ TXTFILE) of TEXTOBJ)) (* ;  "Close the file that this window was open on.") - (COND - ((NOT (WINDOWPROP W 'TEDIT-CLOSING-FILE T)) - (CLOSEF? (fetch (TEXTOBJ TXTFILE) of TEXTOBJ)) - (WINDOWPROP W 'TEDIT-CLOSING-FILE NIL] - (WINDOWPROP W 'TEXTOBJ NIL) (* ; + (COND + ((NOT (WINDOWPROP W 'TEDIT-CLOSING-FILE T)) + (CLOSEF? (fetch (TEXTOBJ TXTFILE) of TEXTOBJ)) + (WINDOWPROP W 'TEDIT-CLOSING-FILE NIL] + (WINDOWPROP W 'TEXTOBJ NIL) (* ;  "Detach the edit data structures from the window") - (WINDOWPROP W 'TEXTSTREAM NIL) - (WINDOWPROP W 'LINES NIL) - (WINDOWPROP W 'THISLINE NIL) - (WINDOWPROP W 'PROCESS.EXITFN NIL) - (WINDOWPROP W 'PROCESS.IDLEFN NIL) - (WINDOWPROP W 'CURSOROUTFN NIL) - (WINDOWPROP W 'CURSORMOVEDFN NIL) - (WINDOWPROP W 'BUTTONEVENTFN 'TOTOPW) (* ; "And the button functions") - (WINDOWPROP W 'RIGHTBUTTONFN 'DOWINDOWCOM) - (WINDOWDELPROP W 'CLOSEFN 'TEDIT.DEACTIVATE.WINDOW) - (WINDOWPROP W 'SCROLLFN NIL) - (WINDOWDELPROP W 'RESHAPEFN '\EDITRESHAPEFN) - (AND (NOT DISCONNECTONLYFLG) - (WINDOWPROP W 'PROCESS) - (\TEDIT.INTERRUPT.SETUP (WINDOWPROP W 'PROCESS) - T)) (* ; + (WINDOWPROP W 'TEXTSTREAM NIL) + (WINDOWPROP W 'LINES NIL) + (WINDOWPROP W 'THISLINE NIL) + (WINDOWPROP W 'PROCESS.EXITFN NIL) + (WINDOWPROP W 'PROCESS.IDLEFN NIL) + (WINDOWPROP W 'CURSOROUTFN NIL) + (WINDOWPROP W 'CURSORMOVEDFN NIL) + (WINDOWPROP W 'BUTTONEVENTFN 'TOTOPW) (* ; "And the button functions") + (WINDOWPROP W 'RIGHTBUTTONFN 'DOWINDOWCOM) + (WINDOWDELPROP W 'CLOSEFN 'TEDIT.DEACTIVATE.WINDOW) + (WINDOWPROP W 'SCROLLFN NIL) + (WINDOWDELPROP W 'RESHAPEFN '\EDITRESHAPEFN) + (AND (NOT DISCONNECTONLYFLG) + (WINDOWPROP W 'PROCESS) + (\TEDIT.INTERRUPT.SETUP (WINDOWPROP W 'PROCESS) + T)) (* ;  "Make sure any disarmed interrupts are restored.") - (for MENUW in (ATTACHEDWINDOWS W) when (AND (WINDOWPROP MENUW 'TEDITMENU) - (WINDOWPROP MENUW 'TEXTOBJ)) - do (* ; + (for MENUW in (ATTACHEDWINDOWS W) when (AND (WINDOWPROP MENUW 'TEDITMENU) + (WINDOWPROP MENUW 'TEXTOBJ)) + do (* ;  "Detach all the TEDITMENU windows that belong to this window.") - (replace (TEXTOBJ EDITFINISHEDFLG) of (TEXTOBJ MENUW) with T) + (replace (TEXTOBJ EDITFINISHEDFLG) of (TEXTOBJ MENUW) with T) (* ; "Mark it finished") - (WINDOWPROP MENUW 'TEDITMENU NIL) (* ; + (WINDOWPROP MENUW 'TEDITMENU NIL) (* ;  "And mark it no longer a menu window") - (GIVE.TTY.PROCESS MENUW) (* ; + (GIVE.TTY.PROCESS MENUW) (* ;  "Then give it a chance to kill itself off") - (DISMISS 300)) - (COND - ((NOT DISCONNECTONLYFLG) - (GIVE.TTY.PROCESS W) - (DISMISS 300))) - [replace (TEXTOBJ \WINDOW) of TEXTOBJ with (COND - ((LISTP (fetch (TEXTOBJ \WINDOW) - of TEXTOBJ)) + (DISMISS 300)) + (COND + ((NOT DISCONNECTONLYFLG) + (GIVE.TTY.PROCESS W) + (DISMISS 300))) + [replace (TEXTOBJ \WINDOW) of TEXTOBJ with (COND + ((LISTP (fetch (TEXTOBJ \WINDOW) + of TEXTOBJ)) (* ; "It's a list; remove this window") - (DREMOVE W (fetch (TEXTOBJ \WINDOW) - of TEXTOBJ] + (DREMOVE W (fetch (TEXTOBJ \WINDOW) + of TEXTOBJ] (* ;  "Disconnect the window from the edit data structures as well.") - ]) + )))]) (\TEDIT.REPAINTFN [LAMBDA (W) (* ; "Edited 30-May-91 23:34 by jds") @@ -2726,25 +2729,25 @@ (RPAQ? TEDIT.TITLED.ICON.TEMPLATE (CONS TEDITICON (CONS TEDITMASK (CONS TEDIT.ICON.TITLE.REGION NIL)) )) (DECLARE%: DONTCOPY - (FILEMAP (NIL (7116 90052 (TEDIT.CREATEW 7126 . 9899) (\TEDIT.CREATEW.FROM.REGION 9901 . 10881) ( -TEDIT.CURSORMOVEDFN 10883 . 20782) (TEDIT.CURSOROUTFN 20784 . 21327) (TEDIT.WINDOW.SETUP 21329 . 23154 -) (TEDIT.MINIMAL.WINDOW.SETUP 23156 . 30934) (\TEDIT.ACTIVE.WINDOWP 30936 . 31929) ( -\TEDIT.BUTTONEVENTFN 31931 . 55639) (\TEDIT.WINDOW.OPS 55641 . 58853) (\TEDIT.EXPANDFN 58855 . 59418) -(\TEDIT.MAINW 59420 . 60717) (\TEDIT.PRIMARYW 60719 . 61880) (\TEDIT.COPYINSERTFN 61882 . 62678) ( -\TEDIT.NEWREGIONFN 62680 . 65196) (\TEDIT.SET.WINDOW.EXTENT 65198 . 70741) (\TEDIT.SHRINK.ICONCREATE -70743 . 72944) (\TEDIT.SHRINKFN 72946 . 73505) (\TEDIT.SPLITW 73507 . 78972) (\TEDIT.UNSPLITW 78974 . -83830) (\TEDIT.WINDOW.SETUP 83832 . 89655) (\SAFE.FIRST 89657 . 90050)) (91382 92293 (TEDITWINDOWP -91392 . 92291)) (92330 95120 (TEDIT.GETINPUT 92340 . 94400) (\TEDIT.MAKEFILENAME 94402 . 95118)) ( -95169 101597 (TEDIT.PROMPTPRINT 95179 . 98114) (TEDIT.PROMPTFLASH 98116 . 100025) ( -\TEDIT.PROMPT.PAGEFULLFN 100027 . 101595)) (101832 105804 (TEXTSTREAM.TITLE 101842 . 102467) ( -\TEDIT.ORIGINAL.WINDOW.TITLE 102469 . 104391) (\TEDIT.WINDOW.TITLE 104393 . 105047) ( -\TEXTSTREAM.FILENAME 105049 . 105802)) (105847 147324 (TEDIT.DEACTIVATE.WINDOW 105857 . 112821) ( -\TEDIT.REPAINTFN 112823 . 115671) (\TEDIT.RESHAPEFN 115673 . 120517) (\TEDIT.SCROLLFN 120519 . 147322) -) (147366 149497 (\TEDIT.PROCIDLEFN 147376 . 148671) (\TEDIT.PROCENTRYFN 148673 . 149118) ( -\TEDIT.PROCEXITFN 149120 . 149495)) (149576 160542 (\EDIT.DOWNCARET 149586 . 150255) (\EDIT.FLIPCARET -150257 . 151776) (TEDIT.FLASHCARET 151778 . 153059) (\EDIT.UPCARET 153061 . 153486) ( -TEDIT.NORMALIZECARET 153488 . 159185) (\SETCARET 159187 . 160115) (\TEDIT.CARET 160117 . 160540)) ( -160576 174370 (TEDIT.ADD.MENUITEM 160586 . 162877) (TEDIT.DEFAULT.MENUFN 162879 . 171849) ( -TEDIT.REMOVE.MENUITEM 171851 . 172848) (\TEDIT.CREATEMENU 172850 . 173287) (\TEDIT.MENU.WHENHELDFN -173289 . 174055) (\TEDIT.MENU.WHENSELECTEDFN 174057 . 174368))))) + (FILEMAP (NIL (7098 90034 (TEDIT.CREATEW 7108 . 9881) (\TEDIT.CREATEW.FROM.REGION 9883 . 10863) ( +TEDIT.CURSORMOVEDFN 10865 . 20764) (TEDIT.CURSOROUTFN 20766 . 21309) (TEDIT.WINDOW.SETUP 21311 . 23136 +) (TEDIT.MINIMAL.WINDOW.SETUP 23138 . 30916) (\TEDIT.ACTIVE.WINDOWP 30918 . 31911) ( +\TEDIT.BUTTONEVENTFN 31913 . 55621) (\TEDIT.WINDOW.OPS 55623 . 58835) (\TEDIT.EXPANDFN 58837 . 59400) +(\TEDIT.MAINW 59402 . 60699) (\TEDIT.PRIMARYW 60701 . 61862) (\TEDIT.COPYINSERTFN 61864 . 62660) ( +\TEDIT.NEWREGIONFN 62662 . 65178) (\TEDIT.SET.WINDOW.EXTENT 65180 . 70723) (\TEDIT.SHRINK.ICONCREATE +70725 . 72926) (\TEDIT.SHRINKFN 72928 . 73487) (\TEDIT.SPLITW 73489 . 78954) (\TEDIT.UNSPLITW 78956 . +83812) (\TEDIT.WINDOW.SETUP 83814 . 89637) (\SAFE.FIRST 89639 . 90032)) (91364 92275 (TEDITWINDOWP +91374 . 92273)) (92312 95102 (TEDIT.GETINPUT 92322 . 94382) (\TEDIT.MAKEFILENAME 94384 . 95100)) ( +95151 101579 (TEDIT.PROMPTPRINT 95161 . 98096) (TEDIT.PROMPTFLASH 98098 . 100007) ( +\TEDIT.PROMPT.PAGEFULLFN 100009 . 101577)) (101814 105786 (TEXTSTREAM.TITLE 101824 . 102449) ( +\TEDIT.ORIGINAL.WINDOW.TITLE 102451 . 104373) (\TEDIT.WINDOW.TITLE 104375 . 105029) ( +\TEXTSTREAM.FILENAME 105031 . 105784)) (105829 147611 (TEDIT.DEACTIVATE.WINDOW 105839 . 113108) ( +\TEDIT.REPAINTFN 113110 . 115958) (\TEDIT.RESHAPEFN 115960 . 120804) (\TEDIT.SCROLLFN 120806 . 147609) +) (147653 149784 (\TEDIT.PROCIDLEFN 147663 . 148958) (\TEDIT.PROCENTRYFN 148960 . 149405) ( +\TEDIT.PROCEXITFN 149407 . 149782)) (149863 160829 (\EDIT.DOWNCARET 149873 . 150542) (\EDIT.FLIPCARET +150544 . 152063) (TEDIT.FLASHCARET 152065 . 153346) (\EDIT.UPCARET 153348 . 153773) ( +TEDIT.NORMALIZECARET 153775 . 159472) (\SETCARET 159474 . 160402) (\TEDIT.CARET 160404 . 160827)) ( +160863 174657 (TEDIT.ADD.MENUITEM 160873 . 163164) (TEDIT.DEFAULT.MENUFN 163166 . 172136) ( +TEDIT.REMOVE.MENUITEM 172138 . 173135) (\TEDIT.CREATEMENU 173137 . 173574) (\TEDIT.MENU.WHENHELDFN +173576 . 174342) (\TEDIT.MENU.WHENSELECTEDFN 174344 . 174655))))) STOP diff --git a/library/tedit/TEDIT-WINDOW.LCOM b/library/tedit/TEDIT-WINDOW.LCOM index 4ce1b6a0..192e965a 100644 Binary files a/library/tedit/TEDIT-WINDOW.LCOM and b/library/tedit/TEDIT-WINDOW.LCOM differ diff --git a/library/virtualkeyboards/DANDELIONKEYBOARDS b/library/virtualkeyboards/DANDELIONKEYBOARDS new file mode 100644 index 00000000..e958d19c --- /dev/null +++ b/library/virtualkeyboards/DANDELIONKEYBOARDS @@ -0,0 +1,625 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 6-Jul-2023 08:52:09" {WMEDLEY}virtualkeyboards>DANDELIONKEYBOARDS.;3 33795 + + :EDIT-BY rmk + + :CHANGES-TO (VARS DANDELIONKEYBOARDSCOMS) + + :PREVIOUS-DATE " 4-Jul-2023 23:18:05" {WMEDLEY}virtualkeyboards>DANDELIONKEYBOARDS.;2 +) + + +(PRETTYCOMPRINT DANDELIONKEYBOARDSCOMS) + +(RPAQQ DANDELIONKEYBOARDSCOMS ((ALISTS (VKBD.LOADED-KEYBOARDS DANDELION)))) + +(ADDTOVAR VKBD.LOADED-KEYBOARDS + (DANDELION (EUROPEAN ((100 (53 197 NOLOCKSHIFT)) + (101 (52 196 NOLOCKSHIFT)) + (102 (54 198 NOLOCKSHIFT)) + (103 (61887 61759 LOCKSHIFT)) + (104 (55 199 NOLOCKSHIFT)) + (105 (61888 61760 LOCKSHIFT)) + (106 (61872 61744 LOCKSHIFT)) + (107 (61860 61732 LOCKSHIFT)) + (108 (48 126 NOLOCKSHIFT)) + (109 (61892 61764 LOCKSHIFT)) + (110 (203 207 NOLOCKSHIFT)) + (111 (61919 61791 LOCKSHIFT)) + (112 (47 191 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 195 NOLOCKSHIFT)) + (117 (50 194 NOLOCKSHIFT)) + (118 (61873 61745 LOCKSHIFT)) + (119 (61858 61730 LOCKSHIFT)) + (120 (61874 61746 LOCKSHIFT)) + (121 (61859 61731 LOCKSHIFT)) + (122 (57 202 NOLOCKSHIFT)) + (123 (61886 61758 LOCKSHIFT)) + (124 (61864 61736 LOCKSHIFT)) + (125 (61903 61775 LOCKSHIFT)) + (126 (61908 61780 LOCKSHIFT)) + (127 (241 225 LOCKSHIFT)) + (128 (187 170 LOCKSHIFT)) + (129 (249 233 LOCKSHIFT)) + (132 (49 193 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61905 61777 LOCKSHIFT)) + (137 (61869 61741 LOCKSHIFT)) + (138 (61877 61749 LOCKSHIFT)) + (139 (61906 61778 LOCKSHIFT)) + (140 (251 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (250 234 LOCKSHIFT)) + (143 (59 58 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (171 186 LOCKSHIFT)) + (148 (61904 61776 LOCKSHIFT)) + (149 (61920 61792 LOCKSHIFT)) + (150 (61921 61793 LOCKSHIFT)) + (151 (61857 61729 LOCKSHIFT)) + (152 (61863 61735 LOCKSHIFT)) + (153 (56 200 NOLOCKSHIFT)) + (154 (61900 61772 LOCKSHIFT)) + (155 (239 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (246 230 LOCKSHIFT)) + (159 (207 176 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (logic ((100 (53 37 NOLOCKSHIFT)) + (101 (52 164 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61258 61260 NOLOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (61292 61293 NOLOCKSHIFT)) + (106 (61271 61270 NOLOCKSHIFT)) + (107 (61284 61285 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61307 61306 NOLOCKSHIFT)) + (110 (45 177 NOLOCKSHIFT)) + (111 (61269 61268 LOCKSHIFT)) + (112 (172 174 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61240 61241 NOLOCKSHIFT)) + (119 (61234 61235 NOLOCKSHIFT)) + (120 (61266 61262 NOLOCKSHIFT)) + (121 (61365 61365 NOLOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (61275 61274 NOLOCKSHIFT)) + (124 (61300 61299 NOLOCKSHIFT)) + (125 (61273 61272 NOLOCKSHIFT)) + (126 (61282 61283 NOLOCKSHIFT)) + (127 (61256 61257 NOLOCKSHIFT)) + (128 (61356 61356 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61250 61251 NOLOCKSHIFT)) + (137 (61298 61297 NOLOCKSHIFT)) + (138 (61305 61303 NOLOCKSHIFT)) + (139 (61265 61264 NOLOCKSHIFT)) + (140 (61364 61364 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61281 233 NOLOCKSHIFT)) + (143 (61351 61351 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (61357 61357 NOLOCKSHIFT)) + (148 (61279 61278 NOLOCKSHIFT)) + (149 (61239 61238 NOLOCKSHIFT)) + (150 (61290 61290 NOLOCKSHIFT)) + (151 (61263 61261 NOLOCKSHIFT)) + (152 (61295 61295 NOLOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61252 61253 NOLOCKSHIFT)) + (155 (61254 61255 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (MATH ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61284 61285 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (174 61245 NOLOCKSHIFT)) + (107 (61369 61363 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61254 61255 NOLOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (173 61246 LOCKSHIFT)) + (112 (47 61300 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61282 61283 LOCKSHIFT)) + (119 (61287 61286 NOLOCKSHIFT)) + (120 (61301 61302 NOLOCKSHIFT)) + (121 (61351 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (175 61247 LOCKSHIFT)) + (124 (180 184 LOCKSHIFT)) + (125 (172 61244 LOCKSHIFT)) + (126 (61256 61257 LOCKSHIFT)) + (127 (44 61250 NOLOCKSHIFT)) + (128 (61298 61253 NOLOCKSHIFT)) + (129 (93 61265 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (61356 61362 LOCKSHIFT)) + (138 (61254 61291 NOLOCKSHIFT)) + (139 (98 61360 NOLOCKSHIFT)) + (140 (61309 177 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 61251 NOLOCKSHIFT)) + (143 (61299 61252 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (61358 82 LOCKSHIFT)) + (149 (61296 61266 NOLOCKSHIFT)) + (150 (61305 61303 NOLOCKSHIFT)) + (151 (61308 61267 LOCKSHIFT)) + (152 (61288 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61357 61361 NOLOCKSHIFT)) + (155 (61292 61293 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 61264 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) + (101 (61396 61380 NOLOCKSHIFT)) + (102 (61398 61382 NOLOCKSHIFT)) + (103 (8557 8554 NOLOCKSHIFT)) + (104 (61399 61383 NOLOCKSHIFT)) + (105 (61232 8743 NOLOCKSHIFT)) + (106 (61346 8571 NOLOCKSHIFT)) + (107 (188 86 NOLOCKSHIFT)) + (108 (61402 61386 NOLOCKSHIFT)) + (109 (210 8738 NOLOCKSHIFT)) + (110 (61437 61438 NOLOCKSHIFT)) + (111 (163 8558 NOLOCKSHIFT)) + (112 (61248 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (61395 61379 NOLOCKSHIFT)) + (117 (61394 61378 NOLOCKSHIFT)) + (118 (185 8553 NOLOCKSHIFT)) + (119 (176 8546 NOLOCKSHIFT)) + (120 (167 8744 NOLOCKSHIFT)) + (121 (97 8745 NOLOCKSHIFT)) + (122 (61401 61385 NOLOCKSHIFT)) + (123 (162 8570 NOLOCKSHIFT)) + (124 (61437 88 NOLOCKSHIFT)) + (125 (111 8569 NOLOCKSHIFT)) + (126 (61289 8737 NOLOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (61393 61377 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61233 8742 NOLOCKSHIFT)) + (137 (61438 67 NOLOCKSHIFT)) + (138 (8739 74 NOLOCKSHIFT)) + (139 (190 61436 NOLOCKSHIFT)) + (140 (189 90 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61249 62 NOLOCKSHIFT)) + (143 (61352 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 61280 NOLOCKSHIFT)) + (148 (212 8574 NOLOCKSHIFT)) + (149 (61354 8573 NOLOCKSHIFT)) + (150 (61286 8741 NOLOCKSHIFT)) + (151 (165 8572 NOLOCKSHIFT)) + (152 (61368 8740 NOLOCKSHIFT)) + (153 (61400 61384 NOLOCKSHIFT)) + (154 (173 175 NOLOCKSHIFT)) + (155 (172 174 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61406 61368 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (DVORAK ((100 (49 42 NOLOCKSHIFT)) + (101 (51 41 NOLOCKSHIFT)) + (102 (57 37 NOLOCKSHIFT)) + (103 (46 62 NOLOCKSHIFT)) + (104 (48 38 NOLOCKSHIFT)) + (105 (101 69 LOCKSHIFT)) + (106 (103 71 LOCKSHIFT)) + (107 (107 75 LOCKSHIFT)) + (108 (54 45 NOLOCKSHIFT)) + (109 (116 84 LOCKSHIFT)) + (110 (56 95 NOLOCKSHIFT)) + (111 (108 76 LOCKSHIFT)) + (112 (122 90 LOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (53 40 NOLOCKSHIFT)) + (117 (55 35 NOLOCKSHIFT)) + (118 (44 60 NOLOCKSHIFT)) + (119 (63 47 NOLOCKSHIFT)) + (120 (111 79 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (52 164 NOLOCKSHIFT)) + (123 (99 67 LOCKSHIFT)) + (124 (113 81 LOCKSHIFT)) + (125 (114 82 LOCKSHIFT)) + (126 (110 78 LOCKSHIFT)) + (127 (119 87 LOCKSHIFT)) + (128 (44 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (33 64 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (117 85 LOCKSHIFT)) + (137 (106 74 LOCKSHIFT)) + (138 (104 72 LOCKSHIFT)) + (139 (120 88 LOCKSHIFT)) + (140 (59 58 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (118 86 LOCKSHIFT)) + (143 (115 83 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (169 170 NOLOCKSHIFT)) + (148 (112 80 LOCKSHIFT)) + (149 (121 89 LOCKSHIFT)) + (150 (105 73 LOCKSHIFT)) + (151 (102 70 LOCKSHIFT)) + (152 (100 68 LOCKSHIFT)) + (153 (50 162 NOLOCKSHIFT)) + (154 (98 66 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (GREEK ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (9830 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (9829 9797 LOCKSHIFT)) + (106 (9849 9817 LOCKSHIFT)) + (107 (115 9814 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (9837 9805 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (9843 9811 LOCKSHIFT)) + (112 (47 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (9853 9821 LOCKSHIFT)) + (119 (9835 9803 LOCKSHIFT)) + (120 (9846 9814 LOCKSHIFT)) + (121 (9825 9793 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (9836 9804 LOCKSHIFT)) + (124 (9851 9819 LOCKSHIFT)) + (125 (9842 9810 LOCKSHIFT)) + (126 (9838 9806 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (9850 9818 LOCKSHIFT)) + (137 (9841 9809 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (9826 66 LOCKSHIFT)) + (140 (9833 9801 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (9845 9813 LOCKSHIFT)) + (149 (9848 9816 LOCKSHIFT)) + (150 (9828 9796 LOCKSHIFT)) + (151 (9852 9820 LOCKSHIFT)) + (152 (9834 9802 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (9840 9808 LOCKSHIFT)) + (155 (9839 9807 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (ITALIAN ((100 (53 61903 NOLOCKSHIFT)) + (101 (52 61886 NOLOCKSHIFT)) + (102 (54 61919 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 61872 NOLOCKSHIFT)) + (117 (50 61858 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (39 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 170 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (SPANISH ((100 (53 61904 NOLOCKSHIFT)) + (101 (52 61887 NOLOCKSHIFT)) + (102 (54 61920 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 61873 NOLOCKSHIFT)) + (117 (50 61858 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (59 58 NOLOCKSHIFT)) + (129 (203 187 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (61900 61772 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (161 191 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61925 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (44 171 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (FRENCH ((100 (53 61905 NOLOCKSHIFT)) + (101 (52 61888 NOLOCKSHIFT)) + (102 (54 61921 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 61874 NOLOCKSHIFT)) + (117 (50 61859 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (39 61857 NOLOCKSHIFT)) + (129 (61872 61892 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (61869 61741 LOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61919 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61873 61877 LOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (GERMAN ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (251 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (61863 61735 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61908 61780 LOCKSHIFT)) + (159 (61925 61797 LOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION) + (STANDARD-RUSSIAN ((100 (34 52 NOLOCKSHIFT)) + (101 (47 51 NOLOCKSHIFT)) + (102 (58 53 NOLOCKSHIFT)) + (103 (10085 10037 LOCKSHIFT)) + (104 (44 54 NOLOCKSHIFT)) + (105 (10067 10019 LOCKSHIFT)) + (106 (10068 10020 LOCKSHIFT)) + (107 (10078 10030 LOCKSHIFT)) + (108 (63 57 NOLOCKSHIFT)) + (109 (10077 10029 LOCKSHIFT)) + (110 (37 48 NOLOCKSHIFT)) + (111 (10073 10025 LOCKSHIFT)) + (112 (10071 10023 LOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (45 50 NOLOCKSHIFT)) + (117 (61352 49 NOLOCKSHIFT)) + (118 (10088 10040 LOCKSHIFT)) + (119 (10075 10027 LOCKSHIFT)) + (120 (10093 10045 LOCKSHIFT)) + (121 (10086 10038 LOCKSHIFT)) + (122 (95 56 NOLOCKSHIFT)) + (123 (10090 10042 LOCKSHIFT)) + (124 (10089 10041 LOCKSHIFT)) + (125 (10091 10043 LOCKSHIFT)) + (126 (10069 10021 LOCKSHIFT)) + (127 (10066 10018 LOCKSHIFT)) + (128 (10095 10047 LOCKSHIFT)) + (129 (10092 10044 LOCKSHIFT)) + (132 (167 43 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (10065 10017 LOCKSHIFT)) + (137 (10083 10035 LOCKSHIFT)) + (138 (10080 10032 LOCKSHIFT)) + (139 (10074 10026 LOCKSHIFT)) + (140 (10097 10049 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (10096 10048 LOCKSHIFT)) + (143 (10072 10024 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (41 40 NOLOCKSHIFT)) + (148 (10076 10028 LOCKSHIFT)) + (149 (10070 10022 LOCKSHIFT)) + (150 (10081 10033 LOCKSHIFT)) + (151 (10079 10031 LOCKSHIFT)) + (152 (10082 10034 LOCKSHIFT)) + (153 (46 55 NOLOCKSHIFT)) + (154 (10084 10036 LOCKSHIFT)) + (155 (10094 10046 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (10087 10039 LOCKSHIFT)) + (159 (33 61 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DANDELION))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL))) +STOP diff --git a/library/virtualkeyboards/DORADOKEYBOARDS b/library/virtualkeyboards/DORADOKEYBOARDS new file mode 100644 index 00000000..565c4bec --- /dev/null +++ b/library/virtualkeyboards/DORADOKEYBOARDS @@ -0,0 +1,624 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 6-Jul-2023 08:52:15" {WMEDLEY}virtualkeyboards>DORADOKEYBOARDS.;4 33578 + + :EDIT-BY rmk + + :CHANGES-TO (VARS DORADOKEYBOARDSCOMS) + + :PREVIOUS-DATE " 4-Jul-2023 23:15:23" {WMEDLEY}virtualkeyboards>DORADOKEYBOARDS.;2) + + +(PRETTYCOMPRINT DORADOKEYBOARDSCOMS) + +(RPAQQ DORADOKEYBOARDSCOMS ((ALISTS (VKBD.LOADED-KEYBOARDS DORADO)))) + +(ADDTOVAR VKBD.LOADED-KEYBOARDS + (DORADO (EUROPEAN ((100 (53 197 NOLOCKSHIFT)) + (101 (52 196 NOLOCKSHIFT)) + (102 (54 198 NOLOCKSHIFT)) + (103 (61887 61759 LOCKSHIFT)) + (104 (55 199 NOLOCKSHIFT)) + (105 (61888 61760 LOCKSHIFT)) + (106 (61872 61744 LOCKSHIFT)) + (107 (61860 61732 LOCKSHIFT)) + (108 (48 126 NOLOCKSHIFT)) + (109 (61892 61764 LOCKSHIFT)) + (110 (203 207 NOLOCKSHIFT)) + (111 (61919 61791 LOCKSHIFT)) + (112 (47 191 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 195 NOLOCKSHIFT)) + (117 (50 194 NOLOCKSHIFT)) + (118 (61873 61745 LOCKSHIFT)) + (119 (61858 61730 LOCKSHIFT)) + (120 (61874 61746 LOCKSHIFT)) + (121 (61859 61731 LOCKSHIFT)) + (122 (57 202 NOLOCKSHIFT)) + (123 (61886 61758 LOCKSHIFT)) + (124 (61864 61736 LOCKSHIFT)) + (125 (61903 61775 LOCKSHIFT)) + (126 (61908 61780 LOCKSHIFT)) + (127 (241 225 LOCKSHIFT)) + (128 (187 170 LOCKSHIFT)) + (129 (249 233 LOCKSHIFT)) + (132 (49 193 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61905 61777 LOCKSHIFT)) + (137 (61869 61741 LOCKSHIFT)) + (138 (61877 61749 LOCKSHIFT)) + (139 (61906 61778 LOCKSHIFT)) + (140 (251 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (250 234 LOCKSHIFT)) + (143 (59 58 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (171 186 LOCKSHIFT)) + (148 (61904 61776 LOCKSHIFT)) + (149 (61920 61792 LOCKSHIFT)) + (150 (61921 61793 LOCKSHIFT)) + (151 (61857 61729 LOCKSHIFT)) + (152 (61863 61735 LOCKSHIFT)) + (153 (56 200 NOLOCKSHIFT)) + (154 (61900 61772 LOCKSHIFT)) + (155 (239 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (246 230 LOCKSHIFT)) + (159 (207 176 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (logic ((100 (53 37 NOLOCKSHIFT)) + (101 (52 164 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61258 61260 NOLOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (61292 61293 NOLOCKSHIFT)) + (106 (61271 61270 NOLOCKSHIFT)) + (107 (61284 61285 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61307 61306 NOLOCKSHIFT)) + (110 (45 177 NOLOCKSHIFT)) + (111 (61269 61268 LOCKSHIFT)) + (112 (172 174 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61240 61241 NOLOCKSHIFT)) + (119 (61234 61235 NOLOCKSHIFT)) + (120 (61266 61262 NOLOCKSHIFT)) + (121 (61365 61365 NOLOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (61275 61274 NOLOCKSHIFT)) + (124 (61300 61299 NOLOCKSHIFT)) + (125 (61273 61272 NOLOCKSHIFT)) + (126 (61282 61283 NOLOCKSHIFT)) + (127 (61256 61257 NOLOCKSHIFT)) + (128 (61356 61356 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61250 61251 NOLOCKSHIFT)) + (137 (61298 61297 NOLOCKSHIFT)) + (138 (61305 61303 NOLOCKSHIFT)) + (139 (61265 61264 NOLOCKSHIFT)) + (140 (61364 61364 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61281 233 NOLOCKSHIFT)) + (143 (61351 61351 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (61357 61357 NOLOCKSHIFT)) + (148 (61279 61278 NOLOCKSHIFT)) + (149 (61239 61238 NOLOCKSHIFT)) + (150 (61290 61290 NOLOCKSHIFT)) + (151 (61263 61261 NOLOCKSHIFT)) + (152 (61295 61295 NOLOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61252 61253 NOLOCKSHIFT)) + (155 (61254 61255 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (MATH ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61284 61285 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (174 61245 NOLOCKSHIFT)) + (107 (61369 61363 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61254 61255 NOLOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (173 61246 LOCKSHIFT)) + (112 (47 61300 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61282 61283 LOCKSHIFT)) + (119 (61287 61286 NOLOCKSHIFT)) + (120 (61301 61302 NOLOCKSHIFT)) + (121 (61351 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (175 61247 LOCKSHIFT)) + (124 (180 184 LOCKSHIFT)) + (125 (172 61244 LOCKSHIFT)) + (126 (61256 61257 LOCKSHIFT)) + (127 (44 61250 NOLOCKSHIFT)) + (128 (61298 61253 NOLOCKSHIFT)) + (129 (93 61265 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (61356 61362 LOCKSHIFT)) + (138 (61254 61291 NOLOCKSHIFT)) + (139 (98 61360 NOLOCKSHIFT)) + (140 (61309 177 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 61251 NOLOCKSHIFT)) + (143 (61299 61252 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (61358 82 LOCKSHIFT)) + (149 (61296 61266 NOLOCKSHIFT)) + (150 (61305 61303 NOLOCKSHIFT)) + (151 (61308 61267 LOCKSHIFT)) + (152 (61288 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61357 61361 NOLOCKSHIFT)) + (155 (61292 61293 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 61264 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) + (101 (61396 61380 NOLOCKSHIFT)) + (102 (61398 61382 NOLOCKSHIFT)) + (103 (8557 8554 NOLOCKSHIFT)) + (104 (61399 61383 NOLOCKSHIFT)) + (105 (61232 8743 NOLOCKSHIFT)) + (106 (61346 8571 NOLOCKSHIFT)) + (107 (188 86 NOLOCKSHIFT)) + (108 (61402 61386 NOLOCKSHIFT)) + (109 (210 8738 NOLOCKSHIFT)) + (110 (61437 61438 NOLOCKSHIFT)) + (111 (163 8558 NOLOCKSHIFT)) + (112 (61248 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (61395 61379 NOLOCKSHIFT)) + (117 (61394 61378 NOLOCKSHIFT)) + (118 (185 8553 NOLOCKSHIFT)) + (119 (176 8546 NOLOCKSHIFT)) + (120 (167 8744 NOLOCKSHIFT)) + (121 (97 8745 NOLOCKSHIFT)) + (122 (61401 61385 NOLOCKSHIFT)) + (123 (162 8570 NOLOCKSHIFT)) + (124 (61437 88 NOLOCKSHIFT)) + (125 (111 8569 NOLOCKSHIFT)) + (126 (61289 8737 NOLOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (61393 61377 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61233 8742 NOLOCKSHIFT)) + (137 (61438 67 NOLOCKSHIFT)) + (138 (8739 74 NOLOCKSHIFT)) + (139 (190 61436 NOLOCKSHIFT)) + (140 (189 90 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61249 62 NOLOCKSHIFT)) + (143 (61352 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 61280 NOLOCKSHIFT)) + (148 (212 8574 NOLOCKSHIFT)) + (149 (61354 8573 NOLOCKSHIFT)) + (150 (61286 8741 NOLOCKSHIFT)) + (151 (165 8572 NOLOCKSHIFT)) + (152 (61368 8740 NOLOCKSHIFT)) + (153 (61400 61384 NOLOCKSHIFT)) + (154 (173 175 NOLOCKSHIFT)) + (155 (172 174 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61406 61368 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (DVORAK ((100 (49 42 NOLOCKSHIFT)) + (101 (51 41 NOLOCKSHIFT)) + (102 (57 37 NOLOCKSHIFT)) + (103 (46 62 NOLOCKSHIFT)) + (104 (48 38 NOLOCKSHIFT)) + (105 (101 69 LOCKSHIFT)) + (106 (103 71 LOCKSHIFT)) + (107 (107 75 LOCKSHIFT)) + (108 (54 45 NOLOCKSHIFT)) + (109 (116 84 LOCKSHIFT)) + (110 (56 95 NOLOCKSHIFT)) + (111 (108 76 LOCKSHIFT)) + (112 (122 90 LOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (53 40 NOLOCKSHIFT)) + (117 (55 35 NOLOCKSHIFT)) + (118 (44 60 NOLOCKSHIFT)) + (119 (63 47 NOLOCKSHIFT)) + (120 (111 79 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (52 164 NOLOCKSHIFT)) + (123 (99 67 LOCKSHIFT)) + (124 (113 81 LOCKSHIFT)) + (125 (114 82 LOCKSHIFT)) + (126 (110 78 LOCKSHIFT)) + (127 (119 87 LOCKSHIFT)) + (128 (44 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (33 64 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (117 85 LOCKSHIFT)) + (137 (106 74 LOCKSHIFT)) + (138 (104 72 LOCKSHIFT)) + (139 (120 88 LOCKSHIFT)) + (140 (59 58 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (118 86 LOCKSHIFT)) + (143 (115 83 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (169 170 NOLOCKSHIFT)) + (148 (112 80 LOCKSHIFT)) + (149 (121 89 LOCKSHIFT)) + (150 (105 73 LOCKSHIFT)) + (151 (102 70 LOCKSHIFT)) + (152 (100 68 LOCKSHIFT)) + (153 (50 162 NOLOCKSHIFT)) + (154 (98 66 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (GREEK ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (9830 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (9829 9797 LOCKSHIFT)) + (106 (9849 9817 LOCKSHIFT)) + (107 (115 9814 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (9837 9805 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (9843 9811 LOCKSHIFT)) + (112 (47 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (9853 9821 LOCKSHIFT)) + (119 (9835 9803 LOCKSHIFT)) + (120 (9846 9814 LOCKSHIFT)) + (121 (9825 9793 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (9836 9804 LOCKSHIFT)) + (124 (9851 9819 LOCKSHIFT)) + (125 (9842 9810 LOCKSHIFT)) + (126 (9838 9806 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (9850 9818 LOCKSHIFT)) + (137 (9841 9809 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (9826 66 LOCKSHIFT)) + (140 (9833 9801 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (9845 9813 LOCKSHIFT)) + (149 (9848 9816 LOCKSHIFT)) + (150 (9828 9796 LOCKSHIFT)) + (151 (9852 9820 LOCKSHIFT)) + (152 (9834 9802 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (9840 9808 LOCKSHIFT)) + (155 (9839 9807 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (ITALIAN ((100 (53 61903 NOLOCKSHIFT)) + (101 (52 61886 NOLOCKSHIFT)) + (102 (54 61919 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 61872 NOLOCKSHIFT)) + (117 (50 61858 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (39 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 170 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (SPANISH ((100 (53 61904 NOLOCKSHIFT)) + (101 (52 61887 NOLOCKSHIFT)) + (102 (54 61920 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 61873 NOLOCKSHIFT)) + (117 (50 61858 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (59 58 NOLOCKSHIFT)) + (129 (203 187 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (61900 61772 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (161 191 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61925 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (44 171 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (FRENCH ((100 (53 61905 NOLOCKSHIFT)) + (101 (52 61888 NOLOCKSHIFT)) + (102 (54 61921 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (204 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 61874 NOLOCKSHIFT)) + (117 (50 61859 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (128 (39 61857 NOLOCKSHIFT)) + (129 (61872 61892 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (61869 61741 LOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61919 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61873 61877 LOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (GERMAN ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (251 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (128 (39 34 NOLOCKSHIFT)) + (129 (61863 61735 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (95 94 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61908 61780 LOCKSHIFT)) + (159 (61925 61797 LOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO) + (STANDARD-RUSSIAN ((100 (34 52 NOLOCKSHIFT)) + (101 (47 51 NOLOCKSHIFT)) + (102 (58 53 NOLOCKSHIFT)) + (103 (10085 10037 LOCKSHIFT)) + (104 (44 54 NOLOCKSHIFT)) + (105 (10067 10019 LOCKSHIFT)) + (106 (10068 10020 LOCKSHIFT)) + (107 (10078 10030 LOCKSHIFT)) + (108 (63 57 NOLOCKSHIFT)) + (109 (10077 10029 LOCKSHIFT)) + (110 (37 48 NOLOCKSHIFT)) + (111 (10073 10025 LOCKSHIFT)) + (112 (10071 10023 LOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (45 50 NOLOCKSHIFT)) + (117 (61352 49 NOLOCKSHIFT)) + (118 (10088 10040 LOCKSHIFT)) + (119 (10075 10027 LOCKSHIFT)) + (120 (10093 10045 LOCKSHIFT)) + (121 (10086 10038 LOCKSHIFT)) + (122 (95 56 NOLOCKSHIFT)) + (123 (10090 10042 LOCKSHIFT)) + (124 (10089 10041 LOCKSHIFT)) + (125 (10091 10043 LOCKSHIFT)) + (126 (10069 10021 LOCKSHIFT)) + (127 (10066 10018 LOCKSHIFT)) + (128 (10095 10047 LOCKSHIFT)) + (129 (10092 10044 LOCKSHIFT)) + (132 (167 43 NOLOCKSHIFT)) + (133 (92 124 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (10065 10017 LOCKSHIFT)) + (137 (10083 10035 LOCKSHIFT)) + (138 (10080 10032 LOCKSHIFT)) + (139 (10074 10026 LOCKSHIFT)) + (140 (10097 10049 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (10096 10048 LOCKSHIFT)) + (143 (10072 10024 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (145 (41 40 NOLOCKSHIFT)) + (148 (10076 10028 LOCKSHIFT)) + (149 (10070 10022 LOCKSHIFT)) + (150 (10081 10033 LOCKSHIFT)) + (151 (10079 10031 LOCKSHIFT)) + (152 (10082 10034 LOCKSHIFT)) + (153 (46 55 NOLOCKSHIFT)) + (154 (10084 10036 LOCKSHIFT)) + (155 (10094 10046 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (10087 10039 LOCKSHIFT)) + (159 (33 61 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DORADO))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL))) +STOP diff --git a/library/virtualkeyboards/DOVEKEYBOARDS b/library/virtualkeyboards/DOVEKEYBOARDS new file mode 100644 index 00000000..e1799dc7 --- /dev/null +++ b/library/virtualkeyboards/DOVEKEYBOARDS @@ -0,0 +1,631 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) + +(FILECREATED " 6-Jul-2023 08:52:04" {WMEDLEY}virtualkeyboards>DOVEKEYBOARDS.;3 33268 + + :EDIT-BY rmk + + :CHANGES-TO (VARS DOVEKEYBOARDSCOMS) + + :PREVIOUS-DATE " 4-Jul-2023 23:19:33" {WMEDLEY}virtualkeyboards>DOVEKEYBOARDS.;2) + + +(PRETTYCOMPRINT DOVEKEYBOARDSCOMS) + +(RPAQQ DOVEKEYBOARDSCOMS ((ALISTS (VKBD.LOADED-KEYBOARDS DOVE)))) + +(ADDTOVAR VKBD.LOADED-KEYBOARDS + (DOVE (EUROPEAN ((100 (53 197 NOLOCKSHIFT)) + (101 (52 196 NOLOCKSHIFT)) + (102 (54 198 NOLOCKSHIFT)) + (103 (61887 61759 LOCKSHIFT)) + (104 (55 199 NOLOCKSHIFT)) + (105 (61888 61760 LOCKSHIFT)) + (106 (61872 61744 LOCKSHIFT)) + (107 (61860 61732 LOCKSHIFT)) + (108 (48 126 NOLOCKSHIFT)) + (109 (61892 61764 LOCKSHIFT)) + (110 (203 207 NOLOCKSHIFT)) + (111 (61919 61791 LOCKSHIFT)) + (112 (47 191 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 195 NOLOCKSHIFT)) + (117 (50 194 NOLOCKSHIFT)) + (118 (61873 61745 LOCKSHIFT)) + (119 (61858 61730 LOCKSHIFT)) + (120 (61874 61746 LOCKSHIFT)) + (121 (61859 61731 LOCKSHIFT)) + (122 (57 202 NOLOCKSHIFT)) + (123 (61886 61758 LOCKSHIFT)) + (124 (61864 61736 LOCKSHIFT)) + (125 (61903 61775 LOCKSHIFT)) + (126 (61908 61780 LOCKSHIFT)) + (127 (241 225 LOCKSHIFT)) + (171 (187 170 LOCKSHIFT)) + (129 (249 233 LOCKSHIFT)) + (132 (49 193 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61905 61777 LOCKSHIFT)) + (137 (61869 61741 LOCKSHIFT)) + (138 (61877 61749 LOCKSHIFT)) + (139 (61906 61778 LOCKSHIFT)) + (140 (251 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (250 234 LOCKSHIFT)) + (143 (59 58 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (171 186 LOCKSHIFT)) + (148 (61904 61776 LOCKSHIFT)) + (149 (61920 61792 LOCKSHIFT)) + (150 (61921 61793 LOCKSHIFT)) + (151 (61857 61729 LOCKSHIFT)) + (152 (61863 61735 LOCKSHIFT)) + (153 (56 200 NOLOCKSHIFT)) + (154 (61900 61772 LOCKSHIFT)) + (155 (239 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (246 230 LOCKSHIFT)) + (159 (207 176 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (logic ((100 (53 37 NOLOCKSHIFT)) + (101 (52 164 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61258 61260 NOLOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (61292 61293 NOLOCKSHIFT)) + (106 (61271 61270 NOLOCKSHIFT)) + (107 (61284 61285 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61307 61306 NOLOCKSHIFT)) + (110 (45 177 NOLOCKSHIFT)) + (111 (61269 61268 LOCKSHIFT)) + (112 (172 174 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61240 61241 NOLOCKSHIFT)) + (119 (61234 61235 NOLOCKSHIFT)) + (120 (61266 61262 NOLOCKSHIFT)) + (121 (61365 61365 NOLOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (61275 61274 NOLOCKSHIFT)) + (124 (61300 61299 NOLOCKSHIFT)) + (125 (61273 61272 NOLOCKSHIFT)) + (126 (61282 61283 NOLOCKSHIFT)) + (127 (61256 61257 NOLOCKSHIFT)) + (171 (61356 61356 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61250 61251 NOLOCKSHIFT)) + (137 (61298 61297 NOLOCKSHIFT)) + (138 (61305 61303 NOLOCKSHIFT)) + (139 (61265 61264 NOLOCKSHIFT)) + (140 (61364 61364 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61281 233 NOLOCKSHIFT)) + (143 (61351 61351 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (61357 61357 NOLOCKSHIFT)) + (148 (61279 61278 NOLOCKSHIFT)) + (149 (61239 61238 NOLOCKSHIFT)) + (150 (61290 61290 NOLOCKSHIFT)) + (151 (61263 61261 NOLOCKSHIFT)) + (152 (61295 61295 NOLOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61252 61253 NOLOCKSHIFT)) + (155 (61254 61255 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (MATH ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (61284 61285 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (174 61245 NOLOCKSHIFT)) + (107 (61369 61363 NOLOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (61254 61255 NOLOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (173 61246 LOCKSHIFT)) + (112 (47 61300 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (61282 61283 LOCKSHIFT)) + (119 (61287 61286 NOLOCKSHIFT)) + (120 (61301 61302 NOLOCKSHIFT)) + (121 (61351 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (175 61247 LOCKSHIFT)) + (124 (180 184 LOCKSHIFT)) + (125 (172 61244 LOCKSHIFT)) + (126 (61256 61257 LOCKSHIFT)) + (127 (44 61250 NOLOCKSHIFT)) + (171 (61298 61253 NOLOCKSHIFT)) + (129 (93 61265 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (61356 61362 LOCKSHIFT)) + (138 (61254 61291 NOLOCKSHIFT)) + (139 (98 61360 NOLOCKSHIFT)) + (140 (61309 177 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 61251 NOLOCKSHIFT)) + (143 (61299 61252 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (95 94 NOLOCKSHIFT)) + (148 (61358 82 LOCKSHIFT)) + (149 (61296 61266 NOLOCKSHIFT)) + (150 (61305 61303 NOLOCKSHIFT)) + (151 (61308 61267 LOCKSHIFT)) + (152 (61288 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (61357 61361 NOLOCKSHIFT)) + (155 (61292 61293 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 61264 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (OFFICE ((100 (61397 61381 NOLOCKSHIFT)) + (101 (61396 61380 NOLOCKSHIFT)) + (102 (61398 61382 NOLOCKSHIFT)) + (103 (8557 8554 NOLOCKSHIFT)) + (104 (61399 61383 NOLOCKSHIFT)) + (105 (61232 8743 NOLOCKSHIFT)) + (106 (61346 8571 NOLOCKSHIFT)) + (107 (188 86 NOLOCKSHIFT)) + (108 (61402 61386 NOLOCKSHIFT)) + (109 (210 8738 NOLOCKSHIFT)) + (110 (61437 61438 NOLOCKSHIFT)) + (111 (163 8558 NOLOCKSHIFT)) + (112 (61248 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (61395 61379 NOLOCKSHIFT)) + (117 (61394 61378 NOLOCKSHIFT)) + (118 (185 8553 NOLOCKSHIFT)) + (119 (176 8546 NOLOCKSHIFT)) + (120 (167 8744 NOLOCKSHIFT)) + (121 (97 8745 NOLOCKSHIFT)) + (122 (61401 61385 NOLOCKSHIFT)) + (123 (162 8570 NOLOCKSHIFT)) + (124 (61437 88 NOLOCKSHIFT)) + (125 (111 8569 NOLOCKSHIFT)) + (126 (61289 8737 NOLOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (171 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (61393 61377 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (61233 8742 NOLOCKSHIFT)) + (137 (61438 67 NOLOCKSHIFT)) + (138 (8739 74 NOLOCKSHIFT)) + (139 (190 61436 NOLOCKSHIFT)) + (140 (189 90 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (61249 62 NOLOCKSHIFT)) + (143 (61352 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (95 61280 NOLOCKSHIFT)) + (148 (212 8574 NOLOCKSHIFT)) + (149 (61354 8573 NOLOCKSHIFT)) + (150 (61286 8741 NOLOCKSHIFT)) + (151 (165 8572 NOLOCKSHIFT)) + (152 (61368 8740 NOLOCKSHIFT)) + (153 (61400 61384 NOLOCKSHIFT)) + (154 (173 175 NOLOCKSHIFT)) + (155 (172 174 NOLOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61406 61368 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (DVORAK ((100 (49 42 NOLOCKSHIFT)) + (101 (51 41 NOLOCKSHIFT)) + (102 (57 37 NOLOCKSHIFT)) + (103 (46 62 NOLOCKSHIFT)) + (104 (48 38 NOLOCKSHIFT)) + (105 (101 69 LOCKSHIFT)) + (106 (103 71 LOCKSHIFT)) + (107 (107 75 LOCKSHIFT)) + (108 (54 45 NOLOCKSHIFT)) + (109 (116 84 LOCKSHIFT)) + (110 (56 95 NOLOCKSHIFT)) + (111 (108 76 LOCKSHIFT)) + (112 (122 90 LOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (53 40 NOLOCKSHIFT)) + (117 (55 35 NOLOCKSHIFT)) + (118 (44 60 NOLOCKSHIFT)) + (119 (63 47 NOLOCKSHIFT)) + (120 (111 79 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (52 164 NOLOCKSHIFT)) + (123 (99 67 LOCKSHIFT)) + (124 (113 81 LOCKSHIFT)) + (125 (114 82 LOCKSHIFT)) + (126 (110 78 LOCKSHIFT)) + (127 (119 87 LOCKSHIFT)) + (171 (44 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (33 64 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (117 85 LOCKSHIFT)) + (137 (106 74 LOCKSHIFT)) + (138 (104 72 LOCKSHIFT)) + (139 (120 88 LOCKSHIFT)) + (140 (59 58 NOLOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (118 86 LOCKSHIFT)) + (143 (115 83 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (169 170 NOLOCKSHIFT)) + (148 (112 80 LOCKSHIFT)) + (149 (121 89 LOCKSHIFT)) + (150 (105 73 LOCKSHIFT)) + (151 (102 70 LOCKSHIFT)) + (152 (100 68 LOCKSHIFT)) + (153 (50 162 NOLOCKSHIFT)) + (154 (98 66 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (GREEK ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (9830 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (9829 9797 LOCKSHIFT)) + (106 (9849 9817 LOCKSHIFT)) + (107 (115 9814 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (9837 9805 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (9843 9811 LOCKSHIFT)) + (112 (47 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (9853 9821 LOCKSHIFT)) + (119 (9835 9803 LOCKSHIFT)) + (120 (9846 9814 LOCKSHIFT)) + (121 (9825 9793 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (9836 9804 LOCKSHIFT)) + (124 (9851 9819 LOCKSHIFT)) + (125 (9842 9810 LOCKSHIFT)) + (126 (9838 9806 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (171 (39 34 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (9850 9818 LOCKSHIFT)) + (137 (9841 9809 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (9826 66 LOCKSHIFT)) + (140 (9833 9801 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (95 94 NOLOCKSHIFT)) + (148 (9845 9813 LOCKSHIFT)) + (149 (9848 9816 LOCKSHIFT)) + (150 (9828 9796 LOCKSHIFT)) + (151 (9852 9820 LOCKSHIFT)) + (152 (9834 9802 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (9840 9808 LOCKSHIFT)) + (155 (9839 9807 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (ITALIAN ((171 (39 34 NOLOCKSHIFT)) + (100 (53 61903 NOLOCKSHIFT)) + (101 (52 61886 NOLOCKSHIFT)) + (102 (54 61919 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (95 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 61872 NOLOCKSHIFT)) + (117 (50 61857 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (171 (39 186 NOLOCKSHIFT)) + (129 (93 125 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (95 170 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (91 123 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (SPANISH ((208 (161 191 NOLOCKSHIFT)) + (171 (59 58 NOLOCKSHIFT)) + (100 (53 61904 NOLOCKSHIFT)) + (101 (52 61887 NOLOCKSHIFT)) + (102 (54 61920 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (95 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 61873 NOLOCKSHIFT)) + (117 (50 61858 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (171 (59 58 NOLOCKSHIFT)) + (129 (185 186 NOLOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (61900 61772 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (161 191 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61925 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (169 170 NOLOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (FRENCH ((208 (61869 61741 NOLOCKSHIFT)) + (171 (39 61857 NOLOCKSHIFT)) + (100 (53 61905 NOLOCKSHIFT)) + (101 (52 61888 NOLOCKSHIFT)) + (102 (54 61921 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (95 63 NOLOCKSHIFT)) + (115 (1 1 NOLOCKSHIFT) . IGNORE) + (116 (51 61874 NOLOCKSHIFT)) + (117 (50 61859 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 171 NOLOCKSHIFT)) + (171 (39 61857 NOLOCKSHIFT)) + (129 (61872 61892 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 187 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (61869 61741 LOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 61919 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61873 61877 LOCKSHIFT)) + (159 (61 43 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (GERMAN ((100 (53 37 NOLOCKSHIFT)) + (101 (52 36 NOLOCKSHIFT)) + (102 (54 126 NOLOCKSHIFT)) + (103 (101 69 LOCKSHIFT)) + (104 (55 38 NOLOCKSHIFT)) + (105 (100 68 LOCKSHIFT)) + (106 (117 85 LOCKSHIFT)) + (107 (118 86 LOCKSHIFT)) + (108 (48 41 NOLOCKSHIFT)) + (109 (107 75 LOCKSHIFT)) + (110 (45 45 NOLOCKSHIFT)) + (111 (112 80 LOCKSHIFT)) + (112 (251 63 NOLOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (51 35 NOLOCKSHIFT)) + (117 (50 64 NOLOCKSHIFT)) + (118 (119 87 LOCKSHIFT)) + (119 (113 81 LOCKSHIFT)) + (120 (115 83 LOCKSHIFT)) + (121 (97 65 LOCKSHIFT)) + (122 (57 40 NOLOCKSHIFT)) + (123 (105 73 LOCKSHIFT)) + (124 (120 88 LOCKSHIFT)) + (125 (111 79 LOCKSHIFT)) + (126 (108 76 LOCKSHIFT)) + (127 (44 60 NOLOCKSHIFT)) + (171 (39 34 NOLOCKSHIFT)) + (129 (61863 61735 LOCKSHIFT)) + (132 (49 33 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (102 70 LOCKSHIFT)) + (137 (99 67 LOCKSHIFT)) + (138 (106 74 LOCKSHIFT)) + (139 (98 66 LOCKSHIFT)) + (140 (122 90 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (46 62 NOLOCKSHIFT)) + (143 (59 58 NOLOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (95 94 NOLOCKSHIFT)) + (148 (114 82 LOCKSHIFT)) + (149 (116 84 LOCKSHIFT)) + (150 (103 71 LOCKSHIFT)) + (151 (121 89 LOCKSHIFT)) + (152 (104 72 LOCKSHIFT)) + (153 (56 42 NOLOCKSHIFT)) + (154 (110 78 LOCKSHIFT)) + (155 (109 77 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (61908 61780 LOCKSHIFT)) + (159 (61925 61797 LOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE) + (STANDARD-RUSSIAN ((208 (41 40 NOLOCKSHIFT)) + (171 (10073 10025 NOLOCKSHIFT)) + (100 (34 52 NOLOCKSHIFT)) + (101 (47 51 NOLOCKSHIFT)) + (102 (58 53 NOLOCKSHIFT)) + (103 (10085 10037 LOCKSHIFT)) + (104 (44 54 NOLOCKSHIFT)) + (105 (10067 10019 LOCKSHIFT)) + (106 (10068 10020 LOCKSHIFT)) + (107 (10078 10030 LOCKSHIFT)) + (108 (63 57 NOLOCKSHIFT)) + (109 (10077 10029 LOCKSHIFT)) + (110 (37 48 NOLOCKSHIFT)) + (111 (10073 10025 LOCKSHIFT)) + (112 (10071 10023 LOCKSHIFT)) + (115 (8 8 NOLOCKSHIFT) . IGNORE) + (116 (45 50 NOLOCKSHIFT)) + (117 (61352 49 NOLOCKSHIFT)) + (118 (10088 10040 LOCKSHIFT)) + (119 (10075 10027 LOCKSHIFT)) + (120 (10093 10045 LOCKSHIFT)) + (121 (10086 10038 LOCKSHIFT)) + (122 (95 56 NOLOCKSHIFT)) + (123 (10090 10042 LOCKSHIFT)) + (124 (10089 10041 LOCKSHIFT)) + (125 (10091 10043 LOCKSHIFT)) + (126 (10069 10021 LOCKSHIFT)) + (127 (10066 10018 LOCKSHIFT)) + (171 (10095 10047 LOCKSHIFT)) + (129 (10092 10044 LOCKSHIFT)) + (132 (167 43 NOLOCKSHIFT)) + (165 (27 27 NOLOCKSHIFT) . IGNORE) + (134 (9 9 NOLOCKSHIFT) . IGNORE) + (135 (10065 10017 LOCKSHIFT)) + (137 (10083 10035 LOCKSHIFT)) + (138 (10080 10032 LOCKSHIFT)) + (139 (10074 10026 LOCKSHIFT)) + (140 (10097 10049 LOCKSHIFT)) + (141 1SHIFTDOWN . 1SHIFTUP) + (142 (10096 10048 LOCKSHIFT)) + (143 (10072 10024 LOCKSHIFT)) + (144 (13 13 NOLOCKSHIFT) . IGNORE) + (208 (41 40 NOLOCKSHIFT)) + (148 (10076 10028 LOCKSHIFT)) + (149 (10070 10022 LOCKSHIFT)) + (150 (10081 10033 LOCKSHIFT)) + (151 (10079 10031 LOCKSHIFT)) + (152 (10082 10034 LOCKSHIFT)) + (153 (46 55 NOLOCKSHIFT)) + (154 (10084 10036 LOCKSHIFT)) + (155 (10094 10046 LOCKSHIFT)) + (156 LOCKDOWN . LOCKUP) + (157 (32 32 NOLOCKSHIFT) . IGNORE) + (158 (10087 10039 LOCKSHIFT)) + (159 (33 61 NOLOCKSHIFT)) + (160 2SHIFTDOWN . 2SHIFTUP)) + DOVE))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL))) +STOP diff --git a/library/KEYBOARDCONFIGS b/library/virtualkeyboards/KEYBOARDCONFIGS similarity index 68% rename from library/KEYBOARDCONFIGS rename to library/virtualkeyboards/KEYBOARDCONFIGS index f4dedee0..aae4e82f 100644 --- a/library/KEYBOARDCONFIGS +++ b/library/virtualkeyboards/KEYBOARDCONFIGS @@ -1,31 +1,35 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED " 7-Feb-97 12:13:28" {DSK}medley2.0>library>KEYBOARDCONFIGS.;8 61718 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - previous date%: "22-Jan-97 15:26:41" {DSK}medley2.0>library>KEYBOARDCONFIGS.;7) +(FILECREATED " 6-Jul-2023 13:18:46" {WMEDLEY}virtualkeyboards>KEYBOARDCONFIGS.;3 59739 + + :EDIT-BY rmk + + :CHANGES-TO (VARS KEYBOARDCONFIGSCOMS) + + :PREVIOUS-DATE " 7-Feb-97 12:13:28" {WMEDLEY}virtualkeyboards>KEYBOARDCONFIGS.;1) (* ; " -Copyright (c) 1996, 1997 by Xerox Corporation. All rights reserved. +Copyright (c) 1996-1997 by Xerox Corporation. ") (PRETTYCOMPRINT KEYBOARDCONFIGSCOMS) (RPAQQ KEYBOARDCONFIGSCOMS ( - (* ;; "Configuration variables/values for VIRTUALKEYBOARDS package. Loaded when VIRTUALKEYBOARDS is loaded.") + (* ;; "Configuration variables/values for VIRTUALKEYBOARDS package. Loaded when VIRTUALKEYBOARDS is loaded.") - [INITVARS (DEFAULTVIRTUALKEYBOARDTYPE 'MAIKO) + [INITVARS (DEFAULTVIRTUALKEYBOARDTYPE 'X) (DEFAULTKEYBOARDDISPLAYFONT '(CLASSIC 12)) (DEFAULTKEYBOARDLABELSFONT '(HELVETICA 5)) - (KEYBOARDCONFIGCOERCIONS '((SUN4 MAIKO) + (KEYBOARDCONFIGCOERCIONS '((SUN4 X) (SUN5 FULL-IBMPC) - (SUN3 MAIKO) - (X MAIKO) - (MAIKO DORADO) + (SUN3 X) + (X DORADO) (FULL-IBMPC IBMPC] (VARS VKBD.COMMONCHARLABELS VKBD.COMMONKEYLABELS VKBD.COMMONDEFAULTASSIGNMENT) (INITVARS (VKBD.DEFAULT-CONFIGURATION-NAME (KEYBOARDTYPE))) - (ALISTS (VKBD.CONFIGURATIONS MAIKO DORADO DANDELION DOVE FULL-IBMPC MAIKO-EUROPEAN)))) + (ALISTS (VKBD.CONFIGURATIONS X DORADO DANDELION DOVE FULL-IBMPC X-EUROPEAN)))) @@ -34,24 +38,23 @@ Copyright (c) 1996, 1997 by Xerox Corporation. All rights reserved. ) -(RPAQ? DEFAULTVIRTUALKEYBOARDTYPE 'MAIKO) +(RPAQ? DEFAULTVIRTUALKEYBOARDTYPE 'X) (RPAQ? DEFAULTKEYBOARDDISPLAYFONT '(CLASSIC 12)) (RPAQ? DEFAULTKEYBOARDLABELSFONT '(HELVETICA 5)) -(RPAQ? KEYBOARDCONFIGCOERCIONS '((SUN4 MAIKO) - (SUN5 FULL-IBMPC) - (SUN3 MAIKO) - (X MAIKO) - (MAIKO DORADO) - (FULL-IBMPC IBMPC))) +(RPAQ? KEYBOARDCONFIGCOERCIONS '((SUN4 X) + (SUN5 FULL-IBMPC) + (SUN3 X) + (X DORADO) + (FULL-IBMPC IBMPC))) (RPAQQ VKBD.COMMONCHARLABELS ((1 BS) - (2 BREAK) - BS TAB LF CR ESC SPACE (21 ".") - (23 DEL) - HELP SCRL NUMLK CLEAR HOME PGUP END PGDN INS DOIT)) + (2 BREAK) + BS TAB LF CR ESC SPACE (21 ".") + (23 DEL) + HELP SCRL NUMLK CLEAR HOME PGUP END PGDN INS DOIT)) (RPAQQ VKBD.COMMONKEYLABELS ((ESC ESC) @@ -126,361 +129,361 @@ Copyright (c) 1996, 1997 by Xerox Corporation. All rights reserved. (RPAQ? VKBD.DEFAULT-CONFIGURATION-NAME (KEYBOARDTYPE)) (ADDTOVAR VKBD.CONFIGURATIONS - (MAIKO NIL ((HELP (10 10 61 29)) - (FIND (10 42 29 29)) - (CUT (42 42 29 29)) - (OPEN (10 74 29 29)) - (PASTE (42 74 29 29)) - (FRONT (10 106 29 29)) - (COPY (42 106 29 29)) - (PROPS (10 138 29 29)) - (UNDO (42 138 29 29)) - (STOP (10 170 29 29)) - (AGAIN (42 170 29 29)) - (INS (618 10 61 29)) - (NUMERIC. (522 170 61 29)) - (ENTER (714 10 29 61)) - (NUMERIC1 (618 42 29 29)) - (NUMERIC2 (650 42 29 29)) - (NUMERIC3 (682 42 29 29)) - (NUMERIC4 (618 74 29 29)) - (NUMERIC5 (650 74 29 29)) - (NUMERIC6 (682 74 29 29)) - (NUMERIC+ (714 74 29 61)) - (NUMERIC7 (618 106 29 29)) - (NUMERIC8 (650 106 29 29)) - (NUMERIC9 (682 106 29 29)) - (NUMERIC= (618 138 29 29)) - (NUMERIC/ (650 138 29 29)) - (NUMERIC* (682 138 29 29)) - (NUMERIC- (714 138 29 29)) - (PAUSE (618 170 29 29)) - (PRTSCR (650 170 29 29)) - (SCRLLOCK (682 170 29 29)) - (NUMLOCK (714 170 29 29)) - (LOCK (106 10 29 29)) - (ALT (138 10 29 29)) - (LDIAMOND (170 10 29 29)) - (SPACE (202 10 285 29)) - (RDIAMOND (490 10 29 29)) - (NEXT (522 10 29 29)) - (ALTGRAPH (554 10 29 29)) - (LSHIFT (106 42 69 29)) - (Z (178 42 29 29)) - (X (210 42 29 29)) - (C (242 42 29 29)) - (V (274 42 29 29)) - (B (306 42 29 29)) - (N (338 42 29 29)) - (M (370 42 29 29)) - (< (402 42 29 29)) - (> (434 42 29 29)) - (? (466 42 29 29)) - (RSHIFT (498 42 53 29)) - (LINEFEED (554 42 29 29)) - (CONTROL (106 74 53 29)) - (A (162 74 29 29)) - (S (194 74 29 29)) - (D (226 74 29 29)) - (F (258 74 29 29)) - (G (290 74 29 29)) - (H (322 74 29 29)) - (J (354 74 29 29)) - (K (386 74 29 29)) - (L (418 74 29 29)) - (%: (450 74 29 29)) - (%" (482 74 29 29)) - (%` (514 74 29 29)) - (RETURN (546 74 37 32) - (538 106 45 29)) - (=> (106 106 45 29)) - (Q (154 106 29 29)) - (W (186 106 29 29)) - (E (218 106 29 29)) - (R (250 106 29 29)) - (T (282 106 29 29)) - (Y (314 106 29 29)) - (U (346 106 29 29)) - (I (378 106 29 29)) - (O (410 106 29 29)) - (P (442 106 29 29)) - ({ (474 106 29 29)) - (} (506 106 29 29)) - (ESC (106 138 29 29)) - (! (138 138 29 29)) - (@ (170 138 29 29)) - (%# (202 138 29 29)) - ($ (234 138 29 29)) - (%% (266 138 29 29)) - (|6| (298 138 29 29)) - (& (330 138 29 29)) - (* (362 138 29 29)) - (%( (394 138 29 29)) - (%) (426 138 29 29)) - (- (458 138 29 29)) - (+ (490 138 29 29)) - (<- (522 138 61 29)) - (F1 (106 170 29 29)) - (F2 (138 170 29 29)) - (F3 (170 170 29 29)) - (F4 (202 170 29 29)) - (F5 (234 170 29 29)) - (F6 (266 170 29 29)) - (F7 (298 170 29 29)) - (F8 (330 170 29 29)) - (F9 (362 170 29 29)) - (F10 (394 170 29 29)) - (F11 (426 170 29 29)) - (F12 (458 170 29 29)) - (\ (490 170 29 29)) - (NUMERIC. (554 170 29 29))) - NIL - ((%" (%' %" NLS)) - (+ (= + NLS)) - (- (- _ NLS)) - (%: (; %: NLS)) - (< (%, < NLS)) - (> (%. > NLS)) - (? (/ ? NLS)) - (LDIAMOND METADOWN . METAUP) - (ALT IGNORE . IGNORE) - (ALTGRAPH (2,24 2,64 NLS)) - (LINEFEED (LF LF)) - (LOCK LOCKTOGGLE) - (CONTROL CTRLDOWN . CTRLUP) - (ENTER (2,13 2,53 NLS)) - (INS (INS |0| NLS)) - (NEXT (2,22 2,62 NLS)) - (NUMERIC* (* *)) - (NUMERIC+ (+ +)) - (NUMERIC- (- -)) - (NUMERIC. (23 21 NLS)) - (NUMERIC/ (/ /)) - (NUMERIC0 (INS |0| NLS)) - (NUMERIC1 (END |1| NLS)) - (NUMERIC2 ( |2| NLS)) - (NUMERIC3 (PGDN |3| NLS)) - (NUMERIC4 ( |4| NLS)) - (NUMERIC5 (|5| |5|)) - (NUMERIC6 ( |6| NLS)) - (NUMERIC7 (HOME |7| NLS)) - (NUMERIC8 ( |8| NLS)) - (NUMERIC9 (PGUP |9| NLS)) - (NUMERIC= (= =)) - (RETURN (CR CR)) - (%[ (%[ { NLS)) - (\ (\ %| NLS)) - (%` (%` ~ NLS)) - (%] (%] } NLS)) - (F1 (CENTER NOTCENTER NLS)) - (F2 (BOLD NOTBOLD NLS)) - (F3 (ITALIC NOTITALIC NLS)) - (F4 (UCASE LCASE NLS)) - (F5 (STRIKEOUT NOTSTRIKEOUT NLS)) - (F6 (UNDERLINE NOTUNDERLINE NLS)) - (F7 (SUBSCRIPT SUPERSCRIPT NLS)) - (F8 (SMALLER LARGER NLS)) - (F9 (MARGINS NOTMARGINS NLS)) - (F10 (LOOKS NOTLOOKS NLS)) - (F11 (F11 NOTF11 NLS)) - (F12 (F12 NOTF12 NLS))) - ((%` 45 B) - (~ 45 T) - (|6| 2 B) - (^ 2 T) - (%% 0 T) - (|5| 0 B) - ($ 1 T) - (|4| 1 B) - (E 3) - (e 3) - (& 4 T) - (|7| 4 B) - (D 5) - (d 5) - (U 6) - (u 6) - (V 7) - (v 7) - (%) 8 T) - (|0| 8 B) - (K 9) - (k 9) - (- 10 B) - (P 11) - (p 11) - (? 12 T) - (/ 12 B) - (CUT 46) - (NUMERIC. 13) - (FRONT 14) - (<- 15) - (BS 15) - (%# 16 T) - (|3| 16 B) - (@ 17 T) - (|2| 17 B) - (W 18) - (w 18) - (Q 19) - (q 19) - (S 20) - (s 20) - (A 21) - (a 21) - (%( 22 T) - (|9| 22 B) - (I 23) - (i 23) - (X 24) - (x 24) - (O 25) - (o 25) - (L 26) - (l 26) - (< 27 T) - (%, 27 B) - (%" 28 T) - (%' 28 B) - (} 29 T) - (%] 29 B) - (ALT 31) - (! 32 T) - (|1| 32 B) - (ESC 33) - (=> 34) - (TAB 34) - (F 35) - (f 35) - (CONTROL 36) - (C 37) - (c 37) - (J 38) - (j 38) - (B 39) - (b 39) - (Z 40) - (z 40) - (LSHIFT 41) - (> 42 T) - (%. 42 B) - (%: 43 T) - (; 43 B) - (RETURN 44) - (CR 44) - (NEXT 47) - (SKIP 47) - (R 48) - (r 48) - (T 49) - (t 49) - (G 50) - (g 50) - (Y 51) - (y 51) - (H 52) - (h 52) - (* 53 T) - (|8| 53 B) - (N 54) - (n 54) - (M 55) - (m 55) - (LOCK 56) - (SPACE 57) - ({ 58 T) - (%[ 58 B) - (+ 59 T) - (= 59 B) - (RSHIFT 60) - (STOP 61) - (PASTE 62) - (UNDO 63) - (NUMERIC= 64) - (NUMERIC/ 65) - (F7 66) - (F4 67) - (F5 68) - (NUMERIC2 69) - (NUMERIC3 70) - (LINEFEED 71) - (NUMLOCK 73) - (SCRLLOCK 74) - (PAUSE 75) - (ENTER 76) - (F9 80) - (NUMERIC7 81) - (NUMERIC8 82) - (NUMERIC9 83) - (NUMERIC4 84) - (NUMERIC5 85) - (LDIAMOND 86) - (NUMERIC6 87) - (RDIAMOND 88) - (COPY 89) - (FIND 90) - (AGAIN 91) - (HELP 92) - (ALTGRAPH 93) - (NUMERIC1 94) - (NUMERIC* 95) - (NUMERIC- 96) - (F1 97) - (INS 98) - (NUMERIC0 98) - (F2 99) - (F3 100) - (F6 101) - (NUMERIC+ 102) - (F8 104) - (\ 105 B) - (%| 105 T) - (F10 106) - (F11 107) - (F12 108) - (PROPS 109) - (PRTSCR 110) - (OPEN 111) - (ZERO |0|) - (ONE |1|) - (TWO |2|) - (THREE |3|) - (FOUR |4|) - (FIVE |5|) - (SIX |6|) - (SEVEN |7|) - (EIGHT |8|) - (NINE |9|)) - MAIKO - ((<- "BACK SPACE") - (=> "TAB") - (AGAIN "AGAIN") - (ALT ALT) - (ALTGRAPH NEXT) - (CONTROL "CTRL") - (COPY "COPY") - (CUT "CUT") - (ENTER "ENTER") - (FIND "FIND") - (FRONT SAME) - (HELP "HELP") - (LDIAMOND "META") - (NEXT EXPAND) - (NUMERIC. DELETE% WORD) - (OPEN "OPEN") - (PASTE MOVE) - (PAUSE "PAUSE") - (PROPS "PROPS") - (PRTSCR "PR SC") - (RDIAMOND "RDMND") - (RETURN "RTRN") - (SCRLLOCK ("SCRL" "LOCK")) - (STOP "STOP") - (UNDO "UNDO")) - (HELVETICA 6) - 23130 - (CLASSIC 10) - NIL) + (X NIL ((HELP (10 10 61 29)) + (FIND (10 42 29 29)) + (CUT (42 42 29 29)) + (OPEN (10 74 29 29)) + (PASTE (42 74 29 29)) + (FRONT (10 106 29 29)) + (COPY (42 106 29 29)) + (PROPS (10 138 29 29)) + (UNDO (42 138 29 29)) + (STOP (10 170 29 29)) + (AGAIN (42 170 29 29)) + (INS (618 10 61 29)) + (NUMERIC. (522 170 61 29)) + (ENTER (714 10 29 61)) + (NUMERIC1 (618 42 29 29)) + (NUMERIC2 (650 42 29 29)) + (NUMERIC3 (682 42 29 29)) + (NUMERIC4 (618 74 29 29)) + (NUMERIC5 (650 74 29 29)) + (NUMERIC6 (682 74 29 29)) + (NUMERIC+ (714 74 29 61)) + (NUMERIC7 (618 106 29 29)) + (NUMERIC8 (650 106 29 29)) + (NUMERIC9 (682 106 29 29)) + (NUMERIC= (618 138 29 29)) + (NUMERIC/ (650 138 29 29)) + (NUMERIC* (682 138 29 29)) + (NUMERIC- (714 138 29 29)) + (PAUSE (618 170 29 29)) + (PRTSCR (650 170 29 29)) + (SCRLLOCK (682 170 29 29)) + (NUMLOCK (714 170 29 29)) + (LOCK (106 10 29 29)) + (ALT (138 10 29 29)) + (LDIAMOND (170 10 29 29)) + (SPACE (202 10 285 29)) + (RDIAMOND (490 10 29 29)) + (NEXT (522 10 29 29)) + (ALTGRAPH (554 10 29 29)) + (LSHIFT (106 42 69 29)) + (Z (178 42 29 29)) + (X (210 42 29 29)) + (C (242 42 29 29)) + (V (274 42 29 29)) + (B (306 42 29 29)) + (N (338 42 29 29)) + (M (370 42 29 29)) + (< (402 42 29 29)) + (> (434 42 29 29)) + (? (466 42 29 29)) + (RSHIFT (498 42 53 29)) + (LINEFEED (554 42 29 29)) + (CONTROL (106 74 53 29)) + (A (162 74 29 29)) + (S (194 74 29 29)) + (D (226 74 29 29)) + (F (258 74 29 29)) + (G (290 74 29 29)) + (H (322 74 29 29)) + (J (354 74 29 29)) + (K (386 74 29 29)) + (L (418 74 29 29)) + (%: (450 74 29 29)) + (%" (482 74 29 29)) + (%` (514 74 29 29)) + (RETURN (546 74 37 32) + (538 106 45 29)) + (=> (106 106 45 29)) + (Q (154 106 29 29)) + (W (186 106 29 29)) + (E (218 106 29 29)) + (R (250 106 29 29)) + (T (282 106 29 29)) + (Y (314 106 29 29)) + (U (346 106 29 29)) + (I (378 106 29 29)) + (O (410 106 29 29)) + (P (442 106 29 29)) + ({ (474 106 29 29)) + (} (506 106 29 29)) + (ESC (106 138 29 29)) + (! (138 138 29 29)) + (@ (170 138 29 29)) + (%# (202 138 29 29)) + ($ (234 138 29 29)) + (%% (266 138 29 29)) + (|6| (298 138 29 29)) + (& (330 138 29 29)) + (* (362 138 29 29)) + (%( (394 138 29 29)) + (%) (426 138 29 29)) + (- (458 138 29 29)) + (+ (490 138 29 29)) + (<- (522 138 61 29)) + (F1 (106 170 29 29)) + (F2 (138 170 29 29)) + (F3 (170 170 29 29)) + (F4 (202 170 29 29)) + (F5 (234 170 29 29)) + (F6 (266 170 29 29)) + (F7 (298 170 29 29)) + (F8 (330 170 29 29)) + (F9 (362 170 29 29)) + (F10 (394 170 29 29)) + (F11 (426 170 29 29)) + (F12 (458 170 29 29)) + (\ (490 170 29 29)) + (NUMERIC. (554 170 29 29))) + NIL + ((%" (%' %" NLS)) + (+ (= + NLS)) + (- (- _ NLS)) + (%: (; %: NLS)) + (< (%, < NLS)) + (> (%. > NLS)) + (? (/ ? NLS)) + (LDIAMOND METADOWN . METAUP) + (ALT IGNORE . IGNORE) + (ALTGRAPH (2,24 2,64 NLS)) + (LINEFEED (LF LF)) + (LOCK LOCKTOGGLE) + (CONTROL CTRLDOWN . CTRLUP) + (ENTER (2,13 2,53 NLS)) + (INS (INS |0| NLS)) + (NEXT (2,22 2,62 NLS)) + (NUMERIC* (* *)) + (NUMERIC+ (+ +)) + (NUMERIC- (- -)) + (NUMERIC. (23 21 NLS)) + (NUMERIC/ (/ /)) + (NUMERIC0 (INS |0| NLS)) + (NUMERIC1 (END |1| NLS)) + (NUMERIC2 ( |2| NLS)) + (NUMERIC3 (PGDN |3| NLS)) + (NUMERIC4 ( |4| NLS)) + (NUMERIC5 (|5| |5|)) + (NUMERIC6 ( |6| NLS)) + (NUMERIC7 (HOME |7| NLS)) + (NUMERIC8 ( |8| NLS)) + (NUMERIC9 (PGUP |9| NLS)) + (NUMERIC= (= =)) + (RETURN (CR CR)) + (%[ (%[ { NLS)) + (\ (\ %| NLS)) + (%` (%` ~ NLS)) + (%] (%] } NLS)) + (F1 (CENTER NOTCENTER NLS)) + (F2 (BOLD NOTBOLD NLS)) + (F3 (ITALIC NOTITALIC NLS)) + (F4 (UCASE LCASE NLS)) + (F5 (STRIKEOUT NOTSTRIKEOUT NLS)) + (F6 (UNDERLINE NOTUNDERLINE NLS)) + (F7 (SUBSCRIPT SUPERSCRIPT NLS)) + (F8 (SMALLER LARGER NLS)) + (F9 (MARGINS NOTMARGINS NLS)) + (F10 (LOOKS NOTLOOKS NLS)) + (F11 (F11 NOTF11 NLS)) + (F12 (F12 NOTF12 NLS))) + ((%` 45 B) + (~ 45 T) + (|6| 2 B) + (^ 2 T) + (%% 0 T) + (|5| 0 B) + ($ 1 T) + (|4| 1 B) + (E 3) + (e 3) + (& 4 T) + (|7| 4 B) + (D 5) + (d 5) + (U 6) + (u 6) + (V 7) + (v 7) + (%) 8 T) + (|0| 8 B) + (K 9) + (k 9) + (- 10 B) + (P 11) + (p 11) + (? 12 T) + (/ 12 B) + (CUT 46) + (NUMERIC. 13) + (FRONT 14) + (<- 15) + (BS 15) + (%# 16 T) + (|3| 16 B) + (@ 17 T) + (|2| 17 B) + (W 18) + (w 18) + (Q 19) + (q 19) + (S 20) + (s 20) + (A 21) + (a 21) + (%( 22 T) + (|9| 22 B) + (I 23) + (i 23) + (X 24) + (x 24) + (O 25) + (o 25) + (L 26) + (l 26) + (< 27 T) + (%, 27 B) + (%" 28 T) + (%' 28 B) + (} 29 T) + (%] 29 B) + (ALT 31) + (! 32 T) + (|1| 32 B) + (ESC 33) + (=> 34) + (TAB 34) + (F 35) + (f 35) + (CONTROL 36) + (C 37) + (c 37) + (J 38) + (j 38) + (B 39) + (b 39) + (Z 40) + (z 40) + (LSHIFT 41) + (> 42 T) + (%. 42 B) + (%: 43 T) + (; 43 B) + (RETURN 44) + (CR 44) + (NEXT 47) + (SKIP 47) + (R 48) + (r 48) + (T 49) + (t 49) + (G 50) + (g 50) + (Y 51) + (y 51) + (H 52) + (h 52) + (* 53 T) + (|8| 53 B) + (N 54) + (n 54) + (M 55) + (m 55) + (LOCK 56) + (SPACE 57) + ({ 58 T) + (%[ 58 B) + (+ 59 T) + (= 59 B) + (RSHIFT 60) + (STOP 61) + (PASTE 62) + (UNDO 63) + (NUMERIC= 64) + (NUMERIC/ 65) + (F7 66) + (F4 67) + (F5 68) + (NUMERIC2 69) + (NUMERIC3 70) + (LINEFEED 71) + (NUMLOCK 73) + (SCRLLOCK 74) + (PAUSE 75) + (ENTER 76) + (F9 80) + (NUMERIC7 81) + (NUMERIC8 82) + (NUMERIC9 83) + (NUMERIC4 84) + (NUMERIC5 85) + (LDIAMOND 86) + (NUMERIC6 87) + (RDIAMOND 88) + (COPY 89) + (FIND 90) + (AGAIN 91) + (HELP 92) + (ALTGRAPH 93) + (NUMERIC1 94) + (NUMERIC* 95) + (NUMERIC- 96) + (F1 97) + (INS 98) + (NUMERIC0 98) + (F2 99) + (F3 100) + (F6 101) + (NUMERIC+ 102) + (F8 104) + (\ 105 B) + (%| 105 T) + (F10 106) + (F11 107) + (F12 108) + (PROPS 109) + (PRTSCR 110) + (OPEN 111) + (ZERO |0|) + (ONE |1|) + (TWO |2|) + (THREE |3|) + (FOUR |4|) + (FIVE |5|) + (SIX |6|) + (SEVEN |7|) + (EIGHT |8|) + (NINE |9|)) + X + ((<- "BACK SPACE") + (=> "TAB") + (AGAIN "AGAIN") + (ALT ALT) + (ALTGRAPH NEXT) + (CONTROL "CTRL") + (COPY "COPY") + (CUT "CUT") + (ENTER "ENTER") + (FIND "FIND") + (FRONT SAME) + (HELP "HELP") + (LDIAMOND "META") + (NEXT EXPAND) + (NUMERIC. DELETE% WORD) + (OPEN "OPEN") + (PASTE MOVE) + (PAUSE "PAUSE") + (PROPS "PROPS") + (PRTSCR "PR SC") + (RDIAMOND "RDMND") + (RETURN "RTRN") + (SCRLLOCK ("SCRL" "LOCK")) + (STOP "STOP") + (UNDO "UNDO")) + (HELVETICA 6) + 23130 + (CLASSIC 10) + NIL) (DORADO NIL ((|5| (178 154 29 33)) (|4| (146 154 29 33)) (|6| (210 154 29 33)) @@ -1447,116 +1450,116 @@ Copyright (c) 1996, 1997 by Xerox Corporation. All rights reserved. 23130 (CLASSIC 10) NIL) - (MAIKO-EUROPEAN NIL ((HELP (10 10 61 29)) - (FIND (10 42 29 29)) - (CUT (42 42 29 29)) - (OPEN (10 74 29 29)) - (PASTE (42 74 29 29)) - (FRONT (10 106 29 29)) - (COPY (42 106 29 29)) - (PROPS (10 138 29 29)) - (UNDO (42 138 29 29)) - (STOP (10 170 29 29)) - (AGAIN (42 170 29 29)) - (NUMERIC0 (618 10 61 29)) - (NUMERIC. (682 10 29 29)) - (ENTER (714 10 29 61)) - (NUMERIC1 (618 42 29 29)) - (NUMERIC2 (650 42 29 29)) - (NUMERIC3 (682 42 29 29)) - (NUMERIC4 (618 74 29 29)) - (NUMERIC5 (650 74 29 29)) - (NUMERIC6 (682 74 29 29)) - (NUMERIC+ (714 74 29 61)) - (NUMERIC7 (618 106 29 29)) - (NUMERIC8 (650 106 29 29)) - (NUMERIC9 (682 106 29 29)) - (NUMERIC= (618 138 29 29)) - (NUMERIC/ (650 138 29 29)) - (NUMERIC* (682 138 29 29)) - (NUMERIC- (714 138 29 29)) - (PAUSE (618 170 29 29)) - (PRTSCR (650 170 29 29)) - (SCRLLOCK (682 170 29 29)) - (NUMLOCK (714 170 29 29)) - (CAPSLOCK (106 10 29 29)) - (ALT (138 10 29 29)) - (LDIAMOND (170 10 29 29)) - (SPACE (202 10 285 29)) - (RDIAMOND (490 10 29 29)) - (COMPOSE (522 10 29 29)) - (ALTGRAPH (554 10 29 29)) - (LSHIFT (106 42 37 29)) - (%[ (146 42 29 29)) - (Y (178 42 29 29)) - (X (210 42 29 29)) - (C (242 42 29 29)) - (V (274 42 29 29)) - (B (306 42 29 29)) - (N (338 42 29 29)) - (M (370 42 29 29)) - (; (402 42 29 29)) - (%: (434 42 29 29)) - (_ (466 42 29 29)) - (RSHIFT (498 42 53 29)) - (LINEFEED (554 42 29 29)) - (CONTROL (106 74 53 29)) - (A (162 74 29 29)) - (S (194 74 29 29)) - (D (226 74 29 29)) - (F (258 74 29 29)) - (G (290 74 29 29)) - (H (322 74 29 29)) - (J (354 74 29 29)) - (K (386 74 29 29)) - (L (418 74 29 29)) - (OUMLAUT (450 74 29 29)) - (AUMLAUT (482 74 29 29)) - (DEADTILDE (514 74 29 29)) - (CR (546 74 37 32) - (538 106 45 29)) - (TAB (106 106 45 29)) - (Q (154 106 29 29)) - (W (186 106 29 29)) - (E (218 106 29 29)) - (R (250 106 29 29)) - (T (282 106 29 29)) - (Z (314 106 29 29)) - (U (346 106 29 29)) - (I (378 106 29 29)) - (O (410 106 29 29)) - (P (442 106 29 29)) - (UUMLAUT (474 106 29 29)) - (DEADACUTE (506 106 29 29)) - (ESC (106 138 29 29)) - (|1| (138 138 29 29)) - (|2| (170 138 29 29)) - (|3| (202 138 29 29)) - (|4| (234 138 29 29)) - (|5| (266 138 29 29)) - (|6| (298 138 29 29)) - (|7| (330 138 29 29)) - (|8| (362 138 29 29)) - (|9| (394 138 29 29)) - (|0| (426 138 29 29)) - (? (458 138 29 29)) - (DEADGRAVE (490 138 29 29)) - (BACKSPACE (522 138 61 29)) - (F1 (106 170 29 29)) - (F2 (138 170 29 29)) - (F3 (170 170 29 29)) - (F4 (202 170 29 29)) - (F5 (234 170 29 29)) - (F6 (266 170 29 29)) - (F7 (298 170 29 29)) - (F8 (330 170 29 29)) - (F9 (362 170 29 29)) - (F10 (394 170 29 29)) - (F11 (426 170 29 29)) - (F12 (458 170 29 29)) - ({ (490 170 29 29)) - (} (522 170 29 29)) - (DELETE (554 170 29 29))) + (X-EUROPEAN NIL ((HELP (10 10 61 29)) + (FIND (10 42 29 29)) + (CUT (42 42 29 29)) + (OPEN (10 74 29 29)) + (PASTE (42 74 29 29)) + (FRONT (10 106 29 29)) + (COPY (42 106 29 29)) + (PROPS (10 138 29 29)) + (UNDO (42 138 29 29)) + (STOP (10 170 29 29)) + (AGAIN (42 170 29 29)) + (NUMERIC0 (618 10 61 29)) + (NUMERIC. (682 10 29 29)) + (ENTER (714 10 29 61)) + (NUMERIC1 (618 42 29 29)) + (NUMERIC2 (650 42 29 29)) + (NUMERIC3 (682 42 29 29)) + (NUMERIC4 (618 74 29 29)) + (NUMERIC5 (650 74 29 29)) + (NUMERIC6 (682 74 29 29)) + (NUMERIC+ (714 74 29 61)) + (NUMERIC7 (618 106 29 29)) + (NUMERIC8 (650 106 29 29)) + (NUMERIC9 (682 106 29 29)) + (NUMERIC= (618 138 29 29)) + (NUMERIC/ (650 138 29 29)) + (NUMERIC* (682 138 29 29)) + (NUMERIC- (714 138 29 29)) + (PAUSE (618 170 29 29)) + (PRTSCR (650 170 29 29)) + (SCRLLOCK (682 170 29 29)) + (NUMLOCK (714 170 29 29)) + (CAPSLOCK (106 10 29 29)) + (ALT (138 10 29 29)) + (LDIAMOND (170 10 29 29)) + (SPACE (202 10 285 29)) + (RDIAMOND (490 10 29 29)) + (COMPOSE (522 10 29 29)) + (ALTGRAPH (554 10 29 29)) + (LSHIFT (106 42 37 29)) + (%[ (146 42 29 29)) + (Y (178 42 29 29)) + (X (210 42 29 29)) + (C (242 42 29 29)) + (V (274 42 29 29)) + (B (306 42 29 29)) + (N (338 42 29 29)) + (M (370 42 29 29)) + (; (402 42 29 29)) + (%: (434 42 29 29)) + (_ (466 42 29 29)) + (RSHIFT (498 42 53 29)) + (LINEFEED (554 42 29 29)) + (CONTROL (106 74 53 29)) + (A (162 74 29 29)) + (S (194 74 29 29)) + (D (226 74 29 29)) + (F (258 74 29 29)) + (G (290 74 29 29)) + (H (322 74 29 29)) + (J (354 74 29 29)) + (K (386 74 29 29)) + (L (418 74 29 29)) + (OUMLAUT (450 74 29 29)) + (AUMLAUT (482 74 29 29)) + (DEADTILDE (514 74 29 29)) + (CR (546 74 37 32) + (538 106 45 29)) + (TAB (106 106 45 29)) + (Q (154 106 29 29)) + (W (186 106 29 29)) + (E (218 106 29 29)) + (R (250 106 29 29)) + (T (282 106 29 29)) + (Z (314 106 29 29)) + (U (346 106 29 29)) + (I (378 106 29 29)) + (O (410 106 29 29)) + (P (442 106 29 29)) + (UUMLAUT (474 106 29 29)) + (DEADACUTE (506 106 29 29)) + (ESC (106 138 29 29)) + (|1| (138 138 29 29)) + (|2| (170 138 29 29)) + (|3| (202 138 29 29)) + (|4| (234 138 29 29)) + (|5| (266 138 29 29)) + (|6| (298 138 29 29)) + (|7| (330 138 29 29)) + (|8| (362 138 29 29)) + (|9| (394 138 29 29)) + (|0| (426 138 29 29)) + (? (458 138 29 29)) + (DEADGRAVE (490 138 29 29)) + (BACKSPACE (522 138 61 29)) + (F1 (106 170 29 29)) + (F2 (138 170 29 29)) + (F3 (170 170 29 29)) + (F4 (202 170 29 29)) + (F5 (234 170 29 29)) + (F6 (266 170 29 29)) + (F7 (298 170 29 29)) + (F8 (330 170 29 29)) + (F9 (362 170 29 29)) + (F10 (394 170 29 29)) + (F11 (426 170 29 29)) + (F12 (458 170 29 29)) + ({ (490 170 29 29)) + (} (522 170 29 29)) + (DELETE (554 170 29 29))) NIL ((ZERO (|0| = NLS)) (ONE (|1| + NLS)) @@ -1770,7 +1773,7 @@ Copyright (c) 1996, 1997 by Xerox Corporation. All rights reserved. (SEVEN |7|) (EIGHT |8|) (NINE |9|)) - MAIKO + X ((AGAIN "AGAIN") (ALT "ALT") (ALTGRAPH "CMPSE") diff --git a/library/KEYBOARDEDITOR b/library/virtualkeyboards/KEYBOARDEDITOR similarity index 93% rename from library/KEYBOARDEDITOR rename to library/virtualkeyboards/KEYBOARDEDITOR index 5704ecce..1d71c5f5 100644 --- a/library/KEYBOARDEDITOR +++ b/library/virtualkeyboards/KEYBOARDEDITOR @@ -1,13 +1,16 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "25-May-95 14:32:35" {DSK}medley2.0>library>KEYBOARDEDITOR.;4 51139 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS EDITKEYBOARD VKBD.EDIT.CREATE-DISPLAY) +(FILECREATED " 6-Jul-2023 16:23:12" {WMEDLEY}KEYBOARDEDITOR.;3 50717 - previous date%: "25-May-95 11:35:16" {DSK}medley2.0>library>KEYBOARDEDITOR.;2) + :EDIT-BY rmk + + :CHANGES-TO (FNS VKBD.EDIT.CREATE-CHARACTERS-MENU) + + :PREVIOUS-DATE "25-May-95 14:32:35" {WMEDLEY}KEYBOARDEDITOR.;1) (* ; " -Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights reserved. +Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. ") (PRETTYCOMPRINT KEYBOARDEDITORCOMS) @@ -15,14 +18,14 @@ Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights r (RPAQQ KEYBOARDEDITORCOMS ((FILES VIRTUALKEYBOARDS) (COMS - (* ;; "Editor for Configurations -- the description of the physical key layout, which keys are assignable, etc.") + (* ;; "Editor for Configurations -- the description of the physical key layout, which keys are assignable, etc.") (FNS EDITCONFIGURATION VKBD.CONF.CHANGE-KEY-VALUE VKBD.CONF.DISPLAY-FIELD-VALUE VKBD.CONF.DISPLAY-INFO-KEYBOARD VKBD.CONF.DISPLAY-KEY-INFO VKBD.CONF.EDIT-DEFAULT-ASSIGNMENTS VKBD.CONF.ICONFN VKBD.CONF.PARSE-CONFIGURATION) (BITMAPS VKBD.CONF.ICON)) - (* ;; "EEditor for keyboard layouts per se:") + (* ;; "EEditor for keyboard layouts per se:") (FNS EDITKEYBOARD VKBD.EDIT.ADD-SUBITEM-TO-BACKGROUND-MENU VKBD.EDIT.CREATE-COMMAND-MENU VKBD.EDIT.CREATE-NON-CHAR-ASSIGMENTS-MENU VKBD.EDIT-KEYBOARD-COMMAND @@ -459,7 +462,8 @@ Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights r ITEMWIDTH _ 29]) (VKBD.EDIT.CREATE-CHARACTERS-MENU - [LAMBDA (CHAR-SET-NUMBER FONT) (* sm "15-Aug-85 12:15") + [LAMBDA (CHAR-SET-NUMBER FONT) (* ; "Edited 6-Jul-2023 16:23 by rmk") + (* sm "15-Aug-85 12:15") (PROG (EXISTING-MENU-INFO NEW-MENU) [SETQ EXISTING-MENU-INFO (for CHARSET-FONT-MENU in VKBD.EDIT.CASH-MENUES thereis (AND (EQP (CAR CHARSET-FONT-MENU) @@ -468,21 +472,17 @@ Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights r FONT] (if EXISTING-MENU-INFO then (RETURN (CADDR EXISTING-MENU-INFO))) - (PRINTOUT PROMPTWINDOW T "Wait. Bitmaps for character set " (OCTALSTRING CHAR-SET-NUMBER) - " are being retrieved. ") + (PRINTOUT PROMPTWINDOW T "Retrieving bitmaps for character set " (OCTALSTRING + CHAR-SET-NUMBER)) (SETQ NEW-MENU (create MENU ITEMS _ (for I from 0 to 255 bind CODE bind ROTATED-I - collect (PROGN (SETQ ROTATED-I (SUB1 ( - VKBD.EDIT.ROTATED-NUMBER - (ADD1 I) - 16 16))) - (LIST (GETCHARBITMAP (SETQ CODE - (VKBD.PARSE-CHAR-CODE - (LIST - CHAR-SET-NUMBER - ROTATED-I))) - FONT) - CODE))) + collect (SETQ ROTATED-I (SUB1 (VKBD.EDIT.ROTATED-NUMBER + (ADD1 I) + 16 16))) + (SETQ CODE (LOGOR (LLSH CHAR-SET-NUMBER 8) + I)) + (LIST (GETCHARBITMAP CODE FONT) + CODE)) MENUCOLUMNS _ 16 CENTERFLG _ T ITEMHEIGHT _ 25 @@ -717,16 +717,16 @@ Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights r ("Accented Characters" 241))) (RPAQQ VKBD.EDIT.MENU-ITEMS (("CharSet" VKBD.EDIT.SWITCH-CHAR-SET-COMMAND "Pops up a menu of all possible character set number. Selecting one will switch the displayed character set." - ) - ("Stop" VKBD.EDIT.STOP-COMMAND + ) + ("Stop" VKBD.EDIT.STOP-COMMAND "Exit from the keyboard editor. Returns the new keyboard, but does not modify the original one." - ) - ("Quit" VKBD.EDIT.QUIT-COMMAND + ) + ("Quit" VKBD.EDIT.QUIT-COMMAND "Exit from the keyboard editor. Modifies the roriginal keyboard and returns it ." - ) - ("Define" VKBD.EDIT.DEFINE-COMMAND + ) + ("Define" VKBD.EDIT.DEFINE-COMMAND "Adds the edited keyboard in its current state to the set of known keyboards." - ))) + ))) (RPAQQ VKBD.EDIT.NON-CHAR-ASSIGNMENTS (SHIFT CTRL META LOCK LOCKDOWN LOCKUP EVENT)) @@ -744,27 +744,26 @@ Copyright (c) 1985, 1987, 1990, 1995 by Venue & Xerox Corporation. All rights r VKBD.EDIT.MASK) ) -(VKBD.EDIT.ADD-SUBITEM-TO-BACKGROUND-MENU (LIST "Edit" '(ADD.PROCESS '( - VKBD.EDIT-KEYBOARD-COMMAND - T)) - "Calls the keyboard editor. Will prompt for name for the new keyboard, and will use the default keyboard as the initial keyboard" - VKBD.EDIT.BACKGROUND-MENU-SUBITEMS) +(VKBD.EDIT.ADD-SUBITEM-TO-BACKGROUND-MENU (LIST "Edit" '(ADD.PROCESS '(VKBD.EDIT-KEYBOARD-COMMAND + T)) + "Calls the keyboard editor. Will prompt for name for the new keyboard, and will use the default keyboard as the initial keyboard" + VKBD.EDIT.BACKGROUND-MENU-SUBITEMS) "Keyboard") (PUTPROPS KEYBOARDEDITOR COPYRIGHT ("Venue & Xerox Corporation" 1985 1987 1990 1995)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3451 17311 (EDITCONFIGURATION 3461 . 3784) (VKBD.CONF.CHANGE-KEY-VALUE 3786 . 8411) ( -VKBD.CONF.DISPLAY-FIELD-VALUE 8413 . 10186) (VKBD.CONF.DISPLAY-INFO-KEYBOARD 10188 . 12135) ( -VKBD.CONF.DISPLAY-KEY-INFO 12137 . 12894) (VKBD.CONF.EDIT-DEFAULT-ASSIGNMENTS 12896 . 14277) ( -VKBD.CONF.ICONFN 14279 . 15020) (VKBD.CONF.PARSE-CONFIGURATION 15022 . 17309)) (19637 42746 ( -EDITKEYBOARD 19647 . 21947) (VKBD.EDIT.ADD-SUBITEM-TO-BACKGROUND-MENU 21949 . 22875) ( -VKBD.EDIT.CREATE-COMMAND-MENU 22877 . 23227) (VKBD.EDIT.CREATE-NON-CHAR-ASSIGMENTS-MENU 23229 . 23692) - (VKBD.EDIT-KEYBOARD-COMMAND 23694 . 25067) (VKBD.EDIT.ASSIGN-CHARACTER 25069 . 27743) ( -VKBD.EDIT.ASSIGN-NON-CHARACTER 27745 . 28363) (VKBD.EDIT.CREATE-CHARACTER-SETS-MENU 28365 . 29404) ( -VKBD.EDIT.CREATE-CHARACTERS-MENU 29406 . 31987) (VKBD.EDIT.CREATE-DISPLAY 31989 . 35222) ( -VKBD.EDIT.DEFINE-COMMAND 35224 . 35626) (VKBD.EDIT.DO-MENU-COMMAND 35628 . 35838) (VKBD.EDIT.ICONFN -35840 . 36489) (VKBD.EDIT.INVERT-IF-LOCKED 36491 . 36924) (VKBD.EDIT.KEYBOARD-REPAINTFN 36926 . 37496) - (VKBD.EDIT.LARGE-WINDOW-REPAINTFN 37498 . 38093) (VKBD.EDIT.MAKE-CURRENT-KEY 38095 . 40147) ( -VKBD.EDIT.QUIT-COMMAND 40149 . 40502) (VKBD.EDIT.STOP-COMMAND 40504 . 40730) ( -VKBD.EDIT.SWITCH-CHAR-SET-COMMAND 40732 . 41658) (VKBD.EDIT.SWITCH-CHARACTER-SET 41660 . 42443) ( -VKBD.EDIT.ROTATED-NUMBER 42445 . 42744))))) + (FILEMAP (NIL (3425 17285 (EDITCONFIGURATION 3435 . 3758) (VKBD.CONF.CHANGE-KEY-VALUE 3760 . 8385) ( +VKBD.CONF.DISPLAY-FIELD-VALUE 8387 . 10160) (VKBD.CONF.DISPLAY-INFO-KEYBOARD 10162 . 12109) ( +VKBD.CONF.DISPLAY-KEY-INFO 12111 . 12868) (VKBD.CONF.EDIT-DEFAULT-ASSIGNMENTS 12870 . 14251) ( +VKBD.CONF.ICONFN 14253 . 14994) (VKBD.CONF.PARSE-CONFIGURATION 14996 . 17283)) (19611 42442 ( +EDITKEYBOARD 19621 . 21921) (VKBD.EDIT.ADD-SUBITEM-TO-BACKGROUND-MENU 21923 . 22849) ( +VKBD.EDIT.CREATE-COMMAND-MENU 22851 . 23201) (VKBD.EDIT.CREATE-NON-CHAR-ASSIGMENTS-MENU 23203 . 23666) + (VKBD.EDIT-KEYBOARD-COMMAND 23668 . 25041) (VKBD.EDIT.ASSIGN-CHARACTER 25043 . 27717) ( +VKBD.EDIT.ASSIGN-NON-CHARACTER 27719 . 28337) (VKBD.EDIT.CREATE-CHARACTER-SETS-MENU 28339 . 29378) ( +VKBD.EDIT.CREATE-CHARACTERS-MENU 29380 . 31683) (VKBD.EDIT.CREATE-DISPLAY 31685 . 34918) ( +VKBD.EDIT.DEFINE-COMMAND 34920 . 35322) (VKBD.EDIT.DO-MENU-COMMAND 35324 . 35534) (VKBD.EDIT.ICONFN +35536 . 36185) (VKBD.EDIT.INVERT-IF-LOCKED 36187 . 36620) (VKBD.EDIT.KEYBOARD-REPAINTFN 36622 . 37192) + (VKBD.EDIT.LARGE-WINDOW-REPAINTFN 37194 . 37789) (VKBD.EDIT.MAKE-CURRENT-KEY 37791 . 39843) ( +VKBD.EDIT.QUIT-COMMAND 39845 . 40198) (VKBD.EDIT.STOP-COMMAND 40200 . 40426) ( +VKBD.EDIT.SWITCH-CHAR-SET-COMMAND 40428 . 41354) (VKBD.EDIT.SWITCH-CHARACTER-SET 41356 . 42139) ( +VKBD.EDIT.ROTATED-NUMBER 42141 . 42440))))) STOP diff --git a/library/virtualkeyboards/KEYBOARDEDITOR.LCOM b/library/virtualkeyboards/KEYBOARDEDITOR.LCOM new file mode 100644 index 00000000..8b7ec70f Binary files /dev/null and b/library/virtualkeyboards/KEYBOARDEDITOR.LCOM differ diff --git a/library/VIRTUALKEYBOARDS b/library/virtualkeyboards/VIRTUALKEYBOARDS similarity index 91% rename from library/VIRTUALKEYBOARDS rename to library/virtualkeyboards/VIRTUALKEYBOARDS index 449da40a..755d60a8 100644 --- a/library/VIRTUALKEYBOARDS +++ b/library/virtualkeyboards/VIRTUALKEYBOARDS @@ -1,17 +1,17 @@ -(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "XCL" BASE 10) -(FILECREATED "22-Dec-2018 22:58:47"  -|{DSK}kaplan>Local>medley3.5>lispcore>library>VIRTUALKEYBOARDS.;10| 141793 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "XCL" BASE 10) - |changes| |to:| (VARS VIRTUALKEYBOARDSCOMS VKBD.BACKGROUND-MENU-SUBITEMS - VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.WINDOW-MENU-SUBITEMS VKBD.ICON - VKBD.MASK MODEACTIONS) - (RECORDS KEYBOARDCONFIGURATION VIRTUALKEYBOARD) +(FILECREATED " 6-Jul-2023 15:55:10" |{WMEDLEY}VIRTUALKEYBOARDS>VIRTUALKEYBOARDS.;16| 140655 - |previous| |date:| "22-Dec-2018 22:52:44" -|{DSK}kaplan>Local>medley3.5>lispcore>library>VIRTUALKEYBOARDS.;9|) + :EDIT-BY |rmk| + + :CHANGES-TO (VARS VIRTUALKEYBOARDSCOMS) + (FNS VKBD.INIT VKBD.LOAD-KEYBOARD-FILE METASHIFT) + + :PREVIOUS-DATE "28-Jun-2023 11:52:23" |{WMEDLEY}virtualkeyboards>VIRTUALKEYBOARDS.;9| +) -; Copyright (c) 1985, 1986, 1987, 1988, 1990, 1992, 1993, 1995, 1996, 2017, 2018 by Venue & Xerox Corporation. All rights reserved. +; Copyright (c) 1985-1988, 1990, 1992-1993, 1995-1996, 2017-2018 by Venue & Xerox Corporation. (PRETTYCOMPRINT VIRTUALKEYBOARDSCOMS) @@ -50,7 +50,8 @@ UNDERLINE NOTUNDERLINE SUBSCRIPT SUPERSCRIPT SMALLER LARGER MARGINS NOTMARGINS LOOKS NOTLOOKS F11 NOTF11 F12 NOTF12)) (RECORDS KEYBOARDCONFIGURATION VIRTUALKEYBOARD) - (INITVARS (VKBD.KNOWN-KEYBOARDS NIL)) + (INITVARS (VKBD.LOADED-KEYBOARDS NIL) + (VKBD.KNOWN-KEYBOARDS NIL)) (FILES (SOURCE) KEYBOARDCONFIGS) (VARS VKBD.BACKGROUND-MENU-SUBITEMS VKBD.NON-CHAR-ASSIGNMENTS-LABELS @@ -60,6 +61,7 @@ VKBD.KNOWN-KEYBOARDS VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.ICON VKBD.MASK CURRENTKEYBOARDCONFIG VKBD.CONFIGURATIONS VKBD.COMMONCODELABELS VKBD.COMMONKEYLABELS VKBD.COMMONDEFAULTASSIGNMENT) + (INITVARS (CURRENTKEYBOARDCONFIG NIL)) (COMS (DECLARE\: FIRST (P (MOVD? '\\KEYBOARDEVENTFN '\\OLDKEYBOARDEVENTFN))) (INITVARS (\\ORIGINALDEFAULTKEYACTION)) (FNS VKBD.\\KEYBOARDEVENTFN VKBD.RESETKEYACTIONTABLES) @@ -75,11 +77,12 @@ 'DEFAULT))) (FNS FIXKEYBOARD FIXKEYBOARDCONFIG FIXKEYASSIGNMENTS) (DECLARE\: DONTEVAL@LOAD DOCOPY (P (VKBD.INIT))) - (COMS (FNS METASHIFT) - (* \; - "Call new definition if the old one had been called") - (P (AND (MEMB (MACHINETYPE) - '(MAIKO DORADO)) + (COMS (P (MOVD? 'METASHIFT 'OLDMETASHIFT)) + (FNS METASHIFT) + (* \; + "Call new definition if the old one had been called") + (P (AND (MEMB (KEYBOARDTYPE) + '(X DORADO)) (EQUAL (KEYACTION 'BLANK-BOTTOM) '(METADOWN . METAUP)) (METASHIFT T)))) @@ -217,61 +220,34 @@ 'DEFAULT))))))) (VKBD.CREATE-KEYACTION-TABLE - - (LAMBDA (NEW-KEYBOARD OLDTABLE) (* \; "Edited 29-Feb-96 12:32 by rmk") - + (LAMBDA (NEW-KEYBOARD OLDTABLE) (* \; "Edited 28-Jun-2023 11:52 by rmk") + (* \; "Edited 29-Feb-96 12:32 by rmk") (PROG (KEYBOARDNAME FOUND KEYACTION-TABLE CONFIG) - (CL:UNLESS (COND - ((AND (ATOM NEW-KEYBOARD) - (SETQ FOUND (FINDVIRTUALKEYBOARD NEW-KEYBOARD))) - (SETQ NEW-KEYBOARD FOUND)) - ((MEMB NEW-KEYBOARD VKBD.KNOWN-KEYBOARDS))) - - - (* |;;| "Use FOUND to preserve NEW-KEYBOARD for error") - - + (* |;;| "Use FOUND to preserve NEW-KEYBOARD for error") (ERROR "INVALID KEYBOARD" NEW-KEYBOARD)) - (SETQ KEYBOARDNAME (FETCH (VIRTUALKEYBOARD KEYBOARDNAME) OF NEW-KEYBOARD)) - (COND - (OLDTABLE (SETQ KEYACTION-TABLE (RESETKEYACTION OLDTABLE))) - ((SETQ KEYACTION-TABLE (GETPROP KEYBOARDNAME 'KEYACTIONTABLE)) - (RETURN KEYACTION-TABLE)) - (T (SETQ KEYACTION-TABLE (KEYACTIONTABLE)))) - (SETQ NEW-KEYBOARD (VKBD.COMPLETE-KEYBOARD NEW-KEYBOARD)) - (SETQ CONFIG (VKBD.GET-CONFIGURATION (FETCH (VIRTUALKEYBOARD KEYBOARDCONFIGURATION) - - OF NEW-KEYBOARD))) - - (FOR KEY-ASSIGNMENT IN (FETCH (VIRTUALKEYBOARD COMPLETEKEYASSIGNMENTS) - - OF NEW-KEYBOARD) DO (OLDKEYACTION (CAR - - KEY-ASSIGNMENT - - ) - - (CDR KEY-ASSIGNMENT) - - KEYACTION-TABLE)) - + OF NEW-KEYBOARD))) + (FOR KEY-ASSIGNMENT IN (FETCH (VIRTUALKEYBOARD COMPLETEKEYASSIGNMENTS) OF NEW-KEYBOARD) + DO (CL:UNLESS (MEMB (CAR KEY-ASSIGNMENT) + '(31 86)) + (OLDKEYACTION (CAR KEY-ASSIGNMENT) + (CDR KEY-ASSIGNMENT) + KEYACTION-TABLE))) (PUTPROP KEYBOARDNAME 'KEYACTIONTABLE KEYACTION-TABLE) - (RETURN KEYACTION-TABLE)))) (vkbd.windowmenufn @@ -414,7 +390,9 @@ (setq |BackgroundMenu| nil))) (VKBD.INIT - (LAMBDA NIL (* \; "Edited 14-Jun-2017 14:22 by kaplan") + (LAMBDA NIL (* \; "Edited 6-Jul-2023 15:14 by rmk") + (* \; "Edited 28-Jun-2023 10:40 by rmk") + (* \; "Edited 14-Jun-2017 14:22 by kaplan") (* \; "Edited 16-Jun-92 11:14 by kaplan") (* |;;| "Reads virtual keyboard file for current type (or default type), if it can be found. Keyboards that don't match current keyboard can be displayed but not installed (via PROCESS.KEYBOARD)") @@ -423,35 +401,22 @@ (SETQ \\ORIGINALDEFAULTKEYACTION (KEYACTIONTABLE \\DEFAULTKEYACTION))) (SETQ VKBD.COMMONCODELABELS (FOR X IN VKBD.COMMONCHARLABELS COLLECT (IF (LISTP X) - THEN (IF (SMALLP (CAR X)) - THEN X - ELSE (LIST (CHARCODE.DECODE - (CAR X)) - (CADR X))) - ELSE (LIST (CHARCODE.DECODE X) - X)))) + THEN (IF (SMALLP (CAR X)) + THEN X + ELSE (LIST (CHARCODE.DECODE (CAR X)) + (CADR X))) + ELSE (LIST (CHARCODE.DECODE X) + X)))) (VKBD.ADD-ITEM-TO-BACKGROUND-MENU "Keyboard" ''(SWITCHKEYBOARDS T NIL) "Displays a menu for switching keyboards" VKBD.BACKGROUND-MENU-SUBITEMS) (VKBD.WINDOWMENUINIT) - (LET (FILE (KT (KEYBOARDTYPE))) + (LET ((KT (KEYBOARDTYPE))) (SETQ CURRENTKEYBOARDCONFIG (VKBD.GET-CONFIGURATION KT)) - (COND - ((SETQ FILE (COND - ((AND KT (FINDFILE (PACK* KT "KEYBOARDS") - T))) - (T (FINDFILE (PACK* DEFAULTVIRTUALKEYBOARDTYPE "KEYBOARDS") - T)))) - (VKBD.LOAD-KEYBOARD-FILE FILE) + (CL:WHEN (VKBD.LOAD-KEYBOARD-FILE KT) (* |;;| "Loading a keyboard file may change our notion of KEYBOARDTYPE, because of new coercion paths. The default keyboard will be added for the new type") - (VKBD.ADD-DEFAULT-KEYBOARD)) - (T - (* |;;| "Special printing here to avoid file-not-found error in case where user calls VKBD.LOAD-KEYBOARD-FILE directly") - - (PROMPTPRINT "Note: virtual keyboard file for type " (OR (KEYBOARDTYPE) - DEFAULTVIRTUALKEYBOARDTYPE) - " keyboards not found")))))) + (VKBD.ADD-DEFAULT-KEYBOARD))))) (VKBD.CREATE-DEFAULT-KEYBOARD @@ -474,9 +439,10 @@ OF CONFIGURATION))))) (VKBD.ADD-DEFAULT-KEYBOARD - (LAMBDA (KEYBOARDTYPE) (* \; "Edited 23-May-95 17:04 by rmk:") + (LAMBDA (KEYBOARDTYPE) (* \; "Edited 28-Jun-2023 10:45 by rmk") + (* \; "Edited 23-May-95 17:04 by rmk:") -(* |;;;| "It is useful practice to be able to switch back to the original key assignments. Thus the program is adding one special keyboard with the name DEFAULT which is the current keyboardtype's default keyboard.") +(* |;;;| "It is useful practice to be able to switch back to the original key assignments. Thus the program is adding one special keyboard with the name DEFAULT which is the current keyboardtype's default keyboard.") (SETQ KEYBOARDTYPE (OR KEYBOARDTYPE (KEYBOARDTYPE))) (BIND DEFAULT WHILE (SETQ DEFAULT (FINDVIRTUALKEYBOARD 'DEFAULT KEYBOARDTYPE)) @@ -504,114 +470,55 @@ THEN (VKBD.LOAD-KEYBOARD-FILE F REDEFINE? DELETE-FIRST? T))))) (VKBD.LOAD-KEYBOARD-FILE + (LAMBDA (KEYBOARDTYPE REDEFINE? DELETE-CURRENT-DEFINITIONS?) + (* \; "Edited 6-Jul-2023 15:11 by rmk") + (* \; "Edited 4-Jul-2023 23:22 by rmk") + (CL:UNLESS KEYBOARDTYPE (SETQ KEYBOARDTYPE DEFAULTVIRTUALKEYBOARDTYPE)) - (LAMBDA (FILENAME REDEFINE? DELETE-CURRENT-DEFINITIONS? PROMPTPRINT) + (* |;;| "Returns T if keyboards of type KEYBOARDTYPE found. Prints prompt warning and returns NIL if not found.") - (* \; "Edited 4-Mar-96 10:53 by rmk") + (* |;;| "Note: Can't switch to READFILE, since it uses OLD-INTERLISP readtable which doesn't honor vertical bars around numeric atoms.") + (LET (FILE (VKBDDIRS (CONS (MEDLEYDIR "library/virtualkeyboards/") + LISPUSERSDIRECTORIES)) + (NEWKEYBOARDS (CDR (ASSOC KEYBOARDTYPE VKBD.LOADED-KEYBOARDS)))) + (CL:UNLESS NEWKEYBOARDS + (* |;;| "If keyboards of type KEYBOARDTYPE have not previously been loaded, we look for a file KEYBOARDS (e.g. XKEYBOARDS, SDLKEYBOARDS), defaulting to the directory that VIRTUALKEYBOARDS is coming from. It is assumed that that file will add the desired keyboards to VKBD.LOADED-KEYBOARDS,") - (* |;;| "Note: Can't switch to READFILE, since it uses OLD-INTERLISP readtable which doesn't honor vertical bars around numeric atoms.") + (CL:WHEN (SETQ FILE (FINDFILE (PACK* KEYBOARDTYPE "KEYBOARDS") + T VKBDDIRS)) + (LOAD FILE T) + (SETQ NEWKEYBOARDS (CDR (ASSOC KEYBOARDTYPE VKBD.LOADED-KEYBOARDS))))) + (|if| NEWKEYBOARDS + |then| (COND + (DELETE-CURRENT-DEFINITIONS? (SETQ VKBD.KNOWN-KEYBOARDS NEWKEYBOARDS) + (VKBD.ADD-DEFAULT-KEYBOARD)) + (T (FOR NEWKEYBOARD KN KC IN NEWKEYBOARDS + DO + (* |;;| + "To make sure that COMPLETEDASSIGNMENTS cell (or any other new cells) exist--backward compatibility") + (SETQ NEWKEYBOARD (CREATE VIRTUALKEYBOARD USING NEWKEYBOARD)) + (SETQ KN (FETCH KEYBOARDNAME OF NEWKEYBOARD)) + (SETQ KC (FETCH KEYBOARDCONFIGURATION OF NEWKEYBOARD)) + (FOR TAIL OLDKEYBOARD ON VKBD.KNOWN-KEYBOARDS + WHEN (AND (EQ KN (FETCH KEYBOARDNAME OF (SETQ OLDKEYBOARD + (CAR TAIL)))) + (EQ KC (FETCH KEYBOARDCONFIGURATION OF OLDKEYBOARD))) + DO + (* |;;| "If REDEFINE?, then replace one with same name and configuration. Otherwise, keep the old one instead of installing the new one.") - (LET ((NEWKEYBOARDS (CL:WITH-OPEN-FILE (STREAM FILENAME :DIRECTION :INPUT) - - (BIND KB DATE (*PACKAGE* _ *INTERLISP-PACKAGE*) - - (RDTBL _ (FIND-READTABLE "INTERLISP")) - - FIRST (SETQ DATE (READ STREAM RDTBL)) - - (CL:UNLESS (LISTP DATE) - - (CL:WHEN (STRINGP DATE) - - (SETQ DATE (CONCAT "Keyboards from " (FULLNAME STREAM - - ) - - " [" DATE "]")) - - (IF PROMPTPRINT - - THEN (PROMPTPRINT DATE) - - ELSE (PRINTOUT T DATE T))) - - (SETQ DATE NIL)) WHILE (SKIPSEPRCODES STREAM RDTBL) - - UNTIL (EQ 'STOP (SETQ KB (READ STREAM RDTBL))) COLLECT - - KB - - FINALLY (CL:WHEN DATE - - - - (* |;;| - - "Was a LISTP date, must have been a keyboard") - - - - (PUSH DATE $$VAL)))))) - - (COND - - (DELETE-CURRENT-DEFINITIONS? (SETQ VKBD.KNOWN-KEYBOARDS NEWKEYBOARDS) - - (VKBD.ADD-DEFAULT-KEYBOARD)) - - (T (FOR NEWKEYBOARD KN KC IN NEWKEYBOARDS - - DO - - - - (* |;;| - -"To make sure that COMPLETEDASSIGNMENTS cell (or any other new cells) exist--backward compatibility") - - - - (SETQ NEWKEYBOARD (CREATE VIRTUALKEYBOARD USING NEWKEYBOARD)) - - (SETQ KN (FETCH KEYBOARDNAME OF NEWKEYBOARD)) - - (SETQ KC (FETCH KEYBOARDCONFIGURATION OF NEWKEYBOARD)) - - (FOR TAIL OLDKEYBOARD ON VKBD.KNOWN-KEYBOARDS - - WHEN (AND (EQ KN (FETCH KEYBOARDNAME OF (SETQ OLDKEYBOARD - - (CAR TAIL)))) - - (EQ KC (FETCH KEYBOARDCONFIGURATION OF OLDKEYBOARD)) - - ) DO - - - - (* |;;| "If REDEFINE?, then replace one with same name and configuration. Otherwise, keep the old one instead of installing the new one.") - - - - (COND - - (REDEFINE? (RPLACA TAIL NEWKEYBOARD)) - - (T (RETURN))) FINALLY (SETQ - - VKBD.KNOWN-KEYBOARDS - - (NCONC1 - - VKBD.KNOWN-KEYBOARDS - - NEWKEYBOARD)))) - - ))))) + (COND + (REDEFINE? (RPLACA TAIL NEWKEYBOARD)) + (T (RETURN))) FINALLY (SETQ VKBD.KNOWN-KEYBOARDS + (NCONC1 VKBD.KNOWN-KEYBOARDS + NEWKEYBOARD)))))) + T + |else| (PROMPTPRINT "Note: Can't find virtual keyboard file for " KEYBOARDTYPE + " keyboards") + NIL)))) (vkbd.store-file-command (lambda (f) (* \; "Edited 15-Dec-87 16:31 by Snow") @@ -2412,29 +2319,29 @@ (NOTF12 621)) (DECLARE\: EVAL@COMPILE -(RECORD KEYBOARDCONFIGURATION (CONFIGURATIONNAME KBCDUMMY1 KEYREGIONS KBCDUMMY2 DEFAULTASSIGNMENT - KEYNAMESMAPPING KEYBOARDTYPE KEYLABELS KEYLABELSFONT - BACKGROUNDSHADE KEYBOARDDISPLAYFONT CHARLABELS) +(RECORD KEYBOARDCONFIGURATION (CONFIGURATIONNAME KBCDUMMY1 KEYREGIONS KBCDUMMY2 DEFAULTASSIGNMENT + KEYNAMESMAPPING KEYBOARDTYPE KEYLABELS KEYLABELSFONT + BACKGROUNDSHADE KEYBOARDDISPLAYFONT CHARLABELS) - (* |;;| "Dummy fields so length test still works") + (* |;;| "Dummy fields so length test still works") - (TYPE? (EQLENGTH DATUM (CONSTANT (LENGTH (RECORDFIELDNAMES - - ' - KEYBOARDCONFIGURATION - ))))) - KEYBOARDTYPE _ (KEYBOARDTYPE) - KEYLABELSFONT _ DEFAULTKEYBOARDLABELSFONT BACKGROUNDSHADE _ 23130 - KEYBOARDDISPLAYFONT _ DEFAULTKEYBOARDDISPLAYFONT) + (TYPE? (EQLENGTH DATUM (CONSTANT (LENGTH (RECORDFIELDNAMES + 'KEYBOARDCONFIGURATION) + )))) + KEYBOARDTYPE _ (KEYBOARDTYPE) + KEYLABELSFONT _ DEFAULTKEYBOARDLABELSFONT BACKGROUNDSHADE _ 23130 + KEYBOARDDISPLAYFONT _ DEFAULTKEYBOARDDISPLAYFONT) (RECORD VIRTUALKEYBOARD (KEYBOARDNAME KEYASSIGNMENTS KEYBOARDCONFIGURATION KEYBOARDDISPLAYFONT) - (HASHLINK VIRTUALKEYBOARD (COMPLETEKEYASSIGNMENTS VKBDHASHARRAY 20))) + (HASHLINK VIRTUALKEYBOARD (COMPLETEKEYASSIGNMENTS VKBDHASHARRAY 20))) ) (DECLARE\: EVAL@COMPILE (GLOBALVARS VKBDHASHARRAY)) (SETUPHASHARRAY 'VKBDHASHARRAY 20) +(RPAQ? VKBD.LOADED-KEYBOARDS NIL) + (RPAQ? VKBD.KNOWN-KEYBOARDS NIL) (FILESLOAD (SOURCE) @@ -2485,11 +2392,11 @@ ))))) (RPAQQ VKBD.NON-CHAR-ASSIGNMENTS-LABELS ((SHIFT SHIFT) - (CTRL CTRL) - (META META) - (LOCK LOCK) - (LOCKUP LOCKUP) - (LOCKDOWN LOCKDOWN))) + (CTRL CTRL) + (META META) + (LOCK LOCK) + (LOCKUP LOCKUP) + (LOCKDOWN LOCKDOWN))) (RPAQQ VKBD.WINDOW-MENU-SUBITEMS (SUBITEMS ("Switch keyboard" (FUNCTION (LAMBDA (W) @@ -2549,6 +2456,8 @@ VKBD.NON-CHAR-ASSIGNMENTS-LABELS VKBD.ICON VKBD.MASK CURRENTKEYBOARDCONFIG VKBD.CONFIGURATIONS VKBD.COMMONCODELABELS VKBD.COMMONKEYLABELS VKBD.COMMONDEFAULTASSIGNMENT) ) + +(RPAQ? CURRENTKEYBOARDCONFIG NIL) (DECLARE\: FIRST (MOVD? '\\KEYBOARDEVENTFN '\\OLDKEYBOARDEVENTFN) @@ -2858,18 +2767,18 @@ (RPAQ? MODEKEYS ) -(RPAQQ MODEACTIONS (EVENT CTRLUP CTRLDOWN 1SHIFTUP 1SHIFTDOWN 2SHIFTUP 2SHIFTDOWN LOCKUP LOCKDOWN - LOCKTOGGLE METAUP METADOWN FONTUP FONTDOWN FONTTOGGLE USERMODE1UP - USERMODE1DOWN USERMODE1TOGGLE USERMODE2UP USERMODE2DOWN USERMODE2TOGGLE - USERMODE3UP USERMODE3DOWN USERMODE3TOGGLE)) +(RPAQQ MODEACTIONS (EVENT CTRLUP CTRLDOWN 1SHIFTUP 1SHIFTDOWN 2SHIFTUP 2SHIFTDOWN LOCKUP LOCKDOWN + LOCKTOGGLE METAUP METADOWN FONTUP FONTDOWN FONTTOGGLE USERMODE1UP + USERMODE1DOWN USERMODE1TOGGLE USERMODE2UP USERMODE2DOWN USERMODE2TOGGLE + USERMODE3UP USERMODE3DOWN USERMODE3TOGGLE)) (DECLARE\: DOEVAL@COMPILE DONTCOPY (GLOBALVARS MODEKEYS MODEACTIONS) ) (ADDTOVAR BREAKRESETFORMS ((LAMBDA (K) - (PROCESS.KEYBOARD NIL K)) - 'DEFAULT)) + (PROCESS.KEYBOARD NIL K)) + 'DEFAULT)) (DEFINEQ (FIXKEYBOARD @@ -3390,12 +3299,15 @@ (VKBD.INIT) ) + +(MOVD? 'METASHIFT 'OLDMETASHIFT) (DEFINEQ (METASHIFT - (LAMBDA FLG (* \; "Edited 16-Jun-92 08:44 by rmk:") + (LAMBDA FLG (* \; "Edited 6-Jul-2023 09:21 by rmk") + (* \; "Edited 16-Jun-92 08:44 by rmk:") - (* |;;| "Sets interpretation of swat key to first arg, where T means meta-shift, NIL means original setting. Returns previous setting. This differs from LLKEY version in that it changes the \\DORADOKEYACTIONS and \\DEFAULTKEYACTION table to insure that the metashift remains in effect across keyboard switches.") + (* |;;| "Sets interpretation of swat key to first arg, where T means meta-shift, NIL means original setting. Returns previous setting. This differs from LLKEY version in that it changes the \\DORADOKEYACTIONS and \\DEFAULTKEYACTION table to insure that the metashift remains in effect across keyboard switches.") (PROG* ((METASTATUS '(METADOWN . METAUP)) (ARGUMENT (AND (IGREATERP FLG 0) @@ -3408,19 +3320,19 @@ OLDSETTING) (SETQ OLDSETTING (KEYACTION 'BLANK-BOTTOM ARGUMENT)) - (* |;;| - "Update \\doradokeyactions table so we don't lose the change when we repalce the keyaction table.") + (* |;;| + "Update \\doradokeyactions table so we don't lose the change when we repalce the keyaction table.") - (AND (EQ (MACHINETYPE) - 'DORADO) - (COND - (ARGUMENT (PUTASSOC 'BLANK-BOTTOM ARGUMENT \\DORADOKEYACTIONS) - (KEYACTION 'BLANK-BOTTOM ARGUMENT \\DEFAULTKEYACTION)) - (T (SETQ \\DORADOKEYACTIONS (|for| X |in| \\DORADOKEYACTIONS - |join| (AND (NEQ (CAR X) - 'BLANK-BOTTOM) - (LIST X)))) - (KEYACTION 'BLANK-BOTTOM NIL \\DEFAULTKEYACTION)))) + (CL:WHEN (EQ (KEYBOARDTYPE) + 'DORADO) + (COND + (ARGUMENT (PUTASSOC 'BLANK-BOTTOM ARGUMENT \\DORADOKEYACTIONS) + (KEYACTION 'BLANK-BOTTOM ARGUMENT \\DEFAULTKEYACTION)) + (T (SETQ \\DORADOKEYACTIONS (|for| X |in| \\DORADOKEYACTIONS + |join| (AND (NEQ (CAR X) + 'BLANK-BOTTOM) + (LIST X)))) + (KEYACTION 'BLANK-BOTTOM NIL \\DEFAULTKEYACTION)))) (RETURN (COND ((EQUAL OLDSETTING METASTATUS) T) @@ -3432,8 +3344,8 @@ (* \; "Call new definition if the old one had been called") -(AND (MEMB (MACHINETYPE) - '(MAIKO DORADO)) +(AND (MEMB (KEYBOARDTYPE) + '(X DORADO)) (EQUAL (KEYACTION 'BLANK-BOTTOM) '(METADOWN . METAUP)) (METASHIFT T)) @@ -3450,38 +3362,38 @@ (PUTPROPS VIRTUALKEYBOARDS COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990 1992 1993 1995 1996 2017 2018)) (DECLARE\: DONTCOPY - (FILEMAP (NIL (5486 14142 (FINDVIRTUALKEYBOARD 5496 . 8650) (PROCESS.KEYBOARD 8652 . 11328) ( -VKBD.CREATE-KEYACTION-TABLE 11330 . 13246) (VKBD.WINDOWMENUFN 13248 . 13515) (VKBD.WINDOWMENUINIT -13517 . 14140)) (14143 19504 (LOADKEYBOARDDISPLAYFONTS 14153 . 19502)) (19613 20837 (DEFINEKEYBOARD -19623 . 20835)) (20838 25256 (VKBD.ADD-ITEM-TO-BACKGROUND-MENU 20848 . 21256) (VKBD.INIT 21258 . 23796 -) (VKBD.CREATE-DEFAULT-KEYBOARD 23798 . 24390) (VKBD.ADD-DEFAULT-KEYBOARD 24392 . 25254)) (25257 31597 - (VKBD.LOAD-FILE-COMMAND 25267 . 25721) (VKBD.LOAD-KEYBOARD-FILE 25723 . 29558) ( -VKBD.STORE-FILE-COMMAND 29560 . 29901) (VKBD.STORE-KEYBOARD-FILE 29903 . 31595)) (31598 40899 ( -SWITCHKEYBOARDS 31608 . 33086) (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS 33088 . 33458) ( -VKBD.POP-UP-KEYBOARDS-MENU 33460 . 34842) (VKBD.GET-CONFIGURATION 34844 . 35762) ( -VKBD.SUBCONFIGURATION 35764 . 40897)) (40900 81185 (VKBD.BUTTONEVENTFN 40910 . 43817) ( -VKBD.CENTER-BITMAP-IN-REGION 43819 . 45343) (VKBD.CLEAR-KEY-DISPLAY 45345 . 47476) ( -VKBD.CREATE-KEYBOARD-BITMAP 47478 . 49522) (VKBD.CREATE-KEYBOARD-DISPLAY 49524 . 52653) ( -VKBD.CURSORMOVEDFN 52655 . 54559) (VKBD.DISPLAY-CHARACTER 54561 . 56519) (VKBD.DISPLAY-EMPTY-KEY-CAP -56521 . 67059) (VKBD.DISPLAY-KEY 67061 . 70268) (VKBD.DISPLAY-KEY-CHARACTERS 70270 . 71463) ( -VKBD.DRAW-KEY-CAPS 71465 . 73653) (VKBD.ERASE-FRAME 73655 . 73978) (VKBD.EXTEND-REGION 73980 . 74569) -(VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 74571 . 75186) (VKBD.GET-KEY-REGIONS 75188 . 75444) ( -VKBD.INVERT-KEY 75446 . 75736) (VKBD.INVERT-REGION 75738 . 76429) (VKBD.KEYBOARD-WINDOW-REPAINTFN -76431 . 78388) (VKBD.LOWER-HALF-REGION 78390 . 78790) (VKBD.POSITION-IS-IN-KEY-REGION 78792 . 79076) ( -VKBD.REMOVE-KEYBOARD-COMMAND 79078 . 79535) (VKBD.UNION-REGIONS 79537 . 80682) (VKBD.UPPER-HALF-REGION - 80684 . 81183)) (81186 100744 (VKBD.KEY-ASSOC 81196 . 81696) (VKBD.CHAR-ASSIGNMENTP 81698 . 81862) ( -VKBD.COMPLETE-KEYBOARD 81864 . 84523) (VKBD.CTRL-ASSIGNMENTP 84525 . 84768) (VKBD.EVENT-ASSIGNMENTP -84770 . 85010) (VKBD.META-ASSIGNMENTP 85012 . 85255) (VKBD.FRAME-KEY 85257 . 87134) ( -VKBD.GET-CURRENT-KEY-ASSIGNMENT 87136 . 87505) (VKBD.GET-NON-CHAR-LABEL 87507 . 88162) (VKBD.ICONFN -88164 . 88900) (VKBD.INVERT-LOCK-KEYS 88902 . 89580) (VKBD.INVERT-SHIFT-KEYS 89582 . 90264) ( -VKBD.TRANSLATE-KEY-ID 90266 . 90945) (VKBD.KEY-ID-TO-KEY-NAMES 90947 . 91433) ( -VKBD.KEYBOARD-IS-KEYBOARDTYPE-KEYBOARD 91435 . 92033) (VKBD.LOCK-ASSIGNMENTP 92035 . 92482) ( -VKBD.LOCK-KEYP 92484 . 92802) (VKBD.LOCK/NOLOCK 92804 . 92963) (VKBD.LOCKDOWN-ASSIGNMENTP 92965 . -93259) (VKBD.LOCKUP-ASSIGNMENTP 93261 . 93551) (VKBD.PARSE-CHAR-CODE 93553 . 94052) ( -VKBD.PARSE-KEY-ASSIGNMENT 94054 . 97510) (VKBD.RESET-KEYBOARD-WINDOW 97512 . 98105) ( -VKBD.SEND-CHARACTER 98107 . 99616) (VKBD.SHIFT-ASSIGNMENTP 99618 . 100012) (VKBD.SHIFTED-CHAR 100014 - . 100172) (VKBD.UNDEFINE-KEYBOARD 100174 . 100581) (VKBD.UNSHIFTED-CHAR 100583 . 100742)) (113812 -116258 (VKBD.\\KEYBOARDEVENTFN 113822 . 115025) (VKBD.RESETKEYACTIONTABLES 115027 . 116256)) (116364 -122515 (NEWKEYACTION 116374 . 122513)) (123170 139358 (FIXKEYBOARD 123180 . 124300) (FIXKEYBOARDCONFIG - 124302 . 131526) (FIXKEYASSIGNMENTS 131528 . 139356)) (139411 141267 (METASHIFT 139421 . 141265))))) + (FILEMAP (NIL (5390 13914 (FINDVIRTUALKEYBOARD 5400 . 8554) (PROCESS.KEYBOARD 8556 . 11232) ( +VKBD.CREATE-KEYACTION-TABLE 11234 . 13018) (VKBD.WINDOWMENUFN 13020 . 13287) (VKBD.WINDOWMENUINIT +13289 . 13912)) (13915 19276 (LOADKEYBOARDDISPLAYFONTS 13925 . 19274)) (19385 20609 (DEFINEKEYBOARD +19395 . 20607)) (20610 24555 (VKBD.ADD-ITEM-TO-BACKGROUND-MENU 20620 . 21028) (VKBD.INIT 21030 . 22982 +) (VKBD.CREATE-DEFAULT-KEYBOARD 22984 . 23576) (VKBD.ADD-DEFAULT-KEYBOARD 23578 . 24553)) (24556 30484 + (VKBD.LOAD-FILE-COMMAND 24566 . 25020) (VKBD.LOAD-KEYBOARD-FILE 25022 . 28445) ( +VKBD.STORE-FILE-COMMAND 28447 . 28788) (VKBD.STORE-KEYBOARD-FILE 28790 . 30482)) (30485 39786 ( +SWITCHKEYBOARDS 30495 . 31973) (VKBD.POP-MENU-AND-SWITCH-KEYBOARDS 31975 . 32345) ( +VKBD.POP-UP-KEYBOARDS-MENU 32347 . 33729) (VKBD.GET-CONFIGURATION 33731 . 34649) ( +VKBD.SUBCONFIGURATION 34651 . 39784)) (39787 80072 (VKBD.BUTTONEVENTFN 39797 . 42704) ( +VKBD.CENTER-BITMAP-IN-REGION 42706 . 44230) (VKBD.CLEAR-KEY-DISPLAY 44232 . 46363) ( +VKBD.CREATE-KEYBOARD-BITMAP 46365 . 48409) (VKBD.CREATE-KEYBOARD-DISPLAY 48411 . 51540) ( +VKBD.CURSORMOVEDFN 51542 . 53446) (VKBD.DISPLAY-CHARACTER 53448 . 55406) (VKBD.DISPLAY-EMPTY-KEY-CAP +55408 . 65946) (VKBD.DISPLAY-KEY 65948 . 69155) (VKBD.DISPLAY-KEY-CHARACTERS 69157 . 70350) ( +VKBD.DRAW-KEY-CAPS 70352 . 72540) (VKBD.ERASE-FRAME 72542 . 72865) (VKBD.EXTEND-REGION 72867 . 73456) +(VKBD.GET-KEY-AND-REGIONS-OF-CURSOR-POSITION 73458 . 74073) (VKBD.GET-KEY-REGIONS 74075 . 74331) ( +VKBD.INVERT-KEY 74333 . 74623) (VKBD.INVERT-REGION 74625 . 75316) (VKBD.KEYBOARD-WINDOW-REPAINTFN +75318 . 77275) (VKBD.LOWER-HALF-REGION 77277 . 77677) (VKBD.POSITION-IS-IN-KEY-REGION 77679 . 77963) ( +VKBD.REMOVE-KEYBOARD-COMMAND 77965 . 78422) (VKBD.UNION-REGIONS 78424 . 79569) (VKBD.UPPER-HALF-REGION + 79571 . 80070)) (80073 99631 (VKBD.KEY-ASSOC 80083 . 80583) (VKBD.CHAR-ASSIGNMENTP 80585 . 80749) ( +VKBD.COMPLETE-KEYBOARD 80751 . 83410) (VKBD.CTRL-ASSIGNMENTP 83412 . 83655) (VKBD.EVENT-ASSIGNMENTP +83657 . 83897) (VKBD.META-ASSIGNMENTP 83899 . 84142) (VKBD.FRAME-KEY 84144 . 86021) ( +VKBD.GET-CURRENT-KEY-ASSIGNMENT 86023 . 86392) (VKBD.GET-NON-CHAR-LABEL 86394 . 87049) (VKBD.ICONFN +87051 . 87787) (VKBD.INVERT-LOCK-KEYS 87789 . 88467) (VKBD.INVERT-SHIFT-KEYS 88469 . 89151) ( +VKBD.TRANSLATE-KEY-ID 89153 . 89832) (VKBD.KEY-ID-TO-KEY-NAMES 89834 . 90320) ( +VKBD.KEYBOARD-IS-KEYBOARDTYPE-KEYBOARD 90322 . 90920) (VKBD.LOCK-ASSIGNMENTP 90922 . 91369) ( +VKBD.LOCK-KEYP 91371 . 91689) (VKBD.LOCK/NOLOCK 91691 . 91850) (VKBD.LOCKDOWN-ASSIGNMENTP 91852 . +92146) (VKBD.LOCKUP-ASSIGNMENTP 92148 . 92438) (VKBD.PARSE-CHAR-CODE 92440 . 92939) ( +VKBD.PARSE-KEY-ASSIGNMENT 92941 . 96397) (VKBD.RESET-KEYBOARD-WINDOW 96399 . 96992) ( +VKBD.SEND-CHARACTER 96994 . 98503) (VKBD.SHIFT-ASSIGNMENTP 98505 . 98899) (VKBD.SHIFTED-CHAR 98901 . +99059) (VKBD.UNDEFINE-KEYBOARD 99061 . 99468) (VKBD.UNSHIFTED-CHAR 99470 . 99629)) (112553 114999 ( +VKBD.\\KEYBOARDEVENTFN 112563 . 113766) (VKBD.RESETKEYACTIONTABLES 113768 . 114997)) (115105 121256 ( +NEWKEYACTION 115115 . 121254)) (121893 138081 (FIXKEYBOARD 121903 . 123023) (FIXKEYBOARDCONFIG 123025 + . 130249) (FIXKEYASSIGNMENTS 130251 . 138079)) (138168 140132 (METASHIFT 138178 . 140130))))) STOP diff --git a/library/virtualkeyboards/VIRTUALKEYBOARDS.LCOM b/library/virtualkeyboards/VIRTUALKEYBOARDS.LCOM new file mode 100644 index 00000000..f1d16886 Binary files /dev/null and b/library/virtualkeyboards/VIRTUALKEYBOARDS.LCOM differ diff --git a/library/VIRTUAL.TEDIT b/library/virtualkeyboards/VIRTUALKEYBOARDS.TEDIT similarity index 100% rename from library/VIRTUAL.TEDIT rename to library/virtualkeyboards/VIRTUALKEYBOARDS.TEDIT diff --git a/library/virtualkeyboards/XKEYBOARDS b/library/virtualkeyboards/XKEYBOARDS new file mode 100644 index 00000000..8442d293 Binary files /dev/null and b/library/virtualkeyboards/XKEYBOARDS differ diff --git a/lispusers/BITMAPFNS.LCOM b/lispusers/BITMAPFNS.LCOM index 78c2d74f..9d09d57e 100644 Binary files a/lispusers/BITMAPFNS.LCOM and b/lispusers/BITMAPFNS.LCOM differ diff --git a/lispusers/COMMON-MAKE b/lispusers/COMMON-MAKE index c3576f56..2b08b145 100644 --- a/lispusers/COMMON-MAKE +++ b/lispusers/COMMON-MAKE @@ -1,27 +1,26 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "11-Dec-87 14:48:16" {DSK}COMMON-MAKE.;5 15290 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (VARS COMMON-MAKECOMS) - (FNS COMMON-FILE-COMMAND COMMON-MAKEFILE) - (PROPS (COMMON-MAKE MAKEFILE-ENVIRONMENT)) +(FILECREATED "13-Oct-2023 16:40:48" {LU}COMMON-MAKE.;2 14315 - previous date%: "11-Dec-87 12:53:46" {DSK}COMMON-MAKE.;1) + :EDIT-BY "mth" + :CHANGES-TO (VARS COMMON-MAKECOMS) + + :PREVIOUS-DATE "11-Dec-87 14:48:16" {LU}COMMON-MAKE.;1) -(* " -Copyright (c) 1987 by Unisys Corp.. All rights reserved. -") (PRETTYCOMPRINT COMMON-MAKECOMS) -(RPAQQ COMMON-MAKECOMS ((* FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES) +(RPAQQ COMMON-MAKECOMS [ + (* ;; "FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES") + (FNS COMMON-FILE-COMMAND COMMON-MAKEFILE) (PROP MAKEFILE-ENVIRONMENT COMMON-MAKE) - (EDITHIST COMMON-MAKE))) + (DECLARE%: DONTCOPY (ALISTS (EDITHISTALIST COMMON-MAKE]) -(* FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES) +(* ;; "FUNCTIONS TO HANDLE WRITING STANDARD COMMONLISP SOURCE FILES") (DEFINEQ @@ -227,30 +226,20 @@ Copyright (c) 1987 by Unisys Corp.. All rights reserved. (CLOSEF *STANDARD-OUTPUT*]) ) -(PUTPROPS COMMON-MAKE MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) +(PUTPROPS COMMON-MAKE MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP")) (DECLARE%: DONTCOPY -(ADDTOVAR EDITHISTALIST (COMMON-MAKE ("11-Dec-87 12:54:22" DJVB {DSK}COMMON-MAKE.;1 - (COMMON-FILE-COMMAND COMMON-MAKEFILE)) - ("11-Dec-87 13:35:35" DJVB {DSK}COMMON-MAKE.;2 ( - COMMON-FILE-COMMAND - - COMMON-MAKEFILE - ) - (GETTING DETAILS RIGHT)) - ("11-Dec-87 13:40:48" DJVB {DSK}COMMON-MAKE.;3 ( - COMMON-FILE-COMMAND - )) - ("11-Dec-87 14:09:04" DJVB {DSK}COMMON-MAKE.;4 ( - COMMON-FILE-COMMAND - )) - ("11-Dec-87 14:48:44" DJVB {DSK}COMMON-MAKE.;5 ( - COMMON-FILE-COMMAND - ) - (FIXED FILE COMMENTS AND CL:DEFVAR ET AL)))) +(ADDTOVAR EDITHISTALIST + (COMMON-MAKE ("11-Dec-87 12:54:22" DJVB {DSK}COMMON-MAKE.;1 (COMMON-FILE-COMMAND + COMMON-MAKEFILE)) + ("11-Dec-87 13:35:35" DJVB {DSK}COMMON-MAKE.;2 (COMMON-FILE-COMMAND + COMMON-MAKEFILE) + (GETTING DETAILS RIGHT)) + ("11-Dec-87 13:40:48" DJVB {DSK}COMMON-MAKE.;3 (COMMON-FILE-COMMAND)) + ("11-Dec-87 14:09:04" DJVB {DSK}COMMON-MAKE.;4 (COMMON-FILE-COMMAND)) + ("11-Dec-87 14:48:44" DJVB {DSK}COMMON-MAKE.;5 (COMMON-FILE-COMMAND) + (FIXED FILE COMMENTS AND CL:DEFVAR ET AL)))) ) -(PUTPROPS COMMON-MAKE COPYRIGHT ("Unisys Corp." 1987)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (829 13460 (COMMON-FILE-COMMAND 839 . 9055) (COMMON-MAKEFILE 9057 . 13458))))) + (FILEMAP (NIL (722 13353 (COMMON-FILE-COMMAND 732 . 8948) (COMMON-MAKEFILE 8950 . 13351))))) STOP - \ No newline at end of file diff --git a/lispusers/COMMON-MAKE.LCOM b/lispusers/COMMON-MAKE.LCOM new file mode 100644 index 00000000..75503d98 Binary files /dev/null and b/lispusers/COMMON-MAKE.LCOM differ diff --git a/lispusers/GITFNS b/lispusers/GITFNS index 0dbc6b1b..29ea33db 100644 --- a/lispusers/GITFNS +++ b/lispusers/GITFNS @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "30-Mar-2023 09:08:48" {WMEDLEY}GITFNS.;469 119763 +(FILECREATED " 1-Oct-2023 19:33:26" {WMEDLEY}GITFNS.;489 124166 + + :EDIT-BY rmk :CHANGES-TO (FNS GIT-MAKE-PROJECT) - :PREVIOUS-DATE "11-Mar-2023 23:12:35" {WMEDLEY}GITFNS.;468) + :PREVIOUS-DATE " 1-Oct-2023 19:27:42" {WMEDLEY}GITFNS.;488) (PRETTYCOMPRINT GITFNSCOMS) @@ -14,7 +16,7 @@ (* ;; "Set up") (FILES (SYSLOAD FROM LISPUSERS) - COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS) + COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS UNIXUTILS) (* ;; "") @@ -47,6 +49,7 @@ (INITVARS (GIT-MERGE-COMPARES T) (GIT-CDBROWSER-SEPARATE-DIRECTIONS T)) (COMMANDS gwc bbc prc cob b? cdg cdw) + (FNS PRC-COMMAND) (* ;; "") @@ -65,7 +68,7 @@ (FNS GIT-COMMIT GIT-PUSH GIT-PULL GIT-APPROVAL GIT-GET-FILE GIT-FILE-EXISTS? GIT-REMOTE-UPDATE GIT-REMOTE-ADD GIT-FILE-DATE GIT-FILE-HISTORY GIT-PRINT-FILE-HISTORY - GIT-FETCH) + GIT-FETCH GIT-PR-BRANCHES) (* ;; "Differences") @@ -77,8 +80,8 @@ (* ;; "Branches") (FNS GIT-BRANCH-NUM GIT-CHECKOUT GIT-WHICH-BRANCH GIT-MAKE-BRANCH GIT-BRANCHES - GIT-BRANCH-EXISTS? GIT-PICK-BRANCH GIT-PRC-MENU GIT-PULL-REQUESTS GIT-SHORT-BRANCH-NAME - GIT-LONG-NAME) + GIT-BRANCH-EXISTS? GIT-PICK-BRANCH GIT-BRANCH-MENU GIT-PULL-REQUESTS + GIT-SHORT-BRANCH-NAME GIT-LONG-NAME GIT-PRC-BRANCHES) (* ;; "My branches") @@ -98,7 +101,7 @@ (FNS GIT-GET-DIFFERENT-FILES GIT-BRANCHES-COMPARE-DIRECTORIES GIT-WORKING-COMPARE-DIRECTORIES GIT-COMPARE-WORKTREE GITCDOBJBUTTONFN GIT-CD-LABELFN GIT-CD-MENUFN - GIT-WORKING-COMPARE-FILES GIT-BRANCHES-COMPARE-FILES) + GIT-WORKING-COMPARE-FILES GIT-BRANCHES-COMPARE-FILES GIT-PR-COMPARE) (INITVARS (FROMGITN 0)) (* ;; "") @@ -106,8 +109,8 @@ (* ;; "Utilities") - (FNS CDGITDIR GIT-COMMAND GITORIGIN GIT-INITIALS GIT-COMMAND-TO-FILE PROCESS-COMMAND - GIT-RESULT-TO-LINES STRIPLOCAL) + (FNS CDGITDIR GIT-COMMAND GITORIGIN GIT-INITIALS GIT-COMMAND-TO-FILE GIT-RESULT-TO-LINES + STRIPLOCAL) (PROPS (GITFNS FILETYPE)))) @@ -116,7 +119,7 @@ (FILESLOAD (SYSLOAD FROM LISPUSERS) - COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS) + COMPAREDIRECTORIES COMPARESOURCES COMPARETEXT PSEUDOHOSTS UNIXUTILS) @@ -130,15 +133,15 @@ (DEFINEQ (GIT-CLONEP - [LAMBDA (HOST/DIR NOERROR CHECKANCESTORS) (* ; "Edited 12-May-2022 11:44 by rmk") + [LAMBDA (HOST/DIR NOERROR CHECKANCESTORS) (* ; "Edited 1-Oct-2023 18:09 by rmk") + (* ; "Edited 12-May-2022 11:44 by rmk") (* ; "Edited 8-May-2022 16:24 by rmk") (* ;; "If CHECKANCESTORS, looks back up the directory chain to see if perhaps the .git is somewhere higher up.") - (IF [AND HOST/DIR (LET ((D (SLASHIT (TRUEFILENAME (PACKFILENAME.STRING 'BODY HOST/DIR + (IF [AND HOST/DIR (LET [(D (SLASHIT (TRUEFILENAME (PACKFILENAME.STRING 'BODY HOST/DIR 'HOST - 'DSK)) - T))) + 'DSK] (IF (DIRECTORYNAMEP (CONCAT D "/.git/")) THEN D ELSEIF (AND CHECKANCESTORS (FIND-ANCESTOR-DIRECTORY @@ -164,6 +167,7 @@ (GIT-MAKE-PROJECT [LAMBDA (PROJECTNAME CLONEPATH WORKINGPATH EXCLUSIONS DEFAULTSUBDIRS) + (* ; "Edited 1-Oct-2023 19:33 by rmk") (* ; "Edited 30-Mar-2023 09:06 by rmk") (* ; "Edited 5-Feb-2023 12:43 by rmk") (* ; "Edited 1-Feb-2023 16:55 by rmk") @@ -205,7 +209,7 @@ (GIT-CLONEP (MEDLEYDIR (L-CASE PROJECTNAME) NIL NIL T) T) - (GIT-CLONEP (MEDLEYDIR (CONCAT "../" PROJECTNAME) + (GIT-CLONEP (MEDLEYDIR (CONCAT "../" (L-CASE PROJECTNAME)) NIL NIL T) T) (GIT-CLONEP (DIRECTORYNAME (CONCAT MEDLEYDIR "../git-" (L-CASE @@ -216,12 +220,11 @@ (ERROR (CONCAT "Can't find a clone directory for " PROJECTNAME)) (PRINTOUT T "Note: Can't find a clone directory for " PROJECTNAME T))) - elseif (GIT-CLONEP (SLASHIT (PACKFILENAME 'HOST 'DSK 'DIRECTORY + elseif (GIT-CLONEP [SLASHIT (PACKFILENAME 'HOST 'DSK 'DIRECTORY (UNPACKFILENAME.STRING (TRUEFILENAME CLONEPATH) 'DIRECTORY - 'RETURN)) - T) + 'RETURN] T T) else (ERROR (CONCAT "Can't find the clone directory " CLONEPATH " for " PROJECTNAME] @@ -262,7 +265,7 @@ (DIRECTORYNAME (TRUEFILENAME WORKINGPATH) T))) [SETQ WORKINGPATH (if WP - then (UNSLASHIT WP T) + then (UNSLASHIT WP) elseif WORKINGPATH then (ERROR (CONCAT "Can't find the working directory " (AND (EQ WORKINGPATH T) @@ -314,7 +317,8 @@ PROJECT))]) (GIT-PUT-PROJECT-FIELD - [LAMBDA (PROJECT FIELD NEWVALUE) (* ; "Edited 11-Mar-2023 23:00 by rmk") + [LAMBDA (PROJECT FIELD NEWVALUE) (* ; "Edited 10-Jun-2023 21:48 by rmk") + (* ; "Edited 11-Mar-2023 23:00 by rmk") (* ; "Edited 7-Jul-2022 11:25 by rmk") (* ; "Edited 13-May-2022 10:40 by rmk") (* ; "Edited 9-May-2022 20:02 by rmk") @@ -322,24 +326,17 @@ (* ;; "Replaces the value of a project field with NEWVALUE. The project record is DONTCOPY, to avoid potential name conflicts, so this provides a functional interface. One use: augment EXCLUSIONS with a list of temporary debug and testing files that you don't want to see in the various file listings") - (CL:WHEN (SETQ PROJECT (IF (TYPE? GIT-PROJECT PROJECT) - THEN PROJECT - ELSEIF (CDR (ASSOC (OR (U-CASE PROJECT) - GIT-DEFAULT-PROJECT) - GIT-PROJECTS)) - ELSEIF NOERROR - THEN NIL - ELSE (ERROR "NOT A GIT-PROJECT" PROJECT))) - (SELECTQ FIELD - (PROJECTNAME (REPLACE PROJECTNAME OF PROJECT WITH NEWVALUE)) - (WHOST (REPLACE WHOST OF PROJECT WITH NEWVALUE)) - (GITHOST (REPLACE GITHOST OF PROJECT WITH NEWVALUE)) - (EXCLUSIONS (REPLACE EXCLUSIONS OF PROJECT WITH NEWVALUE)) - (DEFAULTSUBDIRS - (REPLACE DEFAULTSUBDIRS OF PROJECT WITH NEWVALUE)) - (CLONEPATH (REPLACE CLONEPATH OF PROJECT WITH NEWVALUE)) - (MAINBRANCH (REPLACE MAINBRANCH OF PROJECT WITH NEWVALUE)) - PROJECT))]) + (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + (SELECTQ FIELD + (PROJECTNAME (REPLACE PROJECTNAME OF PROJECT WITH NEWVALUE)) + (WHOST (REPLACE WHOST OF PROJECT WITH NEWVALUE)) + (GITHOST (REPLACE GITHOST OF PROJECT WITH NEWVALUE)) + (EXCLUSIONS (REPLACE EXCLUSIONS OF PROJECT WITH NEWVALUE)) + (DEFAULTSUBDIRS + (REPLACE DEFAULTSUBDIRS OF PROJECT WITH NEWVALUE)) + (CLONEPATH (REPLACE CLONEPATH OF PROJECT WITH NEWVALUE)) + (MAINBRANCH (REPLACE MAINBRANCH OF PROJECT WITH NEWVALUE)) + PROJECT]) (GIT-PROJECT-PATH [LAMBDA (PROJECTNAME PROJECTPATH) (* ; "Edited 8-May-2022 15:10 by rmk") @@ -478,29 +475,7 @@ (* ;; "Compares REMOTEBRANCH against the main orign branch, for pull-request assessment") - (LET ((RB REMOTEBRANCH) - (DR DRAFTS) - (PRS)) - (IF PROJECT - THEN (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) - ELSEIF (GIT-GET-PROJECT RB NIL T) - THEN (SETQ PROJECT RB) - (SETQ RB NIL) - ELSEIF (GIT-GET-PROJECT DRAFTS NIL T) - THEN (SETQ PROJECT DRAFTS) - (SETQ DRFTS NIL)) - (CL:WHEN (MEMB (U-CASE RB) - '(DRAFT DRAFTS)) - (SETQ RB NIL) - (SETQ DR T)) - (GIT-FETCH PROJECT) - (SETQ PRS (GIT-PULL-REQUESTS T DR PROJECT)) - (IF PRS - THEN (CL:WHEN (OR RB (SETQ RB (GIT-PICK-BRANCH (GIT-PRC-MENU DR PROJECT PRS) - "Pull requests"))) - (GIT-BRANCHES-COMPARE-DIRECTORIES (GIT-MAINBRANCH PROJECT) - RB NIL PROJECT)) - ELSE "No open pull requests"))) + (PRC-COMMAND REMOTEBRANCH DRAFTS PROJECT)) (DEFCOMMAND cob (BRANCH NEXTTITLESTRING PROJECT) @@ -553,6 +528,46 @@ (SLASHIT (/CNDIR (CONCAT (GIT-GET-PROJECT PROJECT 'WHOST) (OR SUBDIR ""))) T)) +(DEFINEQ + +(PRC-COMMAND + [LAMBDA (REMOTEBRANCH DRAFTS PROJECT) (* ; "Edited 28-Jul-2023 09:03 by rmk") + (LET (PRS PRMENU) + (IF PROJECT + THEN (SETQ PROJECT (GIT-GET-PROJECT PROJECT)) + ELSEIF (GIT-GET-PROJECT REMOTEBRANCH NIL T) + THEN (SETQ PROJECT REMOTEBRANCH) + (SETQ REMOTEBRANCH NIL) + ELSEIF (GIT-GET-PROJECT DRAFTS NIL T) + THEN (SETQ PROJECT DRAFTS) + (SETQ DRAFTS NIL)) + (CL:WHEN (MEMB (U-CASE REMOTEBRANCH) + '(DRAFT DRAFTS)) + (SETQ REMOTEBRANCH NIL) + (SETQ DRAFTS T)) + (GIT-FETCH PROJECT) + (SETQ PRS (GIT-PULL-REQUESTS T DRAFTS PROJECT)) + (CL:WHEN (AND REMOTEBRANCH (NEQ REMOTEBRANCH 'PinMenu)) + (for PR in PRS when (OR (STRPOS REMOTEBRANCH (fetch PRDESCRIPTION of PR) + NIL NIL NIL NIL FILEDIRCASEARRAY) + (STRPOS REMOTEBRANCH (fetch PRNAME of PR) + NIL NIL NIL NIL FILEDIRCASEARRAY)) collect PR + finally (CL:WHEN $$VAL (SETQ PRS $$VAL)) + (SETQ REMOTEBRANCH NIL))) + (IF PRS + THEN (CL:UNLESS REMOTEBRANCH + (SETQ PRS (GIT-PRC-BRANCHES DRAFTS PROJECT PRS)) + (SETQ PRMENU (GIT-BRANCH-MENU PRS (CONCAT (LENGTH PRS) + " pull requests") + NIL)) + (SETQ REMOTEBRANCH (MENU PRMENU))) + (if (EQ 'PinMenu REMOTEBRANCH) + then (ADDMENU (GIT-BRANCH-MENU PRS (CONCAT (LENGTH PRS) + " pull requests"))) + elseif REMOTEBRANCH + then (GIT-PR-COMPARE REMOTEBRANCH PROJECT)) + ELSE "No open pull requests"]) +) @@ -1004,6 +1019,35 @@ (GIT-FETCH [LAMBDA (PROJECT) (* ; "Edited 8-Jul-2022 10:32 by rmk") (GIT-COMMAND "git fetch" T NIL PROJECT]) + +(GIT-PR-BRANCHES + [LAMBDA (DRAFT PROJECT PRS) (* ; "Edited 8-Aug-2022 18:15 by rmk") + (* ; "Edited 4-Aug-2022 18:55 by rmk") + (* ; "Edited 9-Jul-2022 19:01 by rmk") + (* ; "Edited 16-May-2022 19:44 by rmk") + (CL:UNLESS PRS + (SETQ PRS (GIT-PULL-REQUESTS T DRAFT PROJECT))) + (CL:WHEN PRS + (LET ((RELATIONS (GIT-BRANCH-RELATIONS (FOR PR IN PRS COLLECT (GITORIGIN (CADDR PR))) + NIL T PROJECT))) + (SORT [FOR PR REL LABEL PRNAME (SUPERSETS _ (CAR RELATIONS)) + (EQUALS _ (CADR RELATIONS)) IN PRS + COLLECT (SETQ PRNAME (fetch PRNAME of PR)) + (SETQ LABEL (CONCAT "#" (fetch (PULLREQUEST PRNUMBER) of PR) + " " + (IF [SETQ REL (CAR (CDR (SASSOC PRNAME SUPERSETS] + THEN (CONCAT PRNAME " > " REL) + ELSEIF [SETQ REL (CAR (CDR (SASSOC PRNAME EQUALS] + THEN (CONCAT PRNAME " = " REL) + ELSE PRNAME))) + (LIST (CL:IF (EQ 'DRAFT (FETCH PRSTATUS OF PR)) + (CONCAT LABEL " (draft)") + LABEL) + (GITORIGIN PRNAME) + (CONCAT " " (FETCH PRDESCRIPTION OF PR) + " #" + (FETCH PRNUMBER OF PR] + T)))]) ) @@ -1321,41 +1365,24 @@ THEN (ERROR "Unknown branch" BRANCH]) (GIT-PICK-BRANCH - [LAMBDA (BRANCHES TITLE) (* ; "Edited 18-May-2022 13:44 by rmk") - (CL:WHEN (MKLIST BRANCHES) - (MENU (CREATE MENU - TITLE _ (OR TITLE 'Branches) - ITEMS _ BRANCHES - MENUFONT _ DEFAULTFONT)))]) + [LAMBDA (BRANCHES TITLE) (* ; "Edited 6-Jul-2023 22:31 by rmk") + (* ; "Edited 30-Jun-2023 16:58 by rmk") + (* ; "Edited 18-May-2022 13:44 by rmk") + (MENU (GIT-BRANCH-MENU BRANCHES (OR TITLE (CONCAT (LENGTH BRANCHES) + " branches"]) -(GIT-PRC-MENU - [LAMBDA (DRAFT PROJECT PRS) (* ; "Edited 8-Aug-2022 18:15 by rmk") - (* ; "Edited 4-Aug-2022 18:55 by rmk") - (* ; "Edited 9-Jul-2022 19:01 by rmk") - (* ; "Edited 16-May-2022 19:44 by rmk") - (CL:UNLESS PRS - (SETQ PRS (GIT-PULL-REQUESTS T DRAFT PROJECT))) - (CL:WHEN PRS - (LET ((RELATIONS (GIT-BRANCH-RELATIONS (FOR PR IN PRS COLLECT (GITORIGIN (CADDR PR))) - NIL T PROJECT))) - (SORT [FOR PR REL LABEL PRNAME (SUPERSETS _ (CAR RELATIONS)) - (EQUALS _ (CADR RELATIONS)) IN PRS - COLLECT (SETQ PRNAME (fetch PRNAME of PR)) - (SETQ LABEL (CONCAT "#" (fetch (PULLREQUEST PRNUMBER) of PR) - " " - (IF [SETQ REL (CAR (CDR (SASSOC PRNAME SUPERSETS] - THEN (CONCAT PRNAME " > " REL) - ELSEIF [SETQ REL (CAR (CDR (SASSOC PRNAME EQUALS] - THEN (CONCAT PRNAME " = " REL) - ELSE PRNAME))) - (LIST (CL:IF (EQ 'DRAFT (FETCH PRSTATUS OF PR)) - (CONCAT LABEL " (draft)") - LABEL) - (GITORIGIN PRNAME) - (CONCAT " " (FETCH PRDESCRIPTION OF PR) - " #" - (FETCH PRNUMBER OF PR] - T)))]) +(GIT-BRANCH-MENU + [LAMBDA (BRANCHES TITLE PIN?) (* ; "Edited 6-Jul-2023 22:31 by rmk") + (* ; "Edited 30-Jun-2023 16:58 by rmk") + (* ; "Edited 18-May-2022 13:44 by rmk") + (CL:WHEN (SETQ BRANCHES (MKLIST BRANCHES)) + (CL:WHEN PIN? + [SETQ BRANCHES (APPEND BRANCHES '((" Pin menu" 'PinMenu]) + (CREATE MENU + TITLE _ (OR TITLE (CONCAT (LENGTH BRANCHES) + " branches")) + ITEMS _ BRANCHES + MENUFONT _ DEFAULTFONT))]) (GIT-PULL-REQUESTS [LAMBDA (ALLINFO INCLUDEDRAFTS PROJECT) (* ; "Edited 8-Aug-2022 13:12 by rmk") @@ -1402,6 +1429,35 @@ (* ;; "Allows short-hand reference to branch: rmk40 will return rmk40--xyz") (FIND B IN (GIT-BRANCHES WHERE PROJECT EXCLUDEMERGED) SUCHTHAT (STRPOS BRANCH B]) + +(GIT-PRC-BRANCHES + [LAMBDA (DRAFT PROJECT PRS) (* ; "Edited 8-Aug-2022 18:15 by rmk") + (* ; "Edited 4-Aug-2022 18:55 by rmk") + (* ; "Edited 9-Jul-2022 19:01 by rmk") + (* ; "Edited 16-May-2022 19:44 by rmk") + (CL:UNLESS PRS + (SETQ PRS (GIT-PULL-REQUESTS T DRAFT PROJECT))) + (CL:WHEN PRS + (LET ((RELATIONS (GIT-BRANCH-RELATIONS (FOR PR IN PRS COLLECT (GITORIGIN (CADDR PR))) + NIL T PROJECT))) + (SORT [FOR PR REL LABEL PRNAME (SUPERSETS _ (CAR RELATIONS)) + (EQUALS _ (CADR RELATIONS)) IN PRS + COLLECT (SETQ PRNAME (fetch PRNAME of PR)) + (SETQ LABEL (CONCAT "#" (fetch (PULLREQUEST PRNUMBER) of PR) + " " + (IF [SETQ REL (CAR (CDR (SASSOC PRNAME SUPERSETS] + THEN (CONCAT PRNAME " > " REL) + ELSEIF [SETQ REL (CAR (CDR (SASSOC PRNAME EQUALS] + THEN (CONCAT PRNAME " = " REL) + ELSE PRNAME))) + (LIST (CL:IF (EQ 'DRAFT (FETCH PRSTATUS OF PR)) + (CONCAT LABEL " (draft)") + LABEL) + (GITORIGIN PRNAME) + (CONCAT " " (FETCH PRDESCRIPTION OF PR) + " #" + (FETCH PRNUMBER OF PR] + T)))]) ) @@ -1664,7 +1720,9 @@ (LIST DIR1 DIR2 MAPPINGS))]) (GIT-BRANCHES-COMPARE-DIRECTORIES - [LAMBDA (BRANCH1 BRANCH2 LOCAL PROJECT) (* ; "Edited 12-Sep-2022 14:41 by rmk") + [LAMBDA (BRANCH1 BRANCH2 LOCAL PROJECT) (* ; "Edited 26-Sep-2023 22:40 by rmk") + (* ; "Edited 10-Jun-2023 17:28 by rmk") + (* ; "Edited 12-Sep-2022 14:41 by rmk") (* ; "Edited 20-Jul-2022 21:18 by rmk") (* ; "Edited 22-May-2022 22:47 by rmk") (* ; "Edited 9-May-2022 15:14 by rmk") @@ -1683,10 +1741,11 @@ (SETQ MAPPINGS (CADDR DIRS)) (IF DIRS THEN (TERPRI T) - (SETQ CDVALUE (COMPAREDIRECTORIES (CAR DIRS) + [SETQ CDVALUE (COMPAREDIRECTORIES (CAR DIRS) (CADR DIRS) '(> < ~= -* *-) - '*>*.*)) + '*>*.* + (GIT-GET-PROJECT PROJECT 'EXCLUSIONS] (* ;; "We know that both sides come from Unix/unversioned, even if they have been copied into versioned FROMGIT, so we make a pass to remove the misleading versions.") @@ -1733,10 +1792,9 @@ (TERPRI T) (IF (FETCH (CDVALUE CDENTRIES) OF CDVALUE) THEN (SETQ LAST-BRANCH-CDVALUE CDVALUE) - (CDBROWSER CDVALUE (CONCAT "Comparing " (L-CASE (FETCH PROJECTNAME - OF PROJECT) - T) - " " SHORT1 " and " SHORT2 " " + (CDBROWSER CDVALUE (CONCAT (L-CASE (FETCH PROJECTNAME OF PROJECT) + T) + " " SHORT1 " vs " SHORT2 " " (LENGTH (FETCH (CDVALUE CDENTRIES) OF CDVALUE)) " files") (LIST SHORT1 SHORT2) @@ -1754,6 +1812,12 @@ (GIT-WORKING-COMPARE-DIRECTORIES [LAMBDA (SUBDIRS SELECT EXCLUDEDFILES FIXDIRECTORYDATES UPDATE PROJECT) + (* ;; "Edited 26-Sep-2023 22:41 by rmk") + + (* ;; "Edited 17-Jun-2023 22:54 by rmk") + + (* ;; "Edited 10-Jun-2023 21:32 by rmk") + (* ;; "Edited 20-Jul-2022 21:18 by rmk") (* ;; "Edited 25-Jun-2022 21:37 by rmk") @@ -1793,7 +1857,13 @@ (GITSUBDIR SUBDIR T PROJECT) (OR SELECT '(> < ~= -* *-)) NIL - (FETCH EXCLUSIONS OF PROJECT) + (for E DPOS in (GIT-GET-PROJECT PROJECT 'EXCLUSIONS) + collect (SETQ DPOS (STRPOS SUBDIR (FILENAMEFIELD E + 'DIRECTORY) + 1 NIL T T FILEDIRCASEARRAY)) + (CL:IF DPOS + (SUBSTRING E (ADD1 DPOS)) + E)) NIL NIL NIL FIXDIRECTORYDATES)) [FOR CDE IN (FETCH CDENTRIES OF CDVAL) DO (CL:WHEN (FETCH INFO1 OF CDE) @@ -1812,9 +1882,8 @@ (SETQ $$VAL (CDMERGE $$VAL)) [SETQ SUBDIRS (CONCATLIST (FOR SUBDIR IN SUBDIRS COLLECT (CONCAT SUBDIR " "]) [FOR CDVAL TITLE IN $$VAL AS SUBDIR INSIDE SUBDIRS - DO (SETQ TITLE (CONCAT "Comparing " WPROJ " and " BRANCH2 " " SUBDIR - " " (LENGTH (fetch (CDVALUE CDENTRIES) - of CDVAL)) + DO (SETQ TITLE (CONCAT WPROJ " vs. " BRANCH2 " " SUBDIR " " + (LENGTH (fetch (CDVALUE CDENTRIES) of CDVAL)) " files")) [CDBROWSER CDVAL TITLE `(,WPROJ ,BRANCH2) `(BRANCH1 ,WPROJ BRANCH2 ,BRANCH2 SUBDIR ,SUBDIR LABELFN @@ -2067,6 +2136,11 @@ " " FILE) (CONCAT (GIT-SHORT-BRANCH-NAME BRANCH2) " " FILE]) + +(GIT-PR-COMPARE + [LAMBDA (RB PROJECT) (* ; "Edited 6-Jul-2023 22:22 by rmk") + (GIT-BRANCHES-COMPARE-DIRECTORIES (GIT-MAINBRANCH PROJECT) + RB NIL PROJECT]) ) (RPAQ? FROMGITN 0) @@ -2083,11 +2157,13 @@ (DEFINEQ (CDGITDIR - [LAMBDA (PROJECT) (* ; "Edited 8-Jul-2022 10:34 by rmk") + [LAMBDA (PROJECT) (* ; "Edited 23-Sep-2023 13:01 by rmk") + (* ; "Edited 8-Jul-2022 10:34 by rmk") (* ; "Edited 7-Jul-2022 09:36 by rmk") (* ; "Edited 7-May-2022 22:41 by rmk") (* ; "Edited 2-Nov-2021 21:12 by rmk:") - (CONCAT "cd " [SLASHIT (STRIPHOST (TRUEFILENAME (FETCH GITHOST OF PROJECT] + (CONCAT "cd " (SLASHIT (TRUEFILENAME (FETCH GITHOST OF PROJECT)) + NIL T) " && "]) (GIT-COMMAND @@ -2198,16 +2274,6 @@ (ERROR (CONCAT "Command failed: " CMD))) NIL]) -(PROCESS-COMMAND - [LAMBDA (CMD) (* ; "Edited 17-Jul-2022 08:17 by rmk") - - (* ;; "This sets up an asynchronous process and waits until it returns with an exit code. Typically 0 means success.") - - (CL:WITH-OPEN-STREAM (PS (CREATE-PROCESS-STREAM CMD)) - (BIND CODE WHILE (EQ T (SETQ CODE (OR (SUBRCALL UNIX-HANDLECOMM 7 (fetch (STREAM F1) - of PS)) - 0))) DO (BLOCK) FINALLY (RETURN CODE]) - (GIT-RESULT-TO-LINES [LAMBDA (FILE ALL) (* ; "Edited 16-Jul-2022 22:21 by rmk") @@ -2234,32 +2300,33 @@ (PUTPROPS GITFNS FILETYPE :TCOMPL) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3979 20805 (GIT-CLONEP 3989 . 5252) (GIT-INIT 5254 . 5884) (GIT-MAKE-PROJECT 5886 . -13487) (GIT-GET-PROJECT 13489 . 15414) (GIT-PUT-PROJECT-FIELD 15416 . 17433) (GIT-PROJECT-PATH 17435 - . 18479) (FIND-ANCESTOR-DIRECTORY 18481 . 18830) (GIT-FIND-CLONE 18832 . 19913) (GIT-MAINBRANCH 19915 - . 20310) (GIT-MAINBRANCH? 20312 . 20803)) (27232 30020 (ALLSUBDIRS 27242 . 28528) (MEDLEYSUBDIRS -28530 . 29223) (GITSUBDIRS 29225 . 30018)) (30021 34811 (TOGIT 30031 . 31437) (FROMGIT 31439 . 32420) -(GIT-DELETE-FILE 32422 . 33268) (MYMEDLEY-DELETE-FILES 33270 . 34809)) (34812 37815 (MYMEDLEYSUBDIR -34822 . 35278) (GITSUBDIR 35280 . 35723) (STRIPDIR 35725 . 36096) (STRIPHOST 36098 . 36338) (STRIPNAME - 36340 . 37093) (STRIPWHERE 37095 . 37813)) (37816 39718 (GFILE4MFILE 37826 . 38189) (MFILE4GFILE -38191 . 38760) (GIT-REPO-FILENAME 38762 . 39716)) (39767 49589 (GIT-COMMIT 39777 . 40603) (GIT-PUSH -40605 . 41249) (GIT-PULL 41251 . 41863) (GIT-APPROVAL 41865 . 42214) (GIT-GET-FILE 42216 . 44181) ( -GIT-FILE-EXISTS? 44183 . 44457) (GIT-REMOTE-UPDATE 44459 . 45183) (GIT-REMOTE-ADD 45185 . 45492) ( -GIT-FILE-DATE 45494 . 46425) (GIT-FILE-HISTORY 46427 . 48361) (GIT-PRINT-FILE-HISTORY 48363 . 49413) ( -GIT-FETCH 49415 . 49587)) (49619 60212 (GIT-BRANCH-DIFF 49629 . 55969) (GIT-COMMIT-DIFFS 55971 . 56524 -) (GIT-BRANCH-RELATIONS 56526 . 60210)) (60257 72489 (GIT-BRANCH-NUM 60267 . 60840) (GIT-CHECKOUT -60842 . 61901) (GIT-WHICH-BRANCH 61903 . 62201) (GIT-MAKE-BRANCH 62203 . 64416) (GIT-BRANCHES 64418 . -66686) (GIT-BRANCH-EXISTS? 66688 . 67392) (GIT-PICK-BRANCH 67394 . 67722) (GIT-PRC-MENU 67724 . 69727) - (GIT-PULL-REQUESTS 69729 . 71875) (GIT-SHORT-BRANCH-NAME 71877 . 72168) (GIT-LONG-NAME 72170 . 72487) -) (72519 75854 (GIT-MY-CURRENT-BRANCH 72529 . 72899) (GIT-MY-BRANCHP 72901 . 73406) ( -GIT-MY-NEXT-BRANCH 73408 . 73902) (GIT-MY-BRANCHES 73904 . 75852)) (75900 79852 (GIT-ADD-WORKTREE -75910 . 77394) (GIT-REMOVE-WORKTREE 77396 . 78326) (GIT-LIST-WORKTREES 78328 . 79132) (WORKTREEDIR -79134 . 79850)) (79900 111109 (GIT-GET-DIFFERENT-FILES 79910 . 86334) ( -GIT-BRANCHES-COMPARE-DIRECTORIES 86336 . 92493) (GIT-WORKING-COMPARE-DIRECTORIES 92495 . 97321) ( -GIT-COMPARE-WORKTREE 97323 . 101301) (GITCDOBJBUTTONFN 101303 . 105793) (GIT-CD-LABELFN 105795 . -106877) (GIT-CD-MENUFN 106879 . 109319) (GIT-WORKING-COMPARE-FILES 109321 . 109941) ( -GIT-BRANCHES-COMPARE-FILES 109943 . 111107)) (111179 119696 (CDGITDIR 111189 . 111749) (GIT-COMMAND -111751 . 113309) (GITORIGIN 113311 . 114008) (GIT-INITIALS 114010 . 114314) (GIT-COMMAND-TO-FILE -114316 . 117805) (PROCESS-COMMAND 117807 . 118420) (GIT-RESULT-TO-LINES 118422 . 119029) (STRIPLOCAL -119031 . 119694))))) + (FILEMAP (NIL (4081 20660 (GIT-CLONEP 4091 . 5419) (GIT-INIT 5421 . 6051) (GIT-MAKE-PROJECT 6053 . +13718) (GIT-GET-PROJECT 13720 . 15645) (GIT-PUT-PROJECT-FIELD 15647 . 17288) (GIT-PROJECT-PATH 17290 + . 18334) (FIND-ANCESTOR-DIRECTORY 18336 . 18685) (GIT-FIND-CLONE 18687 . 19768) (GIT-MAINBRANCH 19770 + . 20165) (GIT-MAINBRANCH? 20167 . 20658)) (26068 28195 (PRC-COMMAND 26078 . 28193)) (28251 31039 ( +ALLSUBDIRS 28261 . 29547) (MEDLEYSUBDIRS 29549 . 30242) (GITSUBDIRS 30244 . 31037)) (31040 35830 ( +TOGIT 31050 . 32456) (FROMGIT 32458 . 33439) (GIT-DELETE-FILE 33441 . 34287) (MYMEDLEY-DELETE-FILES +34289 . 35828)) (35831 38834 (MYMEDLEYSUBDIR 35841 . 36297) (GITSUBDIR 36299 . 36742) (STRIPDIR 36744 + . 37115) (STRIPHOST 37117 . 37357) (STRIPNAME 37359 . 38112) (STRIPWHERE 38114 . 38832)) (38835 40737 + (GFILE4MFILE 38845 . 39208) (MFILE4GFILE 39210 . 39779) (GIT-REPO-FILENAME 39781 . 40735)) (40786 +52616 (GIT-COMMIT 40796 . 41622) (GIT-PUSH 41624 . 42268) (GIT-PULL 42270 . 42882) (GIT-APPROVAL 42884 + . 43233) (GIT-GET-FILE 43235 . 45200) (GIT-FILE-EXISTS? 45202 . 45476) (GIT-REMOTE-UPDATE 45478 . +46202) (GIT-REMOTE-ADD 46204 . 46511) (GIT-FILE-DATE 46513 . 47444) (GIT-FILE-HISTORY 47446 . 49380) ( +GIT-PRINT-FILE-HISTORY 49382 . 50432) (GIT-FETCH 50434 . 50606) (GIT-PR-BRANCHES 50608 . 52614)) ( +52646 63239 (GIT-BRANCH-DIFF 52656 . 58996) (GIT-COMMIT-DIFFS 58998 . 59551) (GIT-BRANCH-RELATIONS +59553 . 63237)) (63284 76387 (GIT-BRANCH-NUM 63294 . 63867) (GIT-CHECKOUT 63869 . 64928) ( +GIT-WHICH-BRANCH 64930 . 65228) (GIT-MAKE-BRANCH 65230 . 67443) (GIT-BRANCHES 67445 . 69713) ( +GIT-BRANCH-EXISTS? 69715 . 70419) (GIT-PICK-BRANCH 70421 . 70911) (GIT-BRANCH-MENU 70913 . 71616) ( +GIT-PULL-REQUESTS 71618 . 73764) (GIT-SHORT-BRANCH-NAME 73766 . 74057) (GIT-LONG-NAME 74059 . 74376) ( +GIT-PRC-BRANCHES 74378 . 76385)) (76417 79752 (GIT-MY-CURRENT-BRANCH 76427 . 76797) (GIT-MY-BRANCHP +76799 . 77304) (GIT-MY-NEXT-BRANCH 77306 . 77800) (GIT-MY-BRANCHES 77802 . 79750)) (79798 83750 ( +GIT-ADD-WORKTREE 79808 . 81292) (GIT-REMOVE-WORKTREE 81294 . 82224) (GIT-LIST-WORKTREES 82226 . 83030) + (WORKTREEDIR 83032 . 83748)) (83798 116000 (GIT-GET-DIFFERENT-FILES 83808 . 90232) ( +GIT-BRANCHES-COMPARE-DIRECTORIES 90234 . 96585) (GIT-WORKING-COMPARE-DIRECTORIES 96587 . 101983) ( +GIT-COMPARE-WORKTREE 101985 . 105963) (GITCDOBJBUTTONFN 105965 . 110455) (GIT-CD-LABELFN 110457 . +111539) (GIT-CD-MENUFN 111541 . 113981) (GIT-WORKING-COMPARE-FILES 113983 . 114603) ( +GIT-BRANCHES-COMPARE-FILES 114605 . 115769) (GIT-PR-COMPARE 115771 . 115998)) (116070 124099 (CDGITDIR + 116080 . 116767) (GIT-COMMAND 116769 . 118327) (GITORIGIN 118329 . 119026) (GIT-INITIALS 119028 . +119332) (GIT-COMMAND-TO-FILE 119334 . 122823) (GIT-RESULT-TO-LINES 122825 . 123432) (STRIPLOCAL 123434 + . 124097))))) STOP diff --git a/lispusers/GITFNS.LCOM b/lispusers/GITFNS.LCOM index 70a03829..8ff816d3 100644 Binary files a/lispusers/GITFNS.LCOM and b/lispusers/GITFNS.LCOM differ diff --git a/lispusers/GITFNS.TEDIT b/lispusers/GITFNS.TEDIT index 64a88d10..42526590 100644 --- a/lispusers/GITFNS.TEDIT +++ b/lispusers/GITFNS.TEDIT @@ -15,7 +15,7 @@ where CLONEPATH specifies the local path to the clone e.g. {dsk}...>git-medley WORKINGPATH is optionally the local path to a corresponding Medley-residential working directory (e.g. {dsk}...>working-medley>) -When the project has a working path: +When the project has a WORKINGPATH: EXCLUSIONS is a list of files and directories to be excluded from comparisons (including what its .gitignore specifies) DEFAULTSUBDIRS is a list of subdirectories to be use in working-path comparisons when directories are not otherwise specified. For convenience, if CLONEPATH is NIL or T (and not a path), then a sequence of probes based on PROJECTNAME attempts to find a clone directory (with a .git subdirectory): @@ -76,73 +76,13 @@ In addition to the commands for comparing and viewing files, the menu for this b If the master/main branch is the current branch then the menu has no commands to change the clone directory. The browser will show those files that have been updated from a recent merge, and they can individually be copied from the git branch to realign the two source trees with incremented Medley version numbers. If the comparison is with a different branch, say the user's current staging branch, copying files from the working Medley to the git clone or deleting git files will set git up for future commits. Note that the menu item for deleting Medley files will cause all versions to be removed, not just the latest one, to avoid the possibility that an earlier one is revealed. Deletion for Medley files is also accomplished by renaming to a {Wprojectname} subdirectory so that they can be recovered if a deletion is in error. Files in the git-clone are removed from the file system immediately, since git provides its own recovery mechanism for those files. GITFNS does not (yet?) include functions for commits, pushes, or merge for updating the remote repository. Those have to be done outside of Medley through the usual github interfaces, as guided by the information provided by the comparisons. -(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))..4 4 44444 4..8.8J PAGEHEADING RUNNINGHEADTERMINAL -MODERN -TIMESROMAN$TERMINALMODERN -MODERN MODERN -MODERN - HRULE.GETFNMODERN -  HRULE.GETFNMODERN -  HRULE.GETFNMODERN -   HRULE.GETFNMODERN   HRULE.GETFNMODERN   -1 - -R -  - -; -@, - - "  &  \  -X - p  6 , -  -) -  -)  -+      5      -@ &   -I 7 -  o - E . -8 > I - -  -Y   - -$ -;  -} -( -) 9 -! -0 -4  c -  - 5  vB  -1OLJ -'' - - -)2 -+ -  - -    Z !   -5H - - 5 -5 ->$N ! M - A -@ -4 - -@ -   k 6.  R   < 9   -' -Y" ( ? F  - - - -1Sz \ No newline at end of file +(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL)))))1$4$4 $1$4 $4 $4$4$4$4$1$18$18$J$ PAGEHEADING RUNNINGHEAD1$ TERMINAL_Q(DEFAULTFONT 1 (TERMINAL 12) (TERMINAL 8) (TERMINAL 8) (POSTSCRIPT (TERMINAL 8))) MODERN +TERMINAL +MODERNMODERN +MODERN  +TIMESROMAN$MODERN + HRULE.GETFN  HRULE.GETFN  HRULE.GETFN   HRULE.GETFN  HRULE.GETFN 1R ;@ +, "  &  \  +X + p 6 , ) ) +      5     @ &  I 7  o E .8 > I Y  $; }() 9!04  c  5  vB 1OLJ'')2+     Z !  5H 55>$N ! M A@4 +@   k 6.  R   < 9  'Y"(? F 1Rz \ No newline at end of file diff --git a/lispusers/MANAGER b/lispusers/MANAGER index 220b00e7..0779cbf6 100644 --- a/lispusers/MANAGER +++ b/lispusers/MANAGER @@ -1,16 +1,15 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "15-Sep-2022 23:39:36" {DSK}matt>medley>LISPUSERS>MANAGER.;2 111145 +(FILECREATED "13-Oct-2023 16:41:52" {LU}MANAGER.;3 112648 + + :EDIT-BY "mth" :CHANGES-TO (FNS Manager.DO.COMMAND) + (VARS MANAGERCOMS MANAGER-FILE-OPERATIONS-COMMANDS) - :PREVIOUS-DATE "10-Feb-2022 22:17:51" {DSK}matt>medley>LISPUSERS>MANAGER.;1) + :PREVIOUS-DATE "10-Oct-2023 11:27:25" {LU}MANAGER.;1) -(* ; " -Copyright (c) 1986-1987, 1900, 2022 by Xerox Corporation. -") - (PRETTYCOMPRINT MANAGERCOMS) (RPAQQ MANAGERCOMS @@ -52,11 +51,12 @@ Copyright (c) 1986-1987, 1900, 2022 by Xerox Corporation. (* ;; "") (SPECVARS Manager.ACTIVEFLG MANAGER-CASES MANAGER-ADDTOFILES?) - (GLOBALVARS LAMBDAFONT DEFAULTFONT MENUFONT BOLDMENUFONT MANAGER-WINDOWS LOADBFLG SAVEDBFLG + (GLOBALVARS LAMBDAFONT DEFAULTFONT MENUFONT BOLDMENUFONT MANAGER-WINDOWS LOADDBFLG SAVEDBFLG MANAGER-ITEM-OPERATION-COMMANDS MANAGER-ITEM-FILE-RELATION-COMMANDS MANAGER-FILE-OPERATIONS-COMMANDS MANAGER-FILE-FILE-RELATION-COMMANDS - MANAGER-MAIN-MENU-ITEMS MANAGER-ACTIVITY-WINDOW-TITLE BackgroundMenuCommands - BackgroundMenu) + MANAGER-MAIN-MENU-ITEMS MANAGER-ACTIVITY-WINDOW-TITLE MANAGER-MAIN-WINDOW + MANAGER-MAIN-ICONW Manager.WINDOW-ANCHOR MANAGER.BM MANAGER.BM.MASK + BackgroundMenuCommands BackgroundMenu) (VARS *UNMANAGED-TYPES* MANAGER-ACTIVITY-WINDOW-TITLE (MANAGER-CASES) (MANAGER-ADDTOFILES?) MANAGER-FILE-FILE-RELATION-COMMANDS MANAGER-FILE-OPERATIONS-COMMANDS @@ -64,28 +64,33 @@ Copyright (c) 1986-1987, 1900, 2022 by Xerox Corporation. MANAGER-MAIN-MENU-ITEMS MANAGER.BM MANAGER.BM.MASK) (INITVARS (Manager.ACTIVEFLG NIL) (Manager.SORTFILELSTFLG T) + (Manager.WINDOW-ANCHOR 'ANCHOR-BL) (Manager.MENUROWS 20) (Manager.DATASPACE NIL) (MANAGER-WINDOWS NIL) (MANAGER-MAIN-WINDOW NIL) + (MANAGER-MAIN-ICONW (ICONW MANAGER.BM MANAGER.BM.MASK + (create POSITION XCOORD _ 0 YCOORD _ 0) + T)) (MANAGER-OPEN-WINDOWS NIL) (MANAGER-FILE-MENU NIL) (MANAGER-FILELST-MENU NIL) (MANAGER-FILE-OPERATIONS-MENU NIL) (MANAGER-FILE-FILE-RELATION-MENU NIL) (MANAGER-MARKED-SHADE BOLDMENUFONT)) - (FILES FILEBROWSER) - (* ; "for SEE command") + (FILES DATABASEFNS FILEBROWSER (FROM LISPUSERS) + COMMON-MAKE) + (* ; "FILEBROWSER for SEE command") (FNS MANAGER MANAGER.RESET Manager.ADDADV Manager.ADDTOFILES? Manager.ALTERMARKING - Manager.DO.COMMAND Manager.HIGHLIGHT Manager.PROMPT Manager.WINDOW - Manager.insurefilehighlights Manager.CHANGED? Manager.CHECKFILE Manager.COLLECTCOMS - Manager.COMS.WSF Manager.COMSOPEN Manager.COMSUPDATE Manager.HIGHLIGHTED - Manager.INSUREHIGHLIGHTS Manager.FILECHANGES Manager.FILELSTCHANGED? + Manager.ANCHORED-SET-POSITION Manager.DO.COMMAND Manager.HIGHLIGHT Manager.PROMPT + Manager.WINDOW Manager.insurefilehighlights Manager.CHANGED? Manager.CHECKFILE + Manager.COLLECTCOMS Manager.COMS.WSF Manager.COMSOPEN Manager.COMSUPDATE + Manager.HIGHLIGHTED Manager.INSUREHIGHLIGHTS Manager.FILECHANGES Manager.FILELSTCHANGED? Manager.FILESUBTYPES Manager.GET.ENVIRONMENT Manager.GETFILE Manager.INTITLE? Manager.MAIN.WSF Manager.MAINCLOSE Manager.MAINMENUITEMS Manager.MAINOPEN Manager.MAINUPDATE Manager.MAKEFILE.ADV Manager.MENUCOLUMNS Manager.MENUHASITEM Manager.MENUITEMS Manager.REMOVE.DUPLICATE.ADVICE Manager.RESETSUBITEMS - Manager.SORT.COMS Manager.SORTBYCOLUMN) + Manager.SET-ANCHOR Manager.SORT.COMS Manager.SORTBYCOLUMN) (ADVISE ADDFILE ADDTOFILES? MAKEFILE MARKASCHANGED UNMARKASCHANGED UPDATEFILES ADDTOCOMS DELFROMCOMS \ADDTOFILEBLOCK/ADDNEWCOM LOAD LOADFNS (MARKASCHANGED :IN DEFAULT.EDITDEFA0001)) @@ -181,10 +186,11 @@ Copyright (c) 1986-1987, 1900, 2022 by Xerox Corporation. ) (DECLARE%: DOEVAL@COMPILE DONTCOPY -(GLOBALVARS LAMBDAFONT DEFAULTFONT MENUFONT BOLDMENUFONT MANAGER-WINDOWS LOADBFLG SAVEDBFLG +(GLOBALVARS LAMBDAFONT DEFAULTFONT MENUFONT BOLDMENUFONT MANAGER-WINDOWS LOADDBFLG SAVEDBFLG MANAGER-ITEM-OPERATION-COMMANDS MANAGER-ITEM-FILE-RELATION-COMMANDS MANAGER-FILE-OPERATIONS-COMMANDS MANAGER-FILE-FILE-RELATION-COMMANDS MANAGER-MAIN-MENU-ITEMS - MANAGER-ACTIVITY-WINDOW-TITLE BackgroundMenuCommands BackgroundMenu) + MANAGER-ACTIVITY-WINDOW-TITLE MANAGER-MAIN-WINDOW MANAGER-MAIN-ICONW Manager.WINDOW-ANCHOR + MANAGER.BM MANAGER.BM.MASK BackgroundMenuCommands BackgroundMenu) ) (RPAQQ *UNMANAGED-TYPES* (EXPRESSIONS FILES FIELDS FILEVARS-ARE-NOW-OK)) @@ -368,6 +374,12 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB ("Edit FILELST" 'EDIT "Edit the variable which lists the files noticed by the file package"))) ("Advice" 'SHOWADVICE "Display the list of advised or traced fns and functions.") + ("Set Window Anchor" 'ANCHOR-BL + "Set the anchor corner for window growth to Bottom Left (default)" + (SUBITEMS (" Top Left " 'ANCHOR-TL "Set the anchor corner to Top Left") + (" Top Right " 'ANCHOR-TR "Set the anchor corner to Top Right") + (" Bottom Left " 'ANCHOR-BL "Set the anchor corner to Bottom Left") + (" Bottom Right " 'ANCHOR-BR "Set the anchor corner to Bottom Right"))) ("Quit" 'QUIT "Shut down all manager windows" (SUBITEMS ("Quit" 'QUIT "Shut down all manager windows" ) @@ -385,6 +397,8 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (RPAQ? Manager.SORTFILELSTFLG T) +(RPAQ? Manager.WINDOW-ANCHOR 'ANCHOR-BL) + (RPAQ? Manager.MENUROWS 20) (RPAQ? Manager.DATASPACE NIL) @@ -393,6 +407,9 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (RPAQ? MANAGER-MAIN-WINDOW NIL) +(RPAQ? MANAGER-MAIN-ICONW (ICONW MANAGER.BM MANAGER.BM.MASK (create POSITION XCOORD _ 0 YCOORD _ 0) + T)) + (RPAQ? MANAGER-OPEN-WINDOWS NIL) (RPAQ? MANAGER-FILE-MENU NIL) @@ -405,11 +422,12 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (RPAQ? MANAGER-MARKED-SHADE BOLDMENUFONT) -(FILESLOAD FILEBROWSER) +(FILESLOAD DATABASEFNS FILEBROWSER (FROM LISPUSERS) + COMMON-MAKE) -(* ; "for SEE command") +(* ; "FILEBROWSER for SEE command") (DEFINEQ @@ -522,11 +540,30 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (Manager.HIGHLIGHT ITEM MENU MARKING?))) finally (Manager.MAINUPDATE UPDATEFILES]) +(Manager.ANCHORED-SET-POSITION + [LAMBDA (IW IH) (* ; "Edited 10-Oct-2023 11:22 by mth") + (LET (WREGION XPOS YPOS TEMP) + (SETQ WREGION (WINDOWPROP MANAGER-MAIN-WINDOW 'REGION)) + (SETQ YPOS (fetch (REGION BOTTOM) of WREGION)) + (if (FMEMB Manager.WINDOW-ANCHOR '(ANCHOR-TL ANCHOR-TR)) + then (SETQ YPOS (- (+ YPOS (fetch (REGION HEIGHT) of WREGION)) + IH))) + (SETQ TEMP (+ YPOS IH)) + (if (>= TEMP SCREENHEIGHT) + then (SETQ YPOS (- SCREENHEIGHT 1))) + (SETQ XPOS (fetch (REGION LEFT) of WREGION)) + (if (FMEMB Manager.WINDOW-ANCHOR '(ANCHOR-TR ANCHOR-BR)) + then (SETQ XPOS (- (+ XPOS (fetch (REGION WIDTH) of WREGION)) + IW))) + (SETQ TEMP (+ XPOS IW)) + (if (>= TEMP SCREENWIDTH) + then (SETQ XPOS (- SCREENWIDTH 1))) + (create POSITION + XCOORD _ XPOS + YCOORD _ YPOS]) + (Manager.DO.COMMAND - [LAMBDA (COMMAND ITEM COMSTYPE FILE MENU) (* ; "Edited 15-Sep-2022 23:35 by Matt Heffron") - (* ; "Edited 15-Sep-2022 23:32 by Matt Heffron") - (* ; "Edited 15-Sep-2022 23:19 by Matt Heffron") - (* ; "Edited 18-Nov-87 14:30 by raf") + [LAMBDA (COMMAND ITEM COMSTYPE FILE MENU) (* ; "Edited 13-Oct-2023 16:28 by mth") (if (EQ COMSTYPE 'FILEVARS) then (SETQ COMSTYPE 'VARS) (* ; "The Manager currently does unnatural things with the FILEVARS type, this is a hack to compensate for it. E.g., editing a FILEVARS = editing the VARS, etc.") ) @@ -719,15 +756,22 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (Manager.HIGHLIGHT FILE MENU))) else (* ; "single item") (UNMARKASCHANGED ITEM COMSTYPE))) - (SEE (FB.FASTSEE.ONEFILE - NIL FILE (LET [(W (CREATEW NIL (CONCAT "Seeing " FILE - "..."] - (DSPSCROLL 'ON W) - (WINDOWPROP W 'PAGEFULLFN - 'FB.SEEFULLFN) - (TTYDISPLAYSTREAM W) - W))) - (TEDIT-SEE (TEDIT-SEE FILE)) + (SEE (LET ((FULLNAME (OR (CDAR (GETPROP FILE 'FILEDATES)) + FILE))) + + (* ;; + "I'm assuming that the CAR of the FILEDATES list is the most recent...") + + (FB.FASTSEE.ONEFILE + NIL FULLNAME + (LET [(W (CREATEW NIL (CONCAT "Seeing " FULLNAME + "..."] + (DSPSCROLL 'ON W) + (WINDOWPROP W 'PAGEFULLFN 'FB.SEEFULLFN) + (TTYDISPLAYSTREAM W) + W)))) + (TEDIT-SEE (TEDIT-SEE (OR (CDAR (GETPROP FILE 'FILEDATES)) + FILE))) (LOAD (printout T .FONT LAMBDAFONT "Loading file " FILE "." .FONT DEFAULTFONT T) @@ -748,18 +792,20 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB then NIL else (LIST COMMAND] (printout T .FONT DEFAULTFONT T))) - (COMMON-MAKEFILE - (FILESLOAD 'COMMON-MAKEFILE) - (if FILE - then (printout T .FONT LAMBDAFONT - "Writing CommonLisp source into " FILE - ".LSP" .FONT DEFAULTFONT T) - (PRINT (USER::COMMON-MAKEFILE FILE) - T) - else (CL:FORMAT T + (COMMON-MAKEFILE (if FILE + then (printout T .FONT LAMBDAFONT + "Writing CommonLisp source into " + FILE ".LSP" .FONT + DEFAULTFONT T) + (PRINT (COMMON-MAKEFILE FILE) + T) + else (CL:FORMAT T "~&CommonLispify must be selected separately for each file" - ))) + ))) ((LIST HARDCOPY) (LISTFILES1 FILE)) + ((ANCHOR-TL ANCHOR-TR ANCHOR-BL ANCHOR-BR) ( + Manager.SET-ANCHOR + COMMAND)) (CLEANUP (printout T .FONT LAMBDAFONT "Cleanup..." .FONT DEFAULTFONT T) @@ -821,68 +867,42 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (* ;; "DATABASEFNS stuff") - (DB - (FILESLOAD 'DATABASEFNS) - (CL:FORMAT T + (DB (CL:FORMAT T "~&Global DataBaseFNS Flags:~%%SAVEDBFLG = ~a, LOADDBFLG = ~a" - SAVEDBFLG LOADBFLG)) + SAVEDBFLG LOADDBFLG)) (DBFILE - (FILESLOAD 'DATABASEFNS) (CL:FORMAT T "~&The DATABASE prop for ~a is: ~a" FILE (GETPROP FILE 'DATABASE)) (CL:FORMAT T "~&Global DataBaseFNS Flags:~%%SAVEDBFLG = ~a, LOADDBFLG = ~a" - SAVEDBFLG LOADBFLG)) + SAVEDBFLG LOADDBFLG)) (DBON - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'ON) + (SETQ LOADDBFLG 'ON) (SETQ SAVEDBFLG 'ON)) (DBOFF - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'OFF) - (SETQ SAVEDBFLG 'OFF)) + (SETQ LOADDBFLG 'NO) + (SETQ SAVEDBFLG 'NO)) (DBASK - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'ASK) + (SETQ LOADDBFLG 'ASK) (SETQ SAVEDBFLG 'ASK)) - (DBLOADON - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'ON)) - (DBSAVEON - (FILESLOAD 'DATABASEFNS) - (SETQ SAVEDBFLG 'ON)) - (DBLOADOFF - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'OFF)) - (DBSAVEOFF - (FILESLOAD 'DATABASEFNS) - (SETQ SAVEDBFLG 'OFF)) - (DBLOADASK - (FILESLOAD 'DATABASEFNS) - (SETQ LOADBFLG 'ASK)) - (DBSAVEASK - (FILESLOAD 'DATABASEFNS) - (SETQ SAVEDBFLG 'ASK)) - (DBFILEON - (FILESLOAD 'DATABASEFNS) - (PUTPROP FILE 'DATABASE 'ON)) - (DBFILEOFF - (FILESLOAD 'DATABASEFNS) - (PUTPROP FILE 'DATABASE 'OFF)) - (DBFILEASK - (FILESLOAD 'DATABASEFNS) - (PUTPROP FILE 'DATABASE 'ASK)) + (DBLOADON (SETQ LOADDBFLG 'YES)) + (DBSAVEON (SETQ SAVEDBFLG 'YES)) + (DBLOADOFF (SETQ LOADDBFLG 'NO)) + (DBSAVEOFF (SETQ SAVEDBFLG 'NO)) + (DBLOADASK (SETQ LOADDBFLG 'ASK)) + (DBSAVEASK (SETQ SAVEDBFLG 'ASK)) + (DBFILEON (PUTPROP FILE 'DATABASE 'YES)) + (DBFILEOFF (PUTPROP FILE 'DATABASE 'NO)) + (DBFILEASK (PUTPROP FILE 'DATABASE 'ASK)) (DUMPDB (printout T .FONT LAMBDAFONT "Dumping the Masterscope Database for file " FILE .FONT DEFAULTFONT T) - (FILESLOAD 'DATABASEFNS) (DUMPDB FILE)) (LOADDB (printout T .FONT LAMBDAFONT "Loading the Masterscope Database for file " FILE .FONT DEFAULTFONT T) - (FILESLOAD 'DATABASEFNS) (LOADDB FILE)) (COMPILE (printout T .FONT LAMBDAFONT "Compiling..." .FONT @@ -1372,7 +1392,7 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB FILE]) (Manager.MAINOPEN - [LAMBDA (POSITION) (* ; "Edited 17-Aug-87 13:59 by raf") + [LAMBDA (POSITION) (* ; "Edited 10-Oct-2023 11:23 by mth") (* ;;; "Builds the manager main (FILELST) menu at the indicated position.") @@ -1387,31 +1407,30 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (ADDMENU MANAGER-FILE-MENU (SETQ MANAGER-MAIN-WINDOW - (CREATEW (with POSITION - (with MENU MANAGER-FILE-MENU (SETQ IW (MIN (WIDTHIFWINDOW IMAGEWIDTH) - SCREENWIDTH)) + (CREATEW (with POSITION (with MENU MANAGER-FILE-MENU (SETQ IW (MIN (WIDTHIFWINDOW + IMAGEWIDTH) + SCREENWIDTH)) (* ;  "width of file menu. Actually unlikely to be wider than screenwidth (!)") - (SETQ IH (MIN (HEIGHTIFWINDOW IMAGEHEIGHT T) - SCREENHEIGHT)) + (SETQ IH (MIN (HEIGHTIFWINDOW IMAGEHEIGHT T) + SCREENHEIGHT)) (* ;  "height of window; could possibly be higher than screen if lots of files") - (if (POSITIONP POSITION) - then (* ; + (if (POSITIONP POSITION) + then (* ;  "gave an initial position for the manager file menu") - POSITION - elseif (WINDOWP MANAGER-MAIN-WINDOW) - then (* ; + POSITION + elseif (WINDOWP MANAGER-MAIN-WINDOW) + then (* ;  "if there was a window, put the new one in the same place (and close the old one)") - (PROG1 (with REGION (WINDOWPROP MANAGER-MAIN-WINDOW - 'REGION) - (create POSITION - XCOORD _ LEFT - YCOORD _ BOTTOM)) - (CLOSEW MANAGER-MAIN-WINDOW)) - else (* ; + (PROG1 (Manager.ANCHORED-SET-POSITION IW IH) + + (* ;; "(with REGION (WINDOWPROP MANAGER-MAIN-WINDOW (QUOTE REGION)) (create POSITION XCOORD _ LEFT YCOORD _ BOTTOM))") + + (CLOSEW MANAGER-MAIN-WINDOW)) + else (* ;  "let user say where to put the menu") - (GETBOXPOSITION IW IH))) + (GETBOXPOSITION IW IH))) (create REGION LEFT _ XCOORD WIDTH _ IW @@ -1434,17 +1453,18 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (* ;; "Shrink to the manager icon, and remember to update when the expanding") [WINDOWPROP MANAGER-MAIN-WINDOW 'ICONFN (FUNCTION (LAMBDA (WIN OICON) - (LET ((IW (if (NULL OICON) - then (ICONW MANAGER.BM - MANAGER.BM.MASK - ) - else OICON))) - [WINDOWPROP IW 'EXPANDFN - (FUNCTION (LAMBDA NIL - ( - Manager.MAINUPDATE - NIL] - IW] + (SETQ MANAGER-MAIN-ICONW + (if (NULL OICON) + then (OR MANAGER-MAIN-ICONW + (ICONW MANAGER.BM + MANAGER.BM.MASK)) + else OICON)) + [WINDOWPROP MANAGER-MAIN-ICONW + 'EXPANDFN + (FUNCTION (LAMBDA NIL + (Manager.MAINUPDATE + NIL] + MANAGER-MAIN-ICONW] (SETQ Manager.ACTIVEFLG T) (Manager.MAINUPDATE T]) @@ -1545,6 +1565,12 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (CONCAT "Creates a " TYPE " submenu for the file " FILE]) +(Manager.SET-ANCHOR + [LAMBDA (NEWANCHOR) (* ; "Edited 10-Oct-2023 11:24 by mth") + (if (AND (FMEMB NEWANCHOR '(ANCHOR-TL ANCHOR-TR ANCHOR-BL ANCHOR-BR)) + (NEQ Manager.WINDOW-ANCHOR NEWANCHOR)) + then (SETQ Manager.WINDOW-ANCHOR NEWANCHOR]) + (Manager.SORT.COMS [LAMBDA (A B) (* ; "Edited 18-Nov-87 15:12 by raf") @@ -1746,20 +1772,21 @@ Will load DataBaseFNS if necessary" (SUBITEMS ("All" 'DB (ADDTOVAR LAMA ) ) -(PUTPROPS MANAGER COPYRIGHT ("Xerox Corporation" 1986 1987 1900 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (24415 101274 (MANAGER 24425 . 25224) (MANAGER.RESET 25226 . 26740) (Manager.ADDADV -26742 . 28095) (Manager.ADDTOFILES? 28097 . 28375) (Manager.ALTERMARKING 28377 . 29987) ( -Manager.DO.COMMAND 29989 . 61755) (Manager.HIGHLIGHT 61757 . 62054) (Manager.PROMPT 62056 . 62369) ( -Manager.WINDOW 62371 . 63004) (Manager.insurefilehighlights 63006 . 64077) (Manager.CHANGED? 64079 . -64628) (Manager.CHECKFILE 64630 . 65729) (Manager.COLLECTCOMS 65731 . 67169) (Manager.COMS.WSF 67171 - . 69841) (Manager.COMSOPEN 69843 . 74581) (Manager.COMSUPDATE 74583 . 75675) (Manager.HIGHLIGHTED -75677 . 75983) (Manager.INSUREHIGHLIGHTS 75985 . 76543) (Manager.FILECHANGES 76545 . 76844) ( -Manager.FILELSTCHANGED? 76846 . 77174) (Manager.FILESUBTYPES 77176 . 77814) (Manager.GET.ENVIRONMENT -77816 . 80354) (Manager.GETFILE 80356 . 82670) (Manager.INTITLE? 82672 . 83350) (Manager.MAIN.WSF -83352 . 85996) (Manager.MAINCLOSE 85998 . 87108) (Manager.MAINMENUITEMS 87110 . 88187) ( -Manager.MAINOPEN 88189 . 93565) (Manager.MAINUPDATE 93567 . 94203) (Manager.MAKEFILE.ADV 94205 . 95241 -) (Manager.MENUCOLUMNS 95243 . 96047) (Manager.MENUHASITEM 96049 . 96406) (Manager.MENUITEMS 96408 . -96653) (Manager.REMOVE.DUPLICATE.ADVICE 96655 . 98261) (Manager.RESETSUBITEMS 98263 . 99500) ( -Manager.SORT.COMS 99502 . 100034) (Manager.SORTBYCOLUMN 100036 . 101272))))) + (FILEMAP (NIL (25676 102848 (MANAGER 25686 . 26485) (MANAGER.RESET 26487 . 28001) (Manager.ADDADV +28003 . 29356) (Manager.ADDTOFILES? 29358 . 29636) (Manager.ALTERMARKING 29638 . 31248) ( +Manager.ANCHORED-SET-POSITION 31250 . 32353) (Manager.DO.COMMAND 32355 . 62991) (Manager.HIGHLIGHT +62993 . 63290) (Manager.PROMPT 63292 . 63605) (Manager.WINDOW 63607 . 64240) ( +Manager.insurefilehighlights 64242 . 65313) (Manager.CHANGED? 65315 . 65864) (Manager.CHECKFILE 65866 + . 66965) (Manager.COLLECTCOMS 66967 . 68405) (Manager.COMS.WSF 68407 . 71077) (Manager.COMSOPEN 71079 + . 75817) (Manager.COMSUPDATE 75819 . 76911) (Manager.HIGHLIGHTED 76913 . 77219) ( +Manager.INSUREHIGHLIGHTS 77221 . 77779) (Manager.FILECHANGES 77781 . 78080) (Manager.FILELSTCHANGED? +78082 . 78410) (Manager.FILESUBTYPES 78412 . 79050) (Manager.GET.ENVIRONMENT 79052 . 81590) ( +Manager.GETFILE 81592 . 83906) (Manager.INTITLE? 83908 . 84586) (Manager.MAIN.WSF 84588 . 87232) ( +Manager.MAINCLOSE 87234 . 88344) (Manager.MAINMENUITEMS 88346 . 89423) (Manager.MAINOPEN 89425 . 94818 +) (Manager.MAINUPDATE 94820 . 95456) (Manager.MAKEFILE.ADV 95458 . 96494) (Manager.MENUCOLUMNS 96496 + . 97300) (Manager.MENUHASITEM 97302 . 97659) (Manager.MENUITEMS 97661 . 97906) ( +Manager.REMOVE.DUPLICATE.ADVICE 97908 . 99514) (Manager.RESETSUBITEMS 99516 . 100753) ( +Manager.SET-ANCHOR 100755 . 101074) (Manager.SORT.COMS 101076 . 101608) (Manager.SORTBYCOLUMN 101610 + . 102846))))) STOP diff --git a/lispusers/MANAGER.DFASL b/lispusers/MANAGER.DFASL index 8190ca09..86a097ba 100644 Binary files a/lispusers/MANAGER.DFASL and b/lispusers/MANAGER.DFASL differ diff --git a/lispusers/MANAGER.TEDIT b/lispusers/MANAGER.TEDIT index ee71c27e..a35427e5 100644 Binary files a/lispusers/MANAGER.TEDIT and b/lispusers/MANAGER.TEDIT differ diff --git a/lispusers/PSEUDOHOSTS b/lispusers/PSEUDOHOSTS index 981afb63..ad69e0ed 100644 --- a/lispusers/PSEUDOHOSTS +++ b/lispusers/PSEUDOHOSTS @@ -1,14 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "19-Jul-2023 09:17:48" {WMEDLEY}PSEUDOHOSTS.;153 27674 +(FILECREATED "22-Sep-2023 15:29:50" {WMEDLEY}PSEUDOHOSTS.;158 26638 :EDIT-BY rmk - :CHANGES-TO (RECORDS PHDEVICE PHGENFILESTATE TARGETDEVICE) - (MACROS PSEUDOHOST.NAME PSEUDOHOST.TARGETVAL) + :CHANGES-TO (FNS PSEUDOHOST SLASHIT CONTRACT.PH) (VARS PSEUDOHOSTSCOMS) - :PREVIOUS-DATE "18-Jul-2023 13:12:35" {WMEDLEY}PSEUDOHOSTS.;152) + :PREVIOUS-DATE "26-Jul-2023 12:34:37" {WMEDLEY}PSEUDOHOSTS.;155) (PRETTYCOMPRINT PSEUDOHOSTSCOMS) @@ -21,7 +20,7 @@ (* ;; "Internals") - (FNS EXPAND.PH CONTRACT.PH SLASHIT UNSLASHIT GETHOSTINFO.PH) + (FNS EXPAND.PH CONTRACT.PH UNSLASHIT GETHOSTINFO.PH) (FNS OPENFILE.PH GETFILENAME.PH DIRECTORYNAMEP.PH CLOSEFILE.PH REOPENFILE.PH DELETEFILE.PH OPENP.PH UNREGISTERFILE.PH REGISTERFILE.PH GENERATEFILES.PH GETFILEINFO.PH SETFILEINFO.PH NEXTFILEFN.PH FILEINFOFN.PH RENAMEFILE.PH) @@ -42,6 +41,8 @@ (PSEUDOHOST [LAMBDA (HOST PREFIX) + (* ;; "Edited 22-Sep-2023 15:29 by rmk") + (* ;; "Edited 25-Jun-2022 17:00 by rmk") (* ;; "Edited 24-Feb-2022 23:56 by rmk: Expand prefix so that it is rooted in a real host and not a previously defined pseudohost.") @@ -81,7 +82,7 @@ (SELECTQ TARGETHOST ((DSK CORE) (SETQ PREFIX (UNSLASHIT PREFIX))) - (UNIX (SETQ PREFIX (SLASHIT PREFIX))) + (UNIX (SETQ PREFIX (SLASHIT PREFIX))) NIL) (SETQ TARGETDEVICE (OR (\GETDEVICEFROMHOSTNAME TARGETHOST) (ERROR "UNKNOWN TARGET HOST" TARGETHOST))) @@ -153,26 +154,32 @@ (FETCH (FDEV DEVICENAME) OF (FETCH (PHDEVICE TARGETDEV) OF (\GETDEVICEFROMNAME HOST))))]) (TRUEFILENAME - [LAMBDA (FILE) (* ; "Edited 26-Jan-2022 23:33 by rmk") + [LAMBDA (FILE) (* ; "Edited 26-Jul-2023 07:53 by rmk") + (* ; "Edited 26-Jan-2022 23:33 by rmk") (* ; "Edited 25-Jan-2022 08:47 by rmk") - (LET (FILENAME DEVICE) - (IF (STREAMP FILE) - THEN (SETQ FILENAME (FETCH (STREAM FULLFILENAME) OF FILE)) - (SETQ DEVICE (FETCH (STREAM DEVICE) OF FILE)) - ELSE (SETQ FILENAME (\ADD.CONNECTED.DIR FILE)) - (SETQ DEVICE (\GETDEVICEFROMNAME FILENAME))) - (CL:IF (TYPE? PHDEVICE DEVICE) - (EXPAND.PH FILENAME DEVICE) - FILENAME)]) + (if (LISTP FILE) + then (for F in FILE collect (TRUEFILENAME F)) + else (LET (FILENAME DEVICE) + (IF (STREAMP FILE) + THEN (SETQ FILENAME (FETCH (STREAM FULLFILENAME) OF FILE)) + (SETQ DEVICE (FETCH (STREAM DEVICE) OF FILE)) + ELSE (SETQ FILENAME (\ADD.CONNECTED.DIR FILE)) + (SETQ DEVICE (\GETDEVICEFROMNAME FILENAME))) + (CL:IF (TYPE? PHDEVICE DEVICE) + (EXPAND.PH FILENAME DEVICE) + FILENAME)]) (PSEUDOFILENAME - [LAMBDA (FILE) (* ; "Edited 29-Jan-2022 23:08 by rmk") + [LAMBDA (FILE) (* ; "Edited 26-Jul-2023 12:34 by rmk") + (* ; "Edited 29-Jan-2022 23:08 by rmk") (* ; "Edited 28-Jan-2022 09:06 by rmk") - (FOR D PN (FILENAME _ (IF (STREAMP FILE) - THEN (FETCH (STREAM FULLFILENAME) OF FILE) - ELSE (\ADD.CONNECTED.DIR FILE))) IN \FILEDEVICES - WHEN (TYPE? PHDEVICE D) UNLESS (EQ FILENAME (SETQ PN (CONTRACT.PH FILENAME D))) - DO (RETURN PN) FINALLY (RETURN FILENAME]) + (if (LISTP FILE) + then (for F in FILE collect (PSEUDOFILENAME F)) + else (FOR D PN (FILENAME _ (IF (STREAMP FILE) + THEN (FETCH (STREAM FULLFILENAME) OF FILE) + ELSE (\ADD.CONNECTED.DIR FILE))) IN \FILEDEVICES + WHEN (TYPE? PHDEVICE D) UNLESS (EQ FILENAME (SETQ PN (CONTRACT.PH FILENAME D))) + DO (RETURN PN) FINALLY (RETURN FILENAME]) ) @@ -209,6 +216,8 @@ (CONTRACT.PH [LAMBDA (NAME PHDEV) + (* ;; "Edited 22-Sep-2023 14:30 by rmk") + (* ;; "Edited 30-Jan-2022 00:20 by rmk: the smallest pseudoname for NAME. If the NAME was constructed by expanding, then") (* ;; "Finds the smallest pseudoname for NAME. The PHDEV is used only to find its targetdev, that's where we scan for matching prefixes. This is so we can find the lowest matching pseudohost in the target's prefix map. If the hosts are defined as {DSK}...{H1}...{H2}, DSK knows the prefixes that lead to H1 and H2, picks the longest matching prefix and replaces it by the corresponding host.") @@ -234,7 +243,7 @@ (SETQ CONNECTOR (CADDR PM)) [SETQ SUFFIX (CONCAT CONNECTOR (IF (EQ CONNECTOR '/) - THEN (SLASHIT SUFFIX) + THEN (SLASHIT SUFFIX) ELSE (UNSLASHIT SUFFIX]) (RETURN (PACK* '{ (CADR PM) "}" @@ -244,31 +253,6 @@ (RETURN NAME)))]) -(SLASHIT - [LAMBDA (X LCASEDIRS) (* ; "Edited 26-Jan-2022 15:08 by rmk") - (* ; "Edited 3-Jan-2022 11:44 by rmk") - (* ; "Edited 22-Dec-2021 20:18 by rmk") - (* ; "Edited 2-Nov-2021 22:54 by rmk:") - (LET [LASTDIRPOS SLASHED (DIRPOS (ADD1 (OR (STRPOS "}" X) - 0] - [SETQ SLASHED (CONCATCODES (FOR I C FROM DIRPOS WHILE (SETQ C (NTHCHARCODE X I)) - COLLECT (SELCHARQ C - ((< >) - (SETQ LASTDIRPOS I) - (CHARCODE /)) - (/ (SETQ LASTDIRPOS I) - C) - C] - (CL:WHEN (AND LCASEDIRS LASTDIRPOS) - (SETQ LASTDIRPOS (ADD1 (IDIFFERENCE LASTDIRPOS DIRPOS))) - (SETQ SLASHED (CONCAT (L-CASE (SUBSTRING SLASHED 1 LASTDIRPOS)) - (OR (SUBSTRING SLASHED (ADD1 LASTDIRPOS)) - "")))) - (CL:IF (EQ DIRPOS 1) - SLASHED - (CONCAT (SUBSTRING X 1 (SUB1 DIRPOS)) - SLASHED))]) - (UNSLASHIT [LAMBDA (X LCASEDIRS) (* ; "Edited 26-Jan-2022 15:09 by rmk") (* ; "Edited 22-Dec-2021 20:18 by rmk") @@ -527,13 +511,12 @@ EXPORTS.ALL) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1397 9433 (PSEUDOHOST 1407 . 6966) (PSEUDOHOSTP 6968 . 7481) (PSEUDOHOSTS 7483 . 7844) -(TARGETHOST 7846 . 8120) (TRUEFILENAME 8122 . 8809) (PSEUDOFILENAME 8811 . 9431)) (9461 17000 ( -EXPAND.PH 9471 . 10724) (CONTRACT.PH 10726 . 13391) (SLASHIT 13393 . 14961) (UNSLASHIT 14963 . 16709) -(GETHOSTINFO.PH 16711 . 16998)) (17001 25021 (OPENFILE.PH 17011 . 18084) (GETFILENAME.PH 18086 . 18375 -) (DIRECTORYNAMEP.PH 18377 . 19001) (CLOSEFILE.PH 19003 . 19470) (REOPENFILE.PH 19472 . 20037) ( -DELETEFILE.PH 20039 . 20323) (OPENP.PH 20325 . 20620) (UNREGISTERFILE.PH 20622 . 21164) ( -REGISTERFILE.PH 21166 . 21700) (GENERATEFILES.PH 21702 . 22746) (GETFILEINFO.PH 22748 . 23050) ( -SETFILEINFO.PH 23052 . 23251) (NEXTFILEFN.PH 23253 . 23799) (FILEINFOFN.PH 23801 . 24076) ( -RENAMEFILE.PH 24078 . 25019))))) + (FILEMAP (NIL (1315 9921 (PSEUDOHOST 1325 . 6930) (PSEUDOHOSTP 6932 . 7445) (PSEUDOHOSTS 7447 . 7808) +(TARGETHOST 7810 . 8084) (TRUEFILENAME 8086 . 9048) (PSEUDOFILENAME 9050 . 9919)) (9949 15964 ( +EXPAND.PH 9959 . 11212) (CONTRACT.PH 11214 . 13925) (UNSLASHIT 13927 . 15673) (GETHOSTINFO.PH 15675 . +15962)) (15965 23985 (OPENFILE.PH 15975 . 17048) (GETFILENAME.PH 17050 . 17339) (DIRECTORYNAMEP.PH +17341 . 17965) (CLOSEFILE.PH 17967 . 18434) (REOPENFILE.PH 18436 . 19001) (DELETEFILE.PH 19003 . 19287 +) (OPENP.PH 19289 . 19584) (UNREGISTERFILE.PH 19586 . 20128) (REGISTERFILE.PH 20130 . 20664) ( +GENERATEFILES.PH 20666 . 21710) (GETFILEINFO.PH 21712 . 22014) (SETFILEINFO.PH 22016 . 22215) ( +NEXTFILEFN.PH 22217 . 22763) (FILEINFOFN.PH 22765 . 23040) (RENAMEFILE.PH 23042 . 23983))))) STOP diff --git a/lispusers/PSEUDOHOSTS.LCOM b/lispusers/PSEUDOHOSTS.LCOM index 1560bf8f..2a4c82ce 100644 Binary files a/lispusers/PSEUDOHOSTS.LCOM and b/lispusers/PSEUDOHOSTS.LCOM differ diff --git a/lispusers/READAIS b/lispusers/READAIS index 24023611..0e0189d3 100644 --- a/lispusers/READAIS +++ b/lispusers/READAIS @@ -1,23 +1,40 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "28-Apr-88 17:04:57" {ERINYES}MEDLEY>READAIS.;1 48154 - changes to%: (FNS AISBLT AISBLT1TO1 24BITCOLORTO8BITMAP AISBLT8TO4MODUL AISBLT8TOLESSFSA AISBLT8TO4TRUNC AISBLT8TO8 AISBLT4TO4 AISBLT8TO4LESSFSA AISBLT8TO1FSA AISBLT8TO1TRUNC CLOSEST.COLOR GRAPHAISHISTOGRAM AISHISTOGRAM SMOOTHEDFILTER SLOW.COLOR.DISTANCE FAST.COLOR.DISTANCE INSUREAISFILE SHOWCOLORAIS SHOWCOLORAIS1 WRITEAIS WRITEAIS1 \GETBASENYBBLE \PUTBASENYBBLE) - (VARS READAISCOMS) +(FILECREATED "24-Sep-2023 14:35:09" {WMEDLEY}READAIS.;2 63146 - previous date%: "27-Apr-88 12:12:58" {QV}LISP>MEDLEY>READAIS.;2) + :EDIT-BY rmk + + :CHANGES-TO (FNS AISHISTOGRAM) + + :PREVIOUS-DATE "28-Apr-88 17:04:57" {WMEDLEY}READAIS.;1) -(* " -Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988 by Xerox Corporation. All rights reserved. +(* ; " +Copyright (c) 1982-1988 by Xerox Corporation. ") (PRETTYCOMPRINT READAISCOMS) -(RPAQQ READAISCOMS ((DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (NYBBLESPERWORD 4))) (* ;; "fixed INSUREAISFILE, AISBLT, AISBLT8TO8. nhb 27-Apr-88 01:58:56") (FNS 24BITCOLORTO8BITMAP AISBLT AISBLT1TO1 AISBLT8TO4MODUL AISBLT8TOLESSFSA AISBLT8TO4TRUNC AISBLT8TO8 AISBLT4TO4 AISBLT8TO4LESSFSA AISBLT8TO1FSA AISBLT8TO1TRUNC CLOSEST.COLOR GRAPHAISHISTOGRAM AISHISTOGRAM SMOOTHEDFILTER SLOW.COLOR.DISTANCE FAST.COLOR.DISTANCE INSUREAISFILE SHOWCOLORAIS SHOWCOLORAIS1 WRITEAIS WRITEAIS1 \GETBASENYBBLE \PUTBASENYBBLE) (MACROS .GET.4BIT.AND.SPREAD.ERR. .GET.1BIT.AND.SPREAD.ERR. .GET.NBIT.AND.SPREAD.ERR. .GET.LEFTMOST.4BIT .GET.LEFTMOST.BIT. .GET.BESTCOLOR.AND.SPREAD.ERR. .4BIT.MODULATE.INTENSITY.VALUE. .MODULATE.INTENSITY.VALUE. SQUARE) (P (MOVD? (QUOTE FAST.COLOR.DISTANCE) (QUOTE COLOR.DISTANCE))) (VARS AISDIRECTORIES) (GLOBALVARS AISDIRECTORIES))) +(RPAQQ READAISCOMS + ((DECLARE%: EVAL@COMPILE DONTCOPY (CONSTANTS (NYBBLESPERWORD 4))) + + (* ;; "fixed INSUREAISFILE, AISBLT, AISBLT8TO8. nhb 27-Apr-88 01:58:56") + + (FNS 24BITCOLORTO8BITMAP AISBLT AISBLT1TO1 AISBLT8TO4MODUL AISBLT8TOLESSFSA AISBLT8TO4TRUNC + AISBLT8TO8 AISBLT4TO4 AISBLT8TO4LESSFSA AISBLT8TO1FSA AISBLT8TO1TRUNC CLOSEST.COLOR + GRAPHAISHISTOGRAM AISHISTOGRAM SMOOTHEDFILTER SLOW.COLOR.DISTANCE FAST.COLOR.DISTANCE + INSUREAISFILE SHOWCOLORAIS SHOWCOLORAIS1 WRITEAIS WRITEAIS1 \GETBASENYBBLE + \PUTBASENYBBLE) + (MACROS .GET.4BIT.AND.SPREAD.ERR. .GET.1BIT.AND.SPREAD.ERR. .GET.NBIT.AND.SPREAD.ERR. + .GET.LEFTMOST.4BIT .GET.LEFTMOST.BIT. .GET.BESTCOLOR.AND.SPREAD.ERR. + .4BIT.MODULATE.INTENSITY.VALUE. .MODULATE.INTENSITY.VALUE. SQUARE) + (P (MOVD? 'FAST.COLOR.DISTANCE 'COLOR.DISTANCE)) + (VARS AISDIRECTORIES) + (GLOBALVARS AISDIRECTORIES))) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE -(RPAQQ NYBBLESPERWORD 4) +(RPAQQ NYBBLESPERWORD 4) (CONSTANTS (NYBBLESPERWORD 4)) @@ -83,8 +100,59 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988 by Xerox Corporation. Al ) (AISHISTOGRAM -(LAMBDA (FILE REGION) (* kbr%: "13-Jul-85 19:28") (* returns an array that have the number of pixels in FILE that have each intensity.) (PROG (STREAM DATABEG AISHISTOGRAM TMP BITSPERSAMPLE SFILEWIDTH SFILEHEIGHT SFILEBYTESPERLINE LEFT BOTTOM RIGHT TOP WIDTH HEIGHT BEG END) (COND ((OR (SETQ STREAM (FINDFILE FILE NIL AISDIRECTORIES)) (SETQ STREAM FILE)) (SETQ STREAM (GETSTREAM (OPENFILE STREAM (QUOTE INPUT)) (QUOTE INPUT))))) (SETQ TMP (INSUREAISFILE STREAM)) (SETQ BITSPERSAMPLE (CAR TMP)) (SETQ SFILEWIDTH (CADR TMP)) (SETQ SFILEHEIGHT (CADDR TMP)) (SETQ SFILEBYTESPERLINE (LLSH (CADDDR TMP) 1)) (SETQ DATABEG (GETFILEPTR STREAM)) (SETQ AISHISTOGRAM (ARRAY (EXPT 2 BITSPERSAMPLE) NIL 0 0)) (COND (REGION (SETQ LEFT (IMAX (IMIN (fetch (REGION LEFT) of REGION) (SUB1 SFILEWIDTH)) 0)) (SETQ RIGHT (IMAX (IMIN SFILEWIDTH (fetch (REGION PRIGHT) of REGION)) 0)) (COND ((IGEQ LEFT RIGHT) (RETURN AISHISTOGRAM)) (T (SETQ WIDTH (IDIFFERENCE RIGHT LEFT)))) (SETQ BOTTOM (IMIN (fetch (REGION BOTTOM) of REGION) (SUB1 SFILEHEIGHT))) (SETQ TOP (IMIN SFILEHEIGHT (fetch (REGION PTOP) of REGION))) (COND ((IGREATERP BOTTOM TOP) (RETURN AISHISTOGRAM))) (SETQ BEG (IPLUS DATABEG (IPLUS (ITIMES SFILEBYTESPERLINE (IDIFFERENCE SFILEHEIGHT TOP)) LEFT))) (SETQ END (IPLUS DATABEG (IPLUS (ITIMES SFILEBYTESPERLINE (IDIFFERENCE SFILEHEIGHT BOTTOM)) LEFT))) (for LINE from BEG to END by SFILEBYTESPERLINE do (\SETFILEPTR STREAM LINE) (for BIT from 1 to WIDTH do (SETA AISHISTOGRAM (SETQ TMP (\BIN STREAM)) (ADD1 (ELT AISHISTOGRAM TMP)))))) (T (for LINE from 1 to SFILEHEIGHT do (for BIT from 1 to SFILEBYTESPERLINE do (SETA AISHISTOGRAM (SETQ TMP (\BIN STREAM)) (ADD1 (ELT AISHISTOGRAM TMP))))))) (CLOSEF STREAM) (RETURN AISHISTOGRAM))) -) + [LAMBDA (FILE REGION) (* ; "Edited 24-Sep-2023 14:34 by rmk") + (* kbr%: "13-Jul-85 19:28") + (* ; + "returns an array that have the number of pixels in FILE that have each intensity.") + (PROG (STREAM DATABEG AISHISTOGRAM TMP BITSPERSAMPLE SFILEWIDTH SFILEHEIGHT SFILEBYTESPERLINE + LEFT BOTTOM RIGHT TOP WIDTH HEIGHT BEG END) + [COND + ((OR (SETQ STREAM (FINDFILE FILE NIL AISDIRECTORIES)) + (SETQ STREAM FILE)) + (SETQ STREAM (OPENSTREAM STREAM 'INPUT] + (SETQ TMP (INSUREAISFILE STREAM)) + (SETQ BITSPERSAMPLE (CAR TMP)) + (SETQ SFILEWIDTH (CADR TMP)) + (SETQ SFILEHEIGHT (CADDR TMP)) + (SETQ SFILEBYTESPERLINE (LLSH (CADDDR TMP) + 1)) + (SETQ DATABEG (GETFILEPTR STREAM)) + (SETQ AISHISTOGRAM (ARRAY (EXPT 2 BITSPERSAMPLE) + NIL 0 0)) + [COND + [REGION (SETQ LEFT (IMAX (IMIN (fetch (REGION LEFT) of REGION) + (SUB1 SFILEWIDTH)) + 0)) + (SETQ RIGHT (IMAX (IMIN SFILEWIDTH (fetch (REGION PRIGHT) of REGION)) + 0)) + [COND + ((IGEQ LEFT RIGHT) + (RETURN AISHISTOGRAM)) + (T (SETQ WIDTH (IDIFFERENCE RIGHT LEFT] + (SETQ BOTTOM (IMIN (fetch (REGION BOTTOM) of REGION) + (SUB1 SFILEHEIGHT))) + (SETQ TOP (IMIN SFILEHEIGHT (fetch (REGION PTOP) of REGION))) + (COND + ((IGREATERP BOTTOM TOP) + (RETURN AISHISTOGRAM))) + (SETQ BEG (IPLUS DATABEG (IPLUS (ITIMES SFILEBYTESPERLINE (IDIFFERENCE + SFILEHEIGHT TOP) + ) + LEFT))) + (SETQ END (IPLUS DATABEG (IPLUS (ITIMES SFILEBYTESPERLINE (IDIFFERENCE + SFILEHEIGHT + BOTTOM)) + LEFT))) + (for LINE from BEG to END by SFILEBYTESPERLINE + do (\SETFILEPTR STREAM LINE) + (for BIT from 1 to WIDTH do (SETA AISHISTOGRAM (SETQ TMP (\BIN STREAM)) + (ADD1 (ELT AISHISTOGRAM TMP] + (T (for LINE from 1 to SFILEHEIGHT + do (for BIT from 1 to SFILEBYTESPERLINE + do (SETA AISHISTOGRAM (SETQ TMP (\BIN STREAM)) + (ADD1 (ELT AISHISTOGRAM TMP] + (CLOSEF STREAM) + (RETURN AISHISTOGRAM]) (SMOOTHEDFILTER (LAMBDA (HISTOGRAM) (* kbr%: "13-Jul-85 15:05") (* returns a 256 to 256 mapping array that maximally distributes the intensity values by looking at the histogram array HISTOGRAM) (PROG (ARSIZE SMOOTHARRAY TOTALPOINTS POINTSLESS FILEINTENSITY NEWINTENSITY POINTSPAST BUCKETSIZE NTOMOVE NPTS) (SETQ ARSIZE (ARRAYSIZE HISTOGRAM)) (SETQ POINTSLESS 0) (SETQ NEWINTENSITY 0) (SETQ POINTSPAST 0) (SETQ SMOOTHARRAY (ARRAY ARSIZE NIL 0 0)) (SETQ TOTALPOINTS (for I from 0 to (SUB1 ARSIZE) sum (ELT HISTOGRAM I))) (SETQ BUCKETSIZE (IQUOTIENT TOTALPOINTS 256)) (for I from 0 to (SUB1 ARSIZE) do (SETQ NPTS (ELT HISTOGRAM I)) (SETQ POINTSLESS (IPLUS POINTSLESS NPTS)) (COND ((IGREATERP POINTSLESS BUCKETSIZE) (SETQ NTOMOVE (IQUOTIENT POINTSLESS BUCKETSIZE)) (SETA SMOOTHARRAY I (IPLUS NEWINTENSITY (IQUOTIENT NTOMOVE 2))) (SETQ NEWINTENSITY (COND ((IGREATERP NEWINTENSITY 255) 255) (T (IPLUS NEWINTENSITY NTOMOVE)))) (SETQ POINTSLESS (IDIFFERENCE POINTSLESS (ITIMES NTOMOVE BUCKETSIZE)))) (T (SETA SMOOTHARRAY I NEWINTENSITY)))) (RETURN SMOOTHARRAY))) @@ -128,41 +196,308 @@ Copyright (c) 1982, 1983, 1984, 1985, 1986, 1987, 1988 by Xerox Corporation. Al ) (DECLARE%: EVAL@COMPILE -(PUTPROPS .GET.4BIT.AND.SPREAD.ERR. MACRO ((STREAM) (PROGN (* returns the 4 most significant bits taking into account the error and spreads the error into the appropriate places.) (SETQ BYTE (IPLUS (\BIN STREAM) THISPIXELERROR)) (PROG1 (COND ((IGREATERP BYTE 255) (* overflow case) 15) (T (LRSH BYTE 4))) (SETQ ERR (LOGAND BYTE 15)) (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below and to the right.) (* calculate |1/4| of error.) (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELERROR (IPLUS (\GETBASE ERRTABLEPTR 1) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASE ERRTABLEPTR 1 (LRSH ERR 1)) (* |3/8| to one below) (\PUTBASE ERRTABLEPTR 0 (IPLUS (\GETBASE ERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1)))) (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 1)))))) +(PUTPROPS .GET.4BIT.AND.SPREAD.ERR. MACRO [(STREAM) + (PROGN -(PUTPROPS .GET.1BIT.AND.SPREAD.ERR. MACRO ((STREAM) (PROGN (* returns the most significant bit taking into account the error and spreads the error into the appropriate places.) (SETQ BYTE (IPLUS (\BIN STREAM) THISPIXELERROR)) (PROG1 (SETQ VAL (COND ((IGREATERP BYTE 255) (* overflow case) 0) ((IGREATERP 0 BYTE) (* overflow case) 1) (T (LOGXOR (LRSH BYTE 7) 1)))) (SETQ ERR (IDIFFERENCE BYTE (\GETBASE INTENSITYBASE VAL))) (* put |3/8| of error into next pixel, |3/8| to one below and |1/4| to one below and to the right.) (* calculate |1/4| of error.) (SETQ ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) 2) 64)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THREEEIGHTSERR (IPLUS ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) 1) 128))) (SETQ THISPIXELERROR (IPLUS (\GETBASEPTR ERRTABLEPTR 2) THREEEIGHTSERR)) (* |1/4| of error to next one down to right.) (\PUTBASEPTR ERRTABLEPTR 2 ERR) (* |3/8| to one below) (\PUTBASEPTR ERRTABLEPTR 0 (IPLUS (\GETBASEPTR ERRTABLEPTR 0) THREEEIGHTSERR)) (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 2)))))) + (* returns the 4 most significant bits taking into account the error and spreads + the error into the appropriate places.) -(PUTPROPS .GET.NBIT.AND.SPREAD.ERR. MACRO ((STREAM) (PROGN (* returns the NBITS most significant bits taking into account the error and spreads the error into the appropriate places.) (SETQ BYTE (IPLUS (IDIFFERENCE 255 (\BIN STREAM)) THISPIXELERROR)) (PROG1 (SETQ VAL (COND ((IGREATERP BYTE 255) (* overflow case) MAXVALUE) ((IGREATERP 0 BYTE) 0) (T (LRSH BYTE DELBITS)))) (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below and to the right.) (SETQ ERR (IDIFFERENCE BYTE (\GETBASE INTENSITYBASE VAL))) (* calculate |1/4| of error.) (SETQ ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) 2) 64)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THREEEIGHTSERR (IPLUS ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) 1) 128))) (SETQ THISPIXELERROR (IPLUS (\GETBASEPTR ERRTABLEPTR 2) THREEEIGHTSERR)) (* |1/8| of error to next one down to right.) (\PUTBASEPTR ERRTABLEPTR 2 ERR) (* |3/8| to one below) (\PUTBASEPTR ERRTABLEPTR 0 (IPLUS (\GETBASEPTR ERRTABLEPTR 0) THREEEIGHTSERR)) (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 2)))))) + (SETQ BYTE (IPLUS (\BIN STREAM) + THISPIXELERROR)) + (PROG1 (COND + ((IGREATERP BYTE 255) + (* overflow case) + 15) + (T (LRSH BYTE 4))) + (SETQ ERR (LOGAND BYTE 15)) -(PUTPROPS .GET.LEFTMOST.4BIT MACRO ((STREAM) (* returns the 4 most significant bits) (LRSH (\BIN STREAM) 4))) + (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below + and to the right.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH ERR 2)) + (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELERROR + (IPLUS (\GETBASE ERRTABLEPTR 1) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASE ERRTABLEPTR 1 (LRSH ERR 1)) + (* |3/8| to one below) + [\PUTBASE ERRTABLEPTR 0 + (IPLUS (\GETBASE ERRTABLEPTR 0) + (IPLUS ERR (LRSH ERR 1] + (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 1)))]) -(PUTPROPS .GET.LEFTMOST.BIT. MACRO ((STREAM) (* returns the most significant bit from an 8 bit sample. It also inverts the sign of the bit since 1 is black and 0 white. NIL) (COND ((IGREATERP (COND (FILTERARRAY (ELT FILTERARRAY (\BIN STREAM))) (T (\BIN STREAM))) 127) 0) (T 1)))) +(PUTPROPS .GET.1BIT.AND.SPREAD.ERR. MACRO [(STREAM) + (PROGN -(PUTPROPS .GET.BESTCOLOR.AND.SPREAD.ERR. MACRO (NIL (PROGN (* returns the best matching color bits taking into account the error and spreads the error into the appropriate places.) (SETQ COLOR (CLOSEST.COLOR COLORMAP (SETQ REDBYTE (IPLUS (\BIN REDSTREAM) THISPIXELREDERROR)) (SETQ GREENBYTE (IPLUS (\BIN GREENSTREAM) THISPIXELGREENERROR)) (SETQ BLUEBYTE (IPLUS (\BIN BLUESTREAM) THISPIXELBLUEERROR)))) (SETQ RGB (ELT COLORMAP COLOR)) (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB RED) of RGB) REDBYTE)) (COND ((IGREATERP ERR -1) (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below and to the right.) (* calculate |1/4| of error.) (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELREDERROR (IPLUS (\GETBASEPTR REDERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR REDERRTABLEPTR 2 (LRSH ERR 1)) (* |3/8| to one below) (\PUTBASEPTR REDERRTABLEPTR 0 (IPLUS (\GETBASEPTR REDERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1))))) (T (* error is negative, do things differently.) (* calculate |1/4| of error.) (SETQ ERR (LRSH (IMINUS ERR) 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELREDERROR (IDIFFERENCE (\GETBASEPTR REDERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR REDERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) (* |3/8| to one below) (\PUTBASEPTR REDERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR REDERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1)))))) (SETQ REDERRTABLEPTR (\ADDBASE REDERRTABLEPTR 2))) (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB GREEN) of RGB) GREENBYTE)) (COND ((IGREATERP ERR -1) (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below and to the right.) (* calculate |1/4| of error.) (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELGREENERROR (IPLUS (\GETBASEPTR GREENERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR GREENERRTABLEPTR 2 (LRSH ERR 1)) (* |3/8| to one below) (\PUTBASEPTR GREENERRTABLEPTR 0 (IPLUS (\GETBASEPTR GREENERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1))))) (T (* error is negative, do things differently.) (* calculate |1/4| of error.) (SETQ ERR (LRSH (IMINUS ERR) 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELGREENERROR (IDIFFERENCE (\GETBASEPTR GREENERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR GREENERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) (* |3/8| to one below) (\PUTBASEPTR GREENERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR GREENERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1)))))) (SETQ GREENERRTABLEPTR (\ADDBASE GREENERRTABLEPTR 2))) (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB BLUE) of RGB) BLUEBYTE)) (COND ((IGREATERP ERR -1) (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below and to the right.) (* calculate |1/4| of error.) (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELBLUEERROR (IPLUS (\GETBASEPTR BLUEERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR BLUEERRTABLEPTR 2 (LRSH ERR 1)) (* |3/8| to one below) (\PUTBASEPTR BLUEERRTABLEPTR 0 (IPLUS (\GETBASEPTR BLUEERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1))))) (T (* error is negative, do things differently.) (* calculate |1/4| of error.) (SETQ ERR (LRSH (IMINUS ERR) 2)) (* |3/8| of error to next pixel plus error from previous line) (SETQ THISPIXELBLUEERROR (IDIFFERENCE (\GETBASEPTR BLUEERRTABLEPTR 2) (IPLUS ERR (LRSH ERR 1)))) (* |1/8| of error to next one down to right.) (\PUTBASEPTR BLUEERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) (* |3/8| to one below) (\PUTBASEPTR BLUEERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR BLUEERRTABLEPTR 0) (IPLUS ERR (LRSH ERR 1)))))) (SETQ BLUEERRTABLEPTR (\ADDBASE BLUEERRTABLEPTR 2))) COLOR))) + (* returns the most significant bit taking into account the error and spreads the + error into the appropriate places.) -(PUTPROPS .4BIT.MODULATE.INTENSITY.VALUE. MACRO ((STREAM) (LOGAND (IMIN 255 (IMAX (IPLUS (\BIN STREAM) (RAND MODMIN MODMAX)) 0)) 240))) + (SETQ BYTE (IPLUS (\BIN STREAM) + THISPIXELERROR)) + (PROG1 [SETQ VAL (COND + ((IGREATERP BYTE 255) + (* overflow case) + 0) + ((IGREATERP 0 BYTE) + (* overflow case) + 1) + (T (LOGXOR (LRSH BYTE 7) + 1] + (SETQ ERR (IDIFFERENCE BYTE (\GETBASE + INTENSITYBASE + VAL))) -(PUTPROPS .MODULATE.INTENSITY.VALUE. MACRO ((STREAM) (IMIN 255 (IMAX (IPLUS (\BIN STREAM) (RAND MODMIN MODMAX)) 0)))) + (* put |3/8| of error into next pixel, |3/8| to one below and |1/4| to one below + and to the right.) + (* calculate |1/4| of error.) + (SETQ ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) + 2) + 64)) + (* |3/8| of error to next pixel plus + error from previous line) + (SETQ THREEEIGHTSERR + (IPLUS ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) + 1) + 128))) + (SETQ THISPIXELERROR (IPLUS (\GETBASEPTR + ERRTABLEPTR + 2) + THREEEIGHTSERR)) + (* |1/4| of error to next one down to + right.) + (\PUTBASEPTR ERRTABLEPTR 2 ERR) + (* |3/8| to one below) + (\PUTBASEPTR ERRTABLEPTR 0 + (IPLUS (\GETBASEPTR ERRTABLEPTR 0) + THREEEIGHTSERR)) + (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 2)))]) -(PUTPROPS SQUARE MACRO (LAMBDA (X) (* coded this way because negative arith is not is microcode for ITIMES) (COND ((IGREATERP X -1) (ITIMES X X)) (T (ITIMES (SETQ X (IMINUS X)) X))))) +(PUTPROPS .GET.NBIT.AND.SPREAD.ERR. MACRO [(STREAM) + (PROGN + + (* returns the NBITS most significant bits taking into account the error and + spreads the error into the appropriate places.) + + (SETQ BYTE (IPLUS (IDIFFERENCE 255 (\BIN STREAM)) + THISPIXELERROR)) + (PROG1 [SETQ VAL (COND + ((IGREATERP BYTE 255) + (* overflow case) + MAXVALUE) + ((IGREATERP 0 BYTE) + 0) + (T (LRSH BYTE DELBITS] + + (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below + and to the right.) + + (SETQ ERR (IDIFFERENCE BYTE (\GETBASE + INTENSITYBASE + VAL))) + (* calculate |1/4| of error.) + (SETQ ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) + 2) + 64)) + (* |3/8| of error to next pixel plus + error from previous line) + (SETQ THREEEIGHTSERR + (IPLUS ERR (IDIFFERENCE (LRSH (IPLUS 256 ERR) + 1) + 128))) + (SETQ THISPIXELERROR (IPLUS (\GETBASEPTR + ERRTABLEPTR + 2) + THREEEIGHTSERR)) + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR ERRTABLEPTR 2 ERR) + (* |3/8| to one below) + (\PUTBASEPTR ERRTABLEPTR 0 + (IPLUS (\GETBASEPTR ERRTABLEPTR 0) + THREEEIGHTSERR)) + (SETQ ERRTABLEPTR (\ADDBASE ERRTABLEPTR 2)))]) + +(PUTPROPS .GET.LEFTMOST.4BIT MACRO ((STREAM) (* returns the 4 most significant bits) + (LRSH (\BIN STREAM) + 4))) + +(PUTPROPS .GET.LEFTMOST.BIT. MACRO ((STREAM) + + (* returns the most significant bit from an 8 bit sample. + It also inverts the sign of the bit since 1 is black and 0 white. + NIL) + + (COND + ((IGREATERP (COND + (FILTERARRAY (ELT FILTERARRAY (\BIN STREAM))) + (T (\BIN STREAM))) + 127) + 0) + (T 1)))) + +(PUTPROPS .GET.BESTCOLOR.AND.SPREAD.ERR. MACRO + (NIL (PROGN + + (* returns the best matching color bits taking into account the error and spreads + the error into the appropriate places.) + + [SETQ COLOR (CLOSEST.COLOR COLORMAP (SETQ REDBYTE (IPLUS (\BIN REDSTREAM) + THISPIXELREDERROR)) + (SETQ GREENBYTE (IPLUS (\BIN GREENSTREAM) + THISPIXELGREENERROR)) + (SETQ BLUEBYTE (IPLUS (\BIN BLUESTREAM) + THISPIXELBLUEERROR] + (SETQ RGB (ELT COLORMAP COLOR)) + (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB RED) of RGB) + REDBYTE)) + [COND + [(IGREATERP ERR -1) + + (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below + and to the right.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELREDERROR (IPLUS (\GETBASEPTR REDERRTABLEPTR 2) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR REDERRTABLEPTR 2 (LRSH ERR 1)) + (* |3/8| to one below) + (\PUTBASEPTR REDERRTABLEPTR 0 (IPLUS (\GETBASEPTR REDERRTABLEPTR 0) + (IPLUS ERR (LRSH ERR 1] + (T (* error is negative, do things + differently.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH (IMINUS ERR) + 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELREDERROR (IDIFFERENCE (\GETBASEPTR REDERRTABLEPTR 2 + ) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR REDERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) + (* |3/8| to one below) + (\PUTBASEPTR REDERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR + REDERRTABLEPTR 0 + ) + (IPLUS ERR (LRSH ERR 1] + (SETQ REDERRTABLEPTR (\ADDBASE REDERRTABLEPTR 2))) + (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB GREEN) of RGB) + GREENBYTE)) + [COND + [(IGREATERP ERR -1) + + (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below + and to the right.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELGREENERROR (IPLUS (\GETBASEPTR GREENERRTABLEPTR 2) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR GREENERRTABLEPTR 2 (LRSH ERR 1)) + (* |3/8| to one below) + (\PUTBASEPTR GREENERRTABLEPTR 0 (IPLUS (\GETBASEPTR GREENERRTABLEPTR + 0) + (IPLUS ERR (LRSH ERR 1] + (T (* error is negative, do things + differently.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH (IMINUS ERR) + 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELGREENERROR (IDIFFERENCE (\GETBASEPTR + GREENERRTABLEPTR 2) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR GREENERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) + (* |3/8| to one below) + (\PUTBASEPTR GREENERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR + GREENERRTABLEPTR + 0) + (IPLUS ERR (LRSH ERR 1] + (SETQ GREENERRTABLEPTR (\ADDBASE GREENERRTABLEPTR 2))) + (PROGN (SETQ ERR (IDIFFERENCE (fetch (RGB BLUE) of RGB) + BLUEBYTE)) + [COND + [(IGREATERP ERR -1) + + (* put |3/8| of error into next pixel, |3/8| to one below and |1/8| to one below + and to the right.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH ERR 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELBLUEERROR (IPLUS (\GETBASEPTR BLUEERRTABLEPTR 2) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR BLUEERRTABLEPTR 2 (LRSH ERR 1)) + (* |3/8| to one below) + (\PUTBASEPTR BLUEERRTABLEPTR 0 (IPLUS (\GETBASEPTR BLUEERRTABLEPTR 0 + ) + (IPLUS ERR (LRSH ERR 1] + (T (* error is negative, do things + differently.) + (* calculate |1/4| of error.) + (SETQ ERR (LRSH (IMINUS ERR) + 2)) (* |3/8| of error to next pixel plus + error from previous line) + [SETQ THISPIXELBLUEERROR (IDIFFERENCE (\GETBASEPTR BLUEERRTABLEPTR + 2) + (IPLUS ERR (LRSH ERR 1] + (* |1/8| of error to next one down to + right.) + (\PUTBASEPTR BLUEERRTABLEPTR 2 (IMINUS (LRSH ERR 1))) + (* |3/8| to one below) + (\PUTBASEPTR BLUEERRTABLEPTR 0 (IDIFFERENCE (\GETBASEPTR + BLUEERRTABLEPTR + 0) + (IPLUS ERR (LRSH ERR 1] + (SETQ BLUEERRTABLEPTR (\ADDBASE BLUEERRTABLEPTR 2))) + COLOR))) + +(PUTPROPS .4BIT.MODULATE.INTENSITY.VALUE. MACRO ((STREAM) + (LOGAND (IMIN 255 (IMAX (IPLUS (\BIN STREAM) + (RAND MODMIN MODMAX)) + 0)) + 240))) + +(PUTPROPS .MODULATE.INTENSITY.VALUE. MACRO ((STREAM) + (IMIN 255 (IMAX (IPLUS (\BIN STREAM) + (RAND MODMIN MODMAX)) + 0)))) + +(PUTPROPS SQUARE MACRO [LAMBDA (X) (* coded this way because negative + arith is not is microcode for ITIMES) + (COND + ((IGREATERP X -1) + (ITIMES X X)) + (T (ITIMES (SETQ X (IMINUS X)) + X]) ) -(MOVD? (QUOTE FAST.COLOR.DISTANCE) (QUOTE COLOR.DISTANCE)) +(MOVD? 'FAST.COLOR.DISTANCE 'COLOR.DISTANCE) -(RPAQQ AISDIRECTORIES (T {CORE} {DSK} {CYAN})) +(RPAQQ AISDIRECTORIES (T {CORE} {DSK} {CYAN})) (DECLARE%: DOEVAL@COMPILE DONTCOPY - (GLOBALVARS AISDIRECTORIES) ) (PUTPROPS READAIS COPYRIGHT ("Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1827 40089 (24BITCOLORTO8BITMAP 1837 . 3843) (AISBLT 3845 . 10524) (AISBLT1TO1 10526 . -11817) (AISBLT8TO4MODUL 11819 . 13524) (AISBLT8TOLESSFSA 13526 . 15610) (AISBLT8TO4TRUNC 15612 . 16848 -) (AISBLT8TO8 16850 . 19104) (AISBLT4TO4 19106 . 21591) (AISBLT8TO4LESSFSA 21593 . 23620) ( -AISBLT8TO1FSA 23622 . 26181) (AISBLT8TO1TRUNC 26183 . 27872) (CLOSEST.COLOR 27874 . 28236) ( -GRAPHAISHISTOGRAM 28238 . 28847) (AISHISTOGRAM 28849 . 30585) (SMOOTHEDFILTER 30587 . 31648) ( -SLOW.COLOR.DISTANCE 31650 . 31948) (FAST.COLOR.DISTANCE 31950 . 32242) (INSUREAISFILE 32244 . 33441) ( -SHOWCOLORAIS 33443 . 35628) (SHOWCOLORAIS1 35630 . 37166) (WRITEAIS 37168 . 39031) (WRITEAIS1 39033 . -39353) (\GETBASENYBBLE 39355 . 39642) (\PUTBASENYBBLE 39644 . 40087))))) + (FILEMAP (NIL (1582 41465 (24BITCOLORTO8BITMAP 1592 . 3598) (AISBLT 3600 . 10279) (AISBLT1TO1 10281 . +11572) (AISBLT8TO4MODUL 11574 . 13279) (AISBLT8TOLESSFSA 13281 . 15365) (AISBLT8TO4TRUNC 15367 . 16603 +) (AISBLT8TO8 16605 . 18859) (AISBLT4TO4 18861 . 21346) (AISBLT8TO4LESSFSA 21348 . 23375) ( +AISBLT8TO1FSA 23377 . 25936) (AISBLT8TO1TRUNC 25938 . 27627) (CLOSEST.COLOR 27629 . 27991) ( +GRAPHAISHISTOGRAM 27993 . 28602) (AISHISTOGRAM 28604 . 31961) (SMOOTHEDFILTER 31963 . 33024) ( +SLOW.COLOR.DISTANCE 33026 . 33324) (FAST.COLOR.DISTANCE 33326 . 33618) (INSUREAISFILE 33620 . 34817) ( +SHOWCOLORAIS 34819 . 37004) (SHOWCOLORAIS1 37006 . 38542) (WRITEAIS 38544 . 40407) (WRITEAIS1 40409 . +40729) (\GETBASENYBBLE 40731 . 41018) (\PUTBASENYBBLE 41020 . 41463))))) STOP diff --git a/lispusers/READAIS.LCOM b/lispusers/READAIS.LCOM index 78920ee1..1f558c6f 100644 Binary files a/lispusers/READAIS.LCOM and b/lispusers/READAIS.LCOM differ diff --git a/lispusers/READINTERPRESS b/lispusers/READINTERPRESS index e64e9964..0bc37aed 100644 --- a/lispusers/READINTERPRESS +++ b/lispusers/READINTERPRESS @@ -1,11 +1,12 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "22-Jun-2021 10:52:34"  -{DSK}kaplan>Local>medley3.5>git-medley>lispusers>READINTERPRESS.;4 10412 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS PRINTSEQUENCE) +(FILECREATED "24-Sep-2023 13:52:48" {WMEDLEY}READINTERPRESS.;6 11350 - previous date%: "22-Jun-2021 10:35:30" -{DSK}kaplan>Local>medley3.5>git-medley>lispusers>READINTERPRESS.;3) + :EDIT-BY rmk + + :CHANGES-TO (FNS SHOWFILE) + + :PREVIOUS-DATE "22-Jun-2021 10:52:34" {WMEDLEY}READINTERPRESS.;4) (* ; " @@ -122,8 +123,53 @@ Copyright (c) 1983-1986, 1988, 2021 by Xerox Corporation. ) (SHOWFILE -(LAMBDA (IPFILE OUTPUTFILE MAXZEROLINES) (* rmk%: "16-Jun-84 15:29") (OR MAXZEROLINES (SETQ MAXZEROLINES 5)) (RESETLST (PROG (STREAM) (RESETSAVE (SETQ STREAM (OPENFILE IPFILE (QUOTE INPUT))) (QUOTE (PROGN (CLOSEF? OLDVALUE)))) (SETQ STREAM (GETSTREAM STREAM)) (* Don't do an OPENSTREAM until (OPENP stream) is NIL if stream is closed.) (RESETSAVE (OUTPUT)) (RESETSAVE (SETQ OUTPUTFILE (OPENFILE OUTPUTFILE (QUOTE OUTPUT))) (QUOTE (PROGN (CLOSEF? OLDVALUE) (AND RESETSTATE (DELFILE OLDVALUE))))) (OUTPUT OUTPUTFILE) (printout NIL .FONT DEFAULTFONT (OPENP STREAM (QUOTE INPUT)) T T) (for I B1 B2 B3 B4 B5 B6 B7 B8 (NZEROLINES _ 0) from 1 by 8 until (\EOFP STREAM) do (printout NIL |.I5| I %,,) (SETQ B1 (SHOWBYTE STREAM)) (SETQ B2 (SHOWBYTE STREAM)) (SETQ B3 (SHOWBYTE STREAM)) (SETQ B4 (SHOWBYTE STREAM)) (printout NIL %,,) (SETQ B5 (SHOWBYTE STREAM)) (SETQ B6 (SHOWBYTE STREAM)) (SETQ B7 (SHOWBYTE STREAM)) (SETQ B8 (SHOWBYTE STREAM)) (TAB 23) (COND (B1 (printout NIL |.I4| B1))) (COND (B2 (printout NIL |.I4| B2))) (COND (B3 (printout NIL |.I4| B3))) (COND (B4 (printout NIL |.I4| B4))) (printout NIL %,,) (COND (B5 (printout NIL |.I4| B5))) (COND (B6 (printout NIL |.I4| B6))) (COND (B7 (printout NIL |.I4| B7))) (COND (B8 (printout NIL |.I4| B8 T)))) (RETURN (LIST (CLOSEF IPFILE) (CLOSEF OUTPUTFILE)))))) -) + [LAMBDA (IPFILE OUTPUTFILE MAXZEROLINES) (* ; "Edited 24-Sep-2023 13:52 by rmk") + (* rmk%: "16-Jun-84 15:29") + (OR MAXZEROLINES (SETQ MAXZEROLINES 5)) + (RESETLST + [PROG (STREAM) + [RESETSAVE (SETQ STREAM (OPENSTREAM IPFILE 'INPUT)) + '(PROGN (CLOSEF? OLDVALUE] (* Don't do an OPENSTREAM until + (OPENP stream) is NIL if stream is + closed.) + (RESETSAVE (OUTPUT)) + [RESETSAVE (SETQ OUTPUTFILE (OPENSTREAM OUTPUTFILE 'OUTPUT)) + '(PROGN (CLOSEF? OLDVALUE) + (AND RESETSTATE (DELFILE OLDVALUE] + (OUTPUT OUTPUTFILE) + (printout NIL .FONT DEFAULTFONT (OPENP STREAM 'INPUT) + T T) + [for I B1 B2 B3 B4 B5 B6 B7 B8 (NZEROLINES _ 0) from 1 by 8 until (\EOFP STREAM) + do (printout NIL .I5 I %,,) + (SETQ B1 (SHOWBYTE STREAM)) + (SETQ B2 (SHOWBYTE STREAM)) + (SETQ B3 (SHOWBYTE STREAM)) + (SETQ B4 (SHOWBYTE STREAM)) + (printout NIL %,,) + (SETQ B5 (SHOWBYTE STREAM)) + (SETQ B6 (SHOWBYTE STREAM)) + (SETQ B7 (SHOWBYTE STREAM)) + (SETQ B8 (SHOWBYTE STREAM)) + (TAB 23) + (COND + (B1 (printout NIL .I4 B1))) + (COND + (B2 (printout NIL .I4 B2))) + (COND + (B3 (printout NIL .I4 B3))) + (COND + (B4 (printout NIL .I4 B4))) + (printout NIL %,,) + (COND + (B5 (printout NIL .I4 B5))) + (COND + (B6 (printout NIL .I4 B6))) + (COND + (B7 (printout NIL .I4 B7))) + (COND + (B8 (printout NIL .I4 B8 T] + (RETURN (LIST (CLOSEF IPFILE) + (CLOSEF OUTPUTFILE])]) (SHOWBYTE (LAMBDA (STREAM) (* rmk%: "13-JUL-82 18:01") (PROG ((BYTE (COND ((NOT (\EOFP STREAM)) (\BIN STREAM))))) (COND (BYTE (PRIN1 (COND ((AND (IGEQ BYTE (CHARCODE SPACE)) (ILESSP BYTE (CHARCODE DEL)) (NEQ BYTE 96)) (CHARACTER BYTE)) (T (QUOTE %.)))))) (RETURN BYTE))) @@ -132,14 +178,14 @@ Copyright (c) 1983-1986, 1988, 2021 by Xerox Corporation. (DECLARE%: EVAL@COMPILE (PUTPROPS BIN.RIP MACRO [ARGS (LET ((ISTREAM (CAR ARGS)) - (OSTREAM (CADR ARGS))) - `(LET [(C (BIN ,ISTREAM] - (COND - ((IGREATERP (POSITION ,OSTREAM) - 15) - (printout ,OSTREAM 5 "|" 8))) - (printout ,OSTREAM .I3 C " ") - C]) + (OSTREAM (CADR ARGS))) + `(LET [(C (BIN ,ISTREAM] + (COND + ((IGREATERP (POSITION ,OSTREAM) + 15) + (printout ,OSTREAM 5 "|" 8))) + (printout ,OSTREAM .I3 C " ") + C]) ) (DECLARE%: EVAL@COMPILE DONTCOPY @@ -156,8 +202,9 @@ Copyright (c) 1983-1986, 1988, 2021 by Xerox Corporation. ) (PUTPROPS READINTERPRESS COPYRIGHT ("Xerox Corporation" 1983 1984 1985 1986 1988 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1210 1896 (PRINTMASTER 1220 . 1894)) (1897 9430 (OPCODE 1907 . 2032) (TOKEN 2034 . 2606 -) (FINDNONPRIMNAME 2608 . 2713) (FINDOPNAME 2715 . 2972) (SHORTINT 2974 . 3167) (TOKENFORMAT 3169 . -3411) (FINDSEQUENCETYPE 3413 . 3617) (PRINTTOKEN 3619 . 4570) (PRINTSEQUENCE 4572 . 7449) ( -SEARCHIPLIST 7451 . 7583) (READINT.IP 7585 . 7824) (SHOWFILE 7826 . 9150) (SHOWBYTE 9152 . 9428))))) + (FILEMAP (NIL (1158 1844 (PRINTMASTER 1168 . 1842)) (1845 10432 (OPCODE 1855 . 1980) (TOKEN 1982 . +2554) (FINDNONPRIMNAME 2556 . 2661) (FINDOPNAME 2663 . 2920) (SHORTINT 2922 . 3115) (TOKENFORMAT 3117 + . 3359) (FINDSEQUENCETYPE 3361 . 3565) (PRINTTOKEN 3567 . 4518) (PRINTSEQUENCE 4520 . 7397) ( +SEARCHIPLIST 7399 . 7531) (READINT.IP 7533 . 7772) (SHOWFILE 7774 . 10152) (SHOWBYTE 10154 . 10430)))) +) STOP diff --git a/lispusers/READINTERPRESS.LCOM b/lispusers/READINTERPRESS.LCOM index c9323e9b..06b8e147 100644 Binary files a/lispusers/READINTERPRESS.LCOM and b/lispusers/READINTERPRESS.LCOM differ diff --git a/lispusers/REGIONMANAGER b/lispusers/REGIONMANAGER index 0e05334e..463a38c9 100644 --- a/lispusers/REGIONMANAGER +++ b/lispusers/REGIONMANAGER @@ -1,12 +1,10 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "27-Feb-2022 08:48:09"  -{DSK}kaplan>Local>medley3.5>my-medley>lispusers>REGIONMANAGER.;116 37561 +(FILECREATED "10-Oct-2023 22:19:05" {WMEDLEY}REGIONMANAGER.;129 40525 - :CHANGES-TO (FNS \RELCREATEREGION.REF \RELCREATEREGION.SIZE) + :EDIT-BY rmk - :PREVIOUS-DATE "28-Jan-2022 23:52:21" -{DSK}kaplan>Local>medley3.5>my-medley>lispusers>REGIONMANAGER.;113) + :PREVIOUS-DATE "10-Oct-2023 22:17:47" {MEDLEY}REGIONMANAGER.;9) (PRETTYCOMPRINT REGIONMANAGERCOMS) @@ -15,12 +13,12 @@ [ (* ;; "Typed regions") - [COMS (FNS SET-TYPED-REGIONS) + [COMS (FNS SET-TYPED-REGIONS GRAB-TYPED-REGION REGISTER-TYPED-REGION REGION-TYPE) (FNS RM-CREATEW RM-CLOSEW RM-GETREGION CLOSE-TYPED-W) (INITVARS (TYPED-REGIONS)) (GLOBALVARS TYPED-REGIONS) - (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS TYPED-REGION REGION-SOURCE)) - (INITRECORDS TYPED-REGION REGION-SOURCE) + (DECLARE%: EVAL@COMPILE DONTCOPY (RECORDS TYPED-REGION)) + (INITRECORDS TYPED-REGION) (P (MOVD? 'CREATEW 'CREATEW.ORIG) (MOVD? 'CLOSEW 'CLOSEW.ORIG) (MOVD? 'GETREGION 'GETREGION.ORIG) @@ -86,120 +84,170 @@ REGIONS (NCONC REGIONS (CDR PREV)))] else (push TYPED-REGIONS (CONS TYPE REGIONS]) + +(GRAB-TYPED-REGION + [LAMBDA (REGION-TYPE MINWIDTH MINHEIGHT) (* ; "Edited 10-Oct-2023 13:41 by rmk") + (* ; "Edited 14-Sep-2023 07:30 by rmk") + + (* ;; "Returns a REGIONTYPE region that satisfies MINWIDTH and MINHEIGHT, if specified") + + (for R in (CDR (ASSOC REGION-TYPE TYPED-REGIONS)) unless (fetch REGION-INUSE of R) + when [AND (OR (NULL MINWIDTH) + (ILEQ MINWIDTH (fetch WIDTH of R))) + (OR (NULL MINHEIGHT) + (ILEQ MINHEIGHT (fetch HEIGHT of R] do + + (* ;; "We don't mark it as inuse here, leave that gets done by INSTALL-TYPED-REGION when ownership is given to a window. The only downside is that the region could be reallocated before that happens, and 2 window would come up in the same place.") + + (RETURN R]) + +(REGISTER-TYPED-REGION + [LAMBDA (REGION REGION-TYPE WINDOW) (* ; "Edited 10-Oct-2023 13:30 by rmk") + (* ; "Edited 29-Sep-2023 13:33 by rmk") + (* ; "Edited 14-Sep-2023 10:03 by rmk") + + (* ;; "REGION was passed as the REGION argument to the original CREATEW. If that was NIL, CREATEW created its own region, but it didn't do it through GETREGION (=RM.GETREGION) so it hasn't been registered according to the specified type. We set up the arrangements here. ") + + (CL:WHEN REGION-TYPE + (CL:UNLESS REGION + (SETQ REGION (WINDOWREGION WINDOW))) + (LET [(TREGIONLIST (OR (ASSOC REGION-TYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGION-TYPE] + (CL:UNLESS (MEMB REGION (CDR TREGIONLIST)) + (NCONC1 TREGIONLIST REGION)) + (replace REGION-INUSE of REGION with T) + + (* ;; "We keep the original separate from the window's region WINDOWPROP so that RM-CLOSEW can update if the user reshapes.") + + (WINDOWPROP WINDOW 'TYPED-REGION (CONS REGION-TYPE REGION)) + REGION))]) + +(REGION-TYPE + [LAMBDA (X TYPE) (* ; "Edited 10-Oct-2023 14:30 by rmk") + (* ; "Edited 16-Sep-2023 08:41 by rmk") + + (* ;; + "Value is the type of X if it is a region of type TYPE or a region of any type if TYPE is NIL.") + + (CL:WHEN (REGIONP X) + [if TYPE + then (CL:WHEN (MEMB X (CDR (ASSOC TYPE TYPED-REGIONS))) + TYPE) + else (CAR (find TYPELIST in TYPED-REGIONS suchthat (MEMB X TYPELIST])]) ) (DEFINEQ (RM-CREATEW - [LAMBDA (REGION TITLE BORDERSIZE NOOPENFLG PROPS) (* ; "Edited 1-Jan-2022 23:12 by rmk") + [LAMBDA (REGION TITLE BORDERSIZE NOOPENFLG PROPS) (* ; "Edited 24-Sep-2023 20:38 by rmk") + (* ; "Edited 14-Sep-2023 22:23 by rmk") + (* ; "Edited 1-Jan-2022 23:12 by rmk") (* ; "Edited 29-Dec-2021 19:25 by rmk") - (* ;; "Generic CREATEW function for managed regions. If REGIONTYPE is specified (as REGION or in PROPS), then we try to find a previous region for that type that is currently unused, create one if needed.") + (* ;; "Generic CREATEW function for managed regions. If REGION-TYPE is specified (as REGION or in PROPS), then we try to find a previous region for that type that is currently unused, create one if needed.") (* ;; "We have to bracket the original window creation because the we have to mark that the window uses that region, to put it back in the pool when the window is closed.") - (LET (WINDOW REGIONTYPE TYPEDREGION TYPELIST) - [SETQ REGIONTYPE (if (AND REGION (LITATOM REGION)) - then (PROG1 REGION (SETQ REGION NIL)) - else (LISTGET PROPS 'REGION-TYPE] - (SETQ TYPELIST (ASSOC REGIONTYPE TYPED-REGIONS)) + (LET [WINDOW (REGION-TYPE (if (AND (LITATOM REGION) + REGION) + then (PROG1 REGION (SETQ REGION NIL)) + else (LISTGET PROPS 'REGION-TYPE] - (* ;; "We have REGIONTYPE, but maybe also a region that already has a source. Maybe we should make sure that the source is of that type?") + (* ;; "We have REGION-TYPE, but maybe also a region that already has a source. Maybe we should make sure that the source is of that type?") (* ;; "Note: REGION can also be a screenregion, that falls through.") - (IF (REGIONP REGION) - THEN (SETQ TYPEDREGION (FETCH REGION-SOURCE OF REGION)) - ELSEIF TYPELIST - THEN - (* ;; - "If we don't find an unused region, CREATEW will create one in the ordinary way. We type it below.") - - [SETQ TYPEDREGION (FIND R FOUND in (CDR TYPELIST) - SUCHTHAT (NOT (fetch REGION-INUSE of R] - (SETQ REGION TYPEDREGION)) + (CL:WHEN REGION-TYPE + (SETQ REGION (GRAB-TYPED-REGION REGION-TYPE))) (SETQ WINDOW (CREATEW.ORIG REGION TITLE BORDERSIZE NOOPENFLG PROPS)) - - (* ;; "CREATEW doesn't call the user-entry GETREGION, so we have to trap and install its return region here.") - - (CL:WHEN (AND TYPELIST (NULL TYPEDREGION)) (* ; - "If not, we don't record this even if typed.") - (SETQ TYPEDREGION (OR (FETCH REGION-SOURCE OF (SETQ REGION (WINDOWREGION WINDOW))) - (COPY REGION))) - (NCONC1 TYPELIST TYPEDREGION)) - (CL:WHEN TYPEDREGION - (replace REGION-INUSE of TYPEDREGION with T) - (WINDOWPROP WINDOW 'TYPED-REGION TYPEDREGION) - (WINDOWPROP WINDOW 'REGION-TYPE REGIONTYPE)) + (CL:WHEN REGION-TYPE (REGISTER-TYPED-REGION REGION REGION-TYPE WINDOW)) WINDOW]) (RM-CLOSEW - [LAMBDA (WINDOW) (* ; "Edited 29-Dec-2021 15:44 by rmk") - (* ; "Edited 28-Dec-2021 11:02 by rmk") - (* ; "Edited 27-Nov-2021 10:00 by rmk:") - (* ; "Edited 26-Oct-2021 21:54 by rmk:") - (* ; - "Edited 25-Apr-94 10:08 by sybalsky") - (* ; "") + [LAMBDA (WINDOW) (* ; "Edited 10-Oct-2023 22:11 by rmk") (* ;;  "Makes the window's typed region available for reuse, if the window is marked with a TYPEDREGION.") (* ;; "It's possible that the window exists and can be reopened after it has been closed. The glitch in that case is that we may have decided to make the window's region available to another window, and if this window is opened again it will come on top of that other one (if it hasn't moved). Oh well.") - (LET [(TYPEDREGION (WINDOWPROP WINDOW 'TYPED-REGION] - (CL:WHEN (AND (CLOSEW.ORIG WINDOW) - TYPEDREGION) - (REPLACE REGION-INUSE OF TYPEDREGION WITH NIL) - (WINDOWPROP WINDOW 'TYPED-REGION NIL) - T)]) + (* ;; "This replaces the particular typed-region in TYPED-REGIONS with the region that the window ended up with, perhaps after the user reshaped it. But (WINDOWPROP WINDOW 'REGION) doesn't include the prompt window, if it's there, and (WINDOWREGION WINDOW) would union in all of the attached windows (menus etc.) This code assumes that the promptwindow was taken out of the original region (lots of funky code does that), so it unions it back in to the REGION property to reconstruct the original typed-region. The alternative would be to have the windows region copy the original grabbed region and restore only that. But then we would be ignoring any reshaping adjustments.") + + (LET* [CLOSEVAL (TYPEDREGION (WINDOWPROP WINDOW 'TYPED-REGION)) + (REGIONTYPE (CAR TYPEDREGION)) + (TREGION (CDR TYPEDREGION)) + [PWINDOW (WINDOWP (CAR (MKLIST (WINDOWPROP WINDOW 'PROMPTWINDOW] + [WREGION (CL:IF PWINDOW + (UNIONREGIONS (WINDOWPROP WINDOW 'REGION) + (WINDOWPROP PWINDOW 'REGION)) + (WINDOWPROP WINDOW 'REGION))] + (TREGIONLIST (AND REGIONTYPE (OR (ASSOC REGIONTYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGIONTYPE] + (CL:WHEN (AND (SETQ CLOSEVAL (CLOSEW.ORIG WINDOW)) + TYPEDREGION) + (CL:UNLESS (EQUAL TREGION WREGION) + + (* ;; "The user reshaped the window after the region was taken from TYPED-REGIONS. Assume that the new shape is what should be offered when this is recycled. Important to keep the same structure") + + (with REGION TREGION (SETQ LEFT (fetch (REGION LEFT) of WREGION)) + (SETQ BOTTOM (fetch (REGION BOTTOM) of WREGION)) + (SETQ WIDTH (fetch (REGION WIDTH) of WREGION)) + (SETQ HEIGHT (fetch (REGION HEIGHT) of WREGION)))) + + (* ;; "Move TREGION to the front so most recently closed will be recycled first") + + (CL:WHEN TREGIONLIST + (change (CDR TREGIONLIST) + (CONS TREGION (DREMOVE TREGION DATUM)))) + (replace REGION-INUSE of TREGION with NIL) + (WINDOWPROP WINDOW 'TYPED-REGION NIL)) + CLOSEVAL]) (RM-GETREGION - [LAMBDA (MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG INITCORNERS) + [LAMBDA (MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG INITCORNERS) + (* ; "Edited 10-Oct-2023 12:39 by rmk") + (* ; "Edited 14-Sep-2023 07:50 by rmk") (* ; "Edited 1-Jan-2022 21:49 by rmk") - (* ;; "If INITREGION is a type atom and a region of that type is available, then use it as the INITREGION. Otherwise, add a copy of the new region to the available list, and assert that the new region has the copy as its source.") + (* ;; "If INITREGION is a type atom:") - (* ;; "We don't know what will happen to the new region, but if it ends up as a region for CREATEW, the source information enables us to mark its source as inuse.") + (* ;; " If a region of that type is available, then a (copy) is returned.") - (* ;; "This allows for the possibility that the application is actually asking the user for a constellation region that will be shrunk in anticipation of future satellite attachments. A future retrieval will return the original size and position, and it will then presumably be shrunk in the same way.") + (* ;; " Otherwise, the user is asked for a new region, that is added to the type list, and again a copy is returned.") - (LET (REGION (TYPELIST (ASSOC (CL:WHEN (AND INITREGION (LITATOM INITREGION)) - INITREGION) - TYPED-REGIONS))) - (FOR R in (CDR TYPELIST) UNLESS (fetch REGION-INUSE of R) - WHEN [AND (OR (NULL MINWIDTH) - (ILEQ MINWIDTH (FETCH WIDTH OF R))) - (OR (NULL MINHEIGHT) - (ILEQ MINHEIGHT (FETCH HEIGHT OF R] - DO - (* ;; "Copy so the caller can update the region without affecting the recyclable source, but remember what it is based on. We don't mark it as used here, maybe a window won't be built around it and it will fade away. However, there is the risk that another GETREGION will find the same source before it is given to a window, in which case 2 windows might open up in the same place.") + (* ;; "We return a copy because we don't know what will happen to this region, whether it will be changed by future operations (e.g. by a constellation operation). A future retrieval will return the original size and position, and it will then presumably be shrunk in the same way.") - (SETQ REGION (COPY R)) - (REPLACE REGION-SOURCE OF REGION WITH R) - (RETURN)) - - (* ;; "If we found a good one, we're done. Otherwise, run the normal code, but save the new region if it is typed.") + (* ;; " If INITREGION is not a typeatom, it is passed through to the original GETREGION, and the new region will not be managed.") + (LET (REGION TYPELIST (REGION-TYPE (AND (LITATOM INITREGION) + INITREGION))) + (SETQ REGION (GRAB-TYPED-REGION REGION-TYPE MINWIDTH MINHEIGHT)) (CL:UNLESS REGION - (SETQ REGION (GETREGION.ORIG MINWIDTH MINHEIGHT INITREGION NEWREGIONFN NEWREGIONFNARG - INITCORNERS)) - (CL:WHEN TYPELIST - (* ;; - "The new region is based on a typed region. The saved source is a copy of what we return.") + (* ;; "If we found a good one, INITREGIONS must have been a type, and we're done. Otherwise, run the normal code, but save the new region as a new instance if its typed.") - (NCONC1 TYPELIST (REPLACE REGION-SOURCE OF REGION WITH (COPY REGION))))) + (SETQ REGION (GETREGION.ORIG MINWIDTH MINHEIGHT (CL:IF REGION-TYPE + NIL + INITREGION) + NEWREGIONFN NEWREGIONFNARG INITCORNERS)) + (CL:WHEN REGION-TYPE + + (* ;; "A new typed region to add to the list . ") + + (NCONC1 [OR (ASSOC REGION-TYPE TYPED-REGIONS) + (CAR (PUSH TYPED-REGIONS (CONS REGION-TYPE] + REGION))) REGION]) (CLOSE-TYPED-W - [LAMBDA (TYPE) (* ; "Edited 29-Dec-2021 15:58 by rmk") - (* ; "Edited 27-Nov-2021 11:50 by rmk:") + [LAMBDA (TYPE) (* ; "Edited 14-Sep-2023 07:39 by rmk") + (* ; "Edited 29-Dec-2021 15:58 by rmk") + (* ; "Edited 27-Nov-2021 11:50 by rmk:") - (* ;; "Closes all windows of REGIONTYPE inside TYPE") + (* ;; "Closes all windows whose regions are of type TYPE") (CL:WHEN TYPE - (for W R in (OPENWINDOWS) when (AND (SETQ WT (WINDOWPROP W 'REGION-TYPE)) - (EQMEMB WT TYPE)) do (CLOSEW W)))]) + (for W R in (OPENWINDOWS) eachtime [SETQ WT (CAR (WINDOWPROP W 'TYPED-REGION] + when (AND WT (EQMEMB WT TYPE)) do (CLOSEW W)))]) ) (RPAQ? TYPED-REGIONS ) @@ -211,27 +259,17 @@ (DECLARE%: EVAL@COMPILE (HASHLINK TYPED-REGION (REGION-INUSE REGION-INUSE-HASH)) - -(HASHLINK REGION-SOURCE (REGION-SOURCE REGION-SOURCE-HASH)) ) (DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-INUSE-HASH)) (SETUPHASHARRAY 'REGION-INUSE-HASH NIL) - -(DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-SOURCE-HASH)) - -(SETUPHASHARRAY 'REGION-SOURCE-HASH NIL) ) (DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-INUSE-HASH)) (SETUPHASHARRAY 'REGION-INUSE-HASH NIL) -(DECLARE%: EVAL@COMPILE (GLOBALVARS REGION-SOURCE-HASH)) - -(SETUPHASHARRAY 'REGION-SOURCE-HASH NIL) - (MOVD? 'CREATEW 'CREATEW.ORIG) (MOVD? 'CLOSEW 'CLOSEW.ORIG) @@ -683,10 +721,11 @@ ) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1672 3859 (SET-TYPED-REGIONS 1682 . 3857)) (3860 10861 (RM-CREATEW 3870 . 6377) ( -RM-CLOSEW 6379 . 7780) (RM-GETREGION 7782 . 10368) (CLOSE-TYPED-W 10370 . 10859)) (11777 19256 ( -RELCREATEREGION 11787 . 16410) (RELGETREGION 16412 . 19019) (RELCREATEPOSITION 19021 . 19254)) (19257 -26061 (\RELCREATEREGION.REF 19267 . 23018) (\RELCREATEREGION.SIZE 23020 . 26059)) (26114 35456 ( -RM-ATTACHWINDOW 26124 . 35454)) (35457 37191 (CLOSEWITH 35467 . 35994) (CLOSEWITH.DOIT 35996 . 36276) -(MOVEWITH 36278 . 36801) (MOVEWITH.DOIT 36803 . 37189))))) + (FILEMAP (NIL (1573 6691 (SET-TYPED-REGIONS 1583 . 3758) (GRAB-TYPED-REGION 3760 . 4786) ( +REGISTER-TYPED-REGION 4788 . 6085) (REGION-TYPE 6087 . 6689)) (6692 14098 (RM-CREATEW 6702 . 8325) ( +RM-CLOSEW 8327 . 11345) (RM-GETREGION 11347 . 13496) (CLOSE-TYPED-W 13498 . 14096)) (14741 22220 ( +RELCREATEREGION 14751 . 19374) (RELGETREGION 19376 . 21983) (RELCREATEPOSITION 21985 . 22218)) (22221 +29025 (\RELCREATEREGION.REF 22231 . 25982) (\RELCREATEREGION.SIZE 25984 . 29023)) (29078 38420 ( +RM-ATTACHWINDOW 29088 . 38418)) (38421 40155 (CLOSEWITH 38431 . 38958) (CLOSEWITH.DOIT 38960 . 39240) +(MOVEWITH 39242 . 39765) (MOVEWITH.DOIT 39767 . 40153))))) STOP diff --git a/lispusers/REGIONMANAGER.LCOM b/lispusers/REGIONMANAGER.LCOM index f6dd79e8..4784c2a4 100644 Binary files a/lispusers/REGIONMANAGER.LCOM and b/lispusers/REGIONMANAGER.LCOM differ diff --git a/lispusers/REGIONMANAGER.TEDIT b/lispusers/REGIONMANAGER.TEDIT index a53f7e02..cf4e717b 100644 --- a/lispusers/REGIONMANAGER.TEDIT +++ b/lispusers/REGIONMANAGER.TEDIT @@ -3,7 +3,7 @@ Medley REGIONMANAGER 2 1 REGIONMANAGER 1 4 - By Ron Kaplan This document created in December 2021. + By Ron Kaplan This document created in December 2021, last edited September 2023. Medley comes equipped with a core set of functions for specifying regions and creating the windows that occupy those regions on the screen. But it can be disruptive if not irritating to have to draw out a new ghost region for every invocation of a particular application. Thus the common applications (e.g. TEDIT, SEDIT, DINFO...) implement particular strategies to reduce the number of times that a user has to sweep out a new region. They instead default to regions that were allocated for earlier invocations that are no longer active. TEDIT for example recycles the region of a session that was recently shut down, SEDIT allocates from a list of previous regions, DINFO always uses the same region, but FILEBROWSER always prompts for a new one. Applications that do recycle their regions tend to do so indiscrimately, without regard to the current arrangement of other windows on the screen or the role that those windows may play in higher-level applications. The REGIONMANAGER package provides simple extensions to the core region and window functions. These are aimed at giving users and application implementors more flexible and systematic control over the specification and reuse of screen regions. It introduces three new notions: A "typed region" allows the regions of particular applications to be specified, classified, and recycled according to their types. @@ -13,15 +13,21 @@ REGIONMANAGER is innocuous in that explicit user action is required to change th Typed regions REGIONMANAGER adds overlay veneers to the core CREATEW, CLOSEW, and GETREGION functions to make it easier to predict and control how different applications arrange their windows on the screen without always needing to respond to a ghost-region prompt. The REGION/INITREGION arguments may now be region-type atoms in addition to either NIL or particular regions as CREATEW and GETREGION otherwise allow. The type-atom will resolve to a region drawn from a predefined pool of regions associated with that type, if the pool has at least one that is not currently allocated to another window. If the pool has no available regions, then the pool will be enlarged with a region that the user produces from a normal ghost-region prompt, and the type-atom will then resolve to the newly installed region. -A typed-region is marked as "inuse" and therefore unavailable when CREATEW assigns it to a window, and the extended CLOSEW marks it as again available when the window is closed. +A typed-region is marked as "inuse" and therefore unavailable when CREATEW assigns it to a window, and the extended CLOSEW marks it as again available when the window is closed. The region of the most recently closed window will be offered the next time a region of its type is requested. An example of how an application can take advantage of this facility is the TEDIT-PF-SEE package. This provides lightweight alternatives to the PF and SEE commands that print their output to scrollable read-only Tedit windows, specifying PF-TEDIT and SEE-TEDIT as their region types. The user can predefine a preference-ordered sequence of recyclable regions that bring up multiple output windows in a predictable tiled arrangement, without region-prompting for each invocation. The global variable TYPED-REGIONS is an alist that maintains the relationship between atomic type-names and the list of regions that belong to each type. The list is ordered according to preferences set by the user, and a type-atom is always resolved to the first unused region in its list. If the user is asked to sweep out a new region, that region is added at the end, as the least preferable. The function SET-TYPED-REGIONS is provided to add or replace TYPED-REGION entries. (SET-TYPED-REGIONS TYPELISTS REPLACE) [Function] TYPELISTS is an alist of the form ((type1 . regions1)(type2 . regions2)...) -where each regioni is a possibly empty list of regions. For convenience, if TYPELISTS is just a literal type-atom, it is interpreted as ((type)), and if it is a list (type . regions) begining with an atom, it is interpreted as ((type . regions). The new regions replace preexisting regions if REPLACE, otherwise they are added at the front. +where each regionsi is a possibly empty list of regions. For convenience, if TYPELISTS is just a literal type-atom, it is interpreted as ((type)), and if it is a list (type . regions) begining with an atom, it is interpreted as ((type . regions). The new regions replace preexisting regions if REPLACE, otherwise they are added at the front. Typically, a call to SET-TYPED-REGIONS would be placed in a user's INIT file to set up the preference order for the regions that the user wants to participate in this reallocation scheme. If an application uses a type that is not on TYPED-REGIONS, then that type-atom is treated as NIL and always gives rise to the normal ghost-region prompting. Thus a user will observe no change in system behavior if TYPED-REGIONS is left with its initial value NIL. A type that is added with an empty region list (as opposed to not being on the list at all) will allow new regions to accumulate for recycling. - +The function REGION-TYPE returns NIL if X is not a typed-region or not a region of type TYPE. +(REGION-TYPE X TYPE) [Function] +In most scenarios the interpretation of a typed region specification is handled automatically by the extended CREATEW and GETREGION functions. Sometimes it may be useful to perform to for the regions dimensions to be entered into other calculations before it is installed in a window. The function GRAB-TYPED-REGION recycles an existing REGION-TYPE window if one meets the optional minimum width and height requirements, otherwise a new region is returned. +(GRAB-TYPED-REGION REGION-TYPE MINWIDTH MINHEIGHT) [Function] +A type can be assigned to an untyped region and installed in a window by the function REGISTER-TYPED-REGION. That region will then be recycled when the window is closed. +(REGISTER-TYPED-REGION REGION REGION-TYPE WINDOW) [Function] +If REGION is NIL, the (presumably) untyped region of WINDOW will be registered. An entry in TYPED-REGIONS will be created for REGION-TYPE if it is not already present. Relative regions Two functions are provided to make it easy to create regions relative and oriented with respect to a specified reference point. These may be useful for constructing an application that includes a constellation of windows arranged in a particular relative way. (RELCREATEREGION WIDTH HEIGHT CORNERX CORNERY REFX REFY ONSCREEN) [Function] @@ -48,7 +54,7 @@ Applications are often set up as a constellation of windows, a central or primar Each of these applications is constructed by anticipating the subregions that the satellite windows will occupy after they are attached, decreasing the constellation region by their estimated (using WIDTHIFWINDOW HEIGHTIFWINDOW) or actual sizes, and then using remainder as the region for the central window. An alternative approach is to construct the central window first, giving it the entire constellation region, and then to have ATTACHWINDOW reshape that window to accomodate the satellite windows as they are attached in sequence. This leads to the same final configuration, but there is no need for separate calculations to pre-adjust the region of the central window. REGIONMANAGER provides an overlay veneer for ATTACHWINDOW that implements this strategy. If the new argument TAKEFROMCENTRAL is true, then the region of the WINDOWTOATTACH will be substracted from the region of the existing central window according to the EDGE parameter of the attachment. -(ATTACHWINDOW WINDOWTOATTACH MAINWINDOW EDGE POSITIONONEDGE WINDOWCOMACTION TAKEFROMCENTRAL) [Function] +(ATTACHWINDOW WINDOWTOATTACH MAINWINDOW EDGE POSITIONONEDGE WINDOWCOMACTION TAKEFROMCENTRAL) [Function] This behavior is also triggered if the UNDERCONSTRUCTION property of the central window is true. Thus, a constellation can be set up by creating all of the satellites and the central window, marking the central window as under construction, and then doing the sequence of attachments. The property can be reset to NIL when the construction is complete, so the central window does not shrink if other other attachments (e.g. expanded menus) by later user actions. A somewhat weaker form of a constellation is a collection of windows that are not attached around a central window but stand in a parent-child relationship at least with respect to closing and moving. A parent windows spawns children that respond independently to ordinary window commands (move, shape, close). But the children close when the parent closes, and the children move when the parent moves so that they continue to appear in the same relative positions. These primitives allow the construction of a tree of windows that are dependent in this way. @@ -62,19 +68,14 @@ Establishes a link between the PARENT window and any number of CHILDREN windows If NEWPOS is the new position of PARENT, moves each of the move-children so that they stand in the same relation to PARENT after it moves as before. -(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))) 4$4$4$4$4$1 $$1 $4$1$18$18$J$ PAGEHEADING RUNNINGHEADTERMINALTERMINAL -TIMESROMAN$TERMINALMODERN MODERN -   HRULE.GETFNMODERN -   HRULE.GETFNMODERN -  HRULE.GETFNMODERN - - - HRULE.GETFNMODERN   HRULE.GETFNMODERN   (}/ [ ChT  %   - -; 3o) MA  &MmJS-f= -3E -" - -0: /3 -t2C  "O= - , l 9 S~ - 4!U'2  " (  M.U}z \ No newline at end of file +(LIST ((PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC) STARTINGPAGE# 1) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))) (PAGE NIL (PAPERSIZE Letter FOLIOINFO (ARABIC)) (0 0 612 792) ((FOLIO NIL (PARALOOKS (QUAD CENTERED) CHARLOOKS (SUPERSCRIPT 0 INVISIBLE OFF SELECTPOINT OFF PROTECTED OFF SIZE 10 FAMILY MODERN OVERLINE OFF STRIKEOUT OFF UNDERLINE OFF EXPANSION REGULAR SLOPE REGULAR WEIGHT MEDIUM INVERTED OFF USERINFO NIL STYLE NIL) FORMATINFO (ARABIC)) (174 36 288 36) NIL) (HEADING NIL (HEADINGTYPE RUNNINGHEAD) (84 744 528 36) NIL) (TEXT NIL NIL (84 96 456 600) NIL))))) 1$4$4$1 $$1 $4$4$4$4$1$18$18$J$ PAGEHEADING RUNNINGHEADMODERN +rd(DEFAULTFONT 1 (TERMINAL 12) (TERMINAL 8) (TERMINAL 8) (PDF (TERMINAL 8)) (POSTSCRIPT (TERMINAL 8))) TERMINALMODERN TERMINALTERMINAL +TIMESROMAN$  HRULE.GETFN   HRULE.GETFN  HRULE.GETFN   HRULE.GETFN  HRULE.GETFN +D   }/ [ CT  1  + +; 3o)      4 n  o2 V@1 %!  A  &MmJS-f= +3E +" + +l /3 +t2C  "O=  , l)9 S~ - 4!Uh'2&$"&( )MDATE:f12z \ No newline at end of file diff --git a/lispusers/SHOWTIME b/lispusers/SHOWTIME index 601f12ea..fc797fd5 100644 --- a/lispusers/SHOWTIME +++ b/lispusers/SHOWTIME @@ -1,18 +1,48 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "10-Apr-89 18:56:29" {ERINYES}MEDLEY>SHOWTIME.;1 24672 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS SHOWTIME.READ.LISPBM) +(FILECREATED "24-Sep-2023 14:29:56" {WMEDLEY}SHOWTIME.;2 26541 - previous date%: "13-May-88 16:31:25" {POOH/N}LISP>MEDLEY>LISPUSERS>SHOWTIME;1) + :EDIT-BY rmk + + :CHANGES-TO (VARS SHOWTIMECOMS SHOWTIME.ICON SHOWTIME.MASK) + (FNS INFORES SHOWTIME.READ.PRESS) + + :PREVIOUS-DATE "10-Apr-89 18:56:29" {WMEDLEY}SHOWTIME.;1) -(* " -Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. +(* ; " +Copyright (c) 1986-1989 by Xerox Corporation. ") (PRETTYCOMPRINT SHOWTIMECOMS) -(RPAQQ SHOWTIMECOMS ((* ;;; "Mitch Gaarnat and (Mike?) Gocek wrote the original versions of these fns in 1985. They were later modified added to by T. Bigham in 1986 and 1987. Ron Fischer at Xerox AI Systems made a quick pass to convert the file to run in Medley XAIE.") (FNS GET.SHOWTIME.MENU MAKEBRUSH MAKEBRUSH.HEADER&BITMAP INFORES READ.RES SHOWTIME SHOWTIME.BUTTONEVENTFN SHOWTIME.GET.NAME SHOWTIME.ICONFN SHOWTIME.LOAD.BITMAP SHOWTIME.LOAD.BRUSH SHOWTIME.LOAD.DIF.FILE SHOWTIME.LOAD.RES.FILE SHOWTIME.MAKE.RES SHOWTIME.MAKE.RES.HEADER SHOWTIME.MAKE.RES.TAIL SHOWTIME.READ.BRUSH SHOWTIME.READ.LISPBM SHOWTIME.READ.PRESS SHOWTIME.READ.RES SHOWTIME.RES.CHECK&MASSAGE SHOWTIME.RESHAPE.WINDOW SHOWTIME.SAVE.BITMAP SHOWTIME.SAVE.LISPBM SHOWTIME.SCALE.BITMAP SHOWTIME.ADD.FORMAT SHOWTIME.SETUP.WINDOWPROPS SHOWTIME.SHOW.BITMAP SHOWTIME.WRITEBM) (VARS SHOWTIME.ICON SHOWTIME.MASK (SHOWTIME.LOAD.SUBITEMS) (SHOWTIME.SAVE.SUBITEMS) (SHOWTIME.MENU) (SHOWTIMETITLEREGION (QUOTE (7 7 56 29))) (SHOWTIME.DEFAULT.FORMAT (QUOTE LISP)) (BackgroundMenu) (SHOWTIME.FORMAT.FNS (QUOTE (SHOWTIME.FORMAT.FNS (RES READ.RES SHOWTIME.MAKE.RES) (LISP SHOWTIME.READ.LISPBM SHOWTIME.SAVE.LISPBM) (DIF SHOWTIME.LOAD.DIF.FILE NIL) (BRUSH SHOWTIME.LOAD.BRUSH MAKEBRUSH) (PRESS READPRESS PRESSBITMAP))))) (APPENDVARS (BackgroundMenuCommands (Showtime (QUOTE (SHOWTIME)) "Opens a showtime window for use."))) (FILES BITMAPFNS SCALEBITMAP READBRUSH) (P (SHOWTIME.ADD.FORMAT)))) +(RPAQQ SHOWTIMECOMS + ( + +(* ;;; "Mitch Gaarnat and (Mike?) Gocek wrote the original versions of these fns in 1985. They were later modified added to by T. Bigham in 1986 and 1987. Ron Fischer at Xerox AI Systems made a quick pass to convert the file to run in Medley XAIE.") + + (FNS GET.SHOWTIME.MENU MAKEBRUSH MAKEBRUSH.HEADER&BITMAP INFORES READ.RES SHOWTIME + SHOWTIME.BUTTONEVENTFN SHOWTIME.GET.NAME SHOWTIME.ICONFN SHOWTIME.LOAD.BITMAP + SHOWTIME.LOAD.BRUSH SHOWTIME.LOAD.DIF.FILE SHOWTIME.LOAD.RES.FILE SHOWTIME.MAKE.RES + SHOWTIME.MAKE.RES.HEADER SHOWTIME.MAKE.RES.TAIL SHOWTIME.READ.BRUSH SHOWTIME.READ.LISPBM + SHOWTIME.READ.PRESS SHOWTIME.READ.RES SHOWTIME.RES.CHECK&MASSAGE SHOWTIME.RESHAPE.WINDOW + SHOWTIME.SAVE.BITMAP SHOWTIME.SAVE.LISPBM SHOWTIME.SCALE.BITMAP SHOWTIME.ADD.FORMAT + SHOWTIME.SETUP.WINDOWPROPS SHOWTIME.SHOW.BITMAP SHOWTIME.WRITEBM) + [VARS SHOWTIME.ICON SHOWTIME.MASK (SHOWTIME.LOAD.SUBITEMS) + (SHOWTIME.SAVE.SUBITEMS) + (SHOWTIME.MENU) + (SHOWTIMETITLEREGION '(7 7 56 29)) + (SHOWTIME.DEFAULT.FORMAT 'LISP) + (BackgroundMenu) + (SHOWTIME.FORMAT.FNS '(SHOWTIME.FORMAT.FNS (RES READ.RES SHOWTIME.MAKE.RES) + (LISP SHOWTIME.READ.LISPBM SHOWTIME.SAVE.LISPBM) + (DIF SHOWTIME.LOAD.DIF.FILE NIL) + (BRUSH SHOWTIME.LOAD.BRUSH MAKEBRUSH) + (PRESS READPRESS PRESSBITMAP] + (APPENDVARS (BackgroundMenuCommands (Showtime '(SHOWTIME) + "Opens a showtime window for use."))) + (FILES BITMAPFNS SCALEBITMAP READBRUSH) + (P (SHOWTIME.ADD.FORMAT)))) @@ -35,8 +65,35 @@ Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ) (INFORES -(LAMBDA (FILE) (* ; "Edited 13-May-88 16:01 by raf") (LET (STREAM PATTERN WIDTH HEIGHT HI.X LO.X HI.Y LO.Y REAL.X REAL.Y (Header (QUOTE Interpress/Xerox/2.1/RasterEncoding/1.0% ))) (* ; "Return the width, height, bits per pixel and address of the first data byte as a list.") (SETQ STREAM (GETSTREAM (OPENFILE FILE (QUOTE INPUT)) (QUOTE INPUT))) (if (EQ Header (PACK (for X from 1 to 40 collect (CHARACTER (\BIN STREAM))))) then (* ; "bypass BEGIN 254/720000 DUP 2 MAKEVEC") (until (EQUAL (NTH (REVERSE PATTERN) (IDIFFERENCE (LENGTH PATTERN) 4)) (QUOTE (181 15 162 161 27))) do (SETQ PATTERN (push PATTERN (\BIN STREAM)))) (SETQ HI.X (\BIN STREAM)) (SETQ LO.X (\BIN STREAM)) (SETQ HI.Y (\BIN STREAM)) (SETQ LO.Y (\BIN STREAM)) (SETQ REAL.X (IDIFFERENCE (PLUS (LSH HI.X 8) LO.X) 4000)) (SETQ REAL.Y (IDIFFERENCE (PLUS (LSH HI.Y 8) LO.Y) 4000)) (LIST REAL.X REAL.Y STREAM) else (CLOSEF STREAM) NIL))) -) + [LAMBDA (FILE) (* ; "Edited 24-Sep-2023 14:28 by rmk") + (* ; "Edited 13-May-88 16:01 by raf") + (LET (STREAM PATTERN WIDTH HEIGHT HI.X LO.X HI.Y LO.Y REAL.X REAL.Y (Header + ' + Interpress/Xerox/2.1/RasterEncoding/1.0% + )) + (* ; + "Return the width, height, bits per pixel and address of the first data byte as a list.") + (SETQ STREAM (OPENSTREAM FILE 'INPUT)) + (if [EQ Header (PACK (for X from 1 to 40 collect (CHARACTER (\BIN STREAM] + then (* ; + "bypass BEGIN 254/720000 DUP 2 MAKEVEC") + [until (EQUAL (NTH (REVERSE PATTERN) + (IDIFFERENCE (LENGTH PATTERN) + 4)) + '(181 15 162 161 27)) do (SETQ PATTERN (push PATTERN (\BIN STREAM] + (SETQ HI.X (\BIN STREAM)) + (SETQ LO.X (\BIN STREAM)) + (SETQ HI.Y (\BIN STREAM)) + (SETQ LO.Y (\BIN STREAM)) + (SETQ REAL.X (IDIFFERENCE (PLUS (LSH HI.X 8) + LO.X) + 4000)) + (SETQ REAL.Y (IDIFFERENCE (PLUS (LSH HI.Y 8) + LO.Y) + 4000)) + (LIST REAL.X REAL.Y STREAM) + else (CLOSEF STREAM) + NIL]) (READ.RES (LAMBDA (FILE) (* ; "Edited 13-May-88 16:02 by raf") (LET (STREAM A B BITMAP BASE WORDS Attributes WIDTH HEIGHT) (if (SETQ FILE (FULLNAME FILE)) then (* ; "If the file exists, check to see if it's RES format.") (if (SETQ Attributes (INFORES FILE)) then (SETQ WIDTH (CAR Attributes)) (SETQ HEIGHT (CADR Attributes)) (SETQ STREAM (CADDR Attributes)) (SETQ BITMAP (BITMAPCREATE WIDTH HEIGHT 1)) (SETQ BASE (fetch (BITMAP BITMAPBASE) of BITMAP)) (* ; "RESINFO leaves the file open at byte 62.0 Image data begins at byte 95") (for X from 63 to 94 do (\BIN STREAM)) (for X from 1 to (IQUOTIENT (ITIMES WIDTH HEIGHT) 16) do (SETQ A (\BIN STREAM)) (SETQ B (\BIN STREAM)) (\PUTBASE BASE 0 (LOGOR (LLSH A 8) B)) (SETQ BASE (\ADDBASE BASE 1)) (ZEROP (LOGAND X 1023))) (CLOSEF STREAM) BITMAP else (printout PROMPTWINDOW T FILE "isn't an RES file")) else (printout PROMPTWINDOW T "Can't find " FILE) NIL))) @@ -93,7 +150,9 @@ Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ) (SHOWTIME.READ.PRESS -(LAMBDA (FILENAME) (* TBigham "30-Dec-86 11:59") (READPRESS (OPENFILE FILENAME (QUOTE INPUT))))) + [LAMBDA (FILENAME) (* ; "Edited 24-Sep-2023 14:29 by rmk") + (* TBigham "30-Dec-86 11:59") + (READPRESS FILENAME]) (SHOWTIME.READ.RES (LAMBDA (FILENAME) (* TBigham "30-Dec-86 12:03") (* load an RES image and makes it into a lisp bitmap) (DECLARE (GLOBALVARS WAITINGCURSOR)) (LET (BITMAP) (RESETLST (RESETSAVE (CURSOR WAITINGCURSOR)) (SETQ BITMAP (READ.RES FILENAME))))) @@ -136,41 +195,48 @@ Copyright (c) 1986, 1987, 1988, 1989 by Xerox Corporation. All rights reserved. ) ) -(RPAQQ SHOWTIME.ICON #*(80 84)@C@@@@@@@@@@@@@@@@@@@CO@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@@@@@CMOO@@@@@@@@@@@@@@@@GLAOO@@@@@@@@@@@@@@@GL@AOO@@@@@@@@@@@@@@GN@@OOO@@@@@@@@@@@@@GN@@OOOO@@@@@@@@@@@@ON@@GOMOO@@@@@@@@@@@ON@@GOLAOO@@@@@@@@@@OO@@GOL@AOO@@@@@@@@@OO@@GON@@OOO@@@@@@@AOO@@CON@@OOOO@@@@@@AOO@@CON@@GOMOO@@@@@AOOH@CON@@GOLAOO@@@@AOOH@COO@@GOL@AOO@@@AOOH@AOO@@GON@@OOO@@@AOO@AOO@@CON@@OOOO@@@AOOAOO@@CON@@OOMOO@@@AOOOOH@CON@@GOLAO@@@@AOOOH@COO@@GOL@C@@@@@AOOH@AOO@@GON@C@@@@@@AOO@AOO@@GON@G@@@@@@@AOOAOO@@CON@F@@@@@@@@AOOOOH@CON@F@@@@@@@@@AOOOH@COO@F@@@@@@@@@@AOOH@COO@N@@@@@@@@@@@AOO@AOO@L@@@@@@@@@@@@AOOAOO@L@@@@@@@@@@@@@AOOOOHL@@@@@@@@@@@@@@AOOOIL@@@@@@@@@@@@@@@AOOIH@@@@@@@@@@@@@@@@AOIH@@@@@@@@@@@@@@@@@AOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOHGALF@LGLD@DDOND@GHOGKKNMOFONMKFNGLNOGHOGOKNMOFNNOKNNCHNOOHOGOKNMOFFLOKNNKJNOOHOHGH@MOGFMOKNNIBN@OHOOKKNMOGFMOKNNMFNOOHOOKKNMOG@AOKNNLFNOOHOGKKNMOGKKOKNNNNNOGHOHGALF@OKKOALDGLD@GHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOH) - -(RPAQQ SHOWTIME.MASK #*(80 84)@C@@@@@@@@@@@@@@@@@@@CO@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@@@@@COOO@@@@@@@@@@@@@@@@GOOOO@@@@@@@@@@@@@@@GOOOOO@@@@@@@@@@@@@@GOOOOOO@@@@@@@@@@@@@GOOOOOOO@@@@@@@@@@@@OOOOOOOOO@@@@@@@@@@@OOOOOOOOOO@@@@@@@@@@OOOOOOOOOOO@@@@@@@@@OOOOOOOOOOOO@@@@@@@AOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOOO@@@@@AOOOOOOOOOOOOOOO@@@@AOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOO@@@@AOOOOOOOOOOOOOOO@@@@@AOOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOO@@@@@@@AOOOOOOOOOOON@@@@@@@@AOOOOOOOOOON@@@@@@@@@AOOOOOOOOON@@@@@@@@@@AOOOOOOOON@@@@@@@@@@@AOOOOOOOL@@@@@@@@@@@@AOOOOOOL@@@@@@@@@@@@@AOOOOOL@@@@@@@@@@@@@@AOOOOL@@@@@@@@@@@@@@@AOOOH@@@@@@@@@@@@@@@@AOOH@@@@@@@@@@@@@@@@@AOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOH) - -(RPAQQ SHOWTIME.LOAD.SUBITEMS NIL) - -(RPAQQ SHOWTIME.SAVE.SUBITEMS NIL) - -(RPAQQ SHOWTIME.MENU NIL) - -(RPAQQ SHOWTIMETITLEREGION (7 7 56 29)) - -(RPAQQ SHOWTIME.DEFAULT.FORMAT LISP) - -(RPAQQ BackgroundMenu NIL) - -(RPAQQ SHOWTIME.FORMAT.FNS (SHOWTIME.FORMAT.FNS (RES READ.RES SHOWTIME.MAKE.RES) (LISP SHOWTIME.READ.LISPBM SHOWTIME.SAVE.LISPBM) (DIF SHOWTIME.LOAD.DIF.FILE NIL) (BRUSH SHOWTIME.LOAD.BRUSH MAKEBRUSH) (PRESS READPRESS PRESSBITMAP))) - -(APPENDTOVAR BackgroundMenuCommands (Showtime (QUOTE (SHOWTIME)) "Opens a showtime window for use.") +(RPAQQ SHOWTIME.ICON #*(80 84)@C@@@@@@@@@@@@@@@@@@@CO@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@@@@@CMOO@@@@@@@@@@@@@@@@GLAOO@@@@@@@@@@@@@@@GL@AOO@@@@@@@@@@@@@@GN@@OOO@@@@@@@@@@@@@GN@@OOOO@@@@@@@@@@@@ON@@GOMOO@@@@@@@@@@@ON@@GOLAOO@@@@@@@@@@OO@@GOL@AOO@@@@@@@@@OO@@GON@@OOO@@@@@@@AOO@@CON@@OOOO@@@@@@AOO@@CON@@GOMOO@@@@@AOOH@CON@@GOLAOO@@@@AOOH@COO@@GOL@AOO@@@AOOH@AOO@@GON@@OOO@@@AOO@AOO@@CON@@OOOO@@@AOOAOO@@CON@@OOMOO@@@AOOOOH@CON@@GOLAO@@@@AOOOH@COO@@GOL@C@@@@@AOOH@AOO@@GON@C@@@@@@AOO@AOO@@GON@G@@@@@@@AOOAOO@@CON@F@@@@@@@@AOOOOH@CON@F@@@@@@@@@AOOOH@COO@F@@@@@@@@@@AOOH@COO@N@@@@@@@@@@@AOO@AOO@L@@@@@@@@@@@@AOOAOO@L@@@@@@@@@@@@@AOOOOHL@@@@@@@@@@@@@@AOOOIL@@@@@@@@@@@@@@@AOOIH@@@@@@@@@@@@@@@@AOIH@@@@@@@@@@@@@@@@@AOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOHGALF@LGLD@DDOND@GHOGKKNMOFONMKFNGLNOGHOGOKNMOFNNOKNNCHNOOHOGOKNMOFFLOKNNKJNOOHOHGH@MOGFMOKNNIBN@OHOOKKNMOGFMOKNNMFNOOHOOKKNMOG@AOKNNLFNOOHOGKKNMOGKKOKNNNNNOGHOHGALF@OKKOALDGLD@GHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHL@@@@@@@@@@@@@@@@@AHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOH ) +(RPAQQ SHOWTIME.MASK #*(80 84)@C@@@@@@@@@@@@@@@@@@@CO@@@@@@@@@@@@@@@@@@COO@@@@@@@@@@@@@@@@@COOO@@@@@@@@@@@@@@@@GOOOO@@@@@@@@@@@@@@@GOOOOO@@@@@@@@@@@@@@GOOOOOO@@@@@@@@@@@@@GOOOOOOO@@@@@@@@@@@@OOOOOOOOO@@@@@@@@@@@OOOOOOOOOO@@@@@@@@@@OOOOOOOOOOO@@@@@@@@@OOOOOOOOOOOO@@@@@@@AOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOOO@@@@@AOOOOOOOOOOOOOOO@@@@AOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOOO@@@AOOOOOOOOOOOOOOOO@@@@AOOOOOOOOOOOOOOO@@@@@AOOOOOOOOOOOOOO@@@@@@AOOOOOOOOOOOOO@@@@@@@AOOOOOOOOOOON@@@@@@@@AOOOOOOOOOON@@@@@@@@@AOOOOOOOOON@@@@@@@@@@AOOOOOOOON@@@@@@@@@@@AOOOOOOOL@@@@@@@@@@@@AOOOOOOL@@@@@@@@@@@@@AOOOOOL@@@@@@@@@@@@@@AOOOOL@@@@@@@@@@@@@@@AOOOH@@@@@@@@@@@@@@@@AOOH@@@@@@@@@@@@@@@@@AOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOHOOOOOOOOOOOOOOOOOOOH +) + +(RPAQQ SHOWTIME.LOAD.SUBITEMS NIL) + +(RPAQQ SHOWTIME.SAVE.SUBITEMS NIL) + +(RPAQQ SHOWTIME.MENU NIL) + +(RPAQQ SHOWTIMETITLEREGION (7 7 56 29)) + +(RPAQQ SHOWTIME.DEFAULT.FORMAT LISP) + +(RPAQQ BackgroundMenu NIL) + +(RPAQQ SHOWTIME.FORMAT.FNS (SHOWTIME.FORMAT.FNS (RES READ.RES SHOWTIME.MAKE.RES) + (LISP SHOWTIME.READ.LISPBM SHOWTIME.SAVE.LISPBM) + (DIF SHOWTIME.LOAD.DIF.FILE NIL) + (BRUSH SHOWTIME.LOAD.BRUSH MAKEBRUSH) + (PRESS READPRESS PRESSBITMAP))) + +(APPENDTOVAR BackgroundMenuCommands (Showtime '(SHOWTIME) + "Opens a showtime window for use.")) + (FILESLOAD BITMAPFNS SCALEBITMAP READBRUSH) -(SHOWTIME.ADD.FORMAT) +(SHOWTIME.ADD.FORMAT) (PUTPROPS SHOWTIME COPYRIGHT ("Xerox Corporation" 1986 1987 1988 1989)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (2126 20535 (GET.SHOWTIME.MENU 2136 . 2931) (MAKEBRUSH 2933 . 3123) ( -MAKEBRUSH.HEADER&BITMAP 3125 . 3863) (INFORES 3865 . 4778) (READ.RES 4780 . 5689) (SHOWTIME 5691 . -6711) (SHOWTIME.BUTTONEVENTFN 6713 . 8306) (SHOWTIME.GET.NAME 8308 . 9067) (SHOWTIME.ICONFN 9069 . -9407) (SHOWTIME.LOAD.BITMAP 9409 . 10592) (SHOWTIME.LOAD.BRUSH 10594 . 10692) (SHOWTIME.LOAD.DIF.FILE -10694 . 11765) (SHOWTIME.LOAD.RES.FILE 11767 . 12032) (SHOWTIME.MAKE.RES 12034 . 12411) ( -SHOWTIME.MAKE.RES.HEADER 12413 . 14913) (SHOWTIME.MAKE.RES.TAIL 14915 . 15214) (SHOWTIME.READ.BRUSH -15216 . 15322) (SHOWTIME.READ.LISPBM 15324 . 15541) (SHOWTIME.READ.PRESS 15543 . 15664) ( -SHOWTIME.READ.RES 15666 . 15926) (SHOWTIME.RES.CHECK&MASSAGE 15928 . 16392) (SHOWTIME.RESHAPE.WINDOW -16394 . 16681) (SHOWTIME.SAVE.BITMAP 16683 . 17478) (SHOWTIME.SAVE.LISPBM 17480 . 17703) ( -SHOWTIME.SCALE.BITMAP 17705 . 18394) (SHOWTIME.ADD.FORMAT 18396 . 19125) (SHOWTIME.SETUP.WINDOWPROPS -19127 . 19376) (SHOWTIME.SHOW.BITMAP 19378 . 19835) (SHOWTIME.WRITEBM 19837 . 20533))))) + (FILEMAP (NIL (2589 22191 (GET.SHOWTIME.MENU 2599 . 3394) (MAKEBRUSH 3396 . 3586) ( +MAKEBRUSH.HEADER&BITMAP 3588 . 4326) (INFORES 4328 . 6301) (READ.RES 6303 . 7212) (SHOWTIME 7214 . +8234) (SHOWTIME.BUTTONEVENTFN 8236 . 9829) (SHOWTIME.GET.NAME 9831 . 10590) (SHOWTIME.ICONFN 10592 . +10930) (SHOWTIME.LOAD.BITMAP 10932 . 12115) (SHOWTIME.LOAD.BRUSH 12117 . 12215) ( +SHOWTIME.LOAD.DIF.FILE 12217 . 13288) (SHOWTIME.LOAD.RES.FILE 13290 . 13555) (SHOWTIME.MAKE.RES 13557 + . 13934) (SHOWTIME.MAKE.RES.HEADER 13936 . 16436) (SHOWTIME.MAKE.RES.TAIL 16438 . 16737) ( +SHOWTIME.READ.BRUSH 16739 . 16845) (SHOWTIME.READ.LISPBM 16847 . 17064) (SHOWTIME.READ.PRESS 17066 . +17320) (SHOWTIME.READ.RES 17322 . 17582) (SHOWTIME.RES.CHECK&MASSAGE 17584 . 18048) ( +SHOWTIME.RESHAPE.WINDOW 18050 . 18337) (SHOWTIME.SAVE.BITMAP 18339 . 19134) (SHOWTIME.SAVE.LISPBM +19136 . 19359) (SHOWTIME.SCALE.BITMAP 19361 . 20050) (SHOWTIME.ADD.FORMAT 20052 . 20781) ( +SHOWTIME.SETUP.WINDOWPROPS 20783 . 21032) (SHOWTIME.SHOW.BITMAP 21034 . 21491) (SHOWTIME.WRITEBM 21493 + . 22189))))) STOP diff --git a/lispusers/SHOWTIME.LCOM b/lispusers/SHOWTIME.LCOM index 7847488c..ccdab517 100644 Binary files a/lispusers/SHOWTIME.LCOM and b/lispusers/SHOWTIME.LCOM differ diff --git a/lispusers/UNDIGESTIFY b/lispusers/UNDIGESTIFY index 64d6d31c..1f49658d 100644 --- a/lispusers/UNDIGESTIFY +++ b/lispusers/UNDIGESTIFY @@ -1,25 +1,30 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED "29-Jul-87 08:47:18" {PHYLUM}LYRIC>UNDIGESTIFY.;2 16839 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS INSTALL-UNDIGESTIFY) +(FILECREATED "24-Sep-2023 14:26:57" {WMEDLEY}UNDIGESTIFY.;3 17040 - previous date%: "16-May-86 10:55:33" {PHYLUM}LYRIC>UNDIGESTIFY.;1) + :EDIT-BY rmk + + :CHANGES-TO (VARS UNDIGESTIFYCOMS) + (FNS OPEN-SPACE-IN-FILE) + + :PREVIOUS-DATE "29-Jul-87 08:47:18" {WMEDLEY}UNDIGESTIFY.;1) -(* " -Copyright (c) 1986, 1987 by Xerox Corporation. All rights reserved. +(* ; " +Copyright (c) 1986-1987 by Xerox Corporation. ") (PRETTYCOMPRINT UNDIGESTIFYCOMS) -(RPAQQ UNDIGESTIFYCOMS ((INITVARS *DELETE-DIGEST-FLAG* *MOVE-TO-FIRST-DIGEST-MESSAGE-FLAG* - *DONT-UPDATE-HEADERS-FLAG* SEPARATOR1 SEPARATOR2) - (FNS INSTALL-UNDIGESTIFY LAFITE-DISPLAY LAFITE-TRUNCATE-FILE - LAFITE-UNDIGESTIFY MOVE-TO-EOL OPEN-SPACE-IN-FILE - PARSE-AND-MAYBE-MERGE-HEADER SKIP-EOLS BACKUP-PTR - TEDIT.FIND.NOT.CASELESS) - (DECLARE%: EVAL@COMPILE DONTCOPY (FILES {ERIS}SOURCES>LAFITEDECLS)) - (P (INSTALL-UNDIGESTIFY)))) +(RPAQQ UNDIGESTIFYCOMS + ((INITVARS *DELETE-DIGEST-FLAG* *MOVE-TO-FIRST-DIGEST-MESSAGE-FLAG* *DONT-UPDATE-HEADERS-FLAG* + SEPARATOR1 SEPARATOR2) + (FNS INSTALL-UNDIGESTIFY LAFITE-DISPLAY LAFITE-TRUNCATE-FILE LAFITE-UNDIGESTIFY MOVE-TO-EOL + OPEN-SPACE-IN-FILE PARSE-AND-MAYBE-MERGE-HEADER SKIP-EOLS BACKUP-PTR + TEDIT.FIND.NOT.CASELESS) + (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (FROM library/LAFITE) + LAFITEDECLS)) + (P (INSTALL-UNDIGESTIFY)))) (RPAQ? *DELETE-DIGEST-FLAG* NIL) @@ -249,12 +254,16 @@ Copyright (c) 1986, 1987 by Xerox Corporation. All rights reserved. (GETFILEPTR TEXTSTREAM]) (OPEN-SPACE-IN-FILE - [LAMBDA (FILE POSITION NCHARS) (* SCB%: "25-Mar-86 12:52") - - (* Open a space in file starting at POSITION for length NCHARS by sliding the - rest of the file down.) + [LAMBDA (FILE POSITION NCHARS) (* ; "Edited 24-Sep-2023 14:25 by rmk") + (* SCB%: "25-Mar-86 12:52") - (LET [(TEMP (OPENFILE '{NODIRCORE} 'BOTH] + (* ;; + "Open a space in file starting at POSITION for length NCHARS by sliding the rest of the file down.") + + (* Open a space in file starting at POSITION for length NCHARS by sliding the + rest of the file down.) + + (LET [(TEMP (OPENSTREAM '{NODIRCORE} 'BOTH] (COPYBYTES FILE TEMP POSITION (GETEOFPTR FILE)) (SETFILEPTR FILE (IPLUS POSITION NCHARS)) (SETFILEPTR TEMP 0) @@ -302,13 +311,16 @@ Copyright (c) 1986, 1987 by Xerox Corporation. All rights reserved. (TEDIT.FIND TEXTOBJ TARGETSTRING START# END# WILDCARDS?]) ) (DECLARE%: EVAL@COMPILE DONTCOPY -(FILESLOAD {ERIS}SOURCES>LAFITEDECLS) + +(FILESLOAD (FROM library/LAFITE) + LAFITEDECLS) ) -(INSTALL-UNDIGESTIFY) + +(INSTALL-UNDIGESTIFY) (PUTPROPS UNDIGESTIFY COPYRIGHT ("Xerox Corporation" 1986 1987)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1217 16647 (INSTALL-UNDIGESTIFY 1227 . 3240) (LAFITE-DISPLAY 3242 . 3541) ( -LAFITE-TRUNCATE-FILE 3543 . 3954) (LAFITE-UNDIGESTIFY 3956 . 13612) (MOVE-TO-EOL 13614 . 14074) ( -OPEN-SPACE-IN-FILE 14076 . 14578) (PARSE-AND-MAYBE-MERGE-HEADER 14580 . 15800) (SKIP-EOLS 15802 . -16113) (BACKUP-PTR 16115 . 16277) (TEDIT.FIND.NOT.CASELESS 16279 . 16645))))) + (FILEMAP (NIL (1183 16831 (INSTALL-UNDIGESTIFY 1193 . 3206) (LAFITE-DISPLAY 3208 . 3507) ( +LAFITE-TRUNCATE-FILE 3509 . 3920) (LAFITE-UNDIGESTIFY 3922 . 13578) (MOVE-TO-EOL 13580 . 14040) ( +OPEN-SPACE-IN-FILE 14042 . 14762) (PARSE-AND-MAYBE-MERGE-HEADER 14764 . 15984) (SKIP-EOLS 15986 . +16297) (BACKUP-PTR 16299 . 16461) (TEDIT.FIND.NOT.CASELESS 16463 . 16829))))) STOP diff --git a/lispusers/UNDIGESTIFY.LCOM b/lispusers/UNDIGESTIFY.LCOM index 139bcc31..c9b59929 100644 Binary files a/lispusers/UNDIGESTIFY.LCOM and b/lispusers/UNDIGESTIFY.LCOM differ diff --git a/lispusers/bitmapfns b/lispusers/bitmapfns index 62f0a19a..4b2a8546 100644 --- a/lispusers/bitmapfns +++ b/lispusers/bitmapfns @@ -1,137 +1,139 @@ -(FILECREATED " 3-Jun-86 14:13:59" {ERIS}LIBRARY>BITMAPFNS.;6 6278 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to: (MACROS RPCHK) - (FNS READPRESS) +(FILECREATED "24-Sep-2023 13:54:45" {WMEDLEY}bitmapfns.;2 5976 - previous date: " 2-Jun-86 22:35:15" {ERIS}LIBRARY>BITMAPFNS.;5) + :EDIT-BY rmk + + :CHANGES-TO (FNS READPRESS) + + :PREVIOUS-DATE " 3-Jun-86 14:13:59" {WMEDLEY}bitmapfns.;1) -(* Copyright (c) 1983, 1984, 1985, 1986 by Xerox Corporation. All rights reserved.) +(* ; " +Copyright (c) 1983-1986 by Xerox Corporation. +") (PRETTYCOMPRINT BITMAPFNSCOMS) (RPAQQ BITMAPFNSCOMS ((FNS READBINARYBITMAP WRITEBINARYBITMAP WRITEBM WRITEBMLST READBMLST READBM READPRESS WINDOWBM) - (DECLARE: DONTCOPY (MACROS RPCHK)))) + (DECLARE%: DONTCOPY (MACROS RPCHK)))) (DEFINEQ (READBINARYBITMAP - [LAMBDA (WIDTH HEIGHT FILE) (* lmm " 4-JAN-83 00:19") - (* reads a bitmap from the output file.) - (PROG ((BM (BITMAPCREATE WIDTH HEIGHT))) - (\BINS (GETSTREAM FILE (QUOTE INPUT)) - (fetch BITMAPBASE of BM) - 0 - (ITIMES (fetch BITMAPRASTERWIDTH of BM) - (fetch BITMAPHEIGHT of BM) - 2)) - (RETURN BM]) + [LAMBDA (WIDTH HEIGHT FILE) (* lmm " 4-JAN-83 00:19") + (* reads a bitmap from the output + file.) + (PROG ((BM (BITMAPCREATE WIDTH HEIGHT))) + (\BINS (GETSTREAM FILE 'INPUT) + (fetch BITMAPBASE of BM) + 0 + (ITIMES (fetch BITMAPRASTERWIDTH of BM) + (fetch BITMAPHEIGHT of BM) + 2)) + (RETURN BM]) (WRITEBINARYBITMAP - [LAMBDA (BITMAP FILE) (* JWogulis "26-Dec-84 15:06") - (\BOUTS FILE [ffetch BITMAPBASE of (SETQ BITMAP (\DTEST BITMAP (QUOTE BITMAP] - 0 - (ITIMES (ffetch BITMAPHEIGHT of BITMAP) - (ffetch BITMAPRASTERWIDTH of BITMAP) - BYTESPERWORD]) + [LAMBDA (BITMAP FILE) (* JWogulis "26-Dec-84 15:06") + (\BOUTS FILE [ffetch BITMAPBASE of (SETQ BITMAP (\DTEST BITMAP 'BITMAP] + 0 + (ITIMES (ffetch BITMAPHEIGHT of BITMAP) + (ffetch BITMAPRASTERWIDTH of BITMAP) + BYTESPERWORD]) (WRITEBM - [LAMBDA (FILE BITMAP) (* lmm " 6-Jun-85 16:46") - [BOUT16 FILE (ffetch BITMAPWIDTH of (SETQ BITMAP (\DTEST BITMAP (QUOTE BITMAP] - (BOUT16 FILE (ffetch BITMAPHEIGHT of BITMAP)) + [LAMBDA (FILE BITMAP) (* lmm " 6-Jun-85 16:46") + [BOUT16 FILE (ffetch BITMAPWIDTH of (SETQ BITMAP (\DTEST BITMAP 'BITMAP] + (BOUT16 FILE (ffetch BITMAPHEIGHT of BITMAP)) (WRITEBINARYBITMAP BITMAP FILE]) (WRITEBMLST - [LAMBDA (FILE LST) (* JWogulis "26-Dec-84 15:06") - (PROG [(F (OPENSTREAM FILE (QUOTE OUTPUT) - (QUOTE NEW] + [LAMBDA (FILE LST) (* JWogulis "26-Dec-84 15:06") + (PROG [(F (OPENSTREAM FILE 'OUTPUT 'NEW] (for I in LST do (WRITEBM F I)) - (CLOSEF F]) + (CLOSEF F]) (READBMLST - [LAMBDA (FILE) (* JWogulis "26-Dec-84 15:08") - (bind (F _(OPENSTREAM FILE (QUOTE INPUT) - (QUOTE OLD))) - until (EOFP F) collect (READBM F) finally (CLOSEF F]) + [LAMBDA (FILE) (* JWogulis "26-Dec-84 15:08") + (bind (F _ (OPENSTREAM FILE 'INPUT 'OLD)) until (EOFP F) collect (READBM F) + finally (CLOSEF F]) (READBM - [LAMBDA (FILE) (* lmm " 6-Jun-85 16:46") - (READBINARYBITMAP (BIN16 FILE) - (BIN16 FILE) - FILE]) + [LAMBDA (FILE) (* lmm " 6-Jun-85 16:46") + (READBINARYBITMAP (BIN16 FILE) + (BIN16 FILE) + FILE]) (READPRESS - [LAMBDA (FILENAME) (* lmm " 2-Jun-86 22:34") - (RESETLST (PROG (WW HT MICAWIDTH MICAHEIGHT BITMAP TOTCOUNT (OFD (GETSTREAM (OPENFILE - FILENAME - (QUOTE INPUT) - (QUOTE OLD)) - (QUOTE INPUT))) - X WIDTH) - (RESETSAVE NIL (LIST (QUOTE CLOSEF) - OFD)) - (RPCHK 256) (* Edotcode) - (SETQ WW (IQUOTIENT (BIN16 OFD) - 16)) (* Width) - (SETQ HT (BIN16 OFD)) (* Height) - (until (SELECTC (SETQ X (BIN16 OFD)) - ((IPLUS 512 3) - (* Edotmode and 3) - (RPCHK 2) (* Edotsize) - (SETQ MICAWIDTH (BIN16 OFD)) - (SETQ MICAHEIGHT (BIN16 OFD)) - NIL) - (1 (* Edotwindow) - (BIN16 OFD) - (SETQ WIDTH (BIN16 OFD)) - (RPCHK 0) - (RPCHK HT) - NIL) - (3 T) - (GO ERROR))) - [\BINS OFD (fetch BITMAPBASE of (SETQ BITMAP (BITMAPCREATE (ITIMES WW 16) - HT))) - 0 - (ITIMES 2 (SETQ TOTCOUNT (ITIMES HT WW] - (RPCHK 0) (* Entity list terminator) - [COND - (NIL (* more checks, not necessary) - (PROGN (RPCHK (IPLUS 65280 238)) (* Nop, setx) - (RPCHK 0) - (RPCHK (IPLUS 65280 239)) (* Nop, sety) - (RPCHK 0) - (RPCHK (IPLUS 65280 252)) (* Nop, show dots) - (RPCHK 0] - (RETURN BITMAP) - ERROR - (ERROR "Sorry, unrecognized PRESS file format. READPRESS isn't very general."]) + [LAMBDA (FILENAME) (* ; "Edited 24-Sep-2023 13:54 by rmk") + (* lmm " 2-Jun-86 22:34") + (RESETLST + (PROG (WW HT MICAWIDTH MICAHEIGHT BITMAP TOTCOUNT (OFD (OPENSTREAM FILENAME 'INPUT + 'OLD)) + X WIDTH) + (RESETSAVE NIL (LIST 'CLOSEF OFD)) + (RPCHK 256) (* Edotcode) + (SETQ WW (IQUOTIENT (BIN16 OFD) + 16)) (* Width) + (SETQ HT (BIN16 OFD)) (* Height) + (until (SELECTC (SETQ X (BIN16 OFD)) + ((IPLUS 512 3) (* Edotmode and 3) + (RPCHK 2) (* Edotsize) + (SETQ MICAWIDTH (BIN16 OFD)) + (SETQ MICAHEIGHT (BIN16 OFD)) + NIL) + (1 (* Edotwindow) + (BIN16 OFD) + (SETQ WIDTH (BIN16 OFD)) + (RPCHK 0) + (RPCHK HT) + NIL) + (3 T) + (GO ERROR))) + [\BINS OFD (fetch BITMAPBASE of (SETQ BITMAP (BITMAPCREATE (ITIMES WW 16) + HT))) + 0 + (ITIMES 2 (SETQ TOTCOUNT (ITIMES HT WW] + (RPCHK 0) (* Entity list terminator) + [COND + (NIL (* more checks, not necessary) + (PROGN (RPCHK (IPLUS 65280 238)) (* Nop, setx) + (RPCHK 0) + (RPCHK (IPLUS 65280 239)) (* Nop, sety) + (RPCHK 0) + (RPCHK (IPLUS 65280 252)) (* Nop, show dots) + (RPCHK 0] + (RETURN BITMAP) + ERROR + (ERROR "Sorry, unrecognized PRESS file format. READPRESS isn't very general.")))]) (WINDOWBM - [LAMBDA (BITMAP POSITION) (* JWogulis "26-Dec-84 15:37") - (IF (AND POSITION (NOT (POSITIONP POSITION))) - THEN (ERROR "NOT A POSITION" POSITION)) - [IF (NOT POSITION) - THEN (SETQ POSITION (GETBOXPOSITION (IPLUS 8 (BITMAPWIDTH BITMAP)) - (IPLUS 8 (BITMAPHEIGHT BITMAP] - (PROG ((WIND (CREATEW (LIST (CAR POSITION) - (CDR POSITION) - (IPLUS 8 (BITMAPWIDTH BITMAP)) - (IPLUS 8 (BITMAPHEIGHT BITMAP))) - NIL 4))) - (BITBLT BITMAP 0 0 WIND) - (RETURN WIND]) + [LAMBDA (BITMAP POSITION) (* JWogulis "26-Dec-84 15:37") + (IF (AND POSITION (NOT (POSITIONP POSITION))) + THEN (ERROR "NOT A POSITION" POSITION)) + [IF (NOT POSITION) + THEN (SETQ POSITION (GETBOXPOSITION (IPLUS 8 (BITMAPWIDTH BITMAP)) + (IPLUS 8 (BITMAPHEIGHT BITMAP] + (PROG ((WIND (CREATEW (LIST (CAR POSITION) + (CDR POSITION) + (IPLUS 8 (BITMAPWIDTH BITMAP)) + (IPLUS 8 (BITMAPHEIGHT BITMAP))) + NIL 4))) + (BITBLT BITMAP 0 0 WIND) + (RETURN WIND]) ) -(DECLARE: DONTCOPY -(DECLARE: EVAL@COMPILE -[PUTPROPS RPCHK MACRO ((N) +(DECLARE%: DONTCOPY +(DECLARE%: EVAL@COMPILE + +(PUTPROPS RPCHK MACRO ((N) (OR (EQ (BIN16 OFD) N) - (GO ERROR] + (GO ERROR)))) ) ) (PUTPROPS BITMAPFNS COPYRIGHT ("Xerox Corporation" 1983 1984 1985 1986)) -(DECLARE: DONTCOPY - (FILEMAP (NIL (564 5993 (READBINARYBITMAP 574 . 1075) (WRITEBINARYBITMAP 1077 . 1437) (WRITEBM 1439 . -1752) (WRITEBMLST 1754 . 2028) (READBMLST 2030 . 2305) (READBM 2307 . 2492) (READPRESS 2494 . 5342) ( -WINDOWBM 5344 . 5991))))) +(DECLARE%: DONTCOPY + (FILEMAP (NIL (589 5676 (READBINARYBITMAP 599 . 1213) (WRITEBINARYBITMAP 1215 . 1585) (WRITEBM 1587 . +1874) (WRITEBMLST 1876 . 2112) (READBMLST 2114 . 2351) (READBM 2353 . 2536) (READPRESS 2538 . 4970) ( +WINDOWBM 4972 . 5674))))) STOP diff --git a/obsolete/tcp/TCP b/obsolete/tcp/TCP new file mode 100644 index 00000000..49a212eb --- /dev/null +++ b/obsolete/tcp/TCP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "17-Aug-90 12:01:50" {DSK}ETHERNET>TCP>NEW>TCP.;5 98103 changes to%: (FILES TCPLLIP) (FNS \TCP.DELETE.TCB) previous date%: "13-Feb-89 21:04:17" {DSK}ETHERNET>TCP>NEW>TCP.;3) (* " Copyright (c) 1983, 1984, 1985, 1986, 1901, 1900, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPCOMS) (RPAQQ TCPCOMS [(COMS (* ;; "Transmission Control Protocol. RFC 793, September 1981") ) (COMS (DECLARE%: EVAL@LOAD (FILES (SYSLOAD) TCPLLIP)) (GLOBALVARS \TCP.LOCK \TCP.CONTROL.BLOCKS \TCP.CHECKSUMS.ON \TCP.PSEUDOHEADER \TCP.MSL \TCP.DEFAULT.USER.TIMEOUT \TCP.DEFAULT.RECEIVE.WINDOW \TCP.DEVICE \TCP.MASTER.SOCKET)) (COMS (* ;; "DoD Internet addresses") (FNS SET.IP.ADDRESS STRING.TO.IP.ADDRESS IP.ADDRESS.TO.STRING \LOCAL.IP.ADDRESS)) [COMS (* ;; "TCP segments") (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "control bits for TCP.CTRL field of TCP header") (EXPORT (CONSTANTS \TCP.CTRL.ACK \TCP.CTRL.FIN \TCP.CTRL.PSH \TCP.CTRL.RST \TCP.CTRL.SYN \TCP.CTRL.URG) (* ;; "option definitions") (CONSTANTS \TCPOPT.END \TCPOPT.NOP \TCPOPT.MAXSEG) (* ;; "TCP protocol number for IP level dispatch") (CONSTANTS \TCP.PROTOCOL) (* ;; "TCP header length in bytes (= 4 * min data offset)") (CONSTANTS \TCP.HEADER.LENGTH) (* ;;  "minimum offset of data from segment in 32-bit words (= header length / 4)") (CONSTANTS \TCP.MIN.DATA.OFFSET) (* ;; "default maximum segment size") (CONSTANTS \TCP.DEFAULT.MAXSEG) (* ;; "TCP segment") (RECORDS TCPSEGMENT] (COMS (* ;; "TCP sequence numbers") (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "macros for comparing TCP sequence numbers") (MACROS \32BIT.EQ \32BIT.LT \32BIT.LEQ \32BIT.GT \32BIT.GEQ) (* ;; "fast multiply by 3 -- evaluates its argument twice") (MACROS \3TIMES)) (FNS \TCP.SELECT.ISS)) (COMS (* ;; "TCP control blocks") (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "TCP control block") (EXPORT (RECORDS TCP.CONTROL.BLOCK TCPSTREAM)) (* ;; "TCP stream") ) (INITRECORDS TCP.CONTROL.BLOCK TCPSTREAM) (* ;; "global lock for TCP-related mutual exclusion") (INITVARS (\TCP.LOCK (CREATE.MONITORLOCK))) (* ;; "list of TCP control blocks for connection lookup") (INITVARS (\TCP.CONTROL.BLOCKS NIL)) (FNS \TCP.CREATE.TCB \TCP.SELECT.PORT \TCP.LOOKUP.TCB \TCP.DELETE.TCB \TCP.NOSOCKETFN \TCP.PORTCOMPARE)) (COMS (* ;; "TCP checksums") (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "pseudo-header for checksum calculation") (RECORDS TCP.PSEUDOHEADER) (CONSTANTS \TCP.PSEUDOHEADER.LENGTH) (MACROS \16BIT.COMPLEMENT \16BIT.1C.PLUS)) (INITRECORDS TCP.PSEUDOHEADER) (INITVARS (\TCP.PSEUDOHEADER NIL)) (* ;; "this variable controls whether checksums are performed on incoming segments") (INITVARS (\TCP.CHECKSUMS.ON NIL)) (* ;; "checksum routines") (FNS \COMPUTE.CHECKSUM \TCP.CHECKSUM.INCOMING \TCP.CHECKSUM.OUTGOING)) (COMS (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "constants for retransmission timeout calculation") (* ;; "initial retransmission timeout") (CONSTANTS \TCP.INITIAL.RTO) (* ;; "upper and lower bounds on retransmission timeout") (CONSTANTS (\TCP.UBOUND 5000) (\TCP.LBOUND 1000))) (* ;; "maximum segment lifetime") (INITVARS (\TCP.MSL 5000)) (INITVARS (\TCP.DEFAULT.USER.TIMEOUT 60000) (\TCP.DEFAULT.RECEIVE.WINDOW 4096) (\TCP.DEVICE NIL)) (* ;; "TCP protocol routines") (FNS \TCP.ACK# \TCP.PACKET.FILTER \TCP.SETUP.SEGMENT \TCP.RELEASE.SEGMENT \TCP.CONNECTION \TCP.FIX.INCOMING.SEGMENT \TCP.DATA.LENGTH \TCP.SYN.OR.FIN \TCP.INPUT \TCP.INPUT.INITIAL \TCP.INPUT.UNSYNC \TCP.INPUT.LISTEN \TCP.INPUT.SYN.SENT \TCP.CHECK.WINDOW \TCP.CHECK.RESET \TCP.CHECK.SECURITY \TCP.CHECK.NO.SYN \TCP.CHECK.ACK \TCP.HANDLE.ACK \TCP.HANDLE.URG \TCP.QUEUE.INPUT \TCP.HANDLE.FIN \TCP.OUR.FIN.IS.ACKED \TCP.SIGNAL.URGENT.DATA \TCP.PROCESS \TCP.TEMPLATE \TCP.SETUP.SEGMENT.OPTIONS \TCP.SEND.CONTROL \TCP.SEND.ACK \TCP.SEND.RESET \TCP.FIX.OUTGOING.SEGMENT \TCP.SEND.DATA \TCP.SEND.SEGMENT \TCP.NEW.TEMPLATE \TCP.START.PROBE.TIMER \TCP.RETRANSMIT \TCP.START.TIME.WAIT \TCP.CONNECTION.DROPPED \TCP.CHECK.OPTIONS \TCP.PROCESS.OPTIONS)) (COMS (* ;; "support for ICMP messages that affect TCP connections") (DECLARE%: EVAL@COMPILE DONTCOPY (* ;; "ICMP protocol number for IP level dispatch") (CONSTANTS \ICMP.PROTOCOL) (* ;;  "number of 32 bit words in ICMP message before start of original datagram") (CONSTANTS \ICMP.32BIT.WORDS) (* ;; "relevant ICMP message types") (CONSTANTS \ICMP.DESTINATION.UNREACHABLE \ICMP.SOURCE.QUENCH)) (FNS \TCP.HANDLE.ICMP)) (COMS (* ;; "TCP stream routines") (FNS TCP.OPEN TCP.OTHER.STREAM \TCP.BOUTS \TCP.OTHER.BIN \TCP.OTHER.BOUT \TCP.BIN \TCP.BACKFILEPTR \TCP.GETNEXTBUFFER \TCP.GET.SEGMENT \TCP.PEEKBIN \TCP.GETFILEPTR \TCP.READP \TCP.EOFP TCP.URGENTP TCP.URGENT.EVENT \TCP.BOUT \TCP.FLUSH \TCP.FORCEOUTPUT TCP.URGENT.MARK \TCP.FILL.IN.SEGMENT \TCP.CLOSE \TCP.RESETCLOSE TCP.CLOSE.SENDER TCP.DESTADDRESS TCP.STOP)) (COMS (* ;; "well-known ports for network standard functions") (CONSTANTS * \TCP.ASSIGNED.PORTS)) (COMS (* ;; "Stub for debugging") (INITVARS (\TCP.DEBUGGABLE) (TCPTRACEFLG)) (GLOBALVARS \TCP.DEBUGGABLE TCPTRACEFLG) (FNS PPTCB \TCP.TRACE.SEGMENT \TCP.TRACE.TRANSITION)) (COMS (* ;; "TCP initialization") (FNS \TCP.INIT) (P (\TCP.INIT]) (* ;; "Transmission Control Protocol. RFC 793, September 1981") (DECLARE%: EVAL@LOAD (FILESLOAD (SYSLOAD) TCPLLIP) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCP.LOCK \TCP.CONTROL.BLOCKS \TCP.CHECKSUMS.ON \TCP.PSEUDOHEADER \TCP.MSL \TCP.DEFAULT.USER.TIMEOUT \TCP.DEFAULT.RECEIVE.WINDOW \TCP.DEVICE \TCP.MASTER.SOCKET) ) (* ;; "DoD Internet addresses") (DEFINEQ (SET.IP.ADDRESS (LAMBDA NIL (* ejs%: "28-Dec-84 18:45") (* set local IP address manually) (PROG ((ADDR (\IP.READ.STRING.ADDRESS (PROMPTFORWORD "Enter IP address:" (\IP.ADDRESS.TO.STRING (OR (CAR \IP.LOCAL.ADDRESSES) 0)))))) (SETQ \IP.LOCAL.ADDRESSES (LIST ADDR)))) ) (STRING.TO.IP.ADDRESS (LAMBDA (STR) (* ecc "14-May-84 15:01") (APPLY (FUNCTION IP\Make\Address) (to 4 bind (I _ 0) OFFSET collect (SETQ OFFSET (ADD1 I)) (MKATOM (SUBSTRING STR OFFSET (AND (SETQ I (STRPOS "." STR OFFSET)) (SUB1 I))))))) ) (IP.ADDRESS.TO.STRING (LAMBDA (IPADDR) (* ecc "14-May-84 14:32") (PROG ((A (LOADBYTE IPADDR 24 8)) (B (LOADBYTE IPADDR 16 8)) (C (LOADBYTE IPADDR 8 8)) (D (LOADBYTE IPADDR 0 8))) (RETURN (CONCAT A "." B "." C "." D)))) ) (\LOCAL.IP.ADDRESS (LAMBDA NIL (* ejs%: "28-Dec-84 18:45") (* return our IP address (or the first if we're multi-homed)) (if (NULL \IP.LOCAL.ADDRESSES) then (ERROR "You must set \IP.LOCAL.ADDRESSES to a list of our local IP addresses")) (CAR \IP.LOCAL.ADDRESSES)) ) ) (* ;; "TCP segments") (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.CTRL.ACK 16) (RPAQQ \TCP.CTRL.FIN 1) (RPAQQ \TCP.CTRL.PSH 8) (RPAQQ \TCP.CTRL.RST 4) (RPAQQ \TCP.CTRL.SYN 2) (RPAQQ \TCP.CTRL.URG 32) (CONSTANTS \TCP.CTRL.ACK \TCP.CTRL.FIN \TCP.CTRL.PSH \TCP.CTRL.RST \TCP.CTRL.SYN \TCP.CTRL.URG) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCPOPT.END 0) (RPAQQ \TCPOPT.NOP 1) (RPAQQ \TCPOPT.MAXSEG 2) (CONSTANTS \TCPOPT.END \TCPOPT.NOP \TCPOPT.MAXSEG) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.PROTOCOL 6) (CONSTANTS \TCP.PROTOCOL) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.HEADER.LENGTH 20) (CONSTANTS \TCP.HEADER.LENGTH) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.MIN.DATA.OFFSET 5) (CONSTANTS \TCP.MIN.DATA.OFFSET) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.DEFAULT.MAXSEG 536) (CONSTANTS \TCP.DEFAULT.MAXSEG) ) (DECLARE%: EVAL@COMPILE (ACCESSFNS TCPSEGMENT ((TCPHEADER (\IPDATABASE DATUM))) (BLOCKRECORD TCPHEADER ((TCP.SRC.PORT WORD) (TCP.DST.PORT WORD) (TCP.SEQ FIXP) (TCP.ACK FIXP) (TCP.DATA.OFFSET BITS 4) (TCP.MBZ BITS 6) (TCP.CTRL BITS 6) (TCP.WINDOW WORD) (TCP.CHECKSUM WORD) (TCP.URG.PTR WORD))) [ACCESSFNS TCPSEGMENT ((TCP.DATA.LENGTH (fetch (IP IPHEADERCHECKSUM) of DATUM) (replace (IP IPHEADERCHECKSUM) of DATUM with NEWVALUE)) (TCP.SRC.ADDR (fetch (IP IPSOURCEADDRESS) of DATUM) (replace (IP IPSOURCEADDRESS) of DATUM with NEWVALUE)) (TCP.DST.ADDR (fetch (IP IPDESTINATIONADDRESS) of DATUM) (replace (IP IPDESTINATIONADDRESS) of DATUM with NEWVALUE)) (TCP.HEADER.LENGTH (LLSH (fetch TCP.DATA.OFFSET of DATUM) 2)) (TCP.CONTENTS (\ADDBASE (fetch TCPHEADER of DATUM) (UNFOLD (fetch TCP.DATA.OFFSET of DATUM) WORDSPERCELL))) (TCP.OPTIONS (\ADDBASE (fetch TCPHEADER of DATUM) (UNFOLD \TCP.MIN.DATA.OFFSET WORDSPERCELL]) ) (* "END EXPORTED DEFINITIONS") ) (* ;; "TCP sequence numbers") (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (PUTPROPS \32BIT.EQ MACRO ((A B) (IEQP A B))) (PUTPROPS \32BIT.LT MACRO ((A B) (ILESSP (IDIFFERENCE A B) 0))) (PUTPROPS \32BIT.LEQ MACRO ((A B) (ILEQ (IDIFFERENCE A B) 0))) (PUTPROPS \32BIT.GT MACRO ((A B) (IGREATERP (IDIFFERENCE A B) 0))) (PUTPROPS \32BIT.GEQ MACRO ((A B) (IGEQ (IDIFFERENCE A B) 0))) ) (DECLARE%: EVAL@COMPILE (PUTPROPS \3TIMES MACRO ((N) (IPLUS (LLSH N 1) N))) ) ) (DEFINEQ (\TCP.SELECT.ISS (LAMBDA NIL (* ecc "16-May-84 11:40") (* select an initial send sequence number -- use the time of day to make sure we won't repeat after a crash) (LOGAND (DAYTIME) 65535)) ) ) (* ;; "TCP control blocks") (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (DATATYPE TCP.CONTROL.BLOCK ((TCB.LOCK POINTER) (* monitor lock for synchronizing  access) (TCB.STATE POINTER) (* one of CLOSED LISTEN SYN.SENT  SYN.RECEIVED ESTABLISHED FIN.WAIT.1  FIN.WAIT.2 CLOSE.WAIT CLOSING  LAST.ACK TIME.WAIT) (TCB.SND.STREAM POINTER) (* user's send stream) (TCB.SND.SEGMENT POINTER) (* current output packet being  filled) (TCB.RCV.STREAM POINTER) (* user's receive stream) (TCB.RCV.SEGMENT POINTER) (* current input packet being read) (TCB.2MSL.TIMER POINTER) (* 2*MSL quiet time) (TCB.MAXSEG POINTER) (* maximum segment size) (TCB.CLOSEDFLG POINTER) (* T if user has initiated close  (no more data to send)) (TCB.FINSEQ POINTER) (* one past the sequence number of  the FIN we sent) (TCB.ACKFLG POINTER) (* when to ACK peer%: NOW or LATER) (TCB.TEMPLATE POINTER) (* TCP header template) (TCB.PH POINTER) (* TCP pseudo-header for  checksumming) (TCB.SRC.PORT WORD) (* local port) (TCB.DST.PORT WORD) (* remote port) (TCB.DST.HOST FIXP) (* remote host address) (TCB.INPUT.QUEUE POINTER) (* queue of received segments to be  read) (TCB.REXMT.QUEUE POINTER) (* queue of unacked segments to be  retransmitted) (TCB.SND.UNA FIXP) (* first unacknowledged sequence  number) (TCB.SND.NXT FIXP) (* next sequence number to be sent) (TCB.SND.UP FIXP) (* send urgent pointer) (TCB.SND.WL1 FIXP) (* segment sequence number used for  last window update) (TCB.SND.WL2 FIXP) (* segment acknowledgment number  used for last window update) (TCB.ISS FIXP) (* initial send sequence number) (TCB.SND.WND WORD) (* send window) (TCB.RCV.WND WORD) (* receive window) (TCB.RCV.NXT FIXP) (* next sequence number expected) (TCB.RCV.UP FIXP) (* receive urgent pointer) (TCB.IRS FIXP) (* initial receive sequence number) (TCB.USER.TIMEOUT POINTER) (* in milliseconds) (TCB.ESTABLISHED POINTER) (* processes waiting for this event  are notified when the connection  becomes established) (TCB.SND.EVENT POINTER) (* processes waiting for this event  are notified when the send window  opens up) (TCB.RCV.EVENT POINTER) (* processes waiting for this event  are notified when data is received) (TCB.URGENT.EVENT POINTER) (* processes waiting for this event  are notified when urgent data is  received) (TCB.FINACKED.EVENT POINTER)(* processes waiting for this event  are notified when our FIN has been  acked) (TCB.MODE POINTER) (* ACTIVE or PASSIVE) (TCB.RTFLG POINTER) (* T if round trip time being  measured) (TCB.RTSEQ POINTER) (* sequence number being timed) (TCB.RTTIMER POINTER) (* round trip timer) (TCB.SRTT POINTER) (* smoothed round trip time) (TCB.RTO POINTER) (* retransmission timeout based on  smoothed round trip time) (TCB.PROBE.TIMER POINTER) (* timer for delayed ACKs and window  probes) (TCB.IPSOCKET POINTER) (* Pointer to open IP socket for  this connection) (TCB.PROCESS POINTER) (* TCP monitor process for this  connection) (TCB.SENT.ZERO FLAG) (* Sent a zero allocation last time) (TCB.OUTPUT.HELD FLAG) (* True if output window shut) (TCB.NO.IDLE.PROBING FLAG) (* True if we don't probe when  nothing to output) (NIL BITS 5) (TCB.OUR.MAXSEG WORD) (TCB.LAST.SENT.RCV.WND WORD)(* The value of the last rcv window  we sent) ) TCB.LOCK _ (CREATE.MONITORLOCK) TCB.STATE _ 'CLOSED TCB.RCV.WND _ \TCP.DEFAULT.RECEIVE.WINDOW TCB.USER.TIMEOUT _ \TCP.DEFAULT.USER.TIMEOUT TCB.ESTABLISHED _ ( CREATE.EVENT ) TCB.SND.EVENT _ (CREATE.EVENT) TCB.RCV.EVENT _ (CREATE.EVENT) TCB.URGENT.EVENT _ (CREATE.EVENT) TCB.FINACKED.EVENT _ (CREATE.EVENT) TCB.MAXSEG _ \TCP.DEFAULT.MAXSEG TCB.OUR.MAXSEG _ \TCP.DEFAULT.MAXSEG TCB.SRTT _ \TCP.INITIAL.RTO TCB.RTO _ \TCP.INITIAL.RTO) (ACCESSFNS TCPSTREAM ((TCB (fetch (STREAM F1) of DATUM) (replace (STREAM F1) of DATUM with NEWVALUE)) (BYTECOUNT (fetch (STREAM F2) of DATUM) (replace (STREAM F2) of DATUM with NEWVALUE)) (ACCESS (fetch (STREAM ACCESS) of DATUM) (replace (STREAM ACCESS) of DATUM with NEWVALUE)) (ORIGINAL.COFFSET (fetch (STREAM FW6) of DATUM) (replace (STREAM FW6) of DATUM with NEWVALUE))) (CREATE (create STREAM DEVICE _ \TCP.DEVICE))) ) (/DECLAREDATATYPE 'TCP.CONTROL.BLOCK '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER WORD WORD FIXP POINTER POINTER FIXP FIXP FIXP FIXP FIXP FIXP WORD WORD FIXP FIXP FIXP POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER FLAG FLAG FLAG (BITS 5) WORD WORD) '((TCP.CONTROL.BLOCK 0 POINTER) (TCP.CONTROL.BLOCK 2 POINTER) (TCP.CONTROL.BLOCK 4 POINTER) (TCP.CONTROL.BLOCK 6 POINTER) (TCP.CONTROL.BLOCK 8 POINTER) (TCP.CONTROL.BLOCK 10 POINTER) (TCP.CONTROL.BLOCK 12 POINTER) (TCP.CONTROL.BLOCK 14 POINTER) (TCP.CONTROL.BLOCK 16 POINTER) (TCP.CONTROL.BLOCK 18 POINTER) (TCP.CONTROL.BLOCK 20 POINTER) (TCP.CONTROL.BLOCK 22 POINTER) (TCP.CONTROL.BLOCK 24 POINTER) (TCP.CONTROL.BLOCK 26 (BITS . 15)) (TCP.CONTROL.BLOCK 27 (BITS . 15)) (TCP.CONTROL.BLOCK 28 FIXP) (TCP.CONTROL.BLOCK 30 POINTER) (TCP.CONTROL.BLOCK 32 POINTER) (TCP.CONTROL.BLOCK 34 FIXP) (TCP.CONTROL.BLOCK 36 FIXP) (TCP.CONTROL.BLOCK 38 FIXP) (TCP.CONTROL.BLOCK 40 FIXP) (TCP.CONTROL.BLOCK 42 FIXP) (TCP.CONTROL.BLOCK 44 FIXP) (TCP.CONTROL.BLOCK 46 (BITS . 15)) (TCP.CONTROL.BLOCK 47 (BITS . 15)) (TCP.CONTROL.BLOCK 48 FIXP) (TCP.CONTROL.BLOCK 50 FIXP) (TCP.CONTROL.BLOCK 52 FIXP) (TCP.CONTROL.BLOCK 54 POINTER) (TCP.CONTROL.BLOCK 56 POINTER) (TCP.CONTROL.BLOCK 58 POINTER) (TCP.CONTROL.BLOCK 60 POINTER) (TCP.CONTROL.BLOCK 62 POINTER) (TCP.CONTROL.BLOCK 64 POINTER) (TCP.CONTROL.BLOCK 66 POINTER) (TCP.CONTROL.BLOCK 68 POINTER) (TCP.CONTROL.BLOCK 70 POINTER) (TCP.CONTROL.BLOCK 72 POINTER) (TCP.CONTROL.BLOCK 74 POINTER) (TCP.CONTROL.BLOCK 76 POINTER) (TCP.CONTROL.BLOCK 78 POINTER) (TCP.CONTROL.BLOCK 80 POINTER) (TCP.CONTROL.BLOCK 82 POINTER) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 0)) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 16)) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 32)) (TCP.CONTROL.BLOCK 82 (BITS . 52)) (TCP.CONTROL.BLOCK 84 (BITS . 15)) (TCP.CONTROL.BLOCK 85 (BITS . 15))) '86) (* "END EXPORTED DEFINITIONS") ) (/DECLAREDATATYPE 'TCP.CONTROL.BLOCK '(POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER WORD WORD FIXP POINTER POINTER FIXP FIXP FIXP FIXP FIXP FIXP WORD WORD FIXP FIXP FIXP POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER POINTER FLAG FLAG FLAG (BITS 5) WORD WORD) '((TCP.CONTROL.BLOCK 0 POINTER) (TCP.CONTROL.BLOCK 2 POINTER) (TCP.CONTROL.BLOCK 4 POINTER) (TCP.CONTROL.BLOCK 6 POINTER) (TCP.CONTROL.BLOCK 8 POINTER) (TCP.CONTROL.BLOCK 10 POINTER) (TCP.CONTROL.BLOCK 12 POINTER) (TCP.CONTROL.BLOCK 14 POINTER) (TCP.CONTROL.BLOCK 16 POINTER) (TCP.CONTROL.BLOCK 18 POINTER) (TCP.CONTROL.BLOCK 20 POINTER) (TCP.CONTROL.BLOCK 22 POINTER) (TCP.CONTROL.BLOCK 24 POINTER) (TCP.CONTROL.BLOCK 26 (BITS . 15)) (TCP.CONTROL.BLOCK 27 (BITS . 15)) (TCP.CONTROL.BLOCK 28 FIXP) (TCP.CONTROL.BLOCK 30 POINTER) (TCP.CONTROL.BLOCK 32 POINTER) (TCP.CONTROL.BLOCK 34 FIXP) (TCP.CONTROL.BLOCK 36 FIXP) (TCP.CONTROL.BLOCK 38 FIXP) (TCP.CONTROL.BLOCK 40 FIXP) (TCP.CONTROL.BLOCK 42 FIXP) (TCP.CONTROL.BLOCK 44 FIXP) (TCP.CONTROL.BLOCK 46 (BITS . 15)) (TCP.CONTROL.BLOCK 47 (BITS . 15)) (TCP.CONTROL.BLOCK 48 FIXP) (TCP.CONTROL.BLOCK 50 FIXP) (TCP.CONTROL.BLOCK 52 FIXP) (TCP.CONTROL.BLOCK 54 POINTER) (TCP.CONTROL.BLOCK 56 POINTER) (TCP.CONTROL.BLOCK 58 POINTER) (TCP.CONTROL.BLOCK 60 POINTER) (TCP.CONTROL.BLOCK 62 POINTER) (TCP.CONTROL.BLOCK 64 POINTER) (TCP.CONTROL.BLOCK 66 POINTER) (TCP.CONTROL.BLOCK 68 POINTER) (TCP.CONTROL.BLOCK 70 POINTER) (TCP.CONTROL.BLOCK 72 POINTER) (TCP.CONTROL.BLOCK 74 POINTER) (TCP.CONTROL.BLOCK 76 POINTER) (TCP.CONTROL.BLOCK 78 POINTER) (TCP.CONTROL.BLOCK 80 POINTER) (TCP.CONTROL.BLOCK 82 POINTER) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 0)) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 16)) (TCP.CONTROL.BLOCK 82 (FLAGBITS . 32)) (TCP.CONTROL.BLOCK 82 (BITS . 52)) (TCP.CONTROL.BLOCK 84 (BITS . 15)) (TCP.CONTROL.BLOCK 85 (BITS . 15))) '86) (* ;; "global lock for TCP-related mutual exclusion") (RPAQ? \TCP.LOCK (CREATE.MONITORLOCK)) (* ;; "list of TCP control blocks for connection lookup") (RPAQ? \TCP.CONTROL.BLOCKS NIL) (DEFINEQ (\TCP.CREATE.TCB (LAMBDA (DST.HOST DST.PORT SRC.PORT MODE OUR.MAXSEG) (* ejs%: "27-May-86 14:39") (* create a new TCB and the input and output streams that go with it) (WITH.FAST.MONITOR \TCP.LOCK (PROG ((TCB (create TCP.CONTROL.BLOCK TCB.DST.HOST _ DST.HOST TCB.DST.PORT _ DST.PORT TCB.SRC.PORT _ (if (ZEROP SRC.PORT) then (\TCP.SELECT.PORT) else SRC.PORT) TCB.INPUT.QUEUE _ (create SYSQUEUE) TCB.REXMT.QUEUE _ (create SYSQUEUE) TCB.MODE _ MODE TCB.OUR.MAXSEG _ (OR OUR.MAXSEG \TCP.DEFAULT.MAXSEG)))) (replace (STREAM STRMBOUTFN) of (replace TCB.RCV.STREAM of TCB with (create TCPSTREAM ACCESS _ (QUOTE INPUT) TCB _ TCB BYTECOUNT _ 0)) with (FUNCTION \TCP.OTHER.BOUT)) (replace (STREAM STRMBINFN) of (replace TCB.SND.STREAM of TCB with (create TCPSTREAM ACCESS _ (QUOTE APPEND) TCB _ TCB BYTECOUNT _ 0)) with (FUNCTION \TCP.OTHER.BIN)) (\TCP.START.PROBE.TIMER TCB) (push \TCP.CONTROL.BLOCKS TCB) (* put it on the global list of TCBs so it can be found by \TCP.LOOKUP.TCB) (replace TCB.IPSOCKET of TCB with (\IP.OPEN.SOCKET \TCP.PROTOCOL TCB)) (* Tell IP about it) (RETURN TCB)))) ) (\TCP.SELECT.PORT (LAMBDA NIL (* ecc " 7-May-84 17:23") (* find a port unique among all TCP connections on this host) (PROG ((PORT (LOGAND (DAYTIME) 65535))) (until (for TCB in \TCP.CONTROL.BLOCKS always (NEQ PORT (fetch TCB.SRC.PORT of TCB))) do (add PORT 1)) (RETURN PORT))) ) (\TCP.LOOKUP.TCB (LAMBDA (DST.HOST DST.PORT SRC.PORT NOWILDCARDFLG) (* ejs%: "21-Mar-86 18:40") (* Find a TCB that matches the specified addresses. If NOWILDCARDFLG is non-NIL we match against a partially specified TCB if no fully specified one was found.) (WITH.FAST.MONITOR \TCP.LOCK (bind WILDCARD for TCB in \TCP.CONTROL.BLOCKS do (if (EQ SRC.PORT (fetch TCB.SRC.PORT of TCB)) then (* only check further if the local ports match) (if (AND (IEQP DST.HOST (fetch TCB.DST.HOST of TCB)) (EQ DST.PORT (fetch TCB.DST.PORT of TCB))) then (* a full match) (RETURN TCB) elseif (AND (NOT NOWILDCARDFLG) (NULL WILDCARD) (OR (ZEROP (fetch TCB.DST.HOST of TCB)) (IEQP DST.HOST (fetch TCB.DST.HOST of TCB))) (OR (ZEROP (fetch TCB.DST.PORT of TCB)) (EQ DST.PORT (fetch TCB.DST.PORT of TCB)))) then (* a wildcard match) (SETQ WILDCARD TCB))) finally (RETURN (if NOWILDCARDFLG then NIL else WILDCARD))))) ) (\TCP.DELETE.TCB [LAMBDA (TCB) (* ; "Edited 25-Aug-88 18:39 by bvm") (WITH.FAST.MONITOR \TCP.LOCK (\TCP.TRACE.TRANSITION TCB 'CLOSED) (replace TCB.STATE of TCB with 'CLOSED) (\FLUSH.PACKET.QUEUE (fetch TCB.INPUT.QUEUE of TCB)) (\FLUSH.PACKET.QUEUE (fetch TCB.REXMT.QUEUE of TCB)) (SETQ \TCP.CONTROL.BLOCKS (DREMOVE TCB \TCP.CONTROL.BLOCKS)) (\IP.CLOSE.SOCKET (fetch TCB.IPSOCKET of TCB) \TCP.PROTOCOL T) (replace TCB.IPSOCKET of TCB with NIL) [LET [(WHENCLOSEDFN (PROCESSPROP (THIS.PROCESS) 'WHENCLOSEDFN] (COND (WHENCLOSEDFN (CL:FUNCALL WHENCLOSEDFN (fetch TCB.RCV.STREAM of TCB) (fetch TCB.SND.STREAM of TCB] (* ; "break circular links") (replace TCB.SND.STREAM of TCB with NIL) (replace TCB.RCV.STREAM of TCB with NIL) (* ;  "wake up anyone waiting for events to occur") (NOTIFY.EVENT (fetch TCB.ESTABLISHED of TCB)) (NOTIFY.EVENT (fetch TCB.SND.EVENT of TCB)) (NOTIFY.EVENT (fetch TCB.RCV.EVENT of TCB)) (NOTIFY.EVENT (fetch TCB.URGENT.EVENT of TCB)) (NOTIFY.EVENT (fetch TCB.FINACKED.EVENT of TCB]) (\TCP.NOSOCKETFN (LAMBDA (IP) (* ejs%: " 1-Feb-86 18:12") (* * Called when no TCP port corresponding to IP packet is found. We try again, allowing for wildcards) (LET* ((PROTOCOLCHAIN (\IP.FIND.PROTOCOL \TCP.PROTOCOL \IP.PROTOCOLS)) (IPSOCKET (fetch (IPSOCKET IPSLINK) of PROTOCOLCHAIN))) (while IPSOCKET do (COND ((\TCP.PORTCOMPARE IP IPSOCKET T) (APPLY* (ffetch (IPSOCKET IPSINPUTFN) of IPSOCKET) IP IPSOCKET) (RETURN)) (T (SETQ IPSOCKET (fetch (IPSOCKET IPSLINK) of IPSOCKET)))) finally (COND ((NOT (BITTEST (fetch TCP.CTRL of IP) \TCP.CTRL.RST)) (COND ((BITTEST (fetch TCP.CTRL of IP) \TCP.CTRL.ACK) (\TCP.SEND.RESET IP (fetch TCP.ACK of IP) 0 \TCP.CTRL.RST)) (T (\TCP.SEND.RESET IP 0 (IPLUS (fetch TCP.SEQ of IP) (fetch TCP.DATA.LENGTH of IP)) (LOGOR \TCP.CTRL.ACK \TCP.CTRL.RST))))) (T (\RELEASE.ETHERPACKET IP)))))) ) (\TCP.PORTCOMPARE (LAMBDA (SEGMENT IPSOCKET WILDCARDFLG) (* ejs%: "13-Apr-85 17:44") (* Find a TCB that matches the specified addresses. If NOWILDCARDFLG is non-NIL we match against a partially specified TCB if no fully specified one was found.) (WITH.FAST.MONITOR \TCP.LOCK (PROG ((DST.HOST (fetch (TCPSEGMENT TCP.SRC.ADDR) of SEGMENT)) (DST.PORT (fetch (TCPSEGMENT TCP.SRC.PORT) of SEGMENT)) (SRC.PORT (fetch (TCPSEGMENT TCP.DST.PORT) of SEGMENT)) (TCB (fetch (IPSOCKET IPSOCKET) of IPSOCKET))) (COND ((AND TCB (EQ SRC.PORT (fetch TCB.SRC.PORT of TCB))) (* only check further if the local ports match) (COND ((AND (IEQP DST.HOST (fetch TCB.DST.HOST of TCB)) (EQ DST.PORT (fetch TCB.DST.PORT of TCB))) (* a full match) (RETURN IPSOCKET)) ((AND WILDCARDFLG (OR (ZEROP (fetch TCB.DST.HOST of TCB)) (IEQP DST.HOST (fetch TCB.DST.HOST of TCB))) (OR (ZEROP (fetch TCB.DST.PORT of TCB)) (EQ DST.PORT (fetch TCB.DST.PORT of TCB)))) (* a wildcard match) (RETURN IPSOCKET)))))))) ) ) (* ;; "TCP checksums") (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (DATATYPE TCP.PSEUDOHEADER ((PH.SRC.ADDR FIXP) (PH.DST.ADDR FIXP) (NIL BYTE) (PH.PROTOCOL BYTE) (PH.LENGTH WORD)) PH.PROTOCOL _ \TCP.PROTOCOL) ) (/DECLAREDATATYPE 'TCP.PSEUDOHEADER '(FIXP FIXP BYTE BYTE WORD) '((TCP.PSEUDOHEADER 0 FIXP) (TCP.PSEUDOHEADER 2 FIXP) (TCP.PSEUDOHEADER 4 (BITS . 7)) (TCP.PSEUDOHEADER 4 (BITS . 135)) (TCP.PSEUDOHEADER 5 (BITS . 15))) '6) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.PSEUDOHEADER.LENGTH 12) (CONSTANTS \TCP.PSEUDOHEADER.LENGTH) ) (DECLARE%: EVAL@COMPILE [PUTPROPS \16BIT.COMPLEMENT MACRO ((X) (LOGXOR X (MASK.1'S 0 16] [PUTPROPS \16BIT.1C.PLUS MACRO ((X Y) (* compute the one's complement sum of X and Y without creating FIXP boxes --  the sum modulo |2^16| plus an end-around carry) (PROG ((DELTA (IDIFFERENCE MAX.SMALLP Y))) (RETURN (if (ILEQ X DELTA) then (IPLUS X Y) else (IDIFFERENCE X DELTA] ) ) (/DECLAREDATATYPE 'TCP.PSEUDOHEADER '(FIXP FIXP BYTE BYTE WORD) '((TCP.PSEUDOHEADER 0 FIXP) (TCP.PSEUDOHEADER 2 FIXP) (TCP.PSEUDOHEADER 4 (BITS . 7)) (TCP.PSEUDOHEADER 4 (BITS . 135)) (TCP.PSEUDOHEADER 5 (BITS . 15))) '6) (RPAQ? \TCP.PSEUDOHEADER NIL) (* ;; "this variable controls whether checksums are performed on incoming segments") (RPAQ? \TCP.CHECKSUMS.ON NIL) (* ;; "checksum routines") (DEFINEQ (\COMPUTE.CHECKSUM (LAMBDA (BASE LENGTH DONTCOMPLEMENTFLG) (* ecc "25-May-84 18:47") (* TCP/IP protocol checksum is the 16-bit 1's complement of the 1's complement sum of the 16-bit words) (PROG ((CHECKSUM 0) (N (SUB1 (LRSH LENGTH 1)))) (for I from 0 to N do (SETQ CHECKSUM (\16BIT.1C.PLUS CHECKSUM (\GETBASE BASE I)))) (if (ODDP LENGTH) then (* if LENGTH is odd, the last byte must be padded on the right by a zero byte) (SETQ CHECKSUM (\16BIT.1C.PLUS CHECKSUM (LLSH (\GETBASEBYTE BASE (SUB1 LENGTH)) 8)))) (RETURN (if DONTCOMPLEMENTFLG then (* if DONTCOMPLEMENTFLG is non-NIL just return the 1's complement sum) CHECKSUM else (\16BIT.COMPLEMENT CHECKSUM))))) ) (\TCP.CHECKSUM.INCOMING (LAMBDA (SEGMENT) (* ecc "16-May-84 11:53") (* computes the TCP checksum and returns T or NIL depending on whether it matches the checksum in the header) (PROG ((LENGTH (IPLUS (fetch TCP.HEADER.LENGTH of SEGMENT) (\TCP.DATA.LENGTH SEGMENT))) (SEGMENT.CHECKSUM (fetch TCP.CHECKSUM of SEGMENT)) CHECKSUM OK) (WITH.FAST.MONITOR \TCP.LOCK (* need to lock this because we're using \TCP.PSEUDOHEADER) (replace PH.SRC.ADDR of \TCP.PSEUDOHEADER with (fetch TCP.SRC.ADDR of SEGMENT)) (replace PH.DST.ADDR of \TCP.PSEUDOHEADER with (fetch TCP.DST.ADDR of SEGMENT)) (replace PH.LENGTH of \TCP.PSEUDOHEADER with LENGTH) (replace TCP.CHECKSUM of SEGMENT with 0) (* checksum field must be 0 while we are computing checksum) (SETQ CHECKSUM (\16BIT.COMPLEMENT (\16BIT.1C.PLUS (\COMPUTE.CHECKSUM \TCP.PSEUDOHEADER \TCP.PSEUDOHEADER.LENGTH T) (\COMPUTE.CHECKSUM (fetch TCPHEADER of SEGMENT) LENGTH T))))) (SETQ OK (EQ CHECKSUM SEGMENT.CHECKSUM)) (if (AND (NOT OK) (MEMB (QUOTE CHECKSUM) TCPTRACEFLG)) then (printout TCPTRACEFILE .TAB0 0 "[bad checksum " CHECKSUM "]" T)) (RETURN OK))) ) (\TCP.CHECKSUM.OUTGOING (LAMBDA (TCB SEGMENT) (* ecc "16-May-84 11:53") (* compute checksum and place in header) (PROG ((LENGTH (IPLUS (fetch TCP.HEADER.LENGTH of SEGMENT) (\TCP.DATA.LENGTH SEGMENT))) (PH (if TCB then (fetch TCB.PH of TCB) else \TCP.PSEUDOHEADER))) (WITH.FAST.MONITOR \TCP.LOCK (* need to lock this in case we're using \TCP.PSEUDOHEADER) (replace PH.SRC.ADDR of PH with (fetch TCP.SRC.ADDR of SEGMENT)) (replace PH.DST.ADDR of PH with (fetch TCP.DST.ADDR of SEGMENT)) (replace PH.LENGTH of PH with LENGTH) (replace TCP.CHECKSUM of SEGMENT with 0) (* checksum field must be 0 while we are computing checksum) (replace TCP.CHECKSUM of SEGMENT with (\16BIT.COMPLEMENT (\16BIT.1C.PLUS (\COMPUTE.CHECKSUM PH \TCP.PSEUDOHEADER.LENGTH T) (\COMPUTE.CHECKSUM (fetch TCPHEADER of SEGMENT) LENGTH T))))))) ) ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.INITIAL.RTO 1000) (CONSTANTS \TCP.INITIAL.RTO) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.UBOUND 5000) (RPAQQ \TCP.LBOUND 1000) (CONSTANTS (\TCP.UBOUND 5000) (\TCP.LBOUND 1000)) ) ) (* ;; "maximum segment lifetime") (RPAQ? \TCP.MSL 5000) (RPAQ? \TCP.DEFAULT.USER.TIMEOUT 60000) (RPAQ? \TCP.DEFAULT.RECEIVE.WINDOW 4096) (RPAQ? \TCP.DEVICE NIL) (* ;; "TCP protocol routines") (DEFINEQ (\TCP.ACK# (LAMBDA (TCB) (* ejs%: " 7-Jun-85 13:18") (* * Returns the byte id for the next ACK) (* (LET* ((STREAM (fetch TCB.RCV.STREAM of TCB)) (BUFFER (fetch TCB.RCV.SEGMENT of TCB))) (COND (BUFFER (IPLUS (fetch TCP.SEQ of BUFFER) (fetch (STREAM COFFSET) of STREAM))) ((SETQ BUFFER (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB))) (IMIN (fetch TCB.RCV.NXT of TCB) (fetch TCP.SEQ of BUFFER))) (T (fetch TCB.RCV.NXT of TCB))))) (fetch TCB.RCV.NXT of TCB)) ) (\TCP.PACKET.FILTER (LAMBDA (SEGMENT PROTOCOL) (* ecc " 7-May-84 17:27") (* packet filter used by IP code to dispatch packets by protocol) (SELECTC PROTOCOL (\TCP.PROTOCOL (ERSETQ (\TCP.INPUT SEGMENT)) T) (\ICMP.PROTOCOL (ERSETQ (\TCP.HANDLE.ICMP SEGMENT)) T) NIL)) ) (\TCP.SETUP.SEGMENT (LAMBDA (SRC.HOST SRC.PORT DST.HOST DST.PORT) (* ejs%: " 1-Jan-01 10:28") (* allocate a new TCP segment and set up its header) (PROG ((SEGMENT (\IP.SETUPIP (\ALLOCATE.ETHERPACKET) DST.HOST NIL \TCP.MASTER.SOCKET (QUOTE FREE)))) (add (fetch (IP IPTOTALLENGTH) of SEGMENT) \TCP.HEADER.LENGTH) (replace TCP.SRC.PORT of SEGMENT with SRC.PORT) (replace TCP.DST.PORT of SEGMENT with DST.PORT) (replace TCP.DATA.OFFSET of SEGMENT with \TCP.MIN.DATA.OFFSET) (replace TCP.MBZ of SEGMENT with 0) (RETURN SEGMENT))) ) (\TCP.RELEASE.SEGMENT (LAMBDA (SEGMENT) (* ecc " 7-May-84 17:28") (* release a TCP segment -- it had better not be on anyone's queue) (CHECK (OR (NULL (fetch QLINK of SEGMENT)) (SHOULDNT "releasing queued segment"))) (\RELEASE.ETHERPACKET SEGMENT)) ) (\TCP.CONNECTION (LAMBDA (DST.HOST DST.PORT SRC.PORT MODE OPTIONS) (* ; "Edited 23-May-88 19:14 by Snow") (* ;; "open a TCP connection and return the TCB or NIL if the connection fails") (PROG (SPECIFIED TCB ISS TCP.PROCESS) (SELECTQ MODE (ACTIVE) (PASSIVE) (ERROR "TCP open mode must be ACTIVE or PASSIVE")) (if (NULL DST.HOST) then (SETQ DST.HOST 0)) (if (NULL DST.PORT) then (SETQ DST.PORT 0)) (if (NULL SRC.PORT) then (SETQ SRC.PORT 0)) (SETQ SPECIFIED (NOT (OR (ZEROP DST.HOST) (ZEROP DST.PORT)))) (if (AND (EQ MODE (QUOTE ACTIVE)) (NOT SPECIFIED)) then (ERROR "foreign socket unspecified")) (* ;; "Check for conflict with existing connections. ACTIVE open only conflicts with other fully specified connections. PASSIVE open conflicts with fully specified connections if the open is fully specifed, and with partially specified connections if the open is partially specified") (if (SETQ TCB (OR (AND (OR (EQ MODE (QUOTE ACTIVE)) SPECIFIED) (\TCP.LOOKUP.TCB DST.HOST DST.PORT SRC.PORT T)) (AND (EQ MODE (QUOTE PASSIVE)) (NOT SPECIFIED) (SETQ TCB (\TCP.LOOKUP.TCB DST.HOST DST.PORT SRC.PORT NIL)) (OR (ZEROP (fetch TCB.DST.HOST of TCB)) (ZEROP (fetch TCB.DST.PORT of TCB))) TCB))) then (COND ((type? TCP.CONTROL.BLOCK TCB) (COND ((FMEMB (fetch TCB.STATE of TCB) (QUOTE (CLOSED CLOSE.WAIT TIME.WAIT FIN.WAIT.1 FIN.WAIT.2))) (\TCP.DELETE.TCB TCB)) (T (ERROR "TCP connection already exists")))) (T (ERROR "TCP connection already exists")))) (SETQ TCB (\TCP.CREATE.TCB DST.HOST DST.PORT SRC.PORT MODE (OR (LISTGET OPTIONS (QUOTE MAXSEG)) \TCP.DEFAULT.MAXSEG))) (replace TCB.NO.IDLE.PROBING of TCB with (LISTGET OPTIONS (QUOTE NO.IDLE.PROBING))) (SELECTQ MODE (ACTIVE (WITH.MONITOR \TCP.LOCK (SETQ ISS (\TCP.SELECT.ISS)) (replace TCB.ISS of TCB with ISS)) (\TCP.TEMPLATE TCB (COND ((LISTGET OPTIONS (QUOTE MAXSEG)) OPTIONS) (T (APPEND OPTIONS (BQUOTE (MAXSEG %, \TCP.DEFAULT.MAXSEG)))))) (replace TCB.SND.UNA of TCB with ISS) (replace TCB.SND.NXT of TCB with ISS) (replace TCB.SND.UP of TCB with ISS) (\TCP.TRACE.TRANSITION TCB (QUOTE SYN.SENT)) (replace TCB.STATE of TCB with (QUOTE SYN.SENT)) (SETQ TCP.PROCESS (ADD.PROCESS (BQUOTE (\TCP.PROCESS %, TCB)) (QUOTE NAME) (QUOTE TCP) (QUOTE WHENCLOSEDFN) (LISTGET OPTIONS (QUOTE WHENCLOSEDFN)))) (* ; "initiate the three-way handshake to establish the connection") (\TCP.FLUSH (fetch TCB.SND.STREAM of TCB) \TCP.CTRL.SYN) (* ; "wait until established") (WITH.MONITOR (fetch TCB.LOCK of TCB) (RESETLST (RESETSAVE NIL (BQUOTE (AND RESETSTATE (DEL.PROCESS %, TCP.PROCESS)))) (until (NEQ (fetch TCB.STATE of TCB) (QUOTE SYN.SENT)) do (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.ESTABLISHED of TCB)))))) (PASSIVE (\TCP.TRACE.TRANSITION TCB (QUOTE LISTEN)) (replace TCB.STATE of TCB with (QUOTE LISTEN)) (SETQ TCP.PROCESS (ADD.PROCESS (BQUOTE (\TCP.PROCESS %, TCB)) (QUOTE NAME) (QUOTE TCP) (QUOTE WHENCLOSEDFN) (LISTGET OPTIONS (QUOTE WHENCLOSEDFN)))) (* ; "wait until established") (WITH.MONITOR (fetch TCB.LOCK of TCB) (RESETLST (RESETSAVE NIL (BQUOTE (AND RESETSTATE (DEL.PROCESS %, TCP.PROCESS)))) (until (NEQ (fetch TCB.STATE of TCB) (QUOTE LISTEN)) do (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.ESTABLISHED of TCB)))))) (SHOULDNT)) (RETURN (if (NEQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) then TCB else NIL)))) ) (\TCP.FIX.INCOMING.SEGMENT (LAMBDA (SEGMENT FLAGS) (* ecc "16-May-84 11:56") (PROG NIL (if (AND (BITTEST FLAGS \TCP.CTRL.SYN) (BITTEST FLAGS \TCP.CTRL.FIN)) then (RETURN NIL)) (* calculate the length of the segment data and place it in a fixed position in the header for fast access -- note that the TCP.DATA.LENGTH field isn't a true part of the TCP header; it overlays the IP level checksum which is no longer needed) (replace TCP.DATA.LENGTH of SEGMENT with (\TCP.DATA.LENGTH SEGMENT)) (* return T or NIL depending on whether checksum is correct) (RETURN (OR (NOT \TCP.CHECKSUMS.ON) (\TCP.CHECKSUM.INCOMING SEGMENT))))) ) (\TCP.DATA.LENGTH (LAMBDA (SEGMENT) (* ejs%: "21-Jun-85 17:04") (* data length = total segment length - (IP header length + TCP header length)) (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of SEGMENT) (IPLUS (UNFOLD (fetch (IP IPHEADERLENGTH) of SEGMENT) BYTESPERCELL) (UNFOLD (fetch TCP.DATA.OFFSET of SEGMENT) BYTESPERCELL)))) ) (\TCP.SYN.OR.FIN (LAMBDA (FLAGS NOERRORFLG) (* ecc " 1-May-84 17:10") (* SYN and FIN occupy sequence number space so we have to include them in the "length" of the segment) (SELECTC (LOGAND FLAGS (LOGOR \TCP.CTRL.SYN \TCP.CTRL.FIN)) (0 0) (\TCP.CTRL.SYN 1) (\TCP.CTRL.FIN 1) (if NOERRORFLG then 0 else (SHOULDNT "both SYN and FIN")))) ) (\TCP.INPUT (LAMBDA (SEGMENT TCB) (* ejs%: "20-Jun-85 13:06") (* handle an incoming TCP segment -- pages |65-76| of RFC 793) (PROG ((SEQ (fetch TCP.SEQ of SEGMENT)) (ACK (fetch TCP.ACK of SEGMENT)) (FLAGS (fetch TCP.CTRL of SEGMENT)) UNA QUEUEDFLG) (if (NOT (\TCP.INPUT.INITIAL TCB SEGMENT SEQ ACK FLAGS)) then (\TCP.RELEASE.SEGMENT SEGMENT) (RETURN)) (WITH.MONITOR (fetch TCB.LOCK of TCB) (PROG NIL (* handle unsynchronized states) (if (NOT (\TCP.INPUT.UNSYNC TCB SEGMENT SEQ ACK FLAGS)) then (GO DROPIT)) (* first check sequence number) (if (NOT (\TCP.CHECK.WINDOW TCB SEGMENT FLAGS)) then (GO DROPIT)) (* second check the RST bit) (if (NOT (\TCP.CHECK.RESET TCB SEGMENT SEQ ACK FLAGS)) then (GO DROPIT)) (* third check security and precedence) (if (NOT (\TCP.CHECK.SECURITY TCB SEGMENT FLAGS)) then (GO DROPIT)) (* fourth check the SYN bit) (if (NOT (\TCP.CHECK.NO.SYN TCB SEGMENT FLAGS)) then (GO DROPIT)) (if (NOT (\TCP.CHECK.OPTIONS TCB SEGMENT FLAGS)) then (GO DROPIT)) (* fifth check the ACK field) (if (NOT (\TCP.CHECK.ACK TCB SEGMENT FLAGS)) then (GO DROPIT)) (if (EQ (fetch TCB.STATE of TCB) (QUOTE SYN.RECEIVED)) then (if (AND (\32BIT.LEQ (fetch TCB.SND.UNA of TCB) ACK) (\32BIT.LEQ ACK (fetch TCB.SND.NXT of TCB))) then (* our SYN has been acked) (\TCP.TRACE.TRANSITION TCB (QUOTE ESTABLISHED)) (replace TCB.STATE of TCB with (QUOTE ESTABLISHED)) (replace TCB.DST.HOST of TCB with (fetch (TCPSEGMENT TCP.SRC.ADDR) of SEGMENT)) (replace TCB.DST.PORT of TCB with (fetch (TCPSEGMENT TCP.SRC.PORT) of SEGMENT)) (NOTIFY.EVENT (fetch TCB.ESTABLISHED of TCB)) (* continue processing in ESTABLISHED state) else (\TCP.SEND.CONTROL TCB ACK NIL \TCP.CTRL.RST) (GO DROPIT))) (if (NOT (\TCP.HANDLE.ACK TCB SEGMENT SEQ ACK FLAGS)) then (GO DROPIT)) (SELECTQ (fetch TCB.STATE of TCB) (FIN.WAIT.1 (if (\TCP.OUR.FIN.IS.ACKED TCB) then (\TCP.TRACE.TRANSITION TCB (QUOTE FIN.WAIT.2)) (replace TCB.STATE of TCB with (QUOTE FIN.WAIT.2)) (NOTIFY.EVENT (fetch TCB.FINACKED.EVENT of TCB)))) ((ESTABLISHED FIN.WAIT.2 CLOSE.WAIT) NIL) (CLOSING (if (\TCP.OUR.FIN.IS.ACKED TCB) then (\TCP.START.TIME.WAIT TCB) (NOTIFY.EVENT (fetch TCB.FINACKED.EVENT of TCB)) else (GO DROPIT))) (LAST.ACK (if (\TCP.OUR.FIN.IS.ACKED TCB) then (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSED)) (replace TCB.STATE of TCB with (QUOTE CLOSED)) (NOTIFY.EVENT (fetch TCB.FINACKED.EVENT of TCB)) (RETURN) else (GO DROPIT))) (TIME.WAIT (\TCP.SEND.ACK TCB) (GO DROPIT)) (SHOULDNT)) (* sixth check the URG bit) (\TCP.HANDLE.URG TCB SEGMENT SEQ ACK FLAGS) (* seventh process the segment text) (SELECTQ (fetch TCB.STATE of TCB) ((ESTABLISHED FIN.WAIT.1 FIN.WAIT.2) (SETQ QUEUEDFLG (\TCP.QUEUE.INPUT TCB SEGMENT SEQ))) ((CLOSE.WAIT CLOSING LAST.ACK TIME.WAIT)) (SHOULDNT)) (* eighth check the FIN bit) (\TCP.HANDLE.FIN TCB SEGMENT SEQ ACK FLAGS) (if QUEUEDFLG then (RETURN)) DROPIT (\TCP.RELEASE.SEGMENT SEGMENT))))) ) (\TCP.INPUT.INITIAL (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ecc "16-May-84 17:27") (* handle segment for non-existent TCB -- page 65 of RFC 793) (PROG NIL (\TCP.TRACE.SEGMENT (QUOTE RECV) SEGMENT) (if (NOT (\TCP.FIX.INCOMING.SEGMENT SEGMENT FLAGS)) then (* bad checksum) (RETURN NIL)) (if (OR (NULL TCB) (EQ (fetch TCB.STATE of TCB) (QUOTE CLOSED))) then (* an incoming segment not containing a RST causes a RST to be sent in response) (if TCPTRACEFLG then (printout TCPTRACEFILE .TAB0 0 "[no such TCP connection]")) (if (NOT (BITTEST FLAGS \TCP.CTRL.RST)) then (* send a RST) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (\TCP.SEND.RESET SEGMENT ACK) else (\TCP.SEND.RESET SEGMENT 0 (IPLUS SEQ (fetch TCP.DATA.LENGTH of SEGMENT) (\TCP.SYN.OR.FIN FLAGS))))) (RETURN NIL)) (RETURN T))) ) (\TCP.INPUT.UNSYNC (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ejs%: "21-Mar-86 20:03") (* handle segment for TCB in LISTEN or SYN.SENT state -- pages |65-68| of RFC 793) (SELECTQ (fetch TCB.STATE of TCB) (LISTEN (\TCP.INPUT.LISTEN TCB SEGMENT SEQ ACK FLAGS) NIL) (SYN.SENT (\TCP.INPUT.SYN.SENT TCB SEGMENT SEQ ACK FLAGS) (\TCP.CHECK.OPTIONS TCB SEGMENT FLAGS) NIL) T)) ) (\TCP.INPUT.LISTEN (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ejs%: "22-Jun-85 03:14") (* handle segment for TCB in LISTEN state -- pages |65-66| of RFC 793) (PROG (ISS) (* first check for a RST) (if (BITTEST FLAGS \TCP.CTRL.RST) then (RETURN NIL)) (* second check for an ACK) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (* any acknowledgment is bad if it arrives on a connection still in the LISTEN state) (\TCP.SEND.RESET SEGMENT ACK) (RETURN NIL)) (* third check for a SYN) (if (BITTEST FLAGS \TCP.CTRL.SYN) then (if (NOT (\TCP.CHECK.SECURITY TCB SEGMENT FLAGS)) then (RETURN NIL)) (replace TCB.RCV.NXT of TCB with (ADD1 SEQ)) (replace TCB.IRS of TCB with SEQ) (SETQ ISS (\TCP.SELECT.ISS)) (replace TCB.ISS of TCB with ISS) (replace TCB.SND.NXT of TCB with ISS) (replace TCB.SND.UNA of TCB with ISS) (replace TCB.SND.UP of TCB with ISS) (\TCP.TRACE.TRANSITION TCB (QUOTE SYN.RECEIVED)) (replace TCB.STATE of TCB with (QUOTE SYN.RECEIVED)) (* fill in foreign socket in case it was only partially specified) (replace TCB.DST.HOST of TCB with (fetch TCP.SRC.ADDR of SEGMENT)) (replace TCB.DST.PORT of TCB with (fetch TCP.SRC.PORT of SEGMENT)) (\TCP.TEMPLATE TCB) (* send a SYN, ACK segment using \TCP.FLUSH because SYN occupies sequence number space) (\TCP.FLUSH (fetch TCB.SND.STREAM of TCB) \TCP.CTRL.SYN) (* NOTE%: we never queue data that arrives in a SYN segment, we just ACK the SYN and require the data to be retransmitted)) (RETURN NIL))) ) (\TCP.INPUT.SYN.SENT (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ecc "16-May-84 12:13") (* handle segment for TCB in SYN.SENT state -- pages |66-68| of RFC 793) (PROG NIL (* first check the ACK bit) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (if (OR (\32BIT.LEQ ACK (fetch TCB.ISS of TCB)) (\32BIT.GT ACK (fetch TCB.SND.NXT of TCB))) then (* ACK is unacceptable) (if (NOT (BITTEST FLAGS \TCP.CTRL.RST)) then (\TCP.SEND.CONTROL TCB ACK NIL \TCP.CTRL.RST)) (RETURN NIL))) (* second check the RST bit) (if (BITTEST FLAGS \TCP.CTRL.RST) then (if (BITTEST FLAGS \TCP.CTRL.ACK) then (* if the ACK was acceptable then signal the user) (\TCP.CONNECTION.DROPPED TCB "reset")) (RETURN NIL)) (* third check the security and precedence) (if (NOT (\TCP.CHECK.SECURITY TCB SEGMENT FLAGS)) then (RETURN NIL)) (* fourth check the SYN bit) (if (BITTEST FLAGS \TCP.CTRL.SYN) then (replace TCB.RCV.NXT of TCB with (ADD1 SEQ)) (replace TCB.IRS of TCB with SEQ) (if (AND (BITTEST FLAGS \TCP.CTRL.ACK) (\32BIT.GEQ ACK (fetch TCB.SND.UNA of TCB))) then (* new ACK information) (replace TCB.SND.UNA of TCB with ACK)) (replace TCP.CTRL of SEGMENT with (SETQ FLAGS (BITCLEAR FLAGS \TCP.CTRL.SYN))) (if (\32BIT.GT (fetch TCB.SND.UNA of TCB) (fetch TCB.ISS of TCB)) then (* our SYN has been acked) (\TCP.TRACE.TRANSITION TCB (QUOTE ESTABLISHED)) (replace TCB.STATE of TCB with (QUOTE ESTABLISHED)) (* send an ACK segment) (\TCP.SEND.ACK TCB (QUOTE NOW)) (NOTIFY.EVENT (fetch TCB.ESTABLISHED of TCB)) else (* we can just let our original SYN segment be retransmitted) (\TCP.TRACE.TRANSITION TCB (QUOTE SYN.RECEIVED)) (replace TCB.STATE of TCB with (QUOTE SYN.RECEIVED)) (* send an ACK segment) (\TCP.SEND.ACK TCB (QUOTE NOW))) (* NOTE%: we never queue data that arrives in a SYN segment, we just ACK the SYN and require the data to be retransmitted)) (* drop the segment and return) (RETURN NIL))) ) (\TCP.CHECK.WINDOW (LAMBDA (TCB SEGMENT FLAGS) (* ecc "16-May-84 16:29") (* check segment length against receive window -- page 69 of RFC 793) (PROG ((LEN (fetch TCP.DATA.LENGTH of SEGMENT)) (SEQ (fetch TCP.SEQ of SEGMENT)) (RCV.NXT (fetch TCB.RCV.NXT of TCB)) (WND (fetch TCB.RCV.WND of TCB)) TOP) (SETQ TOP (IPLUS SEQ LEN (\TCP.SYN.OR.FIN FLAGS))) (if (ZEROP LEN) then (if (ZEROP WND) then (if (\32BIT.EQ SEQ RCV.NXT) then (RETURN T)) else (if (AND (\32BIT.LEQ RCV.NXT SEQ) (\32BIT.LT SEQ (IPLUS RCV.NXT WND))) then (RETURN T))) else (if (NOT (ZEROP WND)) then (if (OR (AND (\32BIT.LEQ RCV.NXT SEQ) (\32BIT.LT SEQ (IPLUS RCV.NXT WND))) (AND (\32BIT.LT RCV.NXT TOP) (\32BIT.LEQ TOP (IPLUS RCV.NXT WND)))) then (RETURN T)))) (if (NOT (BITTEST FLAGS \TCP.CTRL.RST)) then (* send an ACK in reply) (\TCP.SEND.ACK TCB (QUOTE NOW))) (RETURN NIL))) ) (\TCP.CHECK.RESET (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ecc "16-May-84 12:07") (* check the RST bit -- page 70 of RFC 793) (PROG NIL (if (BITTEST FLAGS \TCP.CTRL.RST) then (SELECTQ (fetch TCB.STATE of TCB) (SYN.RECEIVED (if (EQ (fetch TCB.MODE of TCB) (QUOTE PASSIVE)) then (\TCP.TRACE.TRANSITION TCB (QUOTE LISTEN)) (replace TCB.STATE of TCB with (QUOTE LISTEN)) else (\TCP.CONNECTION.DROPPED TCB "refused")) (\FLUSH.PACKET.QUEUE (fetch TCB.REXMT.QUEUE of TCB)) (\TCP.SEND.CONTROL TCB ACK NIL \TCP.CTRL.RST)) ((ESTABLISHED FIN.WAIT.1 FIN.WAIT.2 CLOSE.WAIT) (\TCP.CONNECTION.DROPPED TCB "reset")) ((CLOSING LAST.ACK TIME.WAIT) (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSED)) (replace TCB.STATE of TCB with (QUOTE CLOSED))) (SHOULDNT)) (RETURN NIL) else (RETURN T)))) ) (\TCP.CHECK.SECURITY (LAMBDA (TCB SEGMENT FLAGS) (* ecc "16-May-84 12:06") (* returns T or NIL depending on whether security and precedence are OK; sends RST if necessary) (* not implemented) T) ) (\TCP.CHECK.NO.SYN (LAMBDA (TCB SEGMENT FLAGS) (* ecc "16-May-84 12:07") (* check the SYN bit -- page 71 of RFC 793) (PROG NIL (CHECK (OR (NOT (BITTEST FLAGS \TCP.CTRL.RST)) (SHOULDNT "RST bit set"))) (if (NOT (BITTEST FLAGS \TCP.CTRL.SYN)) then (RETURN T)) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (\TCP.SEND.CONTROL TCB (fetch TCP.ACK of SEGMENT) NIL \TCP.CTRL.RST) else (\TCP.SEND.CONTROL TCB 0 (IPLUS (fetch TCP.ACK of SEGMENT) (fetch TCP.DATA.LENGTH of SEGMENT) 1) (LOGOR \TCP.CTRL.ACK \TCP.CTRL.RST))) (\TCP.CONNECTION.DROPPED TCB "reset") (RETURN NIL))) ) (\TCP.CHECK.ACK (LAMBDA (TCB SEGMENT FLAGS) (* ecc "16-May-84 12:08") (* check the ACK field -- page 72 of RFC 793) (PROG NIL (CHECK (OR (NOT (BITTEST FLAGS (LOGOR \TCP.CTRL.SYN \TCP.CTRL.RST))) (SHOULDNT "SYN or RST bit set"))) (RETURN (BITTEST FLAGS \TCP.CTRL.ACK)))) ) (\TCP.HANDLE.ACK (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ejs%: "22-Jun-85 00:35") (* ACK processing -- pages |72-73| of RFC 793) (PROG (EVENT) (if (\32BIT.GT ACK (fetch TCB.SND.NXT of TCB)) then (* this segment acks something we haven't sent yet) (\TCP.SEND.ACK TCB (QUOTE NOW)) (RETURN NIL)) (if (AND (fetch TCB.RTFLG of TCB) (\32BIT.GT ACK (fetch TCB.RTSEQ of TCB))) then (* calculate smoothed round trip time) (replace TCB.RTFLG of TCB with NIL) (replace TCB.SRTT of TCB with (FOLDLO (PLUS (ITIMES 7 (fetch TCB.SRTT of TCB)) (CLOCKDIFFERENCE (fetch TCB.RTTIMER of TCB))) 8)) (replace TCB.RTTIMER of TCB with (SETUPTIMER 0 (fetch TCB.RTTIMER of TCB))) (replace TCB.RTO of TCB with (IMIN \TCP.UBOUND (IMAX \TCP.LBOUND (FOLDLO (ITIMES 3 (fetch TCB.SRTT of TCB)) 2))))) (if (\32BIT.GT ACK (fetch TCB.SND.UNA of TCB)) then (* new ACK information) (replace TCB.SND.UNA of TCB with ACK) (SETQ EVENT T)) (if (OR (\32BIT.GT SEQ (fetch TCB.SND.WL1 of TCB)) (AND (\32BIT.EQ SEQ (fetch TCB.SND.WL1 of TCB)) (\32BIT.GEQ ACK (fetch TCB.SND.WL2 of TCB)))) then (* update send window) (replace TCB.SND.WND of TCB with (fetch TCP.WINDOW of SEGMENT)) (replace TCB.SND.WL1 of TCB with SEQ) (replace TCB.SND.WL2 of TCB with ACK) (SETQ EVENT T)) (if EVENT then (NOTIFY.EVENT (fetch TCB.SND.EVENT of TCB))) (RETURN T))) ) (\TCP.HANDLE.URG (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ecc "16-May-84 12:10") (* check the URG bit -- pages |73-74| of RFC 793) (PROG (UP) (if (BITTEST FLAGS \TCP.CTRL.URG) then (SELECTQ (fetch TCB.STATE of TCB) ((ESTABLISHED FIN.WAIT.1 FIN.WAIT.2) (SETQ UP (IPLUS SEQ (fetch TCP.URG.PTR of SEGMENT))) (if (\32BIT.GT UP (fetch TCB.RCV.UP of TCB)) then (replace TCB.RCV.UP of TCB with UP) (if (\32BIT.GT UP (fetch TCB.RCV.NXT of TCB)) then (* urgent pointer is in advance of the data consumed) (\TCP.SIGNAL.URGENT.DATA TCB)))) ((CLOSE.WAIT CLOSING LAST.ACK TIME.WAIT) NIL) (SHOULDNT))))) ) (\TCP.QUEUE.INPUT (LAMBDA (TCB SEGMENT SEQ) (* ejs%: "18-Dec-86 17:39") (* Put the segment in its proper position in the input queue according to its sequence number range. Returns T if the segment was queued, NIL if it was a duplicate. Segments are queued by increasing left endpoint of their sequence number range. If the entire sequence number range has been seen or is covered by segments already in the queue, the segment is a duplicate. Otherwise, it covers some gap in the queue, so it is placed in its proper position. Note that a later segment that covers gaps on both sides will also be queued, resulting in duplicates in the queue. Therefore \TCP.GET.SEGMENT must be prepared to skip over duplicates.) (CHECK (OR (NULL (fetch QLINK of SEGMENT)) (SHOULDNT "input segment already queued"))) (CHECK (\TCP.CHECK.INPUT.QUEUE TCB)) (UNINTERRUPTABLY (PROG ((QUEUE (fetch TCB.INPUT.QUEUE of TCB)) (RCV.NXT (fetch TCB.RCV.NXT of TCB)) (LEN (fetch TCP.DATA.LENGTH of SEGMENT)) (FLAGS (fetch TCP.CTRL of SEGMENT)) TOP CURRENT CURSEQ NEXT) (if (EQ 0 LEN) then (* this segment has no data) (GO DROPITANDPROBE)) (SETQ TOP (IPLUS SEQ LEN)) (if (\32BIT.LEQ TOP RCV.NXT) then (* this segment is a duplicate) (GO DROPITANDPROBE)) (SETQ CURRENT (fetch SYSQUEUEHEAD of QUEUE)) (SETQ NEXT (fetch SYSQUEUETAIL of QUEUE)) (if (OR (NULL CURRENT) (\32BIT.GEQ SEQ (fetch TCP.SEQ of NEXT))) then (* the segment goes at the tail of the queue -- we check this first since this is the expected case) (\ENQUEUE QUEUE SEGMENT) elseif (\32BIT.LT SEQ (SETQ CURSEQ (fetch TCP.SEQ of CURRENT))) then (* the segment goes at the head of the queue) (replace QLINK of SEGMENT with CURRENT) (replace SYSQUEUEHEAD of QUEUE with SEGMENT) else (* * Search for this segment's proper position in the queue. The invariant upon entering this loop is%: segment.seq >= current.seq) (do (if (\32BIT.LEQ TOP (IPLUS CURSEQ (fetch TCP.DATA.LENGTH of CURRENT))) then (* * segment.seq <= current.seq + current.length. The packet is totally subsumed by a previously received packet, and thus, is a duplicate and is dropped) (GO DROPITANDPROBE)) (SETQ NEXT (fetch QLINK of CURRENT)) (SETQ CURSEQ (fetch TCP.SEQ of NEXT)) (if (\32BIT.LT SEQ CURSEQ) then (* * current.seq <= segment.seq < next.seq. Insert the segment between current and next) (replace QLINK of SEGMENT with NEXT) (replace QLINK of CURRENT with SEGMENT) (RETURN)) (SETQ CURRENT NEXT))) (* * Note that we have a zero window allocation at this point. When we free up the window (in \TCP.GET.SEGMENT) %, we'll know to send a gratuitous ACK to our partner to let it know the window's once again open.) (replace TCB.RCV.WND of TCB with (IMAX 0 (IDIFFERENCE (fetch TCB.RCV.WND of TCB) LEN))) (replace TCB.LAST.SENT.RCV.WND of TCB with (IMAX 0 (IDIFFERENCE (fetch TCB.LAST.SENT.RCV.WND of TCB) LEN))) (COND ((OR (EQ 0 (fetch TCB.LAST.SENT.RCV.WND of TCB)) (EQ 0 (fetch TCB.RCV.WND of TCB))) (replace TCB.SENT.ZERO of TCB with T))) (while (AND (\32BIT.LEQ SEQ RCV.NXT) (\32BIT.LT RCV.NXT TOP)) do (* advance RCV.NXT) (replace TCB.RCV.NXT of TCB with (SETQ RCV.NXT TOP)) (if (SETQ SEGMENT (fetch QLINK of SEGMENT)) then (SETQ TOP (IPLUS (SETQ SEQ (fetch TCP.SEQ of SEGMENT)) (fetch TCP.DATA.LENGTH of SEGMENT))))) (if (BITTEST FLAGS \TCP.CTRL.PSH) then (\TCP.SEND.ACK TCB (QUOTE NOW)) else (\TCP.SEND.ACK TCB)) (NOTIFY.EVENT (fetch TCB.RCV.EVENT of TCB)) (RETURN T) DROPITANDPROBE (* * Here when we think we should let the other side know immediately about our condition (e.g. a duplicate packet was received)) (\TCP.SEND.ACK TCB (QUOTE NOW)) DROPIT (* * Here when we have nothing to do, but it's not worth informing our TCP partner) (RETURN NIL)))) ) (\TCP.HANDLE.FIN (LAMBDA (TCB SEGMENT SEQ ACK FLAGS) (* ejs%: "11-Aug-86 22:29") (* check the FIN bit -- pages |75-76| of RFC 793) (PROG (TOP) (if (BITTEST FLAGS \TCP.CTRL.FIN) then (SETQ TOP (IPLUS SEQ (fetch TCP.DATA.LENGTH of SEGMENT))) (* check whether we've received all the data before the FIN) (if (\32BIT.GEQ (fetch TCB.RCV.NXT of TCB) TOP) then (if (\32BIT.EQ (fetch TCB.RCV.NXT of TCB) TOP) then (* advance RCV.NXT over the FIN) (add (fetch TCB.RCV.NXT of TCB) 1)) (SELECTQ (fetch TCB.STATE of TCB) ((SYN.RECEIVED ESTABLISHED) (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSE.WAIT)) (replace TCB.STATE of TCB with (QUOTE CLOSE.WAIT))) (FIN.WAIT.1 (if (\TCP.OUR.FIN.IS.ACKED TCB) then (\TCP.START.TIME.WAIT TCB) (NOTIFY.EVENT (fetch TCB.FINACKED.EVENT of TCB)) else (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSING)) (replace TCB.STATE of TCB with (QUOTE CLOSING)))) (FIN.WAIT.2 (\TCP.START.TIME.WAIT TCB)) ((CLOSE.WAIT CLOSING LAST.ACK) NIL) (TIME.WAIT (\TCP.START.TIME.WAIT TCB)) (SHOULDNT)) (NOTIFY.EVENT (fetch TCB.RCV.EVENT of TCB))) (* acknowledge the FIN) (\TCP.SEND.ACK TCB (QUOTE NOW))))) ) (\TCP.OUR.FIN.IS.ACKED (LAMBDA (TCB) (* ecc "16-May-84 12:15") (* check whether our FIN's sequence number (recorded in the TCB.FINSEQ field) has been acknowledged) (\32BIT.GEQ (fetch TCB.SND.UNA of TCB) (OR (fetch TCB.FINSEQ of TCB) (SHOULDNT "FIN not sent")))) ) (\TCP.SIGNAL.URGENT.DATA (LAMBDA (TCB) (* ecc " 7-May-84 12:19") (NOTIFY.EVENT (fetch TCB.URGENT.EVENT of TCB)) (if TCPTRACEFLG then (printout TCPTRACEFILE .TAB0 0 "[Urgent TCP data has arrived]" T))) ) (\TCP.PROCESS (LAMBDA (TCB) (* ejs%: "11-Aug-86 21:57") (* process to handle retransmission and timeouts for TCP connection) (RESETSAVE NIL (LIST (FUNCTION \TCP.DELETE.TCB) TCB)) (PROCESSPROP (THIS.PROCESS) (QUOTE INFOHOOK) (FUNCTION (LAMBDA NIL (PPTCB TCB)))) (replace TCB.PROCESS of TCB with (THIS.PROCESS)) (WITH.MONITOR (fetch TCB.LOCK of TCB) (bind SEGMENT PACKETQUEUE REXMTQUEUE EVENT (IPSOCKET _ (fetch TCB.IPSOCKET of TCB)) first (SETQ PACKETQUEUE (fetch (IPSOCKET IPSQUEUE) of IPSOCKET)) (SETQ REXMTQUEUE (fetch TCB.REXMT.QUEUE of TCB)) (SETQ EVENT (fetch (IPSOCKET IPSEVENT) of IPSOCKET)) while (NEQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) do (COND ((AND (fetch TCB.RTFLG of TCB) (fetch TCB.PROBE.TIMER of TCB) (IGREATERP (CLOCKDIFFERENCE (fetch TCB.RTTIMER of TCB)) (fetch TCB.USER.TIMEOUT of TCB))) (* timeout has expired without other end responding) (\TCP.CONNECTION.DROPPED TCB "not responding")) ((AND (EQ (fetch TCB.STATE of TCB) (QUOTE TIME.WAIT)) (TIMEREXPIRED? (fetch TCB.2MSL.TIMER of TCB))) (* 2MSL has expired) (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSED)) (replace TCB.STATE of TCB with (QUOTE CLOSED))) ((\TCP.RETRANSMIT TCB) NIL) ((OR (EQ (fetch TCB.ACKFLG of TCB) (QUOTE NOW)) (AND (EQ (fetch TCB.STATE of TCB) (QUOTE ESTABLISHED)) (fetch TCB.PROBE.TIMER of TCB) (TIMEREXPIRED? (fetch TCB.PROBE.TIMER of TCB))) (AND (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB)) (\32BIT.GT (fetch TCP.SEQ of (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB))) (fetch TCB.RCV.NXT of TCB)))) (* an ACK needs to be sent either because the protocol routines requested it or because we need to fill a gap in the input queue) (\TCP.SEND.CONTROL TCB (fetch TCB.SND.NXT of TCB) (\TCP.ACK# TCB) \TCP.CTRL.ACK)) ((AND (\32BIT.GT (fetch TCB.SND.NXT of TCB) (IPLUS (fetch TCB.SND.WL1 of TCB) (fetch TCB.SND.WND of TCB))) (fetch TCB.PROBE.TIMER of TCB) (TIMEREXPIRED? (fetch TCB.PROBE.TIMER of TCB))) (* a probe needs to be sent to open the window) (\TCP.SEND.CONTROL TCB (IPLUS (fetch TCB.SND.NXT of TCB) (fetch TCB.SND.WND of TCB)) (\TCP.ACK# TCB) \TCP.CTRL.ACK))) (COND ((SETQ SEGMENT (\DEQUEUE PACKETQUEUE)) (add (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) -1) (\TCP.INPUT SEGMENT TCB)) (T (COND ((EQ (COND ((OR (fetch TCB.OUTPUT.HELD of TCB) (fetch SYSQUEUEHEAD of REXMTQUEUE) (\32BIT.GT (fetch TCB.SND.NXT of TCB) (IPLUS (fetch TCB.SND.WL1 of TCB) (fetch TCB.SND.WND of TCB)))) (* Something on the retransmit queue. Be agressive.) (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) EVENT (fetch TCB.RTO of TCB))) (T (* Nothing to do. Be lazy) (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) EVENT (fetch TCB.PROBE.TIMER of TCB) (NOT (NULL (fetch TCB.PROBE.TIMER of TCB)))))) EVENT) (COND ((SETQ SEGMENT (\DEQUEUE PACKETQUEUE)) (add (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) -1) (\TCP.INPUT SEGMENT TCB)))))))))) ) (\TCP.TEMPLATE (LAMBDA (TCB OPTIONS) (* ejs%: "21-Jun-85 16:40") (* set up segment for sending control information and pseudo-header for checksumming) (LET ((SEGMENT (fetch TCB.TEMPLATE of TCB))) (if SEGMENT then (replace TCP.DST.ADDR of SEGMENT with (fetch TCB.DST.HOST of TCB)) (replace TCP.DST.PORT of SEGMENT with (fetch TCB.DST.PORT of TCB)) else (SETQ SEGMENT (\TCP.SETUP.SEGMENT (\LOCAL.IP.ADDRESS) (fetch TCB.SRC.PORT of TCB) (fetch TCB.DST.HOST of TCB) (fetch TCB.DST.PORT of TCB)))) (if OPTIONS then (\TCP.SETUP.SEGMENT.OPTIONS SEGMENT OPTIONS)) (replace TCB.TEMPLATE of TCB with SEGMENT) (if (NULL (fetch TCB.PH of TCB)) then (replace TCB.PH of TCB with (create TCP.PSEUDOHEADER))) SEGMENT)) ) (\TCP.SETUP.SEGMENT.OPTIONS (LAMBDA (SEGMENT OPTIONS) (* ejs%: "28-Jul-86 13:31") (* * Add options to a freshly setup segment. OPTIONS is in PLIST format) (LET ((OPTIONSBASE (fetch TCP.OPTIONS of SEGMENT)) (OPTIONSOFFSET 0) DIDPLACEOPTION) (COND ((IGREATERP (fetch (IP IPTOTALLENGTH) of SEGMENT) (CONSTANT (IPLUS \TCP.HEADER.LENGTH \IPOVLEN))) (ERROR "Tried to add options to a segment with TCP data already in place" SEGMENT))) (for OPTIONVALUETAIL on OPTIONS by (CDDR OPTIONVALUETAIL) do (SELECTQ (CAR OPTIONVALUETAIL) (MAXSEG (LET ((VALUE (CADR OPTIONVALUETAIL))) (COND ((SMALLP VALUE) (\PUTBASEBYTE OPTIONSBASE OPTIONSOFFSET \TCPOPT.MAXSEG) (\PUTBASEBYTE OPTIONSBASE (add OPTIONSOFFSET 1) 4) (\PUTBASEBYTE OPTIONSBASE (add OPTIONSOFFSET 1) (LOGAND (MASK.1'S 0 BITSPERBYTE) (LRSH VALUE BITSPERBYTE))) (\PUTBASEBYTE OPTIONSBASE (add OPTIONSOFFSET 1) (LOGAND VALUE (MASK.1'S 0 BITSPERBYTE))) (SETQ DIDPLACEOPTION T))))) NIL)) (COND (DIDPLACEOPTION (\PUTBASEBYTE OPTIONSBASE (add OPTIONSOFFSET 1) \TCPOPT.END))) (until (EQ 0 (IMOD OPTIONSOFFSET 4)) do (\PUTBASEBYTE OPTIONSBASE (add OPTIONSOFFSET 1) \TCPOPT.END)) (add (fetch (IP IPTOTALLENGTH) of SEGMENT) OPTIONSOFFSET) (add (fetch TCP.DATA.OFFSET of SEGMENT) (FOLDHI OPTIONSOFFSET BYTESPERCELL)))) ) (\TCP.SEND.CONTROL (LAMBDA (TCB SEQ ACK FLAGS) (* ejs%: "18-Dec-86 17:29") (* send a control segment with the specified sequence number and ACK information) (PROG ((SEGMENT (OR (fetch TCB.TEMPLATE of TCB) (\TCP.NEW.TEMPLATE TCB)))) (if (NULL FLAGS) then (SETQ FLAGS 0)) (CHECK (OR (NOT (BITTEST FLAGS (LOGOR \TCP.CTRL.SYN \TCP.CTRL.FIN))) (SHOULDNT "SYN or FIN"))) (while (fetch EPTRANSMITTING of SEGMENT) do (BLOCK)) (replace TCP.SEQ of SEGMENT with SEQ) (if ACK then (replace TCP.ACK of SEGMENT with ACK) (SETQ FLAGS (LOGOR FLAGS \TCP.CTRL.ACK)) else (replace TCP.ACK of SEGMENT with 0)) (replace TCP.CTRL of SEGMENT with FLAGS) (replace TCB.SENT.ZERO of TCB with (EQ 0 (replace TCP.WINDOW of SEGMENT with (replace TCB.LAST.SENT.RCV.WND of TCB with (fetch TCB.RCV.WND of TCB))))) (\TCP.SEND.SEGMENT TCB SEGMENT FLAGS) (\TCP.NEW.TEMPLATE TCB))) ) (\TCP.SEND.ACK (LAMBDA (TCB WHEN) (* ejs%: "17-Dec-86 16:43") (* set TCB.ACKFLG to tell the \TCP.PROCESS that an ACK needs to be sent -- NOW means send the ack immediately, LATER means delay in the hope that it can be piggybacked on an outgoing data segment) (COND ((EQ WHEN (QUOTE NOW)) (\TCP.SEND.CONTROL TCB (fetch TCB.SND.NXT of TCB) (\TCP.ACK# TCB) \TCP.CTRL.ACK)) (T (replace TCB.ACKFLG of TCB with (OR WHEN (QUOTE LATER)))))) ) (\TCP.SEND.RESET (LAMBDA (ORIG SEQ ACK FLAGS) (* ejs%: " 7-Jun-85 12:58") (* like \TCP.SEND.CONTROL but always sends RST and can be used without a TCB) (PROG (SEGMENT) (SETQ SEGMENT (\TCP.SETUP.SEGMENT (\LOCAL.IP.ADDRESS) (fetch TCP.DST.PORT of ORIG) (fetch TCP.SRC.ADDR of ORIG) (fetch TCP.SRC.PORT of ORIG))) (replace TCP.SEQ of SEGMENT with SEQ) (if ACK then (replace TCP.ACK of SEGMENT with ACK) (OR FLAGS (SETQ FLAGS (LOGOR \TCP.CTRL.RST \TCP.CTRL.ACK))) else (replace TCP.ACK of SEGMENT with 0) (OR FLAGS (SETQ FLAGS \TCP.CTRL.RST))) (replace TCP.CTRL of SEGMENT with FLAGS) (replace TCP.WINDOW of SEGMENT with 0) (replace EPREQUEUE of SEGMENT with (QUOTE FREE)) (\TCP.SEND.SEGMENT NIL SEGMENT FLAGS))) ) (\TCP.FIX.OUTGOING.SEGMENT (LAMBDA (TCB SEGMENT FLAGS) (* ejs%: "18-Dec-86 17:29") (* fill in control bits, ACK and window information, and start round trip timer) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (replace TCP.ACK of SEGMENT with (fetch TCB.RCV.NXT of TCB)) else (replace TCP.ACK of SEGMENT with 0)) (replace TCP.CTRL of SEGMENT with FLAGS) (* set control bits) (replace TCP.WINDOW of SEGMENT with (replace TCB.LAST.SENT.RCV.WND of TCB with (fetch TCB.RCV.WND of TCB))) (if (NULL (fetch TCB.RTFLG of TCB)) then (* time round trip response to this segment) (replace TCB.RTFLG of TCB with T) (replace TCB.RTSEQ of TCB with (fetch TCP.SEQ of SEGMENT)) (replace TCB.RTTIMER of TCB with (SETUPTIMER 0 (fetch TCB.RTTIMER of TCB))))) ) (\TCP.SEND.DATA (LAMBDA (TCB SEGMENT LENGTH FLAGS) (* wjy "13-Dec-85 14:30") (* * This function is used to send a TCP data segment for the first time. Subsequent retransmissions are done directly through \TCP.SEND.SEGMENT) (* * NOTE%: This function MUST be called with the TCB.LOCK already locked!) (PROG (SEQ TOP) (CHECK (OR (EQ LENGTH (\TCP.DATA.LENGTH SEGMENT)) (SHOULDNT "bad segment length"))) (CHECK (OR (ILEQ LENGTH (fetch TCB.MAXSEG of TCB)) (SHOULDNT "segment > max segment size"))) (if (NEQ (fetch TCB.STATE of TCB) (QUOTE SYN.SENT)) then (* ACK in all synchronized states) (SETQ FLAGS (LOGOR FLAGS \TCP.CTRL.ACK))) (SETQ SEQ (fetch TCB.SND.NXT of TCB)) (* assign sequence number) (if (fetch TCB.ACKFLG of TCB) then (SETQ FLAGS (LOGOR FLAGS \TCP.CTRL.ACK))) (SETQ TOP (IPLUS SEQ LENGTH (\TCP.SYN.OR.FIN FLAGS))) (CHECK (OR (\32BIT.GEQ TOP (fetch TCB.SND.NXT of TCB)) (SHOULDNT "bad sequence numbers"))) (replace TCP.SEQ of SEGMENT with SEQ) (if (BITTEST FLAGS \TCP.CTRL.URG) then (replace TCB.SND.UP of TCB with TOP)) (if (\32BIT.GT (fetch TCB.SND.UP of TCB) SEQ) then (* there's urgent data to send) (SETQ FLAGS (LOGOR FLAGS \TCP.CTRL.URG)) (replace TCP.URG.PTR of SEGMENT with (IDIFFERENCE (fetch TCB.SND.UP of TCB) SEQ)) else (* no urgent data) (* drag the urgent pointer along at the left edge of the window) (replace TCB.SND.UP of TCB with (fetch TCB.SND.UNA of TCB))) (if (BITTEST FLAGS \TCP.CTRL.FIN) then (* remember the sequence number of the FIN so we can tell when it's been acked) (CHECK (OR (EQ (fetch TCB.STATE of TCB) (QUOTE FIN.WAIT.1)) (EQ (fetch TCB.STATE of TCB) (QUOTE LAST.ACK)) (SHOULDNT "bad state for FIN"))) (replace TCB.FINSEQ of TCB with TOP)) (replace TCB.SND.NXT of TCB with TOP) (do (* try to send segment) (SELECTQ (fetch TCB.STATE of TCB) (LISTEN (ERROR "TCP connection not established")) ((SYN.SENT SYN.RECEIVED ESTABLISHED FIN.WAIT.1 CLOSE.WAIT LAST.ACK) (if (OR (ZEROP LENGTH) (ZEROP (fetch TCB.SND.WL1 of TCB)) (\32BIT.LEQ TOP (IPLUS (fetch TCB.SND.UNA of TCB) (fetch TCB.SND.WND of TCB))) (\32BIT.GT (fetch TCB.SND.UP of TCB) (fetch TCB.SND.UNA of TCB))) then (* go ahead and send it) (CHECK (OR (ZEROP LENGTH) (ZEROP (fetch TCB.SND.WL1 of TCB)) (\32BIT.LEQ TOP (IPLUS (fetch TCB.SND.UNA of TCB) (fetch TCB.SND.WND of TCB))))) (replace TCB.OUTPUT.HELD of TCB with NIL) (* advance SND.NXT) (\TCP.FIX.OUTGOING.SEGMENT TCB SEGMENT FLAGS) (replace EPREQUEUE of SEGMENT with (fetch TCB.REXMT.QUEUE of TCB)) (replace EPUSERFIELD of SEGMENT with (CLOCK0 (CREATECELL \FIXP))) (\TCP.SEND.SEGMENT TCB SEGMENT FLAGS) (RETURN) else (* block until we can send it) (replace TCB.OUTPUT.HELD of TCB with T) (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.SND.EVENT of TCB)))) ((FIN.WAIT.2 CLOSING TIME.WAIT) (ERROR "TCP connection closing")) (CLOSED (ERROR "TCP connection closed")) (SHOULDNT))))) ) (\TCP.SEND.SEGMENT (LAMBDA (TCB SEGMENT FLAGS) (* ejs%: "28-Dec-84 18:06") (* common routine to transmit a TCP segment) (\TCP.CHECKSUM.OUTGOING TCB SEGMENT) (\TCP.TRACE.SEGMENT (QUOTE SEND) SEGMENT) (if TCB then (if (BITTEST FLAGS \TCP.CTRL.ACK) then (replace TCB.ACKFLG of TCB with NIL)) (\TCP.START.PROBE.TIMER TCB)) (\IP.TRANSMIT SEGMENT)) ) (\TCP.NEW.TEMPLATE (LAMBDA (TCB) (* ejs%: "29-Dec-84 13:05") (replace TCB.TEMPLATE of TCB with NIL) (\TCP.TEMPLATE TCB))) (\TCP.START.PROBE.TIMER (LAMBDA (TCB) (* ejs%: "12-Aug-86 10:35") (replace TCB.PROBE.TIMER of TCB with (COND ((AND (fetch TCB.NO.IDLE.PROBING of TCB) (EQ (fetch TCB.STATE of TCB) (QUOTE ESTABLISHED))) NIL) (T (COND ((NULL (fetch TCB.PROBE.TIMER of TCB)) (LET ((IPSOCKET (fetch TCB.IPSOCKET of TCB))) (COND (IPSOCKET (NOTIFY.EVENT (fetch (IPSOCKET IPSEVENT) of IPSOCKET))))))) (SETUPTIMER (ITIMES 4 (fetch TCB.RTO of TCB)) (fetch TCB.PROBE.TIMER of TCB)))))) ) (\TCP.RETRANSMIT (LAMBDA (TCB) (* ejs%: " 3-Jun-85 07:58") (* find the first unacknowledged segment and retransmit it) (PROG ((QUEUE (fetch TCB.REXMT.QUEUE of TCB)) (UNA (fetch TCB.SND.UNA of TCB)) CURRENT CURSEQ NEXT PREV REST FIRSTSEG MINSEQ FLAGS) (UNINTERRUPTABLY (* detach the list of segments to be retransmitted so we don't interfere with the driver) (SETQ NEXT (fetch SYSQUEUEHEAD of QUEUE)) (replace SYSQUEUEHEAD of QUEUE with NIL) (replace SYSQUEUETAIL of QUEUE with NIL)) (while (SETQ CURRENT NEXT) do (SETQ NEXT (fetch QLINK of CURRENT)) (replace QLINK of CURRENT with NIL) (if (\32BIT.LEQ (IPLUS (SETQ CURSEQ (fetch TCP.SEQ of CURRENT)) (\TCP.DATA.LENGTH CURRENT) (\TCP.SYN.OR.FIN (fetch TCP.CTRL of CURRENT))) UNA) then (* this segment has already been acked) (\TCP.RELEASE.SEGMENT CURRENT) elseif (NULL FIRSTSEG) then (* this is the first unacked segment we've encountered) (SETQ FIRSTSEG CURRENT) (SETQ MINSEQ CURSEQ) elseif (\32BIT.LT CURSEQ MINSEQ) then (* this is the lowest sequence number seen so so far; put the previous contender back on the REST queue) (replace QLINK of FIRSTSEG with REST) (SETQ REST FIRSTSEG) (SETQ FIRSTSEG CURRENT) (SETQ MINSEQ CURSEQ) else (* this is an unacked segment but later than one we've already seen; just add it to the REST queue) (replace QLINK of CURRENT with REST) (SETQ REST CURRENT))) (UNINTERRUPTABLY (* set the retransmit queue to be the REST queue we've accumulated) (if (SETQ CURRENT REST) then (* find tail of REST queue) (while (SETQ NEXT (fetch QLINK of CURRENT)) do (SETQ CURRENT NEXT))) (replace SYSQUEUEHEAD of QUEUE with REST) (replace SYSQUEUETAIL of QUEUE with CURRENT)) (if FIRSTSEG then (if (IGEQ (CLOCKDIFFERENCE (fetch EPUSERFIELD of FIRSTSEG)) (fetch TCB.RTO of TCB)) then (SETQ FLAGS (fetch TCP.CTRL of FIRSTSEG)) (\TCP.FIX.OUTGOING.SEGMENT TCB FIRSTSEG FLAGS) (replace EPREQUEUE of FIRSTSEG with (fetch TCB.REXMT.QUEUE of TCB)) (CLOCK0 (fetch EPUSERFIELD of FIRSTSEG)) (\TCP.SEND.SEGMENT TCB FIRSTSEG FLAGS) (RETURN T) else (\ENQUEUE (fetch TCB.REXMT.QUEUE of TCB) FIRSTSEG) (RETURN NIL)) else (RETURN NIL)))) ) (\TCP.START.TIME.WAIT (LAMBDA (TCB) (* ecc "16-Apr-84 17:58") (* start 2MSL timer) (replace TCB.2MSL.TIMER of TCB with (SETUPTIMER (ITIMES 2 \TCP.MSL) (fetch TCB.2MSL.TIMER of TCB))) (\TCP.TRACE.TRANSITION TCB (QUOTE TIME.WAIT)) (replace TCB.STATE of TCB with (QUOTE TIME.WAIT))) ) (\TCP.CONNECTION.DROPPED (LAMBDA (TCB MSG) (* ejs%: "29-Jan-85 16:06") (if TCPTRACEFLG then (printout TCPTRACEFILE .TAB0 0 "[TCP connection " (OR MSG "dropped") "]" T)) (\TCP.TRACE.TRANSITION TCB (QUOTE CLOSED)) (replace TCB.STATE of TCB with (QUOTE CLOSED)) (AND (OPENP (fetch TCB.RCV.STREAM of TCB) (QUOTE INPUT)) (CLOSEF (fetch TCB.RCV.STREAM of TCB))) (AND (OPENP (fetch TCB.SND.STREAM of TCB) (QUOTE OUTPUT)) (CLOSEF (fetch TCB.SND.STREAM of TCB))) (NOTIFY.EVENT (fetch TCB.RCV.EVENT of TCB))) ) (\TCP.CHECK.OPTIONS (LAMBDA (TCB SEGMENT FLAGS) (* ejs%: "21-Mar-86 20:04") (* * Do TCP header options processing) (COND ((IGREATERP (fetch (TCPSEGMENT TCP.DATA.OFFSET) of SEGMENT) \TCP.MIN.DATA.OFFSET) (\TCP.PROCESS.OPTIONS TCB SEGMENT FLAGS)) (T T))) ) (\TCP.PROCESS.OPTIONS (LAMBDA (TCB SEGMENT FLAGS) (* ejs%: "20-Jun-85 16:08") (* * Process the options in a TCP header) (bind (OPTIONBASE _ (fetch (TCPSEGMENT TCP.OPTIONS) of SEGMENT)) (OPTIONOFFSET _ 0) OPTION eachtime (SETQ OPTION (\GETBASEBYTE OPTIONBASE OPTIONOFFSET)) until (EQ OPTION \TCPOPT.END) do (SELECTC OPTION (\TCPOPT.END (HELP "Unexpected \TCPOPT.END processing TCP options")) (\TCPOPT.NOP (add OPTIONOFFSET 1)) (\TCPOPT.MAXSEG (COND ((BITTEST FLAGS \TCP.CTRL.SYN) (replace TCB.MAXSEG of TCB with (IMIN \TCP.DEFAULT.MAXSEG (LOGOR (LLSH (\GETBASEBYTE OPTIONBASE (IPLUS OPTIONOFFSET 2)) BITSPERBYTE) (\GETBASEBYTE OPTIONBASE (IPLUS OPTIONOFFSET 3))))))) (add OPTIONOFFSET (\GETBASEBYTE OPTIONBASE (ADD1 OPTIONOFFSET)))) (RETURN))) T) ) ) (* ;; "support for ICMP messages that affect TCP connections") (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.PROTOCOL 1) (CONSTANTS \ICMP.PROTOCOL) ) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.32BIT.WORDS 2) (CONSTANTS \ICMP.32BIT.WORDS) ) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.DESTINATION.UNREACHABLE 3) (RPAQQ \ICMP.SOURCE.QUENCH 4) (CONSTANTS \ICMP.DESTINATION.UNREACHABLE \ICMP.SOURCE.QUENCH) ) ) (DEFINEQ (\TCP.HANDLE.ICMP (LAMBDA (ICMP SEGMENT) (* ejs%: " 3-Jun-85 07:41") (* handle ICMP messages) (PROG (MSG TCB) (if (NEQ (fetch (ICMP ICMPTYPE) of ICMP) \ICMP.DESTINATION.UNREACHABLE) then (RETURN)) (SETQ MSG (SELECTQ (fetch (ICMP ICMPCODE) of ICMP) (0 "net unreachable") (1 "host unreachable") (2 "protocol unreachable") (3 "port unreachable") (4 "fragmentation needed and DF set") (5 "source route failed") "destination unreachable (unknown code)")) (SETQ TCB (\TCP.LOOKUP.TCB (fetch TCP.DST.ADDR of SEGMENT) (fetch TCP.DST.PORT of SEGMENT) (fetch TCP.SRC.PORT of SEGMENT))) (if (OR (NULL TCB) (EQ (fetch TCB.STATE of TCB) (QUOTE CLOSED))) then (RETURN)) (\RELEASE.ETHERPACKET ICMP) (\TCP.CONNECTION.DROPPED TCB MSG))) ) ) (* ;; "TCP stream routines") (DEFINEQ (TCP.OPEN (LAMBDA (DST.HOST DST.PORT SRC.PORT MODE ACCESS NOERRORFLG OPTIONS) (* ejs%: "21-Mar-86 17:38") (PROG (TCB DST.HOST.NUMBER) (SELECTQ ACCESS (INPUT) (APPEND) (OUTPUT (SETQ ACCESS (QUOTE APPEND))) (LISPERROR "ILLEGAL ARG" ACCESS)) (COND ((ATOM DST.HOST) (COND ((AND (NOT (SETQ DST.HOST.NUMBER (DODIP.HOSTP DST.HOST))) (EQ MODE (QUOTE ACTIVE))) (ERROR "Unknown TCP/IP host: " DST.HOST)))) ((FIXP DST.HOST) (SETQ DST.HOST.NUMBER DST.HOST)) (T (ERROR "Illegal TCP/IP host: " DST.HOST))) (SETQ TCB (\TCP.CONNECTION DST.HOST.NUMBER DST.PORT SRC.PORT MODE OPTIONS)) (RETURN (if (NULL TCB) then (if NOERRORFLG then NIL else (ERROR "TCP connection failed")) else (SELECTQ ACCESS (INPUT (fetch TCB.RCV.STREAM of TCB)) (APPEND (fetch TCB.SND.STREAM of TCB)) (SHOULDNT)))))) ) (TCP.OTHER.STREAM (LAMBDA (STREAM) (* ecc "14-May-84 16:52") (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (NOT (type? TCP.CONTROL.BLOCK TCB)) then (ERROR "no TCP control block")) (RETURN (SELECTQ (fetch (TCPSTREAM ACCESS) of STREAM) (INPUT (fetch TCB.SND.STREAM of TCB)) (APPEND (fetch TCB.RCV.STREAM of TCB)) (SHOULDNT))))) ) (\TCP.BOUTS (LAMBDA (STREAM BASE OFF NBYTES) (* ejs%: "27-May-86 15:09") (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (RETURN (\BUFFERED.BOUTS (fetch (TCP.CONTROL.BLOCK TCB.SND.STREAM) of TCB) BASE OFF NBYTES)))) ) (\TCP.OTHER.BIN (LAMBDA (STREAM) (* ejs%: "27-May-86 14:40") (\BIN (TCP.OTHER.STREAM STREAM)))) (\TCP.OTHER.BOUT (LAMBDA (STREAM BYTE) (* ejs%: "27-May-86 14:19") (BOUT (TCP.OTHER.STREAM STREAM) BYTE))) (\TCP.BIN (LAMBDA (STREAM) (* ecc " 3-May-84 13:55") (do (if (ILESSP (fetch COFFSET of STREAM) (fetch CBUFSIZE of STREAM)) then (RETURN (\GETBASEBYTE (fetch CPPTR of STREAM) (PROG1 (fetch COFFSET of STREAM) (add (fetch COFFSET of STREAM) 1)))) elseif (NULL (\TCP.GET.SEGMENT STREAM)) then (RETURN (STREAMOP (QUOTE ENDOFSTREAMOP) STREAM STREAM))))) ) (\TCP.BACKFILEPTR (LAMBDA (STREAM) (* ejs%: "15-Sep-85 23:25") (COND ((AND (fetch CPPTR of STREAM) (IGEQ (fetch COFFSET of STREAM) (fetch (TCPSTREAM ORIGINAL.COFFSET) of STREAM))) (add (fetch COFFSET of STREAM) -1)) (T (\IS.NOT.RANDACCESSP STREAM)))) ) (\TCP.GETNEXTBUFFER (LAMBDA (STREAM WHATFOR NOERRORFLG) (* ejs%: "27-May-86 14:45") (BLOCK) (SELECTQ WHATFOR (READ (COND ((NEQ STREAM (fetch (TCP.CONTROL.BLOCK TCB.RCV.STREAM) of (fetch (TCPSTREAM TCB) of STREAM))) (SETQ STREAM (TCP.OTHER.STREAM STREAM)))) (\TCP.GET.SEGMENT STREAM NOERRORFLG)) (WRITE (COND ((NEQ STREAM (fetch (TCP.CONTROL.BLOCK TCB.SND.STREAM) of (fetch (TCPSTREAM TCB) of STREAM))) (SETQ STREAM (TCP.OTHER.STREAM STREAM)))) (\TCP.FLUSH STREAM) (\TCP.FILL.IN.SEGMENT STREAM)) (SHOULDNT))) ) (\TCP.GET.SEGMENT (LAMBDA (STREAM NOERRORFLG) (* ejs%: "18-Dec-86 17:33") (* * Get the next segment from the input stream. Return T if successful; otherwise, an error code. Call the user-specified error handler to get a code, if necessary) (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM)) SEGMENT SEQ LEN OLDSEGMENT OLDSEQ OLDLEN OLDTOP SUCCESS OFFSET LAST.BYTE) (if (OR (NULL TCB) (AND (NEQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) (NEQ STREAM (fetch TCB.RCV.STREAM of TCB)))) then (ERROR "not TCP input stream")) (WITH.MONITOR (fetch TCB.LOCK of TCB) (SETQ OLDSEGMENT (fetch TCB.RCV.SEGMENT of TCB)) (CHECK (OR (NULL OLDSEGMENT) (EQ (fetch TCP.DATA.LENGTH of OLDSEGMENT) (fetch CBUFSIZE of STREAM)) (SHOULDNT "inconsistent stream buffer size"))) (UNINTERRUPTABLY (COND ((fetch CPPTR of STREAM) (SETQ LAST.BYTE (\GETBASEBYTE (fetch CPPTR of STREAM) (fetch COFFSET of STREAM))))) (replace TCB.RCV.SEGMENT of TCB with NIL) (replace CPPTR of STREAM with NIL) (replace CBUFSIZE of STREAM with 0) (replace COFFSET of STREAM with 0)) (if OLDSEGMENT then (* remember sequence number range of previous segment so we can adjust for overlap) (SETQ OLDTOP (IPLUS (SETQ OLDSEQ (fetch TCP.SEQ of OLDSEGMENT)) (SETQ OLDLEN (fetch TCP.DATA.LENGTH of OLDSEGMENT)))) (replace TCB.RCV.WND of TCB with (IMIN \TCP.DEFAULT.RECEIVE.WINDOW (IPLUS (fetch TCB.RCV.WND of TCB) OLDLEN))) (add (fetch (TCPSTREAM BYTECOUNT) of STREAM) OLDLEN) (\TCP.RELEASE.SEGMENT OLDSEGMENT) (SETQ OLDSEGMENT T)) (* look at first segment in input queue to see if it overlaps the sequence number range we're expecting; there may be duplicates that must be skipped over) (do ((CHECK (\TCP.CHECK.INPUT.QUEUE TCB)) (COND ((AND (SETQ SEGMENT (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB))) (\32BIT.LT (SETQ SEQ (fetch TCP.SEQ of SEGMENT)) (fetch TCB.RCV.NXT of TCB))) (* this segment is within the range of contiguous sequence numbers received so far, because its sequence number is less than RCV.NXT) (\DEQUEUE (fetch TCB.INPUT.QUEUE of TCB)) (SETQ LEN (fetch TCP.DATA.LENGTH of SEGMENT)) (COND ((AND OLDSEGMENT (\32BIT.LEQ (IPLUS SEQ LEN) OLDTOP)) (* this segment is a duplicate) (\TCP.RELEASE.SEGMENT SEGMENT)) (T (* this segment overlaps with the range of sequence numbers we're expecting) (CHECK (OR (NOT OLDSEGMENT) (\32BIT.LEQ SEQ OLDTOP) (SHOULDNT "gap in input queue"))) (UNINTERRUPTABLY (replace CPPTR of STREAM with (fetch TCP.CONTENTS of SEGMENT)) (* eliminate overlap) (SETQ OFFSET (replace (TCPSTREAM ORIGINAL.COFFSET) of STREAM with (replace COFFSET of STREAM with (COND (OLDSEGMENT (IDIFFERENCE OLDLEN (IDIFFERENCE SEQ OLDSEQ))) (T 0))))) (COND (LAST.BYTE (\PUTBASEBYTE (fetch CPPTR of STREAM) (SUB1 OFFSET) LAST.BYTE))) (add (fetch (TCPSTREAM BYTECOUNT) of STREAM) (IMINUS OFFSET)) (replace CBUFSIZE of STREAM with LEN) (replace TCB.RCV.SEGMENT of TCB with SEGMENT)) (SETQ SUCCESS T) (RETURN)))) (T (SELECTQ (fetch TCB.STATE of TCB) ((LISTEN SYN.SENT SYN.RECEIVED) (* wait until established) (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.ESTABLISHED of TCB))) ((ESTABLISHED FIN.WAIT.1 FIN.WAIT.2) (* wait for next segment) (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.RCV.EVENT of TCB)) (SELECTQ (fetch TCB.STATE of TCB) ((CLOSED CLOSING LAST.ACK) (RELEASE.MONITORLOCK (fetch TCB.LOCK of TCB)) (COND (NOERRORFLG (RETURN NIL)) (T (RETURN (SETQ SUCCESS (\EOF.ACTION STREAM)))))) NIL)) ((CLOSED CLOSE.WAIT CLOSING LAST.ACK TIME.WAIT) (* return NIL to punt to ENDOFSTREAMOP in \TCP.BIN) (RELEASE.MONITORLOCK (fetch TCB.LOCK of TCB)) (COND (NOERRORFLG (RETURN NIL)) (T (RETURN (SETQ SUCCESS (\EOF.ACTION STREAM)))))) (SHOULDNT))))))) (if (fetch TCB.SENT.ZERO of TCB) then (\TCP.SEND.ACK TCB (QUOTE NOW)) (BLOCK)) (RETURN SUCCESS))) ) (\TCP.PEEKBIN (LAMBDA (STREAM NOERRORFLG) (* ecc " 3-May-84 13:55") (do (if (ILESSP (fetch COFFSET of STREAM) (fetch CBUFSIZE of STREAM)) then (RETURN (\GETBASEBYTE (fetch CPPTR of STREAM) (fetch COFFSET of STREAM))) elseif (NULL (\TCP.GET.SEGMENT STREAM)) then (RETURN (if NOERRORFLG then NIL else (STREAMOP (QUOTE ENDOFSTREAMOP) STREAM STREAM)))))) ) (\TCP.GETFILEPTR (LAMBDA (STREAM) (* ejs%: "10-Jun-85 14:07") (IPLUS (fetch (STREAM COFFSET) of STREAM) (fetch (TCPSTREAM BYTECOUNT) of STREAM))) ) (\TCP.READP (LAMBDA (STREAM) (* ejs%: " 7-Jun-85 13:39") (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (OR (NULL TCB) (AND (NEQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) (NEQ STREAM (fetch TCB.RCV.STREAM of TCB)))) then (ERROR "not TCP input stream") else (RETURN (OR (ILESSP (fetch COFFSET of STREAM) (fetch CBUFSIZE of STREAM)) (AND (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB)) T)))))) ) (\TCP.EOFP (LAMBDA (STREAM) (* ejs%: "13-Apr-85 16:15") (* check whether EOF has been reached on stream -- may block waiting for next segment) (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (NULL TCB) then (ERROR "not TCP stream") elseif (AND (NEQ (QUOTE CLOSED) (fetch TCB.STATE of TCB)) (EQ STREAM (fetch TCB.SND.STREAM of TCB))) then (RETURN T) (* Always at EOF of outgoing stream.) elseif (OR (ILESSP (fetch COFFSET of STREAM) (fetch CBUFSIZE of STREAM)) (NOT (NULL (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB))))) then (* there is still data left to read) (RETURN NIL) else (RETURN (SELECTQ (fetch TCB.STATE of TCB) (ESTABLISHED NIL) ((LISTEN SYN.SENT SYN.RECEIVED FIN.WAIT.1 FIN.WAIT.2) (* can't tell without waiting for next segment) (NULL (\TCP.GET.SEGMENT STREAM T))) ((CLOSE.WAIT CLOSING LAST.ACK TIME.WAIT CLOSED) (* no more data can be forthcoming) T) (SHOULDNT)))))) ) (TCP.URGENTP (LAMBDA (STREAM) (* ecc " 7-May-84 14:27") (* check if current point in receive stream is before receive urgent pointer) (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (OR (NULL TCB) (NEQ STREAM (fetch TCB.RCV.STREAM of TCB))) then (ERROR "not TCP input stream")) (RETURN (AND (fetch TCB.RCV.SEGMENT of TCB) (\32BIT.GT (fetch TCB.RCV.UP of TCB) (IPLUS (fetch TCP.SEQ of (fetch TCB.RCV.SEGMENT of TCB)) (fetch COFFSET of STREAM))))))) ) (TCP.URGENT.EVENT (LAMBDA (STREAM) (* edited%: "22-May-84 18:10") (* return the urgent data event so that a user process can wait for it) (fetch TCB.URGENT.EVENT of (fetch (TCPSTREAM TCB) of STREAM))) ) (\TCP.BOUT (LAMBDA (STREAM CHAR) (* ecc " 3-May-84 13:55") (do (if (ILESSP (fetch COFFSET of STREAM) (fetch CBUFSIZE of STREAM)) then (\PUTBASEBYTE (fetch CPPTR of STREAM) (fetch COFFSET of STREAM) CHAR) (add (fetch COFFSET of STREAM) 1) (RETURN) else (\TCP.FLUSH STREAM) (\TCP.FILL.IN.SEGMENT STREAM)))) ) (\TCP.FLUSH (LAMBDA (STREAM FLAGS) (* ; "Edited 4-Dec-87 12:11 by scp") (* Force out current output segment. If FLAGS is non-nil, send a segment with those flags even if we have to create a new one) (PROG ((TCB (fetch TCB of STREAM)) SEGMENT LENGTH) (if (OR (NULL TCB) (AND (NEQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) (NEQ STREAM (fetch TCB.SND.STREAM of TCB)))) then (ERROR "not TCP output stream")) (SETQ LENGTH (fetch COFFSET of STREAM)) (WITH.FAST.MONITOR (fetch TCB.LOCK of TCB) (if (OR (AND (SETQ SEGMENT (fetch TCB.SND.SEGMENT of TCB)) (NOT (ZEROP LENGTH))) (AND FLAGS (SETQ SEGMENT (\TCP.FILL.IN.SEGMENT STREAM (COND ((EQ (fetch TCB.STATE of TCB) (QUOTE SYN.SENT)) (BQUOTE (MAXSEG %, (OR (fetch TCB.OUR.MAXSEG of TCB) \TCP.DEFAULT.MAXSEG)))) ((EQ (fetch TCB.STATE of TCB) (QUOTE SYN.RECEIVED)) (BQUOTE (MAXSEG %, (OR (fetch TCB.OUR.MAXSEG of TCB) \TCP.DEFAULT.MAXSEG))))))))) then (if (NULL FLAGS) then (SETQ FLAGS 0)) (CHECK (OR (NOT (ZEROP LENGTH)) (NOT (ZEROP (\TCP.SYN.OR.FIN FLAGS))) (SHOULDNT "sending empty segment"))) (if (AND (IGREATERP LENGTH 0) (ILESSP LENGTH (fetch TCB.OUR.MAXSEG of TCB))) then (* PSH this segment to make sure it gets through to the remote process) (SETQ FLAGS (LOGOR FLAGS \TCP.CTRL.PSH))) (UNINTERRUPTABLY (replace TCB.SND.SEGMENT of TCB with NIL) (replace CBUFSIZE of STREAM with 0) (replace COFFSET of STREAM with 0) (replace CPPTR of STREAM with NIL) (add (fetch (TCPSTREAM BYTECOUNT) of STREAM) LENGTH)) (add (fetch (IP IPTOTALLENGTH) of SEGMENT) LENGTH) (\TCP.SEND.DATA TCB SEGMENT LENGTH FLAGS))))) ) (\TCP.FORCEOUTPUT (LAMBDA (STREAM WAITFLG) (* ejs%: "27-May-86 14:36") (* just call \TCP.FLUSH with no flags -- to implement WAITFLG we should wait for SND.UNA to overtake the current SND.NXT) (COND ((NEQ STREAM (fetch (TCP.CONTROL.BLOCK TCB.SND.STREAM) of (fetch (TCPSTREAM TCB) of STREAM))) (\TCP.FLUSH (fetch (TCP.CONTROL.BLOCK TCB.SND.STREAM) of (fetch (TCPSTREAM TCB) of STREAM)))) (T (\TCP.FLUSH STREAM)))) ) (TCP.URGENT.MARK (LAMBDA (STREAM) (* ecc " 7-May-84 14:17") (* mark the current point in the output stream as the end of urgent data) (\TCP.FLUSH STREAM \TCP.CTRL.URG)) ) (\TCP.FILL.IN.SEGMENT (LAMBDA (STREAM OPTIONS) (* ejs%: "22-Jun-85 03:18") (* * set up a new segment to be filled by the output stream. OPTIONS, if supplied, is in PLIST format) (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM)) SEGMENT) (SETQ SEGMENT (\TCP.SETUP.SEGMENT (\LOCAL.IP.ADDRESS) (fetch TCB.SRC.PORT of TCB) (fetch TCB.DST.HOST of TCB) (fetch TCB.DST.PORT of TCB))) (COND (OPTIONS (\TCP.SETUP.SEGMENT.OPTIONS SEGMENT OPTIONS))) (UNINTERRUPTABLY (replace TCB.SND.SEGMENT of TCB with SEGMENT) (replace CPPTR of STREAM with (fetch TCP.CONTENTS of SEGMENT)) (replace COFFSET of STREAM with 0) (replace CBUFSIZE of STREAM with (fetch TCB.MAXSEG of TCB)) (replace CBUFMAXSIZE of STREAM with (fetch TCB.MAXSEG of TCB))) (RETURN SEGMENT))) ) (\TCP.CLOSE (LAMBDA (STREAM) (* ejs%: "29-Jan-85 17:19") (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (OR (NULL TCB) (FMEMB (fetch TCB.STATE of TCB) (QUOTE (CLOSED TIME.WAIT)))) then (RETURN)) (if (NOT (fetch TCB.CLOSEDFLG of TCB)) then (TCP.CLOSE.SENDER (fetch TCB.SND.STREAM of TCB))) (if (EQ STREAM (fetch TCB.RCV.STREAM of TCB)) then (while (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB)) do (* gobble remaining segments from remote end) (\TCP.GET.SEGMENT STREAM))))) ) (\TCP.RESETCLOSE (LAMBDA (STREAM) (* ejs%: "27-May-86 11:55") (\TCP.CLOSE STREAM))) (TCP.CLOSE.SENDER (LAMBDA (STREAM) (* ecc " 7-May-84 13:44") (PROG ((TCB (fetch (TCPSTREAM TCB) of STREAM))) (if (OR (NULL TCB) (EQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) (fetch TCB.CLOSEDFLG of TCB)) then (RETURN)) (WITH.MONITOR (fetch TCB.LOCK of TCB) (replace TCB.CLOSEDFLG of TCB with T) (SELECTQ (fetch TCB.STATE of TCB) ((LISTEN SYN.SENT) (\TCP.CONNECTION.DROPPED TCB "closed")) ((SYN.RECEIVED ESTABLISHED) (\TCP.TRACE.TRANSITION TCB (QUOTE FIN.WAIT.1)) (replace TCB.STATE of TCB with (QUOTE FIN.WAIT.1)) (\TCP.FLUSH STREAM \TCP.CTRL.FIN)) (CLOSE.WAIT (\TCP.TRACE.TRANSITION TCB (QUOTE LAST.ACK)) (replace TCB.STATE of TCB with (QUOTE LAST.ACK)) (* There is an inconsistency in the spec about this transition%: the description of the CLOSE operation says to go to the CLOSING state, while the diagram shows a transition to the LAST.ACK state. Since the LAST.ACK state avoids the 2MSL wait, we use it.) (\TCP.FLUSH STREAM \TCP.CTRL.FIN)) NIL) (while (NOT (OR (EQ (fetch TCB.STATE of TCB) (QUOTE CLOSED)) (\TCP.OUR.FIN.IS.ACKED TCB))) do (MONITOR.AWAIT.EVENT (fetch TCB.LOCK of TCB) (fetch TCB.FINACKED.EVENT of TCB)))))) ) (TCP.DESTADDRESS (LAMBDA (STREAM) (* ejs%: "27-May-86 11:53") (\IP.ADDRESS.TO.STRING (fetch (TCP.CONTROL.BLOCK TCB.DST.HOST) of (fetch (TCPSTREAM TCB) of STREAM)))) ) (TCP.STOP (LAMBDA NIL (* ejs%: "28-Dec-84 18:02") (MAPC \TCP.CONTROL.BLOCKS (FUNCTION \TCP.DELETE.TCB)) (SETQ \TCP.CONTROL.BLOCKS NIL) (\IP.DELETE.PROTOCOL \TCP.PROTOCOL)) ) ) (* ;; "well-known ports for network standard functions") (RPAQQ \TCP.ASSIGNED.PORTS (\TCP.ECHO.PORT \TCP.SINK.PORT \TCP.SYSTAT.PORT \TCP.DAYTIME.PORT \TCP.NETSTAT.PORT \TCP.FAUCET.PORT \TCP.FTP.PORT \TCP.TELNET.PORT \TCP.SMTP.PORT \TCP.TIME.PORT \TCP.NAME.PORT \TCP.WHOIS.PORT \TCP.NAMESERVER.PORT \TCP.FINGER.PORT \TCP.TTYLINK.PORT \TCP.SUPDUP.PORT \TCP.HOSTNAMES.PORT \TCP.UNIXEXEC.PORT \TCP.UNIXLOGIN.PORT \TCP.UNIXSHELL.PORT)) (DECLARE%: EVAL@COMPILE (RPAQQ \TCP.ECHO.PORT 7) (RPAQQ \TCP.SINK.PORT 9) (RPAQQ \TCP.SYSTAT.PORT 11) (RPAQQ \TCP.DAYTIME.PORT 13) (RPAQQ \TCP.NETSTAT.PORT 15) (RPAQQ \TCP.FAUCET.PORT 19) (RPAQQ \TCP.FTP.PORT 21) (RPAQQ \TCP.TELNET.PORT 23) (RPAQQ \TCP.SMTP.PORT 25) (RPAQQ \TCP.TIME.PORT 37) (RPAQQ \TCP.NAME.PORT 42) (RPAQQ \TCP.WHOIS.PORT 43) (RPAQQ \TCP.NAMESERVER.PORT 53) (RPAQQ \TCP.FINGER.PORT 79) (RPAQQ \TCP.TTYLINK.PORT 87) (RPAQQ \TCP.SUPDUP.PORT 95) (RPAQQ \TCP.HOSTNAMES.PORT 101) (RPAQQ \TCP.UNIXEXEC.PORT 512) (RPAQQ \TCP.UNIXLOGIN.PORT 513) (RPAQQ \TCP.UNIXSHELL.PORT 514) (CONSTANTS \TCP.ECHO.PORT \TCP.SINK.PORT \TCP.SYSTAT.PORT \TCP.DAYTIME.PORT \TCP.NETSTAT.PORT \TCP.FAUCET.PORT \TCP.FTP.PORT \TCP.TELNET.PORT \TCP.SMTP.PORT \TCP.TIME.PORT \TCP.NAME.PORT \TCP.WHOIS.PORT \TCP.NAMESERVER.PORT \TCP.FINGER.PORT \TCP.TTYLINK.PORT \TCP.SUPDUP.PORT \TCP.HOSTNAMES.PORT \TCP.UNIXEXEC.PORT \TCP.UNIXLOGIN.PORT \TCP.UNIXSHELL.PORT) ) (* ;; "Stub for debugging") (RPAQ? \TCP.DEBUGGABLE ) (RPAQ? TCPTRACEFLG ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCP.DEBUGGABLE TCPTRACEFLG) ) (DEFINEQ (PPTCB (LAMBDA (TCB FILE) (* ejs%: " 5-Feb-85 16:47") (DECLARE (GLOBALVARS \TCP.DEBUGGABLE)) (COND (\TCP.DEBUGGABLE (printout FILE "TCP connection from " %# (\IP.PRINT.ADDRESS (\LOCAL.IP.ADDRESS) FILE) ":" (fetch TCB.SRC.PORT of TCB) " to " %# (\IP.PRINT.ADDRESS (fetch TCB.DST.HOST of TCB) FILE) ":" (fetch TCB.DST.PORT of TCB) " " (fetch TCB.STATE of TCB) T) (printout FILE " iss " (fetch TCB.ISS of TCB) " window " (fetch TCB.SND.UNA of TCB) ".." (IPLUS (fetch TCB.SND.UNA of TCB) (fetch TCB.SND.WND of TCB)) " next " (fetch TCB.SND.NXT of TCB)) (if (fetch TCB.FINSEQ of TCB) then (printout FILE " fin " (fetch TCB.FINSEQ of TCB))) (printout FILE " rto " (fetch TCB.RTO of TCB) T) (printout FILE " irs " (fetch TCB.IRS of TCB) " next " (fetch TCB.RCV.NXT of TCB) " window " (fetch TCB.RCV.NXT of TCB) ".." (IPLUS (fetch TCB.RCV.NXT of TCB) (fetch TCB.RCV.WND of TCB)) T) (\TCP.PRINT.SEGMENT.QUEUE "retransmit queue" (fetch TCB.REXMT.QUEUE of TCB) FILE) (\TCP.PRINT.SEGMENT.QUEUE "input queue" (fetch TCB.INPUT.QUEUE of TCB) FILE)))) ) (\TCP.TRACE.SEGMENT (LAMBDA (CALLER SEGMENT) (* ejs%: " 5-Feb-85 16:50") (DECLARE (GLOBALVARS \TCP.DEBUGGABLE TCPTRACEFLG)) (if (AND \TCP.DEBUGGABLE (MEMB CALLER TCPTRACEFLG)) then (printout TCPTRACEFILE .TAB0 0 %# (\TCP.PRINT.ELAPSED.TIME TCPTRACEFILE) CALLER ": " %# (TCP.PRINT.SEGMENT SEGMENT TCPTRACEFILE NIL (MEMB (QUOTE CONTENTS) TCPTRACEFLG))))) ) (\TCP.TRACE.TRANSITION (LAMBDA (TCB NEWSTATE) (* ejs%: " 5-Feb-85 16:51") (DECLARE (GLOBALVARS \TCP.DEBUGGABLE)) (if (AND \TCP.DEBUGGABLE (MEMB (QUOTE TRANSITION) TCPTRACEFLG) (NEQ (fetch TCB.STATE of TCB) NEWSTATE)) then (printout TCPTRACEFILE .TAB0 0 %# (\TCP.PRINT.ELAPSED.TIME TCPTRACEFILE) (fetch TCB.SRC.PORT of TCB) "/" (fetch TCB.DST.PORT of TCB) ": " (fetch TCB.STATE of TCB) " ---> " NEWSTATE))) ) ) (* ;; "TCP initialization") (DEFINEQ (\TCP.INIT (LAMBDA NIL (* ; "Edited 11-Aug-88 14:32 by atm") (COND ((NULL \TCP.DEVICE) (SETQ \TCP.DEVICE (create FDEV FDBINABLE _ T FDBOUTABLE _ T BUFFERED _ T CLOSEFILE _ (FUNCTION \TCP.CLOSE) REGISTERFILE _ (FUNCTION \ADD-OPEN-STREAM) UNREGISTERFILE _ (FUNCTION \GENERIC-UNREGISTER-STREAM) OPENP _ (FUNCTION \GENERIC.OPENP) BIN _ (FUNCTION \BUFFERED.BIN) BOUT _ (FUNCTION \BUFFERED.BOUT) BLOCKIN _ (FUNCTION \BUFFERED.BINS) BLOCKOUT _ (FUNCTION \TCP.BOUTS) PEEKBIN _ (FUNCTION \BUFFERED.PEEKBIN) READP _ (FUNCTION \TCP.READP) FORCEOUTPUT _ (FUNCTION \TCP.FORCEOUTPUT) GETNEXTBUFFER _ (FUNCTION \TCP.GETNEXTBUFFER) BACKFILEPTR _ (FUNCTION \TCP.BACKFILEPTR) GETFILEPTR _ (FUNCTION \TCP.GETFILEPTR) EOFP _ (FUNCTION \TCP.EOFP) DEVICENAME _ (QUOTE TCP) EVENTFN _ (FUNCTION NILL))) (\DEFINEDEVICE (QUOTE TCP) \TCP.DEVICE))) (SETQ \TCP.LOCK (CREATE.MONITORLOCK)) (COND ((NULL \TCP.PSEUDOHEADER) (SETQ \TCP.PSEUDOHEADER (create TCP.PSEUDOHEADER)))) (OR \IPFLG (\IPINIT)) (\IP.ADD.PROTOCOL \TCP.PROTOCOL (FUNCTION \TCP.PORTCOMPARE) (FUNCTION \TCP.NOSOCKETFN) NIL (FUNCTION \TCP.HANDLE.ICMP)) (SETQ \TCP.MASTER.SOCKET (\IP.FIND.PROTOCOL \TCP.PROTOCOL))) ) ) (\TCP.INIT) (PUTPROPS TCP COPYRIGHT ("Xerox Corporation" 1983 1984 1985 1986 1901 1900 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (8342 9364 (SET.IP.ADDRESS 8352 . 8622) (STRING.TO.IP.ADDRESS 8624 . 8865) ( IP.ADDRESS.TO.STRING 8867 . 9091) (\LOCAL.IP.ADDRESS 9093 . 9362)) (14232 14439 (\TCP.SELECT.ISS 14242 . 14437)) (28588 34348 (\TCP.CREATE.TCB 28598 . 29684) (\TCP.SELECT.PORT 29686 . 29968) ( \TCP.LOOKUP.TCB 29970 . 30867) (\TCP.DELETE.TCB 30869 . 32537) (\TCP.NOSOCKETFN 32539 . 33367) ( \TCP.PORTCOMPARE 33369 . 34346)) (36215 38810 (\COMPUTE.CHECKSUM 36225 . 36891) ( \TCP.CHECKSUM.INCOMING 36893 . 37989) (\TCP.CHECKSUM.OUTGOING 37991 . 38808)) (39315 77802 (\TCP.ACK# 39325 . 39782) (\TCP.PACKET.FILTER 39784 . 40055) (\TCP.SETUP.SEGMENT 40057 . 40587) ( \TCP.RELEASE.SEGMENT 40589 . 40843) (\TCP.CONNECTION 40845 . 44136) (\TCP.FIX.INCOMING.SEGMENT 44138 . 44766) (\TCP.DATA.LENGTH 44768 . 45096) (\TCP.SYN.OR.FIN 45098 . 45438) (\TCP.INPUT 45440 . 48309) (\TCP.INPUT.INITIAL 48311 . 49094) (\TCP.INPUT.UNSYNC 49096 . 49466) (\TCP.INPUT.LISTEN 49468 . 50911) (\TCP.INPUT.SYN.SENT 50913 . 52778) (\TCP.CHECK.WINDOW 52780 . 53628) (\TCP.CHECK.RESET 53630 . 54398 ) (\TCP.CHECK.SECURITY 54400 . 54600) (\TCP.CHECK.NO.SYN 54602 . 55166) (\TCP.CHECK.ACK 55168 . 55443) (\TCP.HANDLE.ACK 55445 . 56750) (\TCP.HANDLE.URG 56752 . 57345) (\TCP.QUEUE.INPUT 57347 . 61011) ( \TCP.HANDLE.FIN 61013 . 62109) (\TCP.OUR.FIN.IS.ACKED 62111 . 62378) (\TCP.SIGNAL.URGENT.DATA 62380 . 62586) (\TCP.PROCESS 62588 . 65394) (\TCP.TEMPLATE 65396 . 66104) (\TCP.SETUP.SEGMENT.OPTIONS 66106 . 67362) (\TCP.SEND.CONTROL 67364 . 68215) (\TCP.SEND.ACK 68217 . 68655) (\TCP.SEND.RESET 68657 . 69371) (\TCP.FIX.OUTGOING.SEGMENT 69373 . 70111) (\TCP.SEND.DATA 70113 . 72955) (\TCP.SEND.SEGMENT 72957 . 73305) (\TCP.NEW.TEMPLATE 73307 . 73432) (\TCP.START.PROBE.TIMER 73434 . 73897) (\TCP.RETRANSMIT 73899 . 75994) (\TCP.START.TIME.WAIT 75996 . 76281) (\TCP.CONNECTION.DROPPED 76283 . 76787) ( \TCP.CHECK.OPTIONS 76789 . 77047) (\TCP.PROCESS.OPTIONS 77049 . 77800)) (78261 78997 (\TCP.HANDLE.ICMP 78271 . 78995)) (79035 93181 (TCP.OPEN 79045 . 79822) (TCP.OTHER.STREAM 79824 . 80161) (\TCP.BOUTS 80163 . 80384) (\TCP.OTHER.BIN 80386 . 80485) (\TCP.OTHER.BOUT 80487 . 80597) (\TCP.BIN 80599 . 80952) (\TCP.BACKFILEPTR 80954 . 81210) (\TCP.GETNEXTBUFFER 81212 . 81725) (\TCP.GET.SEGMENT 81727 . 85444) (\TCP.PEEKBIN 85446 . 85802) (\TCP.GETFILEPTR 85804 . 85955) (\TCP.READP 85957 . 86354) (\TCP.EOFP 86356 . 87244) (TCP.URGENTP 87246 . 87703) (TCP.URGENT.EVENT 87705 . 87911) (\TCP.BOUT 87913 . 88223) (\TCP.FLUSH 88225 . 89779) (\TCP.FORCEOUTPUT 89781 . 90199) (TCP.URGENT.MARK 90201 . 90375) ( \TCP.FILL.IN.SEGMENT 90377 . 91122) (\TCP.CLOSE 91124 . 91604) (\TCP.RESETCLOSE 91606 . 91693) ( TCP.CLOSE.SENDER 91695 . 92828) (TCP.DESTADDRESS 92830 . 93000) (TCP.STOP 93002 . 93179)) (94939 96765 (PPTCB 94949 . 95990) (\TCP.TRACE.SEGMENT 95992 . 96350) (\TCP.TRACE.TRANSITION 96352 . 96763)) ( 96802 97966 (\TCP.INIT 96812 . 97964))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPCHAT b/obsolete/tcp/TCPCHAT new file mode 100644 index 00000000..0c4735fc --- /dev/null +++ b/obsolete/tcp/TCPCHAT @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Jun-90 16:10:42" {DSK}local>lde>lispcore>library>TCPCHAT.;3 11300 changes to%: (FILES TCP) (VARS TCPCHATCOMS) previous date%: "15-Feb-90 13:09:03" {DSK}local>lde>lispcore>library>TCPCHAT.;2) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPCHATCOMS) (RPAQQ TCPCHATCOMS [(FNS TCPCHAT.BIN TCPCHAT.HOST.FILTER TCPCHAT.NEGOTIATE TCPCHAT.OPEN TCPCHAT.OPTION.COMMAND TCPCHAT.OPTION.INPUT TCPCHAT.OPTION.OUTPUT TCPCHAT.OPTION.TRACE TCPCHAT.TERMINAL.TYPE) (VARS TCPCHAT.TELNET.TTY.TYPES TELNET.OPTIONS) (INITVARS (TCPCHAT.TRACEFLG) (TCPCHAT.TRACEFILE)) (FILES (SYSLOAD) TCP CHAT) (DECLARE%: EVAL@COMPILE DONTCOPY (FILES CHATDECLS) (COMS (CONSTANTS * TELNET.COMMANDS) (CONSTANTS * TELNET.MARKS)) (RECORDS TELNET.OPTION TELNET.OPTIONSTATE) (GLOBALVARS TCPCHAT.TELNET.TTY.TYPES TELNET.OPTIONS TELNET.MARKS)) (DECLARE%: DONTEVAL@LOAD DOCOPY (* ;; "Tell Chat we exist ") (ADDVARS (CHAT.PROTOCOLTYPES (TCP . TCPCHAT.HOST.FILTER)) (CHAT.PROTOCOL.ABBREVS (N . TCP) (T . TCP]) (DEFINEQ (TCPCHAT.BIN (LAMBDA (STREAM) (* ; "Edited 7-Jul-88 18:03 by atm") (bind CHAR while (AND (EQ (SETQ CHAR (\BUFFERED.BIN STREAM)) TELNET.IAC) (NEQ (SETQ CHAR (\BUFFERED.BIN STREAM)) TELNET.IAC)) do (TCPCHAT.NEGOTIATE CHAR STREAM) finally (RETURN CHAR))) ) (TCPCHAT.HOST.FILTER (LAMBDA (HOST) (* ; "Edited 12-Apr-88 17:14 by bvm") (COND ((AND \IPFLG (DODIP.HOSTP HOST)) (LIST HOST (FUNCTION TCPCHAT.OPEN))))) ) (TCPCHAT.NEGOTIATE (LAMBDA (COMMAND STREAM) (* ; "Edited 7-Jul-88 18:03 by atm") (TCPCHAT.OPTION.INPUT (TCP.OTHER.STREAM STREAM) COMMAND (\BUFFERED.BIN STREAM))) ) (TCPCHAT.OPEN (LAMBDA (HOST) (* ; "Edited 17-Apr-87 10:06 by jrb:") (PROG ((STREAM (TCP.OPEN (DODIP.HOSTP HOST) \TCP.TELNET.PORT NIL (QUOTE ACTIVE) (QUOTE INPUT))) (OSTYPE (OR (AND (GETHASH (U-CASE HOST) \IP.HOSTNAMES) (fetch (HOSTS.TXT.ENTRY HTE.OS.TYPE) of (GETHASH (U-CASE HOST) \IP.HOSTNAMES))) (GETHOSTINFO HOST (QUOTE OSTYPE)))) OUTPUTSTREAM) (COND (STREAM (replace (STREAM BINABLE) of STREAM with NIL) (* ; "Can't run microcoded") (replace (STREAM STRMBINFN) of STREAM with (FUNCTION TCPCHAT.BIN)) (STREAMPROP STREAM (QUOTE SETDISPLAYTYPE) (FUNCTION NILL)) (COND ((EQ OSTYPE (QUOTE INTERLISP)) (RETURN (CONS STREAM (TCP.OTHER.STREAM STREAM))))) (* ; "(STREAMPROP STREAM (QUOTE SETDISPLAYTYPE) (FUNCTION TCPCHAT.TERMINAL.TYPE))") (SETQ OUTPUTSTREAM (TCP.OTHER.STREAM STREAM)) (STREAMPROP OUTPUTSTREAM (QUOTE OPTIONSTATES) (for OPTION in TELNET.OPTIONS collect (create TELNET.OPTIONSTATE OPTION _ (fetch (TELNET.OPTION OPTION) of OPTION)))) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM TELNET.DO TELNET.ECHO) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM TELNET.DO TELNET.SUPPRESS.GOAHEAD) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM TELNET.WILL TELNET.SUPPRESS.GOAHEAD) (COND ((NEQ OSTYPE (QUOTE UNIX)) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM TELNET.DO TELNET.BINARY) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM TELNET.WILL TELNET.BINARY))) (RETURN (CONS STREAM OUTPUTSTREAM)))))) ) (TCPCHAT.OPTION.COMMAND (LAMBDA (OUTPUTSTREAM COMMAND OPTION TRACECAPTION) (* ; "Edited 24-Aug-87 16:58 by scp") (LET ((OPTIONSTATE (FASSOC OPTION (STREAMPROP OUTPUTSTREAM (QUOTE OPTIONSTATES)))) GO.AHEAD.WITH.COMMAND) (COND ((NULL OPTIONSTATE) (SETQ GO.AHEAD.WITH.COMMAND T)) (T (SELECTC COMMAND (TELNET.DO (COND ((NEQ (fetch (TELNET.OPTIONSTATE DOING) of OPTIONSTATE) (QUOTE YES)) (SETQ GO.AHEAD.WITH.COMMAND T) (replace (TELNET.OPTIONSTATE DOING) of OPTIONSTATE with (QUOTE YES))))) (TELNET.WILL (COND ((NEQ (fetch (TELNET.OPTIONSTATE WILLING) of OPTIONSTATE) (QUOTE YES)) (SETQ GO.AHEAD.WITH.COMMAND T) (replace (TELNET.OPTIONSTATE WILLING) of OPTIONSTATE with (QUOTE YES))))) (TELNET.DONT (COND ((NEQ (fetch (TELNET.OPTIONSTATE DOING) of OPTIONSTATE) (QUOTE NO)) (SETQ GO.AHEAD.WITH.COMMAND T) (replace (TELNET.OPTIONSTATE DOING) of OPTIONSTATE with (QUOTE NO))))) (TELNET.WONT (COND ((NEQ (fetch (TELNET.OPTIONSTATE WILLING) of OPTIONSTATE) (QUOTE NO)) (SETQ GO.AHEAD.WITH.COMMAND T) (replace (TELNET.OPTIONSTATE WILLING) of OPTIONSTATE with (QUOTE NO))))) NIL))) (COND (GO.AHEAD.WITH.COMMAND (BOUT OUTPUTSTREAM TELNET.IAC) (BOUT OUTPUTSTREAM COMMAND) (BOUT OUTPUTSTREAM OPTION) (FORCEOUTPUT OUTPUTSTREAM) (TCPCHAT.OPTION.TRACE COMMAND OPTION (OR TRACECAPTION (QUOTE SEND))))))) ) (TCPCHAT.OPTION.INPUT (LAMBDA (OUTPUTSTREAM COMMAND OPTION) (* ; "Edited 16-Apr-87 13:30 by jrb:") (LET ((OPTIONRECORD (FASSOC OPTION TELNET.OPTIONS))) (COND (OPTIONRECORD (SELECTC COMMAND (TELNET.DO (TCPCHAT.OPTION.TRACE (QUOTE DO) OPTION (QUOTE RECV)) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (fetch (TELNET.OPTION ON.DO) of OPTIONRECORD) OPTION)) (TELNET.DONT (TCPCHAT.OPTION.TRACE (QUOTE DONT) OPTION (QUOTE RECV)) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (fetch (TELNET.OPTION ON.DONT) of OPTIONRECORD) OPTION)) (TELNET.WILL (TCPCHAT.OPTION.TRACE (QUOTE WILL) OPTION (QUOTE RECV)) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (fetch (TELNET.OPTION ON.WILL) of OPTIONRECORD) OPTION)) (TELNET.WONT (TCPCHAT.OPTION.TRACE (QUOTE WONT) OPTION (QUOTE RECV)) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (fetch (TELNET.OPTION ON.WONT) of OPTIONRECORD) OPTION)) (TELNET.SB (TCPCHAT.OPTION.TRACE (QUOTE SB) OPTION (QUOTE RECV)) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (fetch (TELNET.OPTION ON.SB) of OPTIONRECORD) OPTION)) COMMAND)) (T (TCPCHAT.OPTION.TRACE COMMAND OPTION) (TCPCHAT.OPTION.OUTPUT OUTPUTSTREAM (QUOTE WONT) OPTION))))) ) (TCPCHAT.OPTION.OUTPUT (LAMBDA (OUTPUTSTREAM COMMAND OPTION) (* ; "Edited 17-Apr-87 16:34 by jrb:") (LET (CMDNUM) (COND ((NULL COMMAND)) ((SETQ CMDNUM (CDR (FASSOC COMMAND (BQUOTE ((WILL \, TELNET.WILL) (WONT \, TELNET.WONT) (DO \, TELNET.DO) (DONT \, TELNET.DONT)))))) (TCPCHAT.OPTION.COMMAND OUTPUTSTREAM CMDNUM OPTION (QUOTE SENDBACK))) (T (APPLY* COMMAND (TCP.OTHER.STREAM OUTPUTSTREAM)))))) ) (TCPCHAT.OPTION.TRACE (LAMBDA (COMMAND OPTION PREFIX) (* ejs%: "22-Apr-85 16:41") (DECLARE (GLOBALVARS TCPCHAT.TRACEFLG TCPCHAT.TRACEFILE)) (COND (TCPCHAT.TRACEFLG (COND ((SMALLP COMMAND) (SETQ COMMAND (SELECTC COMMAND (TELNET.DO (QUOTE DO)) (TELNET.DONT (QUOTE DONT)) (TELNET.WILL (QUOTE WILL)) (TELNET.WONT (QUOTE WONT)) COMMAND)))) (printout TCPCHAT.TRACEFILE PREFIX ": " COMMAND " ") (PRINTCONSTANT OPTION TELNET.MARKS TCPCHAT.TRACEFILE) (TERPRI TCPCHAT.TRACEFILE)))) ) (TCPCHAT.TERMINAL.TYPE (LAMBDA (INPUTSTREAM) (* ; "Edited 20-Apr-87 13:42 by jrb:") (LET ((COMMAND)) (SELECTC (\BUFFERED.BIN INPUTSTREAM) (TELNET.SEND (* ; "OK, should be followed by IAC SE") (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE "REQUEST IS SEND")) (IF (EQ (SETQ COMMAND (\BUFFERED.BIN INPUTSTREAM)) TELNET.IAC) THEN (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE " IAC")) ELSE (IF TCPCHAT.TRACEFLG THEN (printout " EXPECTED IAC, GOT " COMMAND))) (IF (EQ (SETQ COMMAND (\BUFFERED.BIN INPUTSTREAM)) TELNET.SE) THEN (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE " SE")) ELSE (IF TCPCHAT.TRACEFLG THEN (printout " EXPECTED SE, GOT " COMMAND))) (IF TCPCHAT.TRACEFLG THEN (TERPRI TCPCHAT.TRACEFILE)) (LET* ((OUTPUTSTREAM (TCP.OTHER.STREAM INPUTSTREAM)) (DISPLAYTYPE (OR (CDR (FASSOC (fetch (CHATDISPLAYTYPE DPYNAME) of (STREAMPROP INPUTSTREAM (QUOTE DISPLAYTYPE))) TCPCHAT.TELNET.TTY.TYPES)) (CDR (FASSOC (fetch (CHATDISPLAYTYPE DPYNAME) of (STREAMPROP OUTPUTSTREAM (QUOTE DISPLAYTYPE))) TCPCHAT.TELNET.TTY.TYPES))))) (BOUT OUTPUTSTREAM TELNET.IAC) (BOUT OUTPUTSTREAM TELNET.SB) (BOUT OUTPUTSTREAM TELNET.TERMINAL.TYPE) (BOUT OUTPUTSTREAM TELNET.IS) (PRIN1 DISPLAYTYPE OUTPUTSTREAM) (BOUT OUTPUTSTREAM TELNET.IAC) (BOUT OUTPUTSTREAM TELNET.SE) (FORCEOUTPUT OUTPUTSTREAM) (COND (TCPCHAT.TRACEFLG (printout TCPCHAT.TRACEFILE "SEND(BACK) IAC SB TERMINAL-TYPE IS " DISPLAYTYPE " IAC SE" T))))) (TELNET.IS (* ; "We told them we couldn't handle this - or would have had they asked...") (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE "REQUEST IS IS, which is an error: rest of command is:" T)) (WHILE (NEQ (SETQ COMMAND (\BUFFERED.BIN INPUTSTREAM)) TELNET.SE) DO (IF TCPCHAT.TRACEFLG THEN (PRIN1 (CHARACTER COMMAND) TCPCHAT.TRACEFILE))) (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE " SE" T))) (IF TCPCHAT.TRACEFLG THEN (printout TCPCHAT.TRACEFILE "REQUEST IS " COMMAND ", which is an error" T))))) ) ) (RPAQQ TCPCHAT.TELNET.TTY.TYPES ((DM2500 . DATAMEDIA-2500) (VT100 . DEC-VT100))) (RPAQQ TELNET.OPTIONS ((94 WONT WONT DONT DONT) (0 WILL WONT NIL DONT) (1 WONT WONT DO DO) (3 WILL WILL NIL NIL) (5 WONT WONT DONT DONT) (6 WILL NIL NIL NIL) (24 WILL NIL DONT NIL TCPCHAT.TERMINAL.TYPE))) (RPAQ? TCPCHAT.TRACEFLG ) (RPAQ? TCPCHAT.TRACEFILE ) (FILESLOAD (SYSLOAD) TCP CHAT) (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD CHATDECLS) (RPAQQ TELNET.COMMANDS ((TELNET.SE 240) (TELNET.SB 250) (TELNET.WILL 251) (TELNET.WONT 252) (TELNET.DO 253) (TELNET.DONT 254) (TELNET.IAC 255) (TELNET.SEND 1) (TELNET.IS 0))) (DECLARE%: EVAL@COMPILE (RPAQQ TELNET.SE 240) (RPAQQ TELNET.SB 250) (RPAQQ TELNET.WILL 251) (RPAQQ TELNET.WONT 252) (RPAQQ TELNET.DO 253) (RPAQQ TELNET.DONT 254) (RPAQQ TELNET.IAC 255) (RPAQQ TELNET.SEND 1) (RPAQQ TELNET.IS 0) (CONSTANTS (TELNET.SE 240) (TELNET.SB 250) (TELNET.WILL 251) (TELNET.WONT 252) (TELNET.DO 253) (TELNET.DONT 254) (TELNET.IAC 255) (TELNET.SEND 1) (TELNET.IS 0)) ) (RPAQQ TELNET.MARKS ((TELNET.BINARY 0) (TELNET.ECHO 1) (TELNET.SUPPRESS.GOAHEAD 3) (TELNET.STATUS 5) (TELNET.TIMING.MARK 6) (TELNET.TERMINAL.TYPE 24))) (DECLARE%: EVAL@COMPILE (RPAQQ TELNET.BINARY 0) (RPAQQ TELNET.ECHO 1) (RPAQQ TELNET.SUPPRESS.GOAHEAD 3) (RPAQQ TELNET.STATUS 5) (RPAQQ TELNET.TIMING.MARK 6) (RPAQQ TELNET.TERMINAL.TYPE 24) (CONSTANTS (TELNET.BINARY 0) (TELNET.ECHO 1) (TELNET.SUPPRESS.GOAHEAD 3) (TELNET.STATUS 5) (TELNET.TIMING.MARK 6) (TELNET.TERMINAL.TYPE 24)) ) (DECLARE%: EVAL@COMPILE (RECORD TELNET.OPTION (OPTION ON.DO ON.DONT ON.WILL ON.WONT ON.SB)) (RECORD TELNET.OPTIONSTATE (OPTION WILLING DOING)) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS TCPCHAT.TELNET.TTY.TYPES TELNET.OPTIONS TELNET.MARKS) ) ) (DECLARE%: DONTEVAL@LOAD DOCOPY (ADDTOVAR CHAT.PROTOCOLTYPES (TCP . TCPCHAT.HOST.FILTER)) (ADDTOVAR CHAT.PROTOCOL.ABBREVS (N . TCP) (T . TCP)) ) (PUTPROPS TCPCHAT COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1430 8610 (TCPCHAT.BIN 1440 . 1698) (TCPCHAT.HOST.FILTER 1700 . 1857) ( TCPCHAT.NEGOTIATE 1859 . 2027) (TCPCHAT.OPEN 2029 . 3387) (TCPCHAT.OPTION.COMMAND 3389 . 4679) ( TCPCHAT.OPTION.INPUT 4681 . 5785) (TCPCHAT.OPTION.OUTPUT 5787 . 6188) (TCPCHAT.OPTION.TRACE 6190 . 6667) (TCPCHAT.TERMINAL.TYPE 6669 . 8608))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPCONFIG b/obsolete/tcp/TCPCONFIG new file mode 100644 index 00000000..257f8dd5 --- /dev/null +++ b/obsolete/tcp/TCPCONFIG @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP") (FILECREATED "12-Jun-90 16:11:50" {DSK}local>lde>lispcore>library>TCPCONFIG.;2 18742 changes to%: (VARS TCPCONFIGCOMS) previous date%: "18-Apr-88 21:05:32" {DSK}local>lde>lispcore>library>TCPCONFIG.;1) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPCONFIGCOMS) (RPAQQ TCPCONFIGCOMS ((PROP MAKEFILE-ENVIRONMENT TCPCONFIG) (DECLARE%: EVAL@COMPILE DONTCOPY (COMS (RECORDS IPINIT)) (GLOBALVARS \IP.LOCAL.NETWORKS \IP.DEFAULT.GATEWAY \IP.INIT.FILE \IP.SUBNET.MASKS \PROCESS.AFTEREXIT.EVENT \PROC.READY \AR.IP.TO.10MB.ALIST)) (COMS (* TCP configuration module) (EXPORT (RECORDS IPINIT)) (INITVARS (\IP.DEFAULT.CONFIGURATION (create IPINIT)) (\IPFLG NIL)) (FILES TCPLLIP) (FNS TCP.CONFIGURE TCP.LIMITCHARS \TCPCONFIG.RESETFN \TCPCONFIG.QUITFN TCP.ALPHA.LIMITCHARS \TCPCONFIG.APPLYFN)))) (PUTPROPS TCPCONFIG MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP")) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE (RECORD IPINIT (LOCAL.ADDRESSES LOCAL.NETWORKS DEFAULT.GATEWAY HTE.FILE HOSTNAME SUBNETMASK DOMAIN.SERVERS LOCAL.DOMAIN LOCAL.NSHOSTNUMBER)) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.LOCAL.NETWORKS \IP.DEFAULT.GATEWAY \IP.INIT.FILE \IP.SUBNET.MASKS \PROCESS.AFTEREXIT.EVENT \PROC.READY \AR.IP.TO.10MB.ALIST) ) ) (* TCP configuration module) (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (RECORD IPINIT (LOCAL.ADDRESSES LOCAL.NETWORKS DEFAULT.GATEWAY HTE.FILE HOSTNAME SUBNETMASK DOMAIN.SERVERS LOCAL.DOMAIN LOCAL.NSHOSTNUMBER)) ) (* "END EXPORTED DEFINITIONS") (RPAQ? \IP.DEFAULT.CONFIGURATION (create IPINIT)) (RPAQ? \IPFLG NIL) (FILESLOAD TCPLLIP) (DEFINEQ (TCP.CONFIGURE [LAMBDA NIL (DECLARE (GLOBALVARS \IP.DEFAULT.CONFIGURATION)) (* ; "Edited 18-Mar-88 15:41 by bvm") (LET* ((CONFIG (OR (AND (INFILEP '{DSK}IP.INIT) (\IP.READ.INIT.FILE '{DSK}IP.INIT)) \IP.DEFAULT.CONFIGURATION (create IPINIT))) (TCP.FREEMENU (FREEMENU `((PROPS FONT (GACHA 12 BOLD)) ((PROPS BOX 2) (LABEL " " TYPE DISPLAY) (LABEL "Apply!" TYPE MOMENTARY SELECTEDFN \TCPCONFIG.APPLYFN) (LABEL " " TYPE DISPLAY) (LABEL "Reset!" TYPE MOMENTARY SELECTEDFN \TCPCONFIG.RESETFN) (LABEL " " TYPE DISPLAY) (LABEL "Quit!" TYPE MOMENTARY SELECTEDFN \TCPCONFIG.QUITFN) (LABEL " " TYPE DISPLAY)) ((LABEL "" TYPE DISPLAY)) ((LABEL " Host Name:" TYPE EDITSTART MESSAGE "Enter the name of this host" LINKS (EDIT HOST.NAME)) (LABEL ,(OR (fetch (IPINIT HOSTNAME) of CONFIG) "") FONT (GACHA 12) TYPE EDIT ID HOST.NAME LIMITCHARS TCP.ALPHA.LIMITCHARS)) ((LABEL " Host Address:" TYPE EDITSTART MESSAGE "Enter the IP address of this host. Format: 13.0.10.5" LINKS (EDIT ADDRESS)) (LABEL ,(OR (CAR (fetch (IPINIT LOCAL.ADDRESSES) of CONFIG)) "") FONT (GACHA 12) TYPE EDIT ID ADDRESS LIMITCHARS TCP.LIMITCHARS)) ((LABEL "Network Address:" TYPE EDITSTART MESSAGE "Enter the IP address of the local network. Format: 13.0.0.0 Leave the host address fields 0." LINKS (EDIT NETWORK.ADDRESS)) (LABEL ,(OR (CAAR (fetch (IPINIT LOCAL.NETWORKS) of CONFIG)) "") FONT (GACHA 12) TYPE EDIT ID NETWORK.ADDRESS LIMITCHARS TCP.LIMITCHARS)) ((LABEL " Subnet mask:" TYPE EDITSTART MESSAGE "Enter the subnet mask. Format: 13.255.252.0 If the bitwise-AND of this address and any destination IP address is not equal to the bitwise-AND of this address and the host's local IP address, the destination IP address will be considered to be on another (sub)network" LINKS (EDIT SUBNET.MASK)) (LABEL ,(OR (CAR (fetch (IPINIT SUBNETMASK) of CONFIG)) "") FONT (GACHA 12) TYPE EDIT ID SUBNET.MASK LIMITCHARS TCP.LIMITCHARS)) ((LABEL "Default Gateway:" TYPE EDITSTART MESSAGE "Enter the IP address of the default gateway for this host. Format 13.0.10.34" LINKS (EDIT DEFAULT.GATEWAY)) (LABEL ,(OR (fetch (IPINIT DEFAULT.GATEWAY) of CONFIG) "") FONT (GACHA 12) TYPE EDIT ID DEFAULT.GATEWAY LIMITCHARS TCP.ALPHA.LIMITCHARS)) ((LABEL " Local Domain:" TYPE EDITSTART MESSAGE "Enter the name of the Internet domain in which this host resides" LINKS (EDIT LOCAL.DOMAIN)) (LABEL ,(OR (fetch (IPINIT LOCAL.DOMAIN) of CONFIG) "") FONT (GACHA 12) TYPE EDIT ID LOCAL.DOMAIN LIMITCHARS TCP.ALPHA.LIMITCHARS)) ((LABEL " Domain servers:" TYPE EDITSTART MESSAGE "Enter the IP addresses of the local domain servers. Format 13.0.10.21 12.0.15.22 ..." LINKS (EDIT DOMAIN.SERVERS)) (LABEL ,(if (fetch (IPINIT DOMAIN.SERVERS) of CONFIG) then (for ADDRESS in (fetch (IPINIT DOMAIN.SERVERS ) of CONFIG) bind (STRING _ "") do (SETQ STRING (CONCAT STRING ADDRESS " ")) finally (RETURN (SUBSTRING STRING 1 -2))) else "") FONT (GACHA 12) TYPE EDIT ID DOMAIN.SERVERS LIMITCHARS TCP.ALPHA.LIMITCHARS)) ((LABEL " Hosts.txt file:" TYPE EDITSTART MESSAGE "Enter the name of the Hosts.txt file to be used for translating IP hostnames to IP host addresses." LINKS (EDIT HOSTS.FILE)) (LABEL ,(OR (fetch (IPINIT HTE.FILE) of CONFIG) "") FONT (GACHA 12) TYPE EDIT ID HOSTS.FILE LIMITCHARS TCP.ALPHA.LIMITCHARS))) "TCP Configuration")) (REG (WINDOWPROP TCP.FREEMENU 'REGION)) (WIDTH (fetch (REGION WIDTH) of REG)) (HEIGHT (fetch (REGION HEIGHT) of REG))) (WINDOWPROP TCP.FREEMENU 'MINSIZE (CONS WIDTH HEIGHT)) (WINDOWPROP TCP.FREEMENU 'MAXSIZE (CONS 65535 HEIGHT)) (MOVEW TCP.FREEMENU (GETBOXPOSITION WIDTH HEIGHT)) (OPENW TCP.FREEMENU) NIL]) (TCP.LIMITCHARS [LAMBDA (ITEM WINDOW CHARACTER) (* ; "Edited 20-Jan-88 15:37 by Snow") (* ;; "allows numbers or periods until a CR then skips to the next item in the menu.") (COND ((FMEMB CHARACTER '(0 1 2 3 4 5 6 7 8 9 %.)) T) ((EQ (CHARACTER (CHARCODE EOL)) CHARACTER) (FM.SKIPNEXT WINDOW)) (T NIL]) (\TCPCONFIG.RESETFN (LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 18-Jan-88 18:32 by Briggs") (AND (GETPROMPTWINDOW WINDOW) (CLEARW (GETPROMPTWINDOW WINDOW))) (FM.RESETMENU WINDOW)) ) (\TCPCONFIG.QUITFN (LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 18-Jan-88 15:40 by Briggs") (FM.ENDEDIT WINDOW) (CLOSEW WINDOW)) ) (TCP.ALPHA.LIMITCHARS [LAMBDA (ITEM WINDOW CHAR) (* ; "Edited 20-Jan-88 15:32 by Snow") (* ;; "This function will allow all characters until a CR then call Fm.Skipnext to move on to the next entry in the table.") (IF (EQ (CHARACTER (CHARCODE CR)) CHAR) THEN (FM.SKIPNEXT WINDOW) ELSE T]) (\TCPCONFIG.APPLYFN [LAMBDA (ITEM WINDOW BUTTONS) (* ; "Edited 18-Mar-88 18:37 by bvm") (* ;; "Before reseting any of the parameters, verify their validity") (FM.ENDEDIT WINDOW) (PROG ((STATE (FM.GETSTATE WINDOW)) (FMPROMPTWINDOW (GETPROMPTWINDOW WINDOW 3)) (CONFIG (create IPINIT LOCAL.NSHOSTNUMBER _ \MY.NSHOSTNUMBER)) IPADDRESS SCRATCH) (* ;; "Before reseting any of the parameters, verify their validity") (CLEARW FMPROMPTWINDOW) (* ;; "So we don't have to check later...") (if (NOT (OR \10MBLOCALNDB \3MBLOCALNDB)) then (printout FMPROMPTWINDOW "This machine doesn't appear to be on any networks!") (RETURN)) (* ;; "") (* ;; "Host name is required") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'HOST.NAME)) (if (STRING-EQUAL SCRATCH "") then (printout FMPROMPTWINDOW "Host name is required!") (FM.EDITITEM (FM.GETITEM 'HOST.NAME NIL WINDOW) WINDOW) (RETURN)) (replace (IPINIT HOSTNAME) of CONFIG with SCRATCH) (* ;; "") (* ;; " Verify host address") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'ADDRESS)) (if (STRING-EQUAL SCRATCH "") then (printout FMPROMPTWINDOW "Host address is required!") (FM.EDITITEM (FM.GETITEM 'ADDRESS NIL WINDOW) WINDOW) (RETURN) elseif (OR (NULL (SETQ IPADDRESS (\IP.READ.STRING.ADDRESS SCRATCH))) (ZEROP (\IPNETADDRESS IPADDRESS))) then (printout FMPROMPTWINDOW "Malformed host address: " SCRATCH) (FM.EDITITEM (FM.GETITEM 'ADDRESS NIL WINDOW) WINDOW) (RETURN)) (replace (IPINIT LOCAL.ADDRESSES) of CONFIG with (LIST (\IP.ADDRESS.TO.STRING IPADDRESS))) (* ;; "") (* ;; "Verify network address. The list is an alist keyed by network address, and containing the atom 10 or 3 indicating the kind of network. We assume the host is only on one network.") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'NETWORK.ADDRESS)) (if (STRING-EQUAL SCRATCH "") then (printout FMPROMPTWINDOW "Network address is required!") (FM.EDITITEM (FM.GETITEM 'NETWORK.ADDRESS NIL WINDOW) WINDOW) (RETURN) elseif (OR (NULL (SETQ IPADDRESS (\IP.READ.STRING.ADDRESS SCRATCH))) (ZEROP (\IPNETADDRESS IPADDRESS))) then (printout FMPROMPTWINDOW "Malformed network address: " SCRATCH) (FM.EDITITEM (FM.GETITEM 'NETWORK.ADDRESS NIL WINDOW) WINDOW) (RETURN)) [replace (IPINIT LOCAL.NETWORKS) of CONFIG with (LIST (CONS (\IP.ADDRESS.TO.STRING IPADDRESS) (if \10MBLOCALNDB then 10 else 3] (* ;; "") (* ;; " Verify subnet mask") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'SUBNET.MASK)) (if (STRING-EQUAL SCRATCH "") then (printout FMPROMPTWINDOW "Subnet mask is required!") (FM.EDITITEM (FM.GETITEM 'SUBNET.MASK NIL WINDOW) WINDOW) (RETURN) elseif (OR (NULL (SETQ IPADDRESS (\IP.READ.STRING.ADDRESS SCRATCH))) (ZEROP (\IPNETADDRESS IPADDRESS))) then (printout FMPROMPTWINDOW "Malformed subnet mask: " SCRATCH) (FM.EDITITEM (FM.GETITEM 'SUBNET.MASK NIL WINDOW) WINDOW) (RETURN)) (replace (IPINIT SUBNETMASK) of CONFIG with (LIST (\IP.ADDRESS.TO.STRING IPADDRESS))) (* ;; "") (* ;; "Verify default gateway, may be empty if none.") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'DEFAULT.GATEWAY)) (if (STRING-EQUAL SCRATCH "") then (SETQ IPADDRESS NIL) elseif (NOT (SETQ IPADDRESS (\IP.READ.STRING.ADDRESS SCRATCH))) then (printout FMPROMPTWINDOW "Malformed default gateway address: " SCRATCH) (FM.EDITITEM (FM.GETITEM 'DEFAULT.GATEWAY NIL WINDOW) WINDOW) (RETURN)) (replace (IPINIT DEFAULT.GATEWAY) of CONFIG with (AND IPADDRESS ( \IP.ADDRESS.TO.STRING IPADDRESS))) (* ;; "") (* ;; "Local domain. May be empty.") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'LOCAL.DOMAIN)) (if (STRING-EQUAL SCRATCH "") then (SETQ SCRATCH NIL)) (replace (IPINIT LOCAL.DOMAIN) of CONFIG with SCRATCH) (* ;; "") (* ;; "Verify domain server address(es) are well formed.") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'DOMAIN.SERVERS)) (if (STRING-EQUAL SCRATCH "") then (SETQ IPADDRESS NIL) else [SETQ IPADDRESS (bind (END _ 0) (BITTABLE _ (MAKEBITTABLE (LIST (CHARCODE SPACE)) T)) (START _ NIL) eachtime [SETQ START (STRPOSL BITTABLE SCRATCH (ADD1 (OR END 65534] (SETQ END (STRPOS " " SCRATCH START)) until (NULL START) collect (\IP.READ.STRING.ADDRESS (SUBSTRING SCRATCH (OR START 1) END] (if (FMEMB NIL IPADDRESS) then (printout FMPROMPTWINDOW "Malformed domain server addresses: " SCRATCH ) (FM.EDITITEM (FM.GETITEM 'DOMAIN.SERVERS NIL WINDOW) WINDOW) (RETURN))) [replace (IPINIT DOMAIN.SERVERS) of CONFIG with (AND IPADDRESS (for ADDR in IPADDRESS collect ( \IP.ADDRESS.TO.STRING ADDR] (* ;; "") (* ;; "Hosts.txt file (may not yet exist)") (* ;; "") (SETQ SCRATCH (LISTGET STATE 'HOSTS.FILE)) (if (if (NOT (STRING-EQUAL SCRATCH "")) elseif (NOT *IP-DEFAULT-HOSTS-FILE*) then (* ;  "If there's a site default, we can leave this empty for flexibility") (FM.CHANGESTATE (FM.GETITEM 'HOSTS.FILE NIL WINDOW) (SETQ SCRATCH "{DSK}HOSTS.TXT") WINDOW) T) then (replace (IPINIT HTE.FILE) of CONFIG with SCRATCH)) (* ;; "") (* ;; "write the information back on the IP.INIT file") (* ;; "") (printout FMPROMPTWINDOW "Writing {dsk}ip.init... ") [LET ((*UPPER-CASE-FILE-NAMES* NIL)) (CL:WITH-OPEN-FILE (STREAM '{DSK}IP.INIT :DIRECTION :OUTPUT :IF-EXISTS :NEW-VERSION) (PRIN2 CONFIG STREAM (FIND-READTABLE "INTERLISP"] (printout FMPROMPTWINDOW "done.") (* ;; "") (* ;; "See if they want to restart TCP with the new configuration.") (* ;; "") (COND ((AND \IPFLG (MOUSECONFIRM "Restart TCP with the new values?" NIL FMPROMPTWINDOW T)) (* ;  "tcp is running and they want it restarted.") (PRINTOUT FMPROMPTWINDOW T "Restarting...") (STOPIP) (SETQ \IP.DEFAULT.CONFIGURATION NIL) (\IPINIT) (* ;; "let the user know we are done.") (PRINTOUT FMPROMPTWINDOW "done."]) ) (PUTPROPS TCPCONFIG COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1988 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2032 18633 (TCP.CONFIGURE 2042 . 7956) (TCP.LIMITCHARS 7958 . 8375) (\TCPCONFIG.RESETFN 8377 . 8561) (\TCPCONFIG.QUITFN 8563 . 8695) (TCP.ALPHA.LIMITCHARS 8697 . 9098) (\TCPCONFIG.APPLYFN 9100 . 18631))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPDEBUG b/obsolete/tcp/TCPDEBUG new file mode 100644 index 00000000..1b0b73dd --- /dev/null +++ b/obsolete/tcp/TCPDEBUG @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "23-Aug-90 17:10:14" {DSK}TCP>TCPDEBUG.;2 27328 changes to%: (VARS TCPDEBUGCOMS) previous date%: "15-Feb-89 13:41:39" {DSK}TCP>TCPDEBUG.;1) (* ; " Copyright (c) 1985, 1986, 1987, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPDEBUGCOMS) (RPAQQ TCPDEBUGCOMS ((COMS (* ;; "standard TCP small servers") (FNS TCP.SINK.SERVER TCP.TELNET.SERVER \TCP.SINK.PROCESS TCP.ECHO.SERVER \TCP.ECHO.PROCESS)) (COMS (* ;; "TCP tracing and debugging info") (DECLARE%: EVAL@COMPILE DONTCOPY (FILES (LOADCOMP) TCP) (CONSTANTS LIGHTGRAYSHADE)) (GLOBALVARS TCPTRACEFLG TCPTRACEFILE TCPTRACEMENU \TCP.ELAPSED.TIME \TCP.DEBUGGABLE) (INITVARS TCPTRACEFLG TCPTRACEFILE TCPTRACEMENU \TCP.ELAPSED.TIME NETTRACETITLEREG) (VARS (\TCP.DEBUGGABLE T)) (BITMAPS NETTRACEICON NETTRACEMASK) (FILES (SYSLOAD) TCP) (FNS TCP.PRINT.SEGMENT \TCP.PRINT.OPTIONS \TCP.PRINT.ELAPSED.TIME \TCP.PRINT.SEGMENT.QUEUE TCPTRACE \TCPTRACEMENU.ITEMFN \TCPTRACEMENU.DISPLAYFN TCP.DRIBBLE)) (COMS (* ;; "miscellaneous TCP debugging") (GLOBALVARS \TCP.LOSSAGE \TCP.LOOPBACK.QUEUE \TCP.LOOPBACK.EVENT \TCP.MASTER.SOCKET) (INITVARS \TCP.LOSSAGE \TCP.LOOPBACK.QUEUE \TCP.LOOPBACK.EVENT) (FNS TCP.DEBUG TCP.WATCHER DUMMY\IP\Transmit\Packet \TCP.CHECK.INPUT.QUEUE TCP.FAUCET TCP.ECHOTEST TCP.QUIET.ECHOTEST TCP.SINKTEST GENERATE.RANDOM.CHARS COPYBYTESTREAM TCP.COPYTOWINDOW TEST.CHECKSUM)))) (* ;; "standard TCP small servers") (DEFINEQ (TCP.SINK.SERVER [LAMBDA (PORT) (* ecc "14-May-84 16:32") (bind STREAM do (if (SETQ STREAM (TCP.OPEN NIL NIL (OR PORT \TCP.SINK.PORT) 'PASSIVE 'INPUT T)) then (ADD.PROCESS `(\TCP.SINK.PROCESS %, STREAM) 'NAME "TCP Sink"]) (TCP.TELNET.SERVER [LAMBDA NIL (* ejs%: "20-Jun-85 12:38") (LET ((INSTREAM (TCP.OPEN NIL NIL \TCP.TELNET.PORT 'PASSIVE 'INPUT)) OUTSTREAM) (COND (INSTREAM (SETQ OUTSTREAM (TCP.OTHER.STREAM INSTREAM)) (ADD.PROCESS (LIST '\TCP.ECHO.PROCESS (KWOTE INSTREAM) (KWOTE OUTSTREAM)) 'NAME "Telnet echo") (ADD.PROCESS '(TCP.TELNET.SERVER)) (GENERATE.RANDOM.CHARS OUTSTREAM]) (\TCP.SINK.PROCESS [LAMBDA (STREAM) (* ejs%: " 7-Jun-85 13:11") (RESETSAVE NIL (LIST (FUNCTION CLOSEF) STREAM)) (replace (STREAM ENDOFSTREAMOP) of STREAM with (FUNCTION NILL)) (until (EOFP STREAM) do (BIN STREAM]) (TCP.ECHO.SERVER [LAMBDA (PORT) (* ecc "14-May-84 16:35") (bind STREAM do (if (SETQ STREAM (TCP.OPEN NIL NIL (OR PORT \TCP.ECHO.PORT) 'PASSIVE 'INPUT T)) then (ADD.PROCESS `(\TCP.ECHO.PROCESS %, STREAM %, (TCP.OTHER.STREAM STREAM)) 'NAME "TCP Echo"]) (\TCP.ECHO.PROCESS [LAMBDA (INSTR OUTSTR) (* ejs%: "25-Mar-86 18:07") (RESETSAVE NIL (LIST (FUNCTION CLOSEF) INSTR)) (RESETSAVE NIL (LIST (FUNCTION CLOSEF) OUTSTR)) (bind C until (OR (NOT (OPENP INSTR 'INPUT)) (EOFP INSTR)) do [COND [(CAR (NLSETQ (READP INSTR))) (SETQ C (CAR (NLSETQ (BIN INSTR] (T (FORCEOUTPUT OUTSTR) (SETQ C (CAR (NLSETQ (BIN INSTR] [COND (C (NLSETQ (BOUT OUTSTR C] (if (OR (NOT (NLSETQ (READP INSTR))) (NOT (OPENP INSTR 'INPUT)) (EOFP INSTR)) then (NLSETQ (FORCEOUTPUT OUTSTR]) ) (* ;; "TCP tracing and debugging info") (DECLARE%: EVAL@COMPILE DONTCOPY (FILESLOAD (LOADCOMP) TCP) (DECLARE%: EVAL@COMPILE (RPAQQ LIGHTGRAYSHADE 1025) (CONSTANTS LIGHTGRAYSHADE) ) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS TCPTRACEFLG TCPTRACEFILE TCPTRACEMENU \TCP.ELAPSED.TIME \TCP.DEBUGGABLE) ) (RPAQ? TCPTRACEFLG NIL) (RPAQ? TCPTRACEFILE NIL) (RPAQ? TCPTRACEMENU NIL) (RPAQ? \TCP.ELAPSED.TIME NIL) (RPAQ? NETTRACETITLEREG NIL) (RPAQQ \TCP.DEBUGGABLE T) (RPAQQ NETTRACEICON #*(72 72)AOOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOON@@@G@@@@@@@@@@@@@@@G@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@F@@@@@@@@@@@@@@@C@@@G@@@@@@@@@@@@@@@G@@@COOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@F@@@DIBDL@@@@@@@@@@@F@@@DIBDL@@@@@@@@@@@F@@@DIBDL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@F@@@@@@@L@@@@@L@@@@@F@@@@@@@L@@@@@N@@@@@F@@@@@@@L@@@@@K@@@@@GH@@@@@CLCOOOOIH@@@@F@@@@@@@LGOOOOHL@@@@F@@@@@@@LD@@@@@F@@@@F@@@@@@@LD@@@@@C@@@@GOOOOOOOLD@@@@@A@@@@F@@@@@@@LD@@@@@B@@@@F@@@@@@@LD@@@@@D@@@@F@@@@@@@LGOOOOHH@@@@GH@@@@@CL@@@@@I@@@@@F@@@@@@@L@@@@@J@@@@@F@@@@@@@L@@@@@L@@@@@F@@@@@@@L@@@@@H@@@@@GH@@@@@CL@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@GOOOOOOOL@@D@@@@@@@@F@@@@@@@L@@L@@@@@@@@F@@@@@@@L@AL@@@@@@@@F@@@@@@@L@BL@@@@@@@@GH@@@@@CL@DOOOOOH@@@F@@@@@@@L@HOOOOOH@@@F@@@@@@@LA@@@@@AH@@@F@@@@@@@LB@@@@@AH@@@GOOOOOOOLD@@@@@AH@@@F@@@@@@@LB@@@@@AH@@@F@@@D@@@LA@@@@@AH@@@F@@@D@@@L@HOOOOO@@@@F@@@@@@@L@DL@@@@@@@@F@@@D@@@L@BL@@@@@@@@F@@@D@@@L@AL@@@@@@@@F@@@@@@@L@@H@@@@@@@@F@@@D@@@L@@@@@@@@@@@F@@@D@@@L@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@F@@@@@@@L@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@ ) (RPAQQ NETTRACEMASK #*(72 72)AOOOOOOOOOOOOOOOL@@@COOOOOOOOOOOOOOON@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@GOOOOOOOOOOOOOOOO@@@COOOOOOOOOOOOOOON@@@AOOOOOOOOOOOOOOOL@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@L@@@@@GOOOOOOOL@@@@@N@@@@@GOOOOOOOL@@@@@O@@@@@GOOOOOOOLCOOOOOH@@@@GOOOOOOOLGOOOOOL@@@@GOOOOOOOLGOOOOON@@@@GOOOOOOOLGOOOOOO@@@@GOOOOOOOLGOOOOOO@@@@GOOOOOOOLGOOOOON@@@@GOOOOOOOLGOOOOOL@@@@GOOOOOOOLGOOOOOH@@@@GOOOOOOOL@@@@@O@@@@@GOOOOOOOL@@@@@N@@@@@GOOOOOOOL@@@@@L@@@@@GOOOOOOOL@@@@@H@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@D@@@@@@@@GOOOOOOOL@@L@@@@@@@@GOOOOOOOL@AL@@@@@@@@GOOOOOOOL@CL@@@@@@@@GOOOOOOOL@GOOOOOH@@@GOOOOOOOL@OOOOOOH@@@GOOOOOOOLAOOOOOOH@@@GOOOOOOOLCOOOOOOH@@@GOOOOOOOLGOOOOOOH@@@GOOOOOOOLCOOOOOOH@@@GOOOOOOOLAOOOOOOH@@@GOOOOOOOL@OOOOOO@@@@GOOOOOOOL@GL@@@@@@@@GOOOOOOOL@CL@@@@@@@@GOOOOOOOL@AL@@@@@@@@GOOOOOOOL@@H@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@GOOOOOOOL@@@@@@@@@@@ ) (FILESLOAD (SYSLOAD) TCP) (DEFINEQ (TCP.PRINT.SEGMENT [LAMBDA (SEGMENT FILE NOFROMTOFLG DATAFLG) (* ejs%: "20-Jun-85 16:06") (PROG ((SEPR "") (COMMA ",") (SEQ (fetch TCP.SEQ of SEGMENT)) (LEN (\TCP.DATA.LENGTH SEGMENT)) (FLAGS (fetch TCP.CTRL of SEGMENT)) TOP BASE) (if (NOT NOFROMTOFLG) then (printout FILE "from " %# (\IP.PRINT.ADDRESS (fetch TCP.SRC.ADDR of SEGMENT) FILE) ":" (fetch TCP.SRC.PORT of SEGMENT) " to " %# (\IP.PRINT.ADDRESS (fetch TCP.DST.ADDR of SEGMENT) FILE) ":" (fetch TCP.DST.PORT of SEGMENT) T)) (printout FILE SEQ) [SETQ TOP (SUB1 (IPLUS SEQ LEN (\TCP.SYN.OR.FIN FLAGS T] (if (\32BIT.LT SEQ TOP) then (printout FILE ".." TOP)) (printout FILE "/" (fetch TCP.ACK of SEGMENT) " [") (if (BITTEST FLAGS \TCP.CTRL.URG) then (printout FILE SEPR "URG") (SETQ SEPR COMMA)) (if (BITTEST FLAGS \TCP.CTRL.ACK) then (printout FILE SEPR "ACK") (SETQ SEPR COMMA)) (if (BITTEST FLAGS \TCP.CTRL.PSH) then (printout FILE SEPR "PSH") (SETQ SEPR COMMA)) (if (BITTEST FLAGS \TCP.CTRL.RST) then (printout FILE SEPR "RST") (SETQ SEPR COMMA)) (if (BITTEST FLAGS \TCP.CTRL.SYN) then (printout FILE SEPR "SYN") (SETQ SEPR COMMA)) (if (BITTEST FLAGS \TCP.CTRL.FIN) then (printout FILE SEPR "FIN") (SETQ SEPR COMMA)) (printout FILE "] window = " (fetch TCP.WINDOW of SEGMENT) " checksum = " (fetch TCP.CHECKSUM of SEGMENT) " length = " LEN T) (if (IGREATERP (fetch TCP.DATA.OFFSET of SEGMENT) \TCP.MIN.DATA.OFFSET) then (\TCP.PRINT.OPTIONS SEGMENT FILE)) (if (AND DATAFLG (NOT (ZEROP LEN))) then (printout FILE "Contents:") (SETQ BASE (fetch TCP.CONTENTS of SEGMENT)) (for (I _ 0) to (SUB1 LEN) do (PRIN1 (CHARACTER (\GETBASEBYTE BASE I)) FILE)) (TERPRI FILE]) (\TCP.PRINT.OPTIONS [LAMBDA (SEGMENT FILE) (* ejs%: "20-Jun-85 13:22") (* * Process the options in a TCP header) (printout FILE "Options: ") (bind (OPTIONBASE _ (fetch (TCPSEGMENT TCP.OPTIONS) of SEGMENT)) (OPTIONOFFSET _ 0) OPTION eachtime (SETQ OPTION (\GETBASEBYTE OPTIONBASE OPTIONOFFSET)) until (EQ OPTION \TCPOPT.END) do (SELECTC OPTION (\TCPOPT.END (printout FILE "end") (add OPTIONOFFSET 1)) (\TCPOPT.NOP (printout FILE "nop") (add OPTIONOFFSET 1)) (\TCPOPT.MAXSEG [printout FILE "maxseg: " (LOGOR (LLSH (\GETBASEBYTE OPTIONBASE (IPLUS OPTIONOFFSET 2)) BITSPERBYTE) (\GETBASEBYTE OPTIONBASE (IPLUS OPTIONOFFSET 3] (add OPTIONOFFSET (\GETBASEBYTE OPTIONBASE (ADD1 OPTIONOFFSET)))) (RETURN)) (printout FILE " "]) (\TCP.PRINT.ELAPSED.TIME [LAMBDA (FILE) (* ecc "23-Apr-84 12:32") (if (MEMB 'TIME TCPTRACEFLG) then (PROG ((NOW (SETUPTIMER 0 NIL 'MILLISECONDS)) INTERVAL) (SETQ INTERVAL (IDIFFERENCE NOW (OR \TCP.ELAPSED.TIME NOW))) (SETQ \TCP.ELAPSED.TIME NOW) (printout FILE (IQUOTIENT INTERVAL 1000) "." |.I3..T| (IMOD INTERVAL 1000) " "]) (\TCP.PRINT.SEGMENT.QUEUE [LAMBDA (CALLER QUEUE FILE) (* ecc "18-Apr-84 14:38") (PROG ((SEGMENT (fetch SYSQUEUEHEAD of QUEUE))) (printout FILE .TAB0 0 CALLER ":" T) (while SEGMENT do (TCP.PRINT.SEGMENT SEGMENT FILE T) (SETQ SEGMENT (fetch QLINK of SEGMENT]) (TCPTRACE [LAMBDA NIL (* ; "Edited 15-Apr-87 15:22 by jrb:") (PROG (MW) (if (WINDOWP TCPTRACEFILE) then (TOTOPW TCPTRACEFILE) (RETURN)) (SETQ TCPTRACEFILE (CREATEW)) [WINDOWADDPROP TCPTRACEFILE 'CLOSEFN (FUNCTION (LAMBDA (WINDOW) (if (EQ WINDOW TCPTRACEFILE) then (SETQ TCPTRACEFLG NIL) (SETQ TCPTRACEFILE T] (DSPFONT (FONTCREATE 'GACHA 8) TCPTRACEFILE) (DSPSCROLL T TCPTRACEFILE) [if (NOT (type? MENU TCPTRACEMENU)) then (SETQ TCPTRACEMENU (create MENU TITLE _ "TCP Trace Window" ITEMS _ '(("Incoming" RECV "Trace incoming segments") ("Time" TIME "Print elapsed time between events") ("Transitions" TRANSITION "Trace connection state transitions") ("Outgoing" SEND "Trace outgoing segments") ("Contents" CONTENTS "Print contents of segments when tracing" ) ("Checksums" CHECKSUM "Trace segments with bad checksums")) MENUROWS _ 2 CENTERFLG _ T WHENSELECTEDFN _ (FUNCTION \TCPTRACEMENU.ITEMFN))) else (FOR ITEM IN (FETCH (MENU ITEMS) OF TCPTRACEMENU) DO (IF (MEMB (CADR ITEM) TCPTRACEFLG) THEN (SHADEITEM ITEM TCPTRACEMENU LIGHTGRAYSHADE) ELSE (SHADEITEM ITEM TCPTRACEMENU WHITESHADE] (ATTACHMENU TCPTRACEMENU TCPTRACEFILE 'TOP) [SETQ MW (CAR (WINDOWPROP TCPTRACEFILE 'ATTACHEDWINDOWS] (WINDOWADDPROP MW 'REPAINTFN (FUNCTION \TCPTRACEMENU.DISPLAYFN)) (WINDOWADDPROP MW 'RESHAPEFN (FUNCTION \TCPTRACEMENU.DISPLAYFN]) (\TCPTRACEMENU.ITEMFN [LAMBDA (ITEM MENU MOUSEKEY) (* ecc "23-Apr-84 13:37") (PROG (FLG) (if (NULL ITEM) then (RETURN)) (SETQ FLG (CADR ITEM)) (if (MEMB FLG TCPTRACEFLG) then (SHADEITEM ITEM MENU WHITESHADE) (SETQ TCPTRACEFLG (DREMOVE FLG TCPTRACEFLG)) else (SHADEITEM ITEM MENU LIGHTGRAYSHADE) (SETQ TCPTRACEFLG (CONS FLG TCPTRACEFLG]) (\TCPTRACEMENU.DISPLAYFN [LAMBDA (WINDOW) (* ecc "23-Apr-84 13:49") (PROG [(MENU (CAR (WINDOWPROP WINDOW 'MENU] (for ITEM in (fetch ITEMS of MENU) when (MEMB (CADR ITEM) TCPTRACEFLG) do (SHADEITEM ITEM MENU LIGHTGRAYSHADE]) (TCP.DRIBBLE [LAMBDA (FORM FILE) (* ecc "18-Apr-84 14:39") (if (NULL FILE) then (SETQ FILE '{DSK}TCP.Transcript)) (RESETLST (RESETSAVE TCPTRACEFILE (OPENFILE FILE 'OUTPUT)) (RESETSAVE TCPTRACEFLG T) (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) TCPTRACEFILE)) (PRINT FORM TCPTRACEFILE) (TERPRI TCPTRACEFILE) (EVAL FORM]) ) (* ;; "miscellaneous TCP debugging") (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCP.LOSSAGE \TCP.LOOPBACK.QUEUE \TCP.LOOPBACK.EVENT \TCP.MASTER.SOCKET) ) (RPAQ? \TCP.LOSSAGE NIL) (RPAQ? \TCP.LOOPBACK.QUEUE NIL) (RPAQ? \TCP.LOOPBACK.EVENT NIL) (DEFINEQ (TCP.DEBUG [LAMBDA (ON?) (* edited%: "21-May-84 13:56") (if ON? then (TCP.STOP) (if (NOT (DEFINEDP 'REAL\IP\Transmit\Packet)) then (MOVD 'IP\Transmit\Packet 'REAL\IP\Transmit\Packet)) (MOVD 'DUMMY\IP\Transmit\Packet 'IP\Transmit\Packet) (if (NULL \TCP.LOOPBACK.EVENT) then (SETQ \TCP.LOOPBACK.EVENT (CREATE.EVENT))) (if (NULL \TCP.LOOPBACK.QUEUE) then (SETQ \TCP.LOOPBACK.QUEUE (create SYSQUEUE))) [if (NOT (FIND.PROCESS 'TCP.WATCHER)) then (ADD.PROCESS '(TCP.WATCHER] else (if (DEFINEDP 'REAL\IP\Transmit\Packet) then (MOVD 'REAL\IP\Transmit\Packet 'IP\Transmit\Packet)) (DEL.PROCESS 'TCP.WATCHER) (\TCP.INIT]) (TCP.WATCHER [LAMBDA NIL (* ecc " 3-May-84 11:10") (* process to handle software loopback  of segments) (RESETSAVE NIL (LIST (FUNCTION \FLUSH.PACKET.QUEUE) \TCP.LOOPBACK.QUEUE)) (bind SEGMENT do (SETQ SEGMENT (\DEQUEUE \TCP.LOOPBACK.QUEUE)) (if SEGMENT then (\TCP.PACKET.FILTER SEGMENT \TCP.PROTOCOL) else (AWAIT.EVENT \TCP.LOOPBACK.EVENT]) (DUMMY\IP\Transmit\Packet [LAMBDA (EPKT) (* ejs%: " 5-Jan-85 16:57") (* Software loopback.) (PROG ([OK (NOT (AND \TCP.LOSSAGE (EQ (RAND 1 \TCP.LOSSAGE) 1] SEGMENT) (CHECK (OR (NULL (fetch QLINK of EPKT)) (SHOULDNT "transmitting queued segment"))) (if OK then (SETQ SEGMENT (\ALLOCATE.ETHERPACKET)) (\BLT (\IPDATABASE SEGMENT) (\IPDATABASE EPKT) (FOLDHI (ADD1 (fetch (IP IPTOTALLENGTH) of EPKT)) BYTESPERWORD))) (if (EQ (fetch EPREQUEUE of EPKT) 'FREE) then (\RELEASE.ETHERPACKET EPKT) elseif (type? SYSQUEUE (fetch EPREQUEUE of EPKT)) then (\ENQUEUE (fetch EPREQUEUE of EPKT) EPKT)) (if OK then (\ENQUEUE \TCP.LOOPBACK.QUEUE SEGMENT) (NOTIFY.EVENT \TCP.LOOPBACK.EVENT]) (\TCP.CHECK.INPUT.QUEUE [LAMBDA (TCB) (* edited%: "22-May-84 15:32") (* perform consistency check on the  input queue) (PROG ((QUEUE (fetch TCB.INPUT.QUEUE of TCB)) CURSEG SEQ1 TOP1 NEXTSEG SEQ2 TOP2) (SETQ CURSEG (fetch SYSQUEUEHEAD of QUEUE)) LOOP (if (NULL CURSEG) then (RETURN T)) (SETQ SEQ1 (fetch TCP.SEQ of CURSEG)) (SETQ TOP1 (IPLUS SEQ1 (fetch TCP.DATA.LENGTH of CURSEG))) (if (AND (\32BIT.LEQ SEQ1 (fetch TCB.RCV.NXT of TCB)) (\32BIT.GT TOP1 (fetch TCB.RCV.NXT of TCB))) then (SHOULDNT "incorrect RCV.NXT") (RETURN NIL)) (SETQ NEXTSEG (fetch QLINK of CURSEG)) (if (NULL NEXTSEG) then (RETURN T)) (SETQ SEQ2 (fetch TCP.SEQ of NEXTSEG)) (SETQ TOP2 (IPLUS SEQ2 (fetch TCP.DATA.LENGTH of NEXTSEG))) (if (\32BIT.LT SEQ2 SEQ1) then (SHOULDNT "input queue out of order") (RETURN NIL)) (SETQ CURSEG NEXTSEG) (GO LOOP]) (TCP.FAUCET [LAMBDA (HOST PORT NLINES) (* ejs%: "20-Jun-85 12:20") (PROG [(STREAM (if HOST then (TCP.OPEN HOST (OR PORT \TCP.SINK.PORT) NIL 'ACTIVE 'OUTPUT) else (TCP.OPEN NIL NIL (OR PORT \TCP.SINK.PORT) 'PASSIVE 'OUTPUT] (RESETLST (RESETSAVE NIL (LIST (FUNCTION CLOSEF) STREAM)) (GENERATE.RANDOM.CHARS STREAM NLINES]) (TCP.ECHOTEST [LAMBDA (HOST NLINES) (* ecc "14-May-84 17:07") (PROG [(STREAM (TCP.OPEN HOST \TCP.ECHO.PORT NIL 'ACTIVE 'OUTPUT] (ADD.PROCESS (BQUOTE (TCP.COPYTOWINDOW %, (TCP.OTHER.STREAM STREAM)) 'NAME "TCP Echo Tester")) (GENERATE.RANDOM.CHARS STREAM NLINES) (TCP.CLOSE.SENDER STREAM]) (TCP.QUIET.ECHOTEST [LAMBDA (HOST NLINES) (* ecc "25-May-84 13:24") (PROG [(STREAM (TCP.OPEN HOST \TCP.ECHO.PORT NIL 'ACTIVE 'OUTPUT] (ADD.PROCESS (BQUOTE (\TCP.SINK.PROCESS %, (TCP.OTHER.STREAM STREAM)) 'NAME "TCP Echo Tester")) (GENERATE.RANDOM.CHARS STREAM NLINES) (TCP.CLOSE.SENDER STREAM]) (TCP.SINKTEST [LAMBDA (PORT VISIBLEFLG) (* ecc "14-May-84 17:28") (TCP.COPYTOWINDOW (TCP.OPEN NIL NIL (OR PORT \TCP.SINK.PORT) 'PASSIVE 'INPUT) VISIBLEFLG]) (GENERATE.RANDOM.CHARS [LAMBDA (STREAM NLINES) (* ejs%: " 7-Jun-85 12:34") (bind (N _ 0) while (NEQ N NLINES) do (add N 1) (printout STREAM "This is byte number " (GETFILEPTR STREAM) "." T) (BLOCK]) (COPYBYTESTREAM [LAMBDA (INSTR OUTSTR VISIBLEFLG) (* ejs%: " 7-Jun-85 13:44") (if VISIBLEFLG then (bind (N _ 1) (C _ NIL) while (OPENP INSTR 'INPUT) do (SETQ C (BIN INSTR)) (printout OUTSTR N ": " C) (if (AND (ILEQ C 127) (IGEQ C 32)) then (printout OUTSTR " (" %# (BOUT OUTSTR C) ")")) (TERPRI OUTSTR) (add N 1)) else (bind C while (AND (OPENP INSTR 'INPUT) (NOT (EOFP INSTR))) do (COND ((SETQ C (BIN INSTR)) (BOUT OUTSTR C]) (TCP.COPYTOWINDOW [LAMBDA (STREAM VISIBLEFLG) (* ejs%: "13-Apr-85 16:01") (RESETLST (RESETSAVE NIL (LIST (FUNCTION CLOSEF?) STREAM)) (PROG ((WIN (CREATEW NIL "Stream Output"))) (DSPSCROLL T WIN) (COPYBYTESTREAM STREAM WIN VISIBLEFLG) (printout WIN .TAB0 0 "[End of stream]"]) (TEST.CHECKSUM [LAMBDA (STR STR2) (* ecc "24-Apr-84 13:11") (if (NULL STR2) then (\COMPUTE.CHECKSUM (\ADDBASE (fetch (STRINGP BASE) of STR) (fetch (STRINGP OFFST) of STR)) (fetch (STRINGP LENGTH) of STR)) else (\16BIT.COMPLEMENT (\16BIT.1C.PLUS (\COMPUTE.CHECKSUM (\ADDBASE (fetch (STRINGP BASE) of STR) (fetch (STRINGP OFFST) of STR)) (fetch (STRINGP LENGTH) of STR) T) (\COMPUTE.CHECKSUM (\ADDBASE (fetch (STRINGP BASE) of STR2) (fetch (STRINGP OFFST) of STR2)) (fetch (STRINGP LENGTH) of STR2) T]) ) (PUTPROPS TCPDEBUG COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2530 5441 (TCP.SINK.SERVER 2540 . 2955) (TCP.TELNET.SERVER 2957 . 3546) ( \TCP.SINK.PROCESS 3548 . 3874) (TCP.ECHO.SERVER 3876 . 4356) (\TCP.ECHO.PROCESS 4358 . 5439)) (8951 18060 (TCP.PRINT.SEGMENT 8961 . 11702) (\TCP.PRINT.OPTIONS 11704 . 13026) (\TCP.PRINT.ELAPSED.TIME 13028 . 13561) (\TCP.PRINT.SEGMENT.QUEUE 13563 . 13945) (TCPTRACE 13947 . 16678) (\TCPTRACEMENU.ITEMFN 16680 . 17190) (\TCPTRACEMENU.DISPLAYFN 17192 . 17578) (TCP.DRIBBLE 17580 . 18058)) (18333 27228 ( TCP.DEBUG 18343 . 19261) (TCP.WATCHER 19263 . 19916) (DUMMY\IP\Transmit\Packet 19918 . 21136) ( \TCP.CHECK.INPUT.QUEUE 21138 . 22505) (TCP.FAUCET 22507 . 23175) (TCP.ECHOTEST 23177 . 23587) ( TCP.QUIET.ECHOTEST 23589 . 24006) (TCP.SINKTEST 24008 . 24288) (GENERATE.RANDOM.CHARS 24290 . 24690) ( COPYBYTESTREAM 24692 . 25563) (TCP.COPYTOWINDOW 25565 . 25990) (TEST.CHECKSUM 25992 . 27226))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPDOMAIN b/obsolete/tcp/TCPDOMAIN new file mode 100644 index 00000000..1e9b8354 --- /dev/null +++ b/obsolete/tcp/TCPDOMAIN @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Jun-90 16:18:18" {DSK}local>lde>lispcore>library>TCPDOMAIN.;3 66928 changes to%: (VARS TCPDOMAINCOMS) previous date%: "28-Feb-89 18:35:51" {DSK}local>lde>lispcore>library>TCPDOMAIN.;2) (* ; " Copyright (c) 1986, 1987, 1988, 1989, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPDOMAINCOMS) (RPAQQ TCPDOMAINCOMS ((COMS (* ;; "TCP/IP Domain resolver implementation. RFC882, RFC883, RFC973") ) (COMS (* ;; "UDP protocol functions") (DECLARE%: DONTCOPY (EXPORT (CONSTANTS (\UDPDOMAIN.WDS 6)) (RECORDS DOMAIN.HEADER))) (INITVARS (\UDPDOMAIN.IPSOCKET)) (GLOBALVARS \UDPDOMAIN.IPSOCKET) (FILES (SYSLOAD) TCPUDP) (FNS \UDPDOM.PROCESS.RESPONSE \UDPDOM.QUERY \UDPDOM.IPSOCKET)) (COMS (* ;; "Protocol independent functions") [DECLARE%: DONTCOPY (EXPORT (CONSTANTS * DOMAIN.OPCODES) (CONSTANTS * DOMAIN.RCODES) (CONSTANTS * DOMAIN.RRTYPES) (CONSTANTS * DOMAIN.CLASSTYPES) (CONSTANTS (\DOMAIN.PORT 53] (INITVARS (\DOMAIN.DEFAULT.SERVER)) (GLOBALVARS \DOMAIN.DEFAULT.SERVER) (FNS \DOMAIN.NAME \DOMAIN.PACK.NAME.LIST \DOMAIN.PARSE.NAME \DOMAIN.RCODE.ERROR \DOMAIN.PROCESS.REDIRECT \DOMAIN.PROCESS.RESPONSE \DOMAIN.PROCESS.RR \DOMAIN.READ.ADDRESS \DOMAIN.READ.NAME.FROM.STREAM \DOMAIN.READ.STRING.FROM.STREAM \DOMAIN.SEARCH.FOR.CANONICAL.NAME \DOMAIN.SKIP.NAME.IN.STREAM \DOMAIN.SKIP.QUESTION \DOMAIN.SKIP.RR)) (COMS (* ;; "Functions to maintain the domain tree structure") (RECORDS DOMAIN.TREE.NODE DOMAIN.SERVER) (INITRECORDS DOMAIN.TREE.NODE) (FNS USTRINGHASHBITS) (INITVARS (\DOMAIN.ROOT (create DOMAIN.TREE.NODE NAME _ "")) (\DOMAIN.NAMESERVERS (HASHARRAY 50 1.2 (FUNCTION USTRINGHASHBITS) (FUNCTION STRING-EQUAL))) (\DOMAIN.UNKNOWN.DOMAINS) (\DOMAIN.GC.INTERVAL 600000) (\DOMAIN.GC.TIMER (SETUPTIMER \DOMAIN.GC.INTERVAL))) (GLOBALVARS \DOMAIN.ROOT \DOMAIN.NAMESERVERS \DOMAIN.UNKNOWN.DOMAINS \DOMAIN.GC.TIMER \DOMAIN.GC.INTERVAL) (FNS \DOMAIN.ADD.NEW.DOMAIN \DOMAIN.ADD.NAMESERVER \DOMAIN.AUGMENT.TREE \DOMAIN.CHOOSE.BEST.SERVERS \DOMAIN.FIND.DOMAIN.IN.TREE \DOMAIN.INIT \DOMAIN.INSERT.IN.TREE \DOMAIN.PATH \DOMAIN.SEARCH.RESOURCE.LIST \DOMAIN.DELETE.NAMESERVER \DOMAIN.AROUND.EXIT \DOMAIN.DELETE.TREE \DOMAIN.BACKGROUND \DOMAIN.GC.NAMESERVERS \DOMAIN.SORT.BY.SVC.TIME) (ADDVARS (BACKGROUNDFNS \DOMAIN.BACKGROUND))) (COMS (* ;; "Programmer's interface") (INITVARS (DOMAIN.TRACE.FLG) (DOMAIN.TRACE.FILE) (INTERNET.LOCAL.DOMAIN)) (GLOBALVARS DOMAIN.TRACE.FLG DOMAIN.TRACE.FILE INTERNET.LOCAL.DOMAIN) (FNS DOMAIN.INIT DOMAIN.LOOKUP.ADDRESS DOMAIN.LOOKUP.NAMESERVER DOMAIN.LOOKUP.OSTYPE DOMAIN.LOOKUP DOMAIN.GRAPH DOMAIN.NAME.EQUAL DOMAIN.TRACE DOMAIN.TRACEWINDOW.BUTTONFN)) (P (DOMAIN.INIT)))) (* ;; "TCP/IP Domain resolver implementation. RFC882, RFC883, RFC973") (* ;; "UDP protocol functions") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (RPAQQ \UDPDOMAIN.WDS 6) (CONSTANTS (\UDPDOMAIN.WDS 6)) ) (DECLARE%: EVAL@COMPILE (BLOCKRECORD DOMAIN.HEADER ((ID WORD) (RESPONSEFLG FLAG) (OPCODE BITS 4) (AUTHORITYFLG FLAG) (TRUNCATEDFLG FLAG) (WANTRECURSEFLG FLAG) (CANRECURSEFLG FLAG) (NIL BITS 3) (RESPONSECODE BITS 4) (QDCOUNT WORD) (ANCOUNT WORD) (NSCOUNT WORD) (ARCOUNT WORD))) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? \UDPDOMAIN.IPSOCKET ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \UDPDOMAIN.IPSOCKET) ) (FILESLOAD (SYSLOAD) TCPUDP) (DEFINEQ (\UDPDOM.PROCESS.RESPONSE [LAMBDA (DOMAIN.PATH RESPONSE) (* ejs%: " 5-Nov-86 13:38") (* * This function parses a query reponse packet) (LET ((RESPONSEBASE (fetch (UDP UDPCONTENTS) of RESPONSE))) (COND ((NEQ 0 (fetch (DOMAIN.HEADER ANCOUNT) of RESPONSEBASE)) (* * The response packet has the information we requested) (PROG1 (\DOMAIN.PROCESS.RESPONSE (\MAKEBASEBYTESTREAM RESPONSEBASE 0 (IDIFFERENCE (fetch (UDP UDPLENGTH) of RESPONSE) \UDPOVLEN) 'INPUT)) (\RELEASE.ETHERPACKET RESPONSE))) ((OR (NEQ 0 (fetch (DOMAIN.HEADER NSCOUNT) of RESPONSEBASE)) (NEQ 0 (fetch (DOMAIN.HEADER ARCOUNT) of RESPONSEBASE))) (* * The server we asked didn't know, but did tell us the name of a server  which might know) (PROG1 (\DOMAIN.PROCESS.REDIRECT (\MAKEBASEBYTESTREAM RESPONSEBASE 0 (IDIFFERENCE (fetch (UDP UDPLENGTH) of RESPONSE) \UDPOVLEN) 'INPUT)) (\RELEASE.ETHERPACKET RESPONSE))) (T (\RELEASE.ETHERPACKET RESPONSE) 'FAILED]) (\UDPDOM.QUERY [LAMBDA (DOMAIN TYPE CLASS SERVER) (* ejs%: " 5-Nov-86 13:40") (* * Make a domain query. Argument semantics should be self-evident if you've  read RFC882 and RFC883. Returns a list of answers, or atoms to indicate  failure--USE.TCP, etc) (LET* ((QUERY (\ALLOCATE.ETHERPACKET)) (ID (RAND 1 65534)) ANSWER DOMAINBASE) (* * Do basic QUERY initialization) (UDP.SETUP QUERY (OR SERVER \DOMAIN.DEFAULT.SERVER) \DOMAIN.PORT ID (\UDPDOM.IPSOCKET)) (SETQ DOMAINBASE (fetch (UDP UDPCONTENTS) of QUERY)) (* * Format header section) (replace (DOMAIN.HEADER ID) of DOMAINBASE with ID) (replace (DOMAIN.HEADER RESPONSEFLG) of DOMAINBASE with NIL) (replace (DOMAIN.HEADER AUTHORITYFLG) of DOMAINBASE with NIL) (replace (DOMAIN.HEADER TRUNCATEDFLG) of DOMAINBASE with NIL) (replace (DOMAIN.HEADER WANTRECURSEFLG) of DOMAINBASE with NIL) (replace (DOMAIN.HEADER CANRECURSEFLG) of DOMAINBASE with NIL) (replace (DOMAIN.HEADER OPCODE) of DOMAINBASE with DOMAIN.QUERY) (replace (DOMAIN.HEADER RESPONSECODE) of DOMAINBASE with 0) (replace (DOMAIN.HEADER QDCOUNT) of DOMAINBASE with 1) (replace (DOMAIN.HEADER ANCOUNT) of DOMAINBASE with 0) (replace (DOMAIN.HEADER NSCOUNT) of DOMAINBASE with 0) (replace (DOMAIN.HEADER ARCOUNT) of DOMAINBASE with 0) (UDP.INCREMENT.LENGTH QUERY (UNFOLD \UDPDOMAIN.WDS BYTESPERWORD)) (* * Add Query) [COND ((AND (NOT (NULL DOMAIN)) (NLISTP DOMAIN)) (SETQ DOMAIN (\DOMAIN.PARSE.NAME DOMAIN] (for NAME in DOMAIN do (UDP.APPEND.BYTE QUERY (NCHARS NAME)) (UDP.APPEND.STRING QUERY (MKSTRING NAME)) finally (UDP.APPEND.BYTE QUERY 0)) (UDP.APPEND.WORD QUERY TYPE) (UDP.APPEND.WORD QUERY CLASS) (* * Do the query) (bind RESPONSE RESPONSEBASE for I from 1 to \MAXETHERTRIES do (COND [(SETQ RESPONSE (UDP.EXCHANGE (\UDPDOM.IPSOCKET) QUERY 10000)) (SETQ RESPONSEBASE (fetch (UDP UDPCONTENTS) of RESPONSE)) (COND [(AND (EQ (fetch (DOMAIN.HEADER ID) of RESPONSEBASE) ID) (fetch (DOMAIN.HEADER RESPONSEFLG) of RESPONSEBASE)) (COND ((AND (fetch (DOMAIN.HEADER TRUNCATEDFLG) of RESPONSEBASE) (EQ (fetch (DOMAIN.HEADER ANCOUNT) of RESPONSEBASE) 0) (EQ (fetch (DOMAIN.HEADER NSCOUNT) of RESPONSEBASE) 0) (EQ (fetch (DOMAIN.HEADER RESPONSECODE) of RESPONSEBASE) RCODE.OK)) (SETQ ANSWER 'USE.TCP) (\RELEASE.ETHERPACKET RESPONSE) (GO $$OUT)) ((NEQ (fetch (DOMAIN.HEADER RESPONSECODE) of RESPONSEBASE) RCODE.OK) (SETQ ANSWER (\DOMAIN.RCODE.ERROR (fetch (DOMAIN.HEADER RESPONSECODE) of RESPONSEBASE))) (COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Error on query: " ANSWER))) (\RELEASE.ETHERPACKET RESPONSE) (GO $$OUT)) (T (SETQ ANSWER (\UDPDOM.PROCESS.RESPONSE DOMAIN RESPONSE)) (GO $$OUT] (T (\RELEASE.ETHERPACKET RESPONSE] (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Query to " (\IP.ADDRESS.TO.STRING (fetch (IP IPDESTINATIONADDRESS ) of QUERY) ) " timed out."))) finally (\RELEASE.ETHERPACKET QUERY) (RETURN ANSWER]) (\UDPDOM.IPSOCKET [LAMBDA NIL (* ejs%: "12-Apr-86 20:39") [COND ((NULL \UDPDOMAIN.IPSOCKET) (SETQ \UDPDOMAIN.IPSOCKET (UDP.OPEN.SOCKET))) ((NOT (\IP.FIND.SOCKET (fetch (IPSOCKET IPSOCKET) of \UDPDOMAIN.IPSOCKET) (\IP.FIND.PROTOCOL \UDP.PROTOCOL))) (SETQ \UDPDOMAIN.IPSOCKET (UDP.OPEN.SOCKET NIL 'ACCEPT] \UDPDOMAIN.IPSOCKET]) ) (* ;; "Protocol independent functions") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (RPAQQ DOMAIN.OPCODES ((DOMAIN.QUERY 0) (DOMAIN.IQUERY 1) (DOMAIN.CQUERYM 2) (DOMAIN.CQUERYU 3))) (DECLARE%: EVAL@COMPILE (RPAQQ DOMAIN.QUERY 0) (RPAQQ DOMAIN.IQUERY 1) (RPAQQ DOMAIN.CQUERYM 2) (RPAQQ DOMAIN.CQUERYU 3) (CONSTANTS (DOMAIN.QUERY 0) (DOMAIN.IQUERY 1) (DOMAIN.CQUERYM 2) (DOMAIN.CQUERYU 3)) ) (RPAQQ DOMAIN.RCODES ((RCODE.OK 0) (RCODE.FORMATERROR 1) (RCODE.SERVERFAILED 2) (RCODE.NAMEERROR 3) (RCODE.NOTIMPLEMENTED 4) (RCODE.REFUSED 5))) (DECLARE%: EVAL@COMPILE (RPAQQ RCODE.OK 0) (RPAQQ RCODE.FORMATERROR 1) (RPAQQ RCODE.SERVERFAILED 2) (RPAQQ RCODE.NAMEERROR 3) (RPAQQ RCODE.NOTIMPLEMENTED 4) (RPAQQ RCODE.REFUSED 5) (CONSTANTS (RCODE.OK 0) (RCODE.FORMATERROR 1) (RCODE.SERVERFAILED 2) (RCODE.NAMEERROR 3) (RCODE.NOTIMPLEMENTED 4) (RCODE.REFUSED 5)) ) (RPAQQ DOMAIN.RRTYPES ((RRTYPE.A 1) (RRTYPE.NS 2) (RRTYPE.MD 3) (RRTYPE.MF 4) (RRTYPE.CNAME 5) (RRTYPE.SOA 6) (RRTYPE.MB 7) (RRTYPE.MG 8) (RRTYPE.MR 9) (RRTYPE.NULL 10) (RRTYPE.WKS 11) (RRTYPE.PTR 12) (RRTYPE.HINFO 13) (RRTYPE.MINFO 14) (RRTYPE.MX 15))) (DECLARE%: EVAL@COMPILE (RPAQQ RRTYPE.A 1) (RPAQQ RRTYPE.NS 2) (RPAQQ RRTYPE.MD 3) (RPAQQ RRTYPE.MF 4) (RPAQQ RRTYPE.CNAME 5) (RPAQQ RRTYPE.SOA 6) (RPAQQ RRTYPE.MB 7) (RPAQQ RRTYPE.MG 8) (RPAQQ RRTYPE.MR 9) (RPAQQ RRTYPE.NULL 10) (RPAQQ RRTYPE.WKS 11) (RPAQQ RRTYPE.PTR 12) (RPAQQ RRTYPE.HINFO 13) (RPAQQ RRTYPE.MINFO 14) (RPAQQ RRTYPE.MX 15) (CONSTANTS (RRTYPE.A 1) (RRTYPE.NS 2) (RRTYPE.MD 3) (RRTYPE.MF 4) (RRTYPE.CNAME 5) (RRTYPE.SOA 6) (RRTYPE.MB 7) (RRTYPE.MG 8) (RRTYPE.MR 9) (RRTYPE.NULL 10) (RRTYPE.WKS 11) (RRTYPE.PTR 12) (RRTYPE.HINFO 13) (RRTYPE.MINFO 14) (RRTYPE.MX 15)) ) (RPAQQ DOMAIN.CLASSTYPES ((CLASSTYPE.IN 1) (CLASSTYPE.CSNET 2) (CLASSTYPE.CHAOS 3))) (DECLARE%: EVAL@COMPILE (RPAQQ CLASSTYPE.IN 1) (RPAQQ CLASSTYPE.CSNET 2) (RPAQQ CLASSTYPE.CHAOS 3) (CONSTANTS (CLASSTYPE.IN 1) (CLASSTYPE.CSNET 2) (CLASSTYPE.CHAOS 3)) ) (DECLARE%: EVAL@COMPILE (RPAQQ \DOMAIN.PORT 53) (CONSTANTS (\DOMAIN.PORT 53)) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? \DOMAIN.DEFAULT.SERVER ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \DOMAIN.DEFAULT.SERVER) ) (DEFINEQ (\DOMAIN.NAME [LAMBDA (DOMAIN.TREE.NODE) (* ejs%: "13-Apr-86 15:38") (* * Generate a list of domain names along the path to the root of the domain  tree) (COND ((NULL (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of DOMAIN.TREE.NODE)) NIL) (T (LET [(SUFFIX (\DOMAIN.NAME (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of DOMAIN.TREE.NODE ] (COND (SUFFIX (CONCAT (fetch (DOMAIN.TREE.NODE NAME) of DOMAIN.TREE.NODE) "." SUFFIX)) (T (fetch (DOMAIN.TREE.NODE NAME) of DOMAIN.TREE.NODE]) (\DOMAIN.PACK.NAME.LIST [LAMBDA (LIST) (* ejs%: "12-Apr-86 20:29") (COND ((LISTP LIST) (LET [(DOMAIN.NAME (ALLOCSTRING (IPLUS (SUB1 (LENGTH LIST)) (for NAME in LIST sum (NCHARS NAME] [bind (I _ 1) for NAME in LIST do (RPLSTRING DOMAIN.NAME I NAME) (add I (NCHARS NAME)) (COND ((ILESSP I (NCHARS DOMAIN.NAME)) (RPLCHARCODE DOMAIN.NAME I (CHARCODE %.)) (add I 1] DOMAIN.NAME)) (T (ALLOCSTRING 0]) (\DOMAIN.PARSE.NAME [LAMBDA (NAME) (* ejs%: "12-Apr-86 18:11") (* * This function parses a domain name  (e.g. SUMEX.STANFORD.EDU)%, and returns a list of domain labels  (SUMEX STANFORD EDU)) (bind (SCRATCHSTRING _ (CONSTANT (ALLOCSTRING 63))) NAMELIST (LENGTH _ 0) for CHAR instring (MKSTRING NAME) do (COND [(EQ CHAR (CHARCODE %.)) (COND ((NEQ 0 LENGTH) [SETQ NAMELIST (NCONC1 NAMELIST (CONCAT (SUBSTRING SCRATCHSTRING 1 LENGTH] (SETQ LENGTH 0] ((IGREATERP LENGTH 63) (ERROR "Domain name too long" SCRATCHSTRING)) (T (RPLCHARCODE SCRATCHSTRING (add LENGTH 1) CHAR))) finally (RETURN (COND [(NEQ LENGTH 0) (NCONC1 NAMELIST (CONCAT (SUBSTRING SCRATCHSTRING 1 LENGTH] (T NAMELIST]) (\DOMAIN.RCODE.ERROR [LAMBDA (CODE) (* ejs%: "12-Apr-86 19:15") (SELECTC CODE (RCODE.OK 'OK) (RCODE.FORMATERROR 'FORMAT.ERROR) (RCODE.SERVERFAILED 'SERVER.FAILED) (RCODE.NAMEERROR 'NAME.ERROR) (RCODE.NOTIMPLEMENTED 'NOT.IMPLEMENTED) (RCODE.REFUSED 'REFUSED) NIL]) (\DOMAIN.PROCESS.REDIRECT [LAMBDA (STREAM) (* ejs%: "12-Apr-86 21:04") (* * Skip past the header and query section to get to the answer section) (* * Past ID and flags in header) (\WIN STREAM) (\WIN STREAM) (LET ((%#QUESTIONS (\WIN STREAM)) (%#ANSWERS (\WIN STREAM)) (%#NSERVERS (\WIN STREAM)) (%#ADDITIONAL (\WIN STREAM))) (* * Past questions) (for I from 1 to %#QUESTIONS do (\DOMAIN.SKIP.QUESTION STREAM)) (* * Collect answers) (for I from 1 to %#ANSWERS collect (\DOMAIN.SKIP.RR STREAM)) (* * Collect rest) (APPEND (for I from 1 to %#NSERVERS collect (\DOMAIN.PROCESS.RR STREAM)) (for I from 1 to %#ADDITIONAL collect (\DOMAIN.PROCESS.RR STREAM]) (\DOMAIN.PROCESS.RESPONSE [LAMBDA (STREAM) (* ejs%: "12-Apr-86 19:58") (* * Skip past the header and query section to get to the answer section) (* * Past ID and flags in header) (\WIN STREAM) (\WIN STREAM) (LET ((%#QUESTIONS (\WIN STREAM)) (%#ANSWERS (\WIN STREAM))) (* * Past rest of header) (\WIN STREAM) (\WIN STREAM) (* * Past questions) (for I from 1 to %#QUESTIONS do (\DOMAIN.SKIP.QUESTION STREAM)) (* * Collect answers) (for I from 1 to %#ANSWERS collect (\DOMAIN.PROCESS.RR STREAM]) (\DOMAIN.PROCESS.RR [LAMBDA (STREAM) (* ejs%: "13-Apr-86 17:09") (* * Process a resource record beginning at the current point in the stream) (LET ((NAME (\DOMAIN.READ.NAME.FROM.STREAM STREAM)) (TYPE (\WIN STREAM)) (CLASS (\WIN STREAM)) (TTL (\MAKENUMBER (\WIN STREAM) (\WIN STREAM))) (RDLEN (\WIN STREAM)) ANSWER) [SETQ ANSWER `(NAME %, NAME TYPE %, TYPE CLASS %, CLASS TTL %, TTL DATA %, (SELECTC TYPE (RRTYPE.A (\DOMAIN.READ.ADDRESS STREAM CLASS (FOLDLO RDLEN BYTESPERCELL ))) ((LIST RRTYPE.CNAME RRTYPE.NS) (\DOMAIN.READ.NAME.FROM.STREAM STREAM)) (RRTYPE.HINFO (CONS (\DOMAIN.READ.STRING.FROM.STREAM STREAM) (\DOMAIN.READ.STRING.FROM.STREAM STREAM))) (PROGN (for I from 1 to RDLEN do (BIN STREAM)) NIL] [COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE (printout DOMAIN.TRACE.FILE "Answer received: " ANSWER] ANSWER]) (\DOMAIN.READ.ADDRESS [LAMBDA (STREAM CLASS %#ADDRESSES) (* ejs%: "12-Apr-86 20:56") (SELECTC CLASS (CLASSTYPE.IN [COND ((EQ %#ADDRESSES 0) NIL) [(NEQ %#ADDRESSES 1) (for I from 1 to %#ADDRESSES collect (\MAKENUMBER (\WIN STREAM) (\WIN STREAM] (T (\MAKENUMBER (\WIN STREAM) (\WIN STREAM]) NIL]) (\DOMAIN.READ.NAME.FROM.STREAM [LAMBDA (STREAM) (* ejs%: "12-Apr-86 20:54") (bind NAMELEN NAMELST until (EQ 0 (SETQ NAMELEN (BIN STREAM))) do [COND [(EQ 3 (LRSH NAMELEN 6)) (* * Process a pointer redirection) (LET ((CONTINUATIONADDR (create WORD HIBYTE _ (LOGAND NAMELEN (MASK.1'S 0 6)) LOBYTE _ (BIN STREAM))) (STREAMPTR (GETFILEPTR STREAM))) (SETFILEPTR STREAM CONTINUATIONADDR) (RETURN (PROG1 (COND (NAMELST (CONCAT (\DOMAIN.PACK.NAME.LIST (DREVERSE NAMELST)) "." (\DOMAIN.READ.NAME.FROM.STREAM STREAM))) (T (\DOMAIN.READ.NAME.FROM.STREAM STREAM))) (SETFILEPTR STREAM STREAMPTR] (T (* * Normal name segment) (LET ((NAME (ALLOCSTRING NAMELEN))) (\BINS STREAM (fetch (STRINGP BASE) of NAME) (fetch (STRINGP OFFST) of NAME) NAMELEN) (push NAMELST NAME] finally (RETURN (\DOMAIN.PACK.NAME.LIST (DREVERSE NAMELST]) (\DOMAIN.READ.STRING.FROM.STREAM [LAMBDA (STREAM) (* ejs%: "13-Apr-86 02:33") (LET* ((NAMELEN (BIN STREAM)) (STRING (ALLOCSTRING NAMELEN))) (for I from 1 to NAMELEN do (RPLCHARCODE STRING I (BIN STREAM))) STRING]) (\DOMAIN.SEARCH.FOR.CANONICAL.NAME [LAMBDA (NAME RRLST) (* ejs%: "14-Nov-86 14:44") (bind FOUNDIT DATA for RR in RRLST thereis (AND (EQ RRTYPE.CNAME (LISTGET RR 'TYPE)) (DOMAIN.NAME.EQUAL (LISTGET RR 'NAME) NAME) (SETQ FOUNDIT T)) finally (RETURN (AND FOUNDIT (LISTGET RR 'DATA]) (\DOMAIN.SKIP.NAME.IN.STREAM [LAMBDA (STREAM) (* ejs%: "12-Apr-86 21:06") (bind NAMELEN NAMELST until (EQ 0 (SETQ NAMELEN (BIN STREAM))) do (COND ((EQ 3 (LRSH NAMELEN 6)) (* * Process a pointer redirection) (BIN STREAM)) (T (* * Normal name segment) (for I from 1 to NAMELEN do (BIN STREAM]) (\DOMAIN.SKIP.QUESTION [LAMBDA (STREAM) (* ejs%: "12-Apr-86 21:06") (* * Skip over a question section--composed of compressed name, QTYPE, and  QCLASS fields) (\DOMAIN.SKIP.NAME.IN.STREAM STREAM) (\WIN STREAM) (\WIN STREAM]) (\DOMAIN.SKIP.RR [LAMBDA (STREAM) (* ejs%: "12-Apr-86 21:10") (* * Skip a resource record beginning at the current point in the stream) (* * Name) (\DOMAIN.SKIP.NAME.IN.STREAM STREAM) (* * Type) (\WIN STREAM) (* * Class) (\WIN STREAM) (* * Time to Live) (\WIN STREAM) (\WIN STREAM) (* * RDATA Length) (for I from 0 to (\WIN STREAM) do (BIN STREAM]) ) (* ;; "Functions to maintain the domain tree structure") (DECLARE%: EVAL@COMPILE (DATATYPE DOMAIN.TREE.NODE ((NAME POINTER) (* The name of this domain) (SUBDOMAINS POINTER) (* List of domains inferior to this  one) (SUPERDOMAIN POINTER) (* The domain of which this domain  is a part) (NAMESERVERS POINTER) (* The list of designated name  servers for this domain) )) (RECORD DOMAIN.SERVER (NAME ADDRESSES EXPIRATION.DATE FOR.DOMAINS AVG.SVC.TIME) AVG.SVC.TIME _ 0) ) (/DECLAREDATATYPE 'DOMAIN.TREE.NODE '(POINTER POINTER POINTER POINTER) '((DOMAIN.TREE.NODE 0 POINTER) (DOMAIN.TREE.NODE 2 POINTER) (DOMAIN.TREE.NODE 4 POINTER) (DOMAIN.TREE.NODE 6 POINTER)) '8) (/DECLAREDATATYPE 'DOMAIN.TREE.NODE '(POINTER POINTER POINTER POINTER) '((DOMAIN.TREE.NODE 0 POINTER) (DOMAIN.TREE.NODE 2 POINTER) (DOMAIN.TREE.NODE 4 POINTER) (DOMAIN.TREE.NODE 6 POINTER)) '8) (DEFINEQ (USTRINGHASHBITS [LAMBDA (STRING) (* ejs%: " 5-Nov-86 13:20") (for C inthinstring (MKSTRING STRING) bind (HASHBITS _ 0) do [SETQ HASHBITS (IPLUS16 (ELT UPPERCASEARRAY C) (IPLUS16 (SETQ HASHBITS (IPLUS16 HASHBITS (LLSH (LOGAND HASHBITS 4095) 2))) (LLSH (LOGAND HASHBITS 255) 8] finally (RETURN HASHBITS]) ) (RPAQ? \DOMAIN.ROOT (create DOMAIN.TREE.NODE NAME _ "")) (RPAQ? \DOMAIN.NAMESERVERS (HASHARRAY 50 1.2 (FUNCTION USTRINGHASHBITS) (FUNCTION STRING-EQUAL))) (RPAQ? \DOMAIN.UNKNOWN.DOMAINS ) (RPAQ? \DOMAIN.GC.INTERVAL 600000) (RPAQ? \DOMAIN.GC.TIMER (SETUPTIMER \DOMAIN.GC.INTERVAL)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \DOMAIN.ROOT \DOMAIN.NAMESERVERS \DOMAIN.UNKNOWN.DOMAINS \DOMAIN.GC.TIMER \DOMAIN.GC.INTERVAL) ) (DEFINEQ (\DOMAIN.ADD.NEW.DOMAIN [LAMBDA (NODE DOMAIN NAMESERVER ADDRESSES TTL) (* ejs%: "25-Apr-86 12:25") (* * Add DOMAIN as a subdomain of NODE, with name service by NAMESERVER, at  addresses ADDRESSES, with expiration TTL seconds from now) (LET ((SUBDOMAIN (create DOMAIN.TREE.NODE SUPERDOMAIN _ NODE NAME _ DOMAIN))) (push (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of NODE) SUBDOMAIN) [COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Adding " DOMAIN " as subdomain of " (\DOMAIN.NAME NODE] (COND (NAMESERVER (* Add name server information to  new subdomain) (COND (DOMAIN.TRACE.FLG (printout DOMAIN.TRACE.FILE " with name server " NAMESERVER)) ) (\DOMAIN.ADD.NAMESERVER SUBDOMAIN NAMESERVER ADDRESSES TTL]) (\DOMAIN.ADD.NAMESERVER [LAMBDA (NODE NAMESERVER ADDRESSES TTL) (* ejs%: "25-Apr-86 12:34") (* * Function called to add name server information to a node in the domain  tree. If ADDRESSES is NIL, this function will query the internet to resolve  the information) (COND (NAMESERVER (LET [(DOMAIN.SERVER (OR (GETHASH NAMESERVER \DOMAIN.NAMESERVERS) (PUTHASH NAMESERVER (create DOMAIN.SERVER NAME _ NAMESERVER ADDRESSES _ ADDRESSES EXPIRATION.DATE _ (IPLUS (IDATE) (OR (NUMBERP TTL) 3600))) \DOMAIN.NAMESERVERS] [COND ([AND (NULL ADDRESSES) (NULL (SETQ ADDRESSES (fetch (DOMAIN.SERVER ADDRESSES) of DOMAIN.SERVER] (SETQ ADDRESSES (replace (DOMAIN.SERVER ADDRESSES) of DOMAIN.SERVER with (OR ADDRESSES (DOMAIN.LOOKUP.ADDRESS NAMESERVER NIL T] (COND [ADDRESSES (COND ((NOT (for SERVER in (fetch (DOMAIN.TREE.NODE NAMESERVERS) of NODE) thereis (STRING-EQUAL SERVER NAMESERVER))) [COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Adding " NAMESERVER " as new name server for " (\DOMAIN.NAME NODE] (push (fetch (DOMAIN.TREE.NODE NAMESERVERS) of NODE) NAMESERVER) (push (fetch (DOMAIN.SERVER FOR.DOMAINS) of DOMAIN.SERVER) NODE] (T (PUTHASH NAMESERVER NIL \DOMAIN.NAMESERVERS]) (\DOMAIN.AUGMENT.TREE [LAMBDA (RRLST) (* ejs%: "14-Nov-86 14:30") (* * RRLST is a list of RRTYPE.NS and/or RRTYPE.A records.  Build up our model of the internet domain tree by processing the information  in RRLST) (bind NAMESERVER for RR in RRLST do (COND ((EQ (LISTGET RR 'TYPE) RRTYPE.NS) (SETQ NAMESERVER (LISTGET RR 'DATA)) (\DOMAIN.INSERT.IN.TREE (LISTGET RR 'NAME) NAMESERVER (\DOMAIN.SEARCH.RESOURCE.LIST RRLST NAMESERVER RRTYPE.A NIL) (LISTGET RR 'TTL]) (\DOMAIN.CHOOSE.BEST.SERVERS [LAMBDA (DOMAIN) (* ejs%: " 1-May-86 17:15") (* * This function chooses the best servers for a query to resolve DOMAIN) (LET* [(PATH (COND ((AND (NLISTP DOMAIN) DOMAIN) (DREVERSE (\DOMAIN.PARSE.NAME DOMAIN))) (T DOMAIN))) (BEST.CHOICE (bind NEXT (CURRENT _ \DOMAIN.ROOT) for NAME in PATH while [SETQ NEXT (for SUBDOMAIN in (fetch ( DOMAIN.TREE.NODE SUBDOMAINS) of CURRENT) thereis (STRING-EQUAL NAME (fetch (DOMAIN.TREE.NODE NAME) of SUBDOMAIN ] do (SETQ CURRENT NEXT) finally (RETURN CURRENT] [while BEST.CHOICE do (COND ((fetch (DOMAIN.TREE.NODE NAMESERVERS) of BEST.CHOICE ) (RETURN)) (T (SETQ BEST.CHOICE (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of BEST.CHOICE] [COND ((EQ BEST.CHOICE \DOMAIN.ROOT) (* Here we have a problem. Is the request for a subdomain of ROOT  (e.g. COM, GOV, EDU, etc)%, or for a local name in our own domain?) (COND [(AND (EQLENGTH PATH 1) (for SUBDOMAIN in (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of \DOMAIN.ROOT) thereis (STRING-EQUAL (CAR PATH) (fetch (DOMAIN.TREE.NODE NAME) of SUBDOMAIN] (T (* Heuristic%: If the domain doesn't appear to be a subdomain of the root,  assume that the local domain server will know it.  If we're wrong, the local name server will tell us) (SETQ BEST.CHOICE NIL] (COND [(NULL BEST.CHOICE) (COND ((OR (EQLENGTH PATH 1) (NULL (fetch (DOMAIN.TREE.NODE NAMESERVERS) of \DOMAIN.ROOT))) (COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Best choice for " DOMAIN " is our local server: " \DOMAIN.DEFAULT.SERVER))) (SORT (MKLIST \DOMAIN.DEFAULT.SERVER) (FUNCTION \DOMAIN.SORT.BY.SVC.TIME))) (T (COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Best choice for " DOMAIN " is the root server"))) (SORT (fetch (DOMAIN.TREE.NODE NAMESERVERS) of \DOMAIN.ROOT) (FUNCTION \DOMAIN.SORT.BY.SVC.TIME] (T [COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Best choice(s) for " DOMAIN ": " (fetch (DOMAIN.TREE.NODE NAMESERVERS) of BEST.CHOICE] (SORT (fetch (DOMAIN.TREE.NODE NAMESERVERS) of BEST.CHOICE) (FUNCTION \DOMAIN.SORT.BY.SVC.TIME]) (\DOMAIN.FIND.DOMAIN.IN.TREE [LAMBDA (NAME) (* ejs%: "13-Apr-86 01:25") (COND ((STREQUAL NAME "") \DOMAIN.ROOT) (T (LET ([PATH (COND ((LISTP NAME) (REVERSE NAME)) (T (DREVERSE (\DOMAIN.PARSE.NAME NAME] (CURRENT \DOMAIN.ROOT)) (bind NEXT for NODE on PATH do (COND ([NOT (SETQ NEXT (for SUBDOMAIN in (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of CURRENT) thereis (STRING-EQUAL (CAR NODE) (fetch (DOMAIN.TREE.NODE NAME) of SUBDOMAIN ] (RETURN (CONS CURRENT NODE))) (T (SETQ CURRENT NEXT))) finally (RETURN CURRENT]) (\DOMAIN.INIT [LAMBDA (EVENT) (* ejs%: " 1-May-86 15:46") (SETQ \DOMAIN.DEFAULT.SERVER (bind NAME for SERVER in (fetch (IPINIT DOMAIN.SERVERS) of \IP.DEFAULT.CONFIGURATION ) as SERVER# from 1 collect (SETQ NAME (CONCAT "Local-Domain-Server-" SERVER#)) (PUTHASH NAME (create DOMAIN.SERVER NAME _ NAME EXPIRATION.DATE _ MAX.FIXP ADDRESSES _ (LIST (\IP.READ.STRING.ADDRESS SERVER))) \DOMAIN.NAMESERVERS) NAME]) (\DOMAIN.INSERT.IN.TREE [LAMBDA (DOMAIN NAMESERVER ADDRESSES TTL) (* ejs%: "25-Apr-86 12:21") (* * Given information from an RRTYPE.NS record, add an entry to the domain  tree) (LET ((PARTIAL.PATH (\DOMAIN.FIND.DOMAIN.IN.TREE DOMAIN))) (COND ((type? DOMAIN.TREE.NODE PARTIAL.PATH) (* Found it) (\DOMAIN.ADD.NAMESERVER PARTIAL.PATH NAMESERVER ADDRESSES TTL)) ((EQLENGTH PARTIAL.PATH 2) (* Only one away from previous  knowledge?) (\DOMAIN.ADD.NEW.DOMAIN (CAR PARTIAL.PATH) (CADR PARTIAL.PATH) NAMESERVER ADDRESSES TTL)) (T (* Some number of domains between our deepest knowledge and the desired  domain) (\DOMAIN.ADD.NEW.DOMAIN (CAR PARTIAL.PATH) (CADR PARTIAL.PATH)) (\DOMAIN.INSERT.IN.TREE DOMAIN NAMESERVER ADDRESSES TTL]) (\DOMAIN.PATH [LAMBDA (DOMAIN.TREE.NODE) (* ejs%: "13-Apr-86 14:44") (* * Generate a list of domain names along the path to the root of the domain  tree) (COND ((NULL (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of DOMAIN.TREE.NODE)) NIL) (T (CONS (fetch (DOMAIN.TREE.NODE NAME) of DOMAIN.TREE.NODE) (\DOMAIN.PATH (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of DOMAIN.TREE.NODE]) (\DOMAIN.SEARCH.RESOURCE.LIST [LAMBDA (RRLST NAME TYPE OK.TO.RETURN.NAME) (* ejs%: "14-Nov-86 14:40") (LET [(ANSWER (bind DATA for RR in RRLST collect (SETQ DATA (LISTGET RR 'DATA)) (COND ((AND DATA (EQ TYPE RRTYPE.A) OK.TO.RETURN.NAME) (LISTGET RR 'NAME)) (T DATA)) when (AND (EQ TYPE (LISTGET RR 'TYPE)) (DOMAIN.NAME.EQUAL (LISTGET RR 'NAME) NAME] (COND (ANSWER) (T (LET [(CANONICAL.NAME (bind FOUNDIT DATA for RR in RRLST thereis (AND (EQ RRTYPE.CNAME (LISTGET RR 'TYPE)) (DOMAIN.NAME.EQUAL (LISTGET RR 'NAME) NAME) (SETQ FOUNDIT T)) finally (RETURN (AND FOUNDIT (LISTGET RR 'DATA] (COND (CANONICAL.NAME (\DOMAIN.SEARCH.RESOURCE.LIST RRLST CANONICAL.NAME TYPE OK.TO.RETURN.NAME]) (\DOMAIN.DELETE.NAMESERVER [LAMBDA (NAMESERVER) (* ejs%: "13-Apr-86 18:35") (LET ((DOMAIN.SERVER (GETHASH NAMESERVER \DOMAIN.NAMESERVERS))) (COND (DOMAIN.SERVER [bind NAMESERVERS for DOMAIN in (fetch (DOMAIN.SERVER FOR.DOMAINS) of DOMAIN.SERVER) do (SETQ NAMESERVERS (fetch (DOMAIN.TREE.NODE NAMESERVERS) of DOMAIN)) (bind for NAME in NAMESERVERS when (STRING-EQUAL NAME NAMESERVER) do (replace (DOMAIN.TREE.NODE NAMESERVERS) of DOMAIN with (DREMOVE NAME NAMESERVERS] (PUTHASH NAMESERVER NIL \DOMAIN.NAMESERVERS]) (\DOMAIN.AROUND.EXIT [LAMBDA (EVENT) (* ejs%: "13-Apr-86 18:30") (SELECTQ EVENT ((NIL AFTERLOGOUT AFTERSYSOUT AFTERMAKESYS AFTERSAVEVM) (\DOMAIN.DELETE.TREE)) NIL]) (\DOMAIN.DELETE.TREE [LAMBDA NIL (* ejs%: "13-Apr-86 17:39") (* * Undoes circularity in pointers between levels of the tree) (bind (OPEN _ (LIST \DOMAIN.ROOT)) CLOSED CURRENT while OPEN do (SETQ CURRENT (pop OPEN)) (SETQ OPEN (APPEND (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of CURRENT) OPEN)) (replace (DOMAIN.TREE.NODE SUBDOMAINS) of CURRENT with NIL) (replace (DOMAIN.TREE.NODE NAME) of CURRENT with NIL) (replace (DOMAIN.TREE.NODE NAMESERVERS) of CURRENT with NIL) (replace (DOMAIN.TREE.NODE SUPERDOMAIN) of CURRENT with NIL)) [MAPHASH \DOMAIN.NAMESERVERS (FUNCTION (LAMBDA (DOMAIN.SERVER NAME) (replace (DOMAIN.SERVER FOR.DOMAINS) of DOMAIN.SERVER with NIL] (CLRHASH \DOMAIN.NAMESERVERS) NIL]) (\DOMAIN.BACKGROUND [LAMBDA NIL (* ejs%: "13-Apr-86 18:24") (COND ((TIMEREXPIRED? \DOMAIN.GC.TIMER) (\DOMAIN.GC.NAMESERVERS) (SETQ \DOMAIN.GC.TIMER (SETUPTIMER \DOMAIN.GC.INTERVAL \DOMAIN.GC.TIMER]) (\DOMAIN.GC.NAMESERVERS [LAMBDA NIL (* ; "Edited 11-Feb-89 12:36 by akw:") (* * This function maps over the name server hash array, and removes old  servers which have timed out) (LET ((TIME (IDATE))) (DECLARE (SPECVARS TIME)) [MAPHASH \DOMAIN.NAMESERVERS (FUNCTION (LAMBDA (DOMAIN.SERVER NAME) (DECLARE (USEDFREE TIME)) (COND ((MEMBER NAME (fetch (IPINIT DOMAIN.SERVERS) of \IP.DEFAULT.CONFIGURATION )) T) ((ILESSP (fetch (DOMAIN.SERVER EXPIRATION.DATE) of DOMAIN.SERVER) TIME) (COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE "Name server " NAME " has expired; deleting..."))) (\DOMAIN.DELETE.NAMESERVER NAME] NIL]) (\DOMAIN.SORT.BY.SVC.TIME [LAMBDA (NAME1 NAME2) (* ejs%: "13-Apr-86 18:14") (LET ((R1 (GETHASH NAME1 \DOMAIN.NAMESERVERS)) (R2 (GETHASH NAME2 \DOMAIN.NAMESERVERS))) (ILESSP (OR (fetch (DOMAIN.SERVER AVG.SVC.TIME) of R1) 0) (OR (fetch (DOMAIN.SERVER AVG.SVC.TIME) of R2) 0]) ) (ADDTOVAR BACKGROUNDFNS \DOMAIN.BACKGROUND) (* ;; "Programmer's interface") (RPAQ? DOMAIN.TRACE.FLG ) (RPAQ? DOMAIN.TRACE.FILE ) (RPAQ? INTERNET.LOCAL.DOMAIN ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS DOMAIN.TRACE.FLG DOMAIN.TRACE.FILE INTERNET.LOCAL.DOMAIN) ) (DEFINEQ (DOMAIN.INIT [LAMBDA NIL (* ; "Edited 15-Feb-88 17:26 by Snow") (* ;; "Called to initialize the domain service for this host") (DECLARE (GLOBALVARS \DOMAIN.DEFAULT.SERVER INTERNET.LOCAL.DOMAIN)) (if (NOT \IP.DEFAULT.CONFIGURATION) then (PROMPTPRINT "Internet domain code is loaded, but disabled.") else (LET [(LOCAL.DOMAIN.SERVERS (fetch (IPINIT DOMAIN.SERVERS) of \IP.DEFAULT.CONFIGURATION )) (LOCAL.DOMAIN (MKSTRING (fetch (IPINIT LOCAL.DOMAIN) of \IP.DEFAULT.CONFIGURATION ] (COND ((AND LOCAL.DOMAIN.SERVERS LOCAL.DOMAIN) (SETQ \DOMAIN.DEFAULT.SERVER (for ADDR inside LOCAL.DOMAIN.SERVERS collect (MKSTRING ADDR))) (SETQ INTERNET.LOCAL.DOMAIN LOCAL.DOMAIN) (for NAMESERVER in LOCAL.DOMAIN.SERVERS do (\DOMAIN.INSERT.IN.TREE LOCAL.DOMAIN (MKSTRING NAMESERVER) (LIST (DODIP.HOSTP NAMESERVER)) MAX.FIXP))) (T (PROMPTPRINT "Internet domain code is loaded, but disabled."]) (DOMAIN.LOOKUP.ADDRESS [LAMBDA (NAME SERVER DONT.GET.OSTYPE) (* ; "Edited 15-Feb-89 15:14 by welch") (* * Programmer's interface to lookup IP Internet host name using the domain  system) (bind (OPEN _ (OR (MKLIST SERVER) (\DOMAIN.CHOOSE.BEST.SERVERS NAME))) CANONICAL.NAME CLOSED ADDRESSES THIS.SERVER ANSWER OSTYPE (ATOMIC-NAME _ (MKATOM (U-CASE NAME))) while OPEN do (SETQ THIS.SERVER (pop OPEN)) (push CLOSED THIS.SERVER) (SETQ ANSWER (DOMAIN.LOOKUP NAME RRTYPE.A THIS.SERVER)) (COND ((SETQ ADDRESSES (\DOMAIN.SEARCH.RESOURCE.LIST ANSWER NAME RRTYPE.A)) (\DOMAIN.AUGMENT.TREE ANSWER) [SETQ OSTYPE (COND (DONT.GET.OSTYPE NIL) (T (DOMAIN.LOOKUP.OSTYPE NAME] (PUTHASH ATOMIC-NAME (create HOSTS.TXT.ENTRY HTE.TYPE _ 'HOST HTE.ADDRESSES _ ADDRESSES HTE.NAMES _ (LIST ATOMIC-NAME) HTE.OS.TYPE _ OSTYPE) \IP.HOSTNAMES) (RETURN ADDRESSES)) (ANSWER (COND ([SETQ CANONICAL.NAME (MKATOM (U-CASE (  \DOMAIN.SEARCH.FOR.CANONICAL.NAME NAME ANSWER] (SETQ ADDRESSES (DOMAIN.LOOKUP.ADDRESS CANONICAL.NAME SERVER)) (PUTHASH ATOMIC-NAME (GETHASH CANONICAL.NAME \IP.HOSTNAMES ) \IP.HOSTNAMES) (RETURN ADDRESSES)) (T (\DOMAIN.AUGMENT.TREE ANSWER) (SETQ OPEN (APPEND (for NEXT.SERVER in (  \DOMAIN.SEARCH.RESOURCE.LIST ANSWER '* RRTYPE.A T) when (NOT (MEMBER NEXT.SERVER CLOSED)) collect NEXT.SERVER) OPEN]) (DOMAIN.LOOKUP.NAMESERVER [LAMBDA (NAME SERVER) (* ejs%: "25-Apr-86 12:55") (* * Programmer's interface to lookup IP Internet host name using the domain  system) (bind (OPEN _ (OR (MKLIST SERVER) (\DOMAIN.CHOOSE.BEST.SERVERS NAME))) CLOSED NAMESERVERS THIS.SERVER ANSWER while OPEN do (SETQ THIS.SERVER (pop OPEN)) (push CLOSED THIS.SERVER) (SETQ ANSWER (DOMAIN.LOOKUP NAME RRTYPE.NS THIS.SERVER)) (COND ((SETQ NAMESERVERS (\DOMAIN.SEARCH.RESOURCE.LIST ANSWER NAME RRTYPE.NS)) (\DOMAIN.AUGMENT.TREE ANSWER) (RETURN NAMESERVERS)) (ANSWER (\DOMAIN.AUGMENT.TREE ANSWER) (SETQ OPEN (APPEND (for NEXT.SERVER in (\DOMAIN.SEARCH.RESOURCE.LIST ANSWER '* RRTYPE.A T) when (NOT (MEMBER NEXT.SERVER CLOSED)) collect NEXT.SERVER) OPEN]) (DOMAIN.LOOKUP.OSTYPE [LAMBDA (NAME SERVER) (* ejs%: "14-Nov-86 14:46") (* * Programmer's interface to lookup IP Internet host name using the domain  system) (bind (OPEN _ (OR (MKLIST SERVER) (\DOMAIN.CHOOSE.BEST.SERVERS NAME))) CANONICAL.NAME CLOSED CPU.OSTYPES THIS.SERVER ANSWER while OPEN do (SETQ THIS.SERVER (pop OPEN)) (push CLOSED THIS.SERVER) (SETQ ANSWER (DOMAIN.LOOKUP NAME RRTYPE.HINFO THIS.SERVER)) (COND [(SETQ CPU.OSTYPES (\DOMAIN.SEARCH.RESOURCE.LIST ANSWER NAME RRTYPE.HINFO)) (\DOMAIN.AUGMENT.TREE ANSWER) (RETURN (MKATOM (U-CASE (CDAR CPU.OSTYPES] (ANSWER (COND ((SETQ CANONICAL.NAME (\DOMAIN.SEARCH.FOR.CANONICAL.NAME NAME ANSWER)) (RETURN (DOMAIN.LOOKUP.OSTYPE CANONICAL.NAME SERVER))) (T (\DOMAIN.AUGMENT.TREE ANSWER) (SETQ OPEN (APPEND (for NEXT.SERVER in (\DOMAIN.SEARCH.RESOURCE.LIST ANSWER '* RRTYPE.A T) when (NOT (MEMBER NEXT.SERVER CLOSED)) collect NEXT.SERVER) OPEN]) (DOMAIN.LOOKUP [LAMBDA (NAME TYPE SERVER) (* ; "Edited 15-Feb-88 17:24 by Snow") (* ;;; "Programmer's interface to lookup IP Internet host name using the domain system") (PROG ((DOMAIN.PATH (\DOMAIN.PARSE.NAME NAME)) (RETRYCOUNT 0) ANSWER ADDRESS TIMINGFLG START.TIME) (OR TYPE (SETQ TYPE RRTYPE.A)) [COND [(LISTP SERVER) (SETQ ADDRESS (COND [(LISTP (CAR SERVER)) (* ;  "Handles a list of DOMAIN.SERVER records") (CAR (fetch (DOMAIN.SERVER ADDRESSES) of (CAR SERVER] (T (* ; "Handles a list of addresses") (CAR SERVER] (SERVER (* ; "Handles a single address") (SETQ ADDRESS SERVER)) (T (SETQ SERVER \DOMAIN.DEFAULT.SERVER) (SETQ ADDRESS (CAR SERVER] [COND ((STRINGP ADDRESS) (SETQ ADDRESS (CAR (fetch (DOMAIN.SERVER ADDRESSES) of (SETQ TIMINGFLG (GETHASH ADDRESS \DOMAIN.NAMESERVERS ] (COND (DOMAIN.TRACE.FLG (FRESHLINE DOMAIN.TRACE.FILE) (PRIN1 "Type " DOMAIN.TRACE.FILE) (PRINTCONSTANT TYPE DOMAIN.RRTYPES DOMAIN.TRACE.FILE) (printout DOMAIN.TRACE.FILE " query to " (COND ((NUMBERP SERVER) (\IP.ADDRESS.TO.STRING SERVER)) (T SERVER)) " for " NAME T))) LOOP (add RETRYCOUNT 1) [COND (TIMINGFLG (SETQ START.TIME (IDATE] [SETQ ANSWER (COND ((NULL ANSWER) (\UDPDOM.QUERY DOMAIN.PATH TYPE CLASSTYPE.IN ADDRESS)) ((EQ ANSWER 'USE.TCP) (\TCPDOM.QUERY DOMAIN.PATH TYPE CLASSTYPE.IN ADDRESS] [COND (TIMINGFLG (replace (DOMAIN.SERVER AVG.SVC.TIME) of TIMINGFLG with (IDIFFERENCE (IDATE) START.TIME] (COND ((LITATOM ANSWER) (SELECTQ ANSWER (NIL (COND ((LISTP SERVER) (SETQ SERVER (CDR SERVER)) [SETQ ADDRESS (CAR (fetch (DOMAIN.SERVER ADDRESSES) of (CAR SERVER] (SETQ RETRYCOUNT 0) (GO LOOP)) (T (RETURN ANSWER)))) (NAME.ERROR (RETURN NIL)) (USE.TCP (COND ((EQ RETRYCOUNT 1) (GO LOOP)) (T (RETURN NIL)))) (RETURN ANSWER))) (T (RETURN ANSWER]) (DOMAIN.GRAPH [LAMBDA (WINDOW) (* ; "Edited 19-Mar-87 16:58 by FS") (LET ((OPENLIST (LIST \DOMAIN.ROOT)) NODELST) (bind NODE while OPENLIST do (SETQ NODE (pop OPENLIST)) (push NODELST (create GRAPHNODE NODELABEL _ (COND ((NULL (fetch (DOMAIN.TREE.NODE SUPERDOMAIN) of NODE)) "*ROOT*") (T (fetch (DOMAIN.TREE.NODE NAME) of NODE))) NODEID _ NODE TONODES _ (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of NODE))) (SETQ OPENLIST (APPEND (fetch (DOMAIN.TREE.NODE SUBDOMAINS) of NODE) OPENLIST))) (SHOWGRAPH (LAYOUTGRAPH NODELST (LIST \DOMAIN.ROOT) 'HORIZONTAL) WINDOW (FUNCTION (LAMBDA (NODE W) (COND (NODE (INSPECT (fetch (GRAPHNODE NODEID) of NODE))) (T (DOMAIN.GRAPH W]) (DOMAIN.NAME.EQUAL [LAMBDA (NAME1 NAME2) (* ejs%: "13-Apr-86 17:23") (COND ((OR (EQ NAME1 '*) (EQ NAME2 '*)) T) (T (OR (LISTP NAME1) (SETQ NAME1 (\DOMAIN.PARSE.NAME NAME1))) (OR (LISTP NAME2) (SETQ NAME2 (\DOMAIN.PARSE.NAME NAME2))) (COND ((OR (AND (NULL NAME1) NAME2) (AND (NULL NAME2) NAME1)) NIL) (T (for X in NAME1 as Y in NAME2 always (STRING-EQUAL X Y]) (DOMAIN.TRACE [LAMBDA (MODE) (* ejs%: "13-Apr-86 16:12") [COND ((WINDOWP DOMAIN.TRACE.FILE) (OPENW DOMAIN.TRACE.FILE)) (T (SETQ DOMAIN.TRACE.FILE (CREATEW NIL "Domain Trace File")) (DSPSCROLL 'ON DOMAIN.TRACE.FILE) (DSPFONT '(GACHA 8) DOMAIN.TRACE.FILE) (WINDOWPROP DOMAIN.TRACE.FILE 'BUTTONEVENTFN (FUNCTION DOMAIN.TRACEWINDOW.BUTTONFN)) (WINDOWPROP DOMAIN.TRACE.FILE 'CLOSEFN (FUNCTION (LAMBDA NIL (SETQ DOMAIN.TRACE.FLG NIL) (SETQ DOMAIN.TRACE.FILE] (SETQ DOMAIN.TRACE.FLG MODE]) (DOMAIN.TRACEWINDOW.BUTTONFN [LAMBDA (WINDOW) (* ejs%: "13-Apr-86 15:49") (COND ((MOUSESTATE (NOT UP)) (SETQ DOMAIN.TRACE.FLG (SELECTQ DOMAIN.TRACE.FLG (NIL T) (T NIL) NIL)) (printout WINDOW T "[Tracing " (SELECTQ DOMAIN.TRACE.FLG (T "on") "off") "]" T]) ) (DOMAIN.INIT) (PUTPROPS TCPDOMAIN COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (4891 12420 (\UDPDOM.PROCESS.RESPONSE 4901 . 6651) (\UDPDOM.QUERY 6653 . 11968) ( \UDPDOM.IPSOCKET 11970 . 12418)) (15354 27202 (\DOMAIN.NAME 15364 . 16190) (\DOMAIN.PACK.NAME.LIST 16192 . 17169) (\DOMAIN.PARSE.NAME 17171 . 18511) (\DOMAIN.RCODE.ERROR 18513 . 18946) ( \DOMAIN.PROCESS.REDIRECT 18948 . 19944) (\DOMAIN.PROCESS.RESPONSE 19946 . 20717) (\DOMAIN.PROCESS.RR 20719 . 22311) (\DOMAIN.READ.ADDRESS 22313 . 22999) (\DOMAIN.READ.NAME.FROM.STREAM 23001 . 24730) ( \DOMAIN.READ.STRING.FROM.STREAM 24732 . 25048) (\DOMAIN.SEARCH.FOR.CANONICAL.NAME 25050 . 25758) ( \DOMAIN.SKIP.NAME.IN.STREAM 25760 . 26267) (\DOMAIN.SKIP.QUESTION 26269 . 26599) (\DOMAIN.SKIP.RR 26601 . 27200)) (28554 29256 (USTRINGHASHBITS 28564 . 29254)) (29754 50847 (\DOMAIN.ADD.NEW.DOMAIN 29764 . 30996) (\DOMAIN.ADD.NAMESERVER 30998 . 34156) (\DOMAIN.AUGMENT.TREE 34158 . 35305) ( \DOMAIN.CHOOSE.BEST.SERVERS 35307 . 39679) (\DOMAIN.FIND.DOMAIN.IN.TREE 39681 . 40954) (\DOMAIN.INIT 40956 . 41749) (\DOMAIN.INSERT.IN.TREE 41751 . 42869) (\DOMAIN.PATH 42871 . 43387) ( \DOMAIN.SEARCH.RESOURCE.LIST 43389 . 45139) (\DOMAIN.DELETE.NAMESERVER 45141 . 46218) ( \DOMAIN.AROUND.EXIT 46220 . 46475) (\DOMAIN.DELETE.TREE 46477 . 48201) (\DOMAIN.BACKGROUND 48203 . 48489) (\DOMAIN.GC.NAMESERVERS 48491 . 50427) (\DOMAIN.SORT.BY.SVC.TIME 50429 . 50845)) (51144 66800 ( DOMAIN.INIT 51154 . 52770) (DOMAIN.LOOKUP.ADDRESS 52772 . 56193) (DOMAIN.LOOKUP.NAMESERVER 56195 . 57556) (DOMAIN.LOOKUP.OSTYPE 57558 . 59197) (DOMAIN.LOOKUP 59199 . 62699) (DOMAIN.GRAPH 62701 . 64901) (DOMAIN.NAME.EQUAL 64903 . 65527) (DOMAIN.TRACE 65529 . 66257) (DOMAIN.TRACEWINDOW.BUTTONFN 66259 . 66798))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPEXPORTS b/obsolete/tcp/TCPEXPORTS new file mode 100644 index 00000000..f700b47b --- /dev/null +++ b/obsolete/tcp/TCPEXPORTS @@ -0,0 +1 @@ +(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") (LISPXPRIN1 "EXPORTS GATHERED FROM {ERIS}Library>TCP*.; ON 11-Sep-89 16:08:46" T) (LISPXTERPRI T) (RPAQQ \TCP.CTRL.ACK 16) (RPAQQ \TCP.CTRL.FIN 1) (RPAQQ \TCP.CTRL.PSH 8) (RPAQQ \TCP.CTRL.RST 4) (RPAQQ \TCP.CTRL.SYN 2) (RPAQQ \TCP.CTRL.URG 32) (CONSTANTS \TCP.CTRL.ACK \TCP.CTRL.FIN \TCP.CTRL.PSH \TCP.CTRL.RST \TCP.CTRL.SYN \TCP.CTRL.URG) (RPAQQ \TCPOPT.END 0) (RPAQQ \TCPOPT.NOP 1) (RPAQQ \TCPOPT.MAXSEG 2) (CONSTANTS \TCPOPT.END \TCPOPT.NOP \TCPOPT.MAXSEG) (RPAQQ \TCP.PROTOCOL 6) (CONSTANTS \TCP.PROTOCOL) (RPAQQ \TCP.HEADER.LENGTH 20) (CONSTANTS \TCP.HEADER.LENGTH) (RPAQQ \TCP.MIN.DATA.OFFSET 5) (CONSTANTS \TCP.MIN.DATA.OFFSET) (RPAQQ \TCP.DEFAULT.MAXSEG 536) (CONSTANTS \TCP.DEFAULT.MAXSEG) (ACCESSFNS TCPSEGMENT ((TCPHEADER (\IPDATABASE DATUM))) (BLOCKRECORD TCPHEADER ((TCP.SRC.PORT WORD) ( TCP.DST.PORT WORD) (TCP.SEQ FIXP) (TCP.ACK FIXP) (TCP.DATA.OFFSET BITS 4) (TCP.MBZ BITS 6) (TCP.CTRL BITS 6) (TCP.WINDOW WORD) (TCP.CHECKSUM WORD) (TCP.URG.PTR WORD))) (ACCESSFNS TCPSEGMENT (( TCP.DATA.LENGTH (fetch (IP IPHEADERCHECKSUM) of DATUM) (replace (IP IPHEADERCHECKSUM) of DATUM with NEWVALUE)) (TCP.SRC.ADDR (fetch (IP IPSOURCEADDRESS) of DATUM) (replace (IP IPSOURCEADDRESS) of DATUM with NEWVALUE)) (TCP.DST.ADDR (fetch (IP IPDESTINATIONADDRESS) of DATUM) (replace (IP IPDESTINATIONADDRESS) of DATUM with NEWVALUE)) (TCP.HEADER.LENGTH (LLSH (fetch TCP.DATA.OFFSET of DATUM) 2)) (TCP.CONTENTS (\ADDBASE (fetch TCPHEADER of DATUM) (UNFOLD (fetch TCP.DATA.OFFSET of DATUM) WORDSPERCELL))) (TCP.OPTIONS (\ADDBASE (fetch TCPHEADER of DATUM) (UNFOLD \TCP.MIN.DATA.OFFSET WORDSPERCELL)))))) (DATATYPE TCP.CONTROL.BLOCK ((TCB.LOCK POINTER) (* ; "monitor lock for synchronizing access") ( TCB.STATE POINTER) (* ; "one of CLOSED LISTEN SYN.SENT SYN.RECEIVED ESTABLISHED FIN.WAIT.1 FIN.WAIT.2 CLOSE.WAIT CLOSING LAST.ACK TIME.WAIT" ) (TCB.SND.STREAM POINTER) (* ; "user's send stream") (TCB.SND.SEGMENT POINTER) (* ; "current output packet being filled") (TCB.RCV.STREAM POINTER) (* ; "user's receive stream") ( TCB.RCV.SEGMENT POINTER) (* ; "current input packet being read") (TCB.2MSL.TIMER POINTER) (* ; "2*MSL quiet time") (TCB.MAXSEG POINTER) (* ; "maximum segment size") (TCB.CLOSEDFLG POINTER) (* ; "T if user has initiated close (no more data to send)") (TCB.FINSEQ POINTER) (* ; "one past the sequence number of the FIN we sent") (TCB.ACKFLG POINTER) (* ; "when to ACK peer: NOW or LATER") (TCB.TEMPLATE POINTER) (* ; "TCP header template") (TCB.PH POINTER) (* ; "TCP pseudo-header for checksumming") (TCB.SRC.PORT WORD) (* ; "local port") (TCB.DST.PORT WORD) (* ; "remote port") (TCB.DST.HOST FIXP) (* ; "remote host address") (TCB.INPUT.QUEUE POINTER) (* ; "queue of received segments to be read") (TCB.REXMT.QUEUE POINTER) (* ; "queue of unacked segments to be retransmitted") (TCB.SND.UNA FIXP) (* ; "first unacknowledged sequence number") (TCB.SND.NXT FIXP) (* ; "next sequence number to be sent") ( TCB.SND.UP FIXP) (* ; "send urgent pointer") (TCB.SND.WL1 FIXP) (* ; "segment sequence number used for last window update") (TCB.SND.WL2 FIXP) (* ; "segment acknowledgment number used for last window update") (TCB.ISS FIXP) (* ; "initial send sequence number") (TCB.SND.WND WORD) (* ; "send window") (TCB.RCV.WND WORD) (* ; "receive window") (TCB.RCV.NXT FIXP) (* ; "next sequence number expected") (TCB.RCV.UP FIXP) (* ; "receive urgent pointer") (TCB.IRS FIXP) (* ; "initial receive sequence number") (TCB.USER.TIMEOUT POINTER) (* ; "in milliseconds") (TCB.ESTABLISHED POINTER) (* ; "processes waiting for this event are notified when the connection becomes established") ( TCB.SND.EVENT POINTER) (* ; "processes waiting for this event are notified when the send window opens up") (TCB.RCV.EVENT POINTER) (* ; "processes waiting for this event are notified when data is received") (TCB.URGENT.EVENT POINTER ) (* ; "processes waiting for this event are notified when urgent data is received") ( TCB.FINACKED.EVENT POINTER) (* ; "processes waiting for this event are notified when our FIN has been acked") (TCB.MODE POINTER) (* ; "ACTIVE or PASSIVE") (TCB.RTFLG POINTER) (* ; "T if round trip time being measured") (TCB.RTSEQ POINTER) (* ; "sequence number being timed") (TCB.RTTIMER POINTER) (* ; "round trip timer") (TCB.SRTT POINTER) (* ; "smoothed round trip time") (TCB.RTO POINTER) (* ; "retransmission timeout based on smoothed round trip time") (TCB.PROBE.TIMER POINTER) (* ; "timer for delayed ACKs and window probes") (TCB.IPSOCKET POINTER) (* ; "Pointer to open IP socket for this connection") (TCB.PROCESS POINTER) (* ; "TCP monitor process for this connection") (TCB.SENT.ZERO FLAG) (* ; "Sent a zero allocation last time") (TCB.OUTPUT.HELD FLAG) (* ; "True if output window shut") ( TCB.NO.IDLE.PROBING FLAG) (* ; "True if we don't probe when nothing to output") (NIL BITS 5) ( TCB.OUR.MAXSEG WORD) (TCB.LAST.SENT.RCV.WND WORD) (* ; "The value of the last rcv window we sent")) TCB.LOCK _ (CREATE.MONITORLOCK) TCB.STATE _ (QUOTE CLOSED) TCB.RCV.WND _ \TCP.DEFAULT.RECEIVE.WINDOW TCB.USER.TIMEOUT _ \TCP.DEFAULT.USER.TIMEOUT TCB.ESTABLISHED _ (CREATE.EVENT) TCB.SND.EVENT _ ( CREATE.EVENT) TCB.RCV.EVENT _ (CREATE.EVENT) TCB.URGENT.EVENT _ (CREATE.EVENT) TCB.FINACKED.EVENT _ ( CREATE.EVENT) TCB.MAXSEG _ \TCP.DEFAULT.MAXSEG TCB.OUR.MAXSEG _ \TCP.DEFAULT.MAXSEG TCB.SRTT _ \TCP.INITIAL.RTO TCB.RTO _ \TCP.INITIAL.RTO) (ACCESSFNS TCPSTREAM ((TCB (fetch (STREAM F1) of DATUM) (replace (STREAM F1) of DATUM with NEWVALUE)) (BYTECOUNT (fetch (STREAM F2) of DATUM) (replace (STREAM F2) of DATUM with NEWVALUE)) (ACCESS (fetch ( STREAM ACCESS) of DATUM) (replace (STREAM ACCESS) of DATUM with NEWVALUE)) (ORIGINAL.COFFSET (fetch ( STREAM FW6) of DATUM) (replace (STREAM FW6) of DATUM with NEWVALUE))) (CREATE (create STREAM DEVICE _ \TCP.DEVICE))) (PUTPROP (QUOTE TCP) (QUOTE IMPORTDATE) (IDATE " 6-Sep-89 17:01:28")) (PUTPROP (QUOTE TCPCHAT) (QUOTE IMPORTDATE) (IDATE " 7-Jul-88 18:21:44")) (RECORD IPINIT (LOCAL.ADDRESSES LOCAL.NETWORKS DEFAULT.GATEWAY HTE.FILE HOSTNAME SUBNETMASK DOMAIN.SERVERS LOCAL.DOMAIN LOCAL.NSHOSTNUMBER)) (PUTPROP (QUOTE TCPCONFIG) (QUOTE IMPORTDATE) (IDATE "18-Apr-88 21:05:32")) (PUTPROP (QUOTE TCPDEBUG) (QUOTE IMPORTDATE) (IDATE "16-Apr-87 15:16:27")) (RPAQQ \UDPDOMAIN.WDS 6) (CONSTANTS (\UDPDOMAIN.WDS 6)) (BLOCKRECORD DOMAIN.HEADER ((ID WORD) (RESPONSEFLG FLAG) (OPCODE BITS 4) (AUTHORITYFLG FLAG) ( TRUNCATEDFLG FLAG) (WANTRECURSEFLG FLAG) (CANRECURSEFLG FLAG) (NIL BITS 3) (RESPONSECODE BITS 4) ( QDCOUNT WORD) (ANCOUNT WORD) (NSCOUNT WORD) (ARCOUNT WORD))) (RPAQQ DOMAIN.OPCODES ((DOMAIN.QUERY 0) (DOMAIN.IQUERY 1) (DOMAIN.CQUERYM 2) (DOMAIN.CQUERYU 3))) (RPAQQ DOMAIN.QUERY 0) (RPAQQ DOMAIN.IQUERY 1) (RPAQQ DOMAIN.CQUERYM 2) (RPAQQ DOMAIN.CQUERYU 3) (CONSTANTS (DOMAIN.QUERY 0) (DOMAIN.IQUERY 1) (DOMAIN.CQUERYM 2) (DOMAIN.CQUERYU 3)) (RPAQQ DOMAIN.RCODES ((RCODE.OK 0) (RCODE.FORMATERROR 1) (RCODE.SERVERFAILED 2) (RCODE.NAMEERROR 3) ( RCODE.NOTIMPLEMENTED 4) (RCODE.REFUSED 5))) (RPAQQ RCODE.OK 0) (RPAQQ RCODE.FORMATERROR 1) (RPAQQ RCODE.SERVERFAILED 2) (RPAQQ RCODE.NAMEERROR 3) (RPAQQ RCODE.NOTIMPLEMENTED 4) (RPAQQ RCODE.REFUSED 5) (CONSTANTS (RCODE.OK 0) (RCODE.FORMATERROR 1) (RCODE.SERVERFAILED 2) (RCODE.NAMEERROR 3) ( RCODE.NOTIMPLEMENTED 4) (RCODE.REFUSED 5)) (RPAQQ DOMAIN.RRTYPES ((RRTYPE.A 1) (RRTYPE.NS 2) (RRTYPE.MD 3) (RRTYPE.MF 4) (RRTYPE.CNAME 5) ( RRTYPE.SOA 6) (RRTYPE.MB 7) (RRTYPE.MG 8) (RRTYPE.MR 9) (RRTYPE.NULL 10) (RRTYPE.WKS 11) (RRTYPE.PTR 12) (RRTYPE.HINFO 13) (RRTYPE.MINFO 14) (RRTYPE.MX 15))) (RPAQQ RRTYPE.A 1) (RPAQQ RRTYPE.NS 2) (RPAQQ RRTYPE.MD 3) (RPAQQ RRTYPE.MF 4) (RPAQQ RRTYPE.CNAME 5) (RPAQQ RRTYPE.SOA 6) (RPAQQ RRTYPE.MB 7) (RPAQQ RRTYPE.MG 8) (RPAQQ RRTYPE.MR 9) (RPAQQ RRTYPE.NULL 10) (RPAQQ RRTYPE.WKS 11) (RPAQQ RRTYPE.PTR 12) (RPAQQ RRTYPE.HINFO 13) (RPAQQ RRTYPE.MINFO 14) (RPAQQ RRTYPE.MX 15) (CONSTANTS (RRTYPE.A 1) (RRTYPE.NS 2) (RRTYPE.MD 3) (RRTYPE.MF 4) (RRTYPE.CNAME 5) (RRTYPE.SOA 6) ( RRTYPE.MB 7) (RRTYPE.MG 8) (RRTYPE.MR 9) (RRTYPE.NULL 10) (RRTYPE.WKS 11) (RRTYPE.PTR 12) ( RRTYPE.HINFO 13) (RRTYPE.MINFO 14) (RRTYPE.MX 15)) (RPAQQ DOMAIN.CLASSTYPES ((CLASSTYPE.IN 1) (CLASSTYPE.CSNET 2) (CLASSTYPE.CHAOS 3))) (RPAQQ CLASSTYPE.IN 1) (RPAQQ CLASSTYPE.CSNET 2) (RPAQQ CLASSTYPE.CHAOS 3) (CONSTANTS (CLASSTYPE.IN 1) (CLASSTYPE.CSNET 2) (CLASSTYPE.CHAOS 3)) (RPAQQ \DOMAIN.PORT 53) (CONSTANTS (\DOMAIN.PORT 53)) (PUTPROP (QUOTE tcpdomain) (QUOTE IMPORTDATE) (IDATE "15-Feb-88 17:40:22")) (PUTPROP (QUOTE tcpexports) (QUOTE IMPORTDATE) (IDATE " 6-Sep-89 17:23:47")) (ACCESSFNS TCPDATASTREAM ((TCPCONTROLDEVICE (fetch (STREAM F3) of DATUM) (replace (STREAM F3) of DATUM with NEWVALUE)) (SEENEOS (fetch (STREAM F4) of DATUM) (replace (STREAM F4) of DATUM with NEWVALUE)) ( TCPFTPCON (fetch (STREAM F5) of DATUM) (replace (STREAM F5) of DATUM with NEWVALUE)))) (RECORD TCPFTPCON (TCPIN TCPOUT DATASTREAM BUSY? IDLETIMER GENERATEFILESDIRECTORY)) (PUTPROP (QUOTE TCPFTP) (QUOTE IMPORTDATE) (IDATE "11-Sep-89 15:22:47")) (PUTPROP (QUOTE tcpftpsrv) (QUOTE IMPORTDATE) (IDATE "24-Aug-87 18:26:25")) (PUTPROP (QUOTE TCPHTE) (QUOTE IMPORTDATE) (IDATE "24-May-88 17:06:10")) (ACCESSFNS AR ((ARBASE (LOCF (fetch (ETHERPACKET EPBODY) of DATUM)))) (BLOCKRECORD ARBASE (( ARHARDWARESPACE WORD) (ARPROTOCOLSPACE WORD) (ARHARDWARELEN BYTE) (ARPROTOCOLLEN BYTE) (AROPCODE WORD) (AR1STWORD WORD)) (ACCESSFNS AR1STWORD ((ARCONTENTS (LOCF DATUM)))))) (ACCESSFNS ARETHER ((ARETHERBASE (fetch (AR ARCONTENTS) of DATUM))) (BLOCKRECORD ARETHERBASE (( ARLCLHDW0 WORD) (ARLCLHDW1 WORD) (ARLCLHDW2 WORD) (ARLCLPTCL FIXP) (ARFRNHDW0 WORD) (ARFRNHDW1 WORD) ( ARFRNHDW2 WORD) (ARFRNPTCL FIXP)) (ACCESSFNS ARLCLHDW0 ((ARSENDERHDW (\LOADNSHOSTNUMBER (LOCF DATUM)) (\STORENSHOSTNUMBER (LOCF DATUM) NEWVALUE)))) (ACCESSFNS ARFRNHDW0 ((ARTARGETHDW (\LOADNSHOSTNUMBER ( LOCF DATUM)) (\STORENSHOSTNUMBER (LOCF DATUM) NEWVALUE)))))) (ACCESSFNS AREXPETHER ((ARETHERBASE (fetch (AR ARCONTENTS) of DATUM))) (BLOCKRECORD ARETHERBASE (( ARLCLHDW WORD) (ARLCLPTCL FIXP) (ARFRNHDW WORD) (ARFRNPTCL FIXP)))) (DATATYPE ARENTRY ((RECENT FLAG) (SEARCHING FLAG) (IPADDRESS POINTER) (ETHERADDRESS POINTER) (TIMER POINTER)) TIMER _ (NCREATE (QUOTE FIXP))) (RPAQQ \AR.HARDWARE.SPACE.ETHERNET 1) (RPAQQ \AR.ETHERNET.ADDRESS.LENGTH 6) (RPAQQ \AR.IP.ADDRESS.LENGTH 4) (RPAQQ \AR.REQUEST 1) (RPAQQ \AR.RESPONSE 2) (RPAQQ \AR.ETHER.PACKET.LENGTH 28) (CONSTANTS (\AR.HARDWARE.SPACE.ETHERNET 1) (\AR.ETHERNET.ADDRESS.LENGTH 6) (\AR.IP.ADDRESS.LENGTH 4) ( \AR.REQUEST 1) (\AR.RESPONSE 2) (\AR.ETHER.PACKET.LENGTH 28)) (PUTPROP (QUOTE TCPLLAR) (QUOTE IMPORTDATE) (IDATE " 6-Sep-89 15:50:14")) (ACCESSFNS ICMPADMASK ((ICMPADMASKBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPADMASKBASE ((ICMPADMASKID WORD) (ICMPADMASKSEQNO WORD) (ICMPADMASKADMASK FIXP)))) (ACCESSFNS ICMP ((ICMPBASE (\IPDATABASE DATUM))) (BLOCKRECORD ICMPBASE ((ICMPTYPE BYTE) (ICMPCODE BYTE ) (ICMPCHECKSUM WORD) (ICMPDATASTART WORD))) (ACCESSFNS ICMP ((ICMPCONTENTS (LOCF (fetch (ICMP ICMPDATASTART) of DATUM)))))) (ACCESSFNS ICMPECHO ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPECHOBASE (( ICMPECHOID WORD) (ICMPECHOSEQNO WORD) (ICMPECHODATA BYTE)))) (ACCESSFNS ICMPDESTUN ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPECHOBASE ((NIL FIXP) (ICMPIPSTART WORD))) (ACCESSFNS ICMPDESTUN ((ICMPIPHEADER (LOCF (fetch (ICMPDESTUN ICMPIPSTART) of DATUM)))))) (ACCESSFNS ICMPREDIRECT ((ICMPREDIRECTBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPREDIRECTBASE ((ICMPGATEWAY FIXP) (ICMPIPSTART WORD))) (ACCESSFNS ICMPREDIRECT ((ICMPIPHEADER (LOCF (fetch (ICMPREDIRECT ICMPIPSTART) of DATUM)))))) (RPAQQ ICMPTYPES ((\ICMP.ECHO.REPLY 0) (\ICMP.DEST.UNREACHABLE 3) (\ICMP.SOURCE.QUENCH 4) ( \ICMP.REDIRECT 5) (\ICMP.ECHO 8) (\ICMP.TIME.EXCEEDED 11) (\ICMP.PARAMETER.PROBLEM 12) ( \ICMP.TIMESTAMP 13) (\ICMP.TIMESTAMP.REPLY 14) (\ICMP.INFO.REQUEST 15) (\ICMP.INFO.REPLY 16) ( \ICMP.ADDRESS.MASK.REQUEST 17) (\ICMP.ADDRESS.MASK.REPLY 18))) (RPAQQ \ICMP.ECHO.REPLY 0) (RPAQQ \ICMP.DEST.UNREACHABLE 3) (RPAQQ \ICMP.SOURCE.QUENCH 4) (RPAQQ \ICMP.REDIRECT 5) (RPAQQ \ICMP.ECHO 8) (RPAQQ \ICMP.TIME.EXCEEDED 11) (RPAQQ \ICMP.PARAMETER.PROBLEM 12) (RPAQQ \ICMP.TIMESTAMP 13) (RPAQQ \ICMP.TIMESTAMP.REPLY 14) (RPAQQ \ICMP.INFO.REQUEST 15) (RPAQQ \ICMP.INFO.REPLY 16) (RPAQQ \ICMP.ADDRESS.MASK.REQUEST 17) (RPAQQ \ICMP.ADDRESS.MASK.REPLY 18) (CONSTANTS (\ICMP.ECHO.REPLY 0) (\ICMP.DEST.UNREACHABLE 3) (\ICMP.SOURCE.QUENCH 4) (\ICMP.REDIRECT 5) (\ICMP.ECHO 8) (\ICMP.TIME.EXCEEDED 11) (\ICMP.PARAMETER.PROBLEM 12) (\ICMP.TIMESTAMP 13) ( \ICMP.TIMESTAMP.REPLY 14) (\ICMP.INFO.REQUEST 15) (\ICMP.INFO.REPLY 16) (\ICMP.ADDRESS.MASK.REQUEST 17 ) (\ICMP.ADDRESS.MASK.REPLY 18)) (RPAQQ ICMPUNREACHABLES ((\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) ( \ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5 ))) (RPAQQ \ICMP.NET.UNREACHABLE 0) (RPAQQ \ICMP.HOST.UNREACHABLE 1) (RPAQQ \ICMP.PROTOCOL.UNREACHABLE 2) (RPAQQ \ICMP.PORT.UNREACHABLE 3) (RPAQQ \ICMP.CANT.FRAGMENT 4) (RPAQQ \ICMP.SOURCE.ROUTE 5) (CONSTANTS (\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) ( \ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5)) (RPAQQ ICMPREDIRECTS ((\ICMP.REDIRECT.NET 0) (\ICMP.REDIRECT.HOST 1) (\ICMP.REDIRECT.SVC.AND.NET 2) ( \ICMP.REDIRECT.SVC.AND.HOST 3))) (RPAQQ \ICMP.REDIRECT.NET 0) (RPAQQ \ICMP.REDIRECT.HOST 1) (RPAQQ \ICMP.REDIRECT.SVC.AND.NET 2) (RPAQQ \ICMP.REDIRECT.SVC.AND.HOST 3) (CONSTANTS (\ICMP.REDIRECT.NET 0) (\ICMP.REDIRECT.HOST 1) (\ICMP.REDIRECT.SVC.AND.NET 2) ( \ICMP.REDIRECT.SVC.AND.HOST 3)) (RPAQQ ICMPTIMEXS ((\ICMP.TRANSIT.TIME.EXCEEDED 0) (\ICMP.FRAGMENT.TIME.EXCEEDED 1))) (RPAQQ \ICMP.TRANSIT.TIME.EXCEEDED 0) (RPAQQ \ICMP.FRAGMENT.TIME.EXCEEDED 1) (CONSTANTS (\ICMP.TRANSIT.TIME.EXCEEDED 0) (\ICMP.FRAGMENT.TIME.EXCEEDED 1)) (RPAQQ \ICMPOVLEN 4) (CONSTANTS \ICMPOVLEN) (RPAQQ \ICMP.PROTOCOL 1) (CONSTANTS \ICMP.PROTOCOL) (PUTPROPS ICMPLENGTH MACRO (LAMBDA (ICMP) (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of ICMP) (LLSH (fetch (IP IPHEADERLENGTH) of ICMP) 2)))) (PUTPROP (QUOTE TCPLLICMP) (QUOTE IMPORTDATE) (IDATE " 6-Sep-89 16:28:51")) (ACCESSFNS IP ((IPBASE (LOCF (fetch (ETHERPACKET EPBODY) of DATUM)))) (BLOCKRECORD IPBASE ((IPVERSION BITS 4) (* ; "Protocol version") (IPHEADERLENGTH BITS 4) (* ; "Head length, in cells") (IPSERVICE BYTE ) (* ; "Service type") (IPTOTALLENGTH WORD) (* ; "Packet length, in bytes") (IPID WORD) (* ; "Packet id") (NIL BITS 1) (IPDONTFRAGMENT FLAG) (* ; "Don't fragment me") (IPMOREFRAGMENTS FLAG) (* ; "Last fragment") (IPFRAGMENTOFFSET BITS 13) (* ; "Fragment position") (IPTIMETOLIVE BYTE) (* ; "Hop limiter") (IPPROTOCOL BYTE) (* ; "Client protocol") (IPHEADERCHECKSUM WORD) (* ; "Header-only checksum") (IPSOURCEADDRESS FIXP) (IPDESTINATIONADDRESS FIXP) (IPOPTIONSSTART BYTE) (* ; "Options or data start here")) (ACCESSFNS IPSERVICE ((IPSERVICEBASE (LOCF DATUM))) (BLOCKRECORD IPSERVICEBASE ((IPPRECEDENCE BITS 3) (IPDELAY FLAG) (IPTHROUGHPUT FLAG) (IPRELIABILITY FLAG) (NIL BITS 2)))) (* ; "Replace is not supported on any of the following because there is ambiguity about the address class." ) (ACCESSFNS IPDESTINATIONADDRESS ((IPDESTBASE (LOCF DATUM))) (ACCESSFNS IPDESTBASE ((IPDESTINATIONNET (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSANET) of DATUM)) ( (EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBNET) of DATUM)) (T (* ; "Class C or error") (fetch (IPADDRESS CLASSCNET) of DATUM)))) (IPDESTINATIONHOST (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSAHOST) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBHOST) of DATUM)) (T (* ; "Class C or error") (fetch (IPADDRESS CLASSCHOST) of DATUM))))))) (ACCESSFNS IPSOURCEADDRESS (( IPSOURCEBASE (LOCF DATUM))) (ACCESSFNS IPSOURCEBASE ((IPSOURCENET (COND ((EQ \IP.CLASS.A (fetch ( IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSANET) of DATUM)) ((EQ \IP.CLASS.B (fetch ( IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBNET) of DATUM)) (T (fetch (IPADDRESS CLASSCNET) of DATUM)))) (IPSOURCEHOST (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch ( IPADDRESS CLASSAHOST) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch ( IPADDRESS CLASSBHOST) of DATUM)) (T (fetch (IPADDRESS CLASSCHOST) of DATUM)))))))) (TYPE? (type? ETHERPACKET DATUM))) (DATATYPE IPSOCKET ((PROTOCOL BYTE) (IPSLINK POINTER) (* ; "Other sockets of this protocol type") (NIL BYTE) (IPSQUEUE POINTER) (* ; "Queue of packets for this protocol") (IPSQUEUELENGTH WORD) (* ; "Count of packets of input queue") (IPSQUEUEALLOC WORD) (* ; "Max count allowed") ( IPSDESTSOCKETCOMPAREFN POINTER) (* ; "Call this to compare dest protocol socket to this socket") ( IPSOCKET POINTER) (* ; "This socket") (IPSINPUTFN POINTER) (* ; "Call to hand packet to protocol") ( IPSEVENT POINTER) (* ; "Notify me when a packet arrives") (IPSNOSOCKETFN POINTER) (* ; "Call this when no socket found") (IPSICMPFN POINTER) (* ; "Call this when an ICMP packet is received on this protocol")) IPSQUEUE _ (create SYSQUEUE) IPSQUEUEALLOC _ \IP.MAX.EPKTS.ON.QUEUE IPSEVENT _ (CREATE.EVENT) IPSINPUTFN _ (FUNCTION \IP.DEFAULT.INPUTFN) IPSICMPFN _ (FUNCTION \RELEASE.ETHERPACKET)) (BLOCKRECORD IPADDRESS ((ADDRESS FIXP)) (* ;; "Class A nets: high bit is 0") (BLOCKRECORD IPADDRESS (( CLASSA BITS 1) (CLASSANET BITS 7) (CLASSAHOST BITS 24))) (* ;; "Class B nets: high 2 bits are 10") ( BLOCKRECORD IPADDRESS ((CLASSB BITS 2))) (BLOCKRECORD IPADDRESS ((CLASSBNET BITS 16) (CLASSBHOST BITS 16))) (* ;; "Class C nets: high 3 bits are 110") (BLOCKRECORD IPADDRESS ((CLASSC BITS 3))) ( BLOCKRECORD IPADDRESS ((CLASSCNETB1 BITS 8) (CLASSCNETB2 BITS 8) (CLASSCNETB3 BITS 8) (CLASSCHOST BITS 8))) (* ; "I wish I could say just net bits 24, host bits 8, but BLOCKRECORD barfs") (BLOCKRECORD IPADDRESS ((CLASSCNETHI BITS 16))) (ACCESSFNS IPADDRESS ((CLASSCNET (\MAKENUMBER (FETCH CLASSCNETB1 OF DATUM) (LOGOR (LLSH (FETCH CLASSCNETB2 OF DATUM) 8) (FETCH CLASSCNETB3 OF DATUM))) (PROGN (REPLACE CLASSCNETHI OF DATUM WITH (LRSH NEWVALUE 8)) (REPLACE CLASSCNETB3 OF DATUM WITH (LOGAND NEWVALUE 255)) DATUM))))) (RPAQQ \IPOVLEN 20) (RPAQQ \MAX.IPDATALENGTH 556) (RPAQQ \IP.PROTOCOLVERSION 4) (RPAQQ \IP.MAX.EPKTS.ON.QUEUE 16) (RPAQQ \IP.DEFAULT.TIME.TO.LIVE 120) (RPAQQ \IP.WAKEUP.INTERVAL 15000) (CONSTANTS \IPOVLEN \MAX.IPDATALENGTH \IP.PROTOCOLVERSION \IP.MAX.EPKTS.ON.QUEUE \IP.DEFAULT.TIME.TO.LIVE \IP.WAKEUP.INTERVAL) (RPAQQ IPPACKETTYPES ((\EPT.IP 2048) (\EPT.AR 2054) (\EET.IP 513) (\EPT.CHAOS 2052))) (RPAQQ \EPT.IP 2048) (RPAQQ \EPT.AR 2054) (RPAQQ \EET.IP 513) (RPAQQ \EPT.CHAOS 2052) (CONSTANTS (\EPT.IP 2048) (\EPT.AR 2054) (\EET.IP 513) (\EPT.CHAOS 2052)) (RPAQQ ICMPUNREACHABLES ((\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) ( \ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5 ))) (RPAQQ \ICMP.NET.UNREACHABLE 0) (RPAQQ \ICMP.HOST.UNREACHABLE 1) (RPAQQ \ICMP.PROTOCOL.UNREACHABLE 2) (RPAQQ \ICMP.PORT.UNREACHABLE 3) (RPAQQ \ICMP.CANT.FRAGMENT 4) (RPAQQ \ICMP.SOURCE.ROUTE 5) (CONSTANTS (\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) ( \ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5)) (PUTPROPS \IPDATABASE MACRO (LAMBDA (IP) (* ; "Returns the LOCF of the start of the data in the packet") (\ADDBASE (fetch (IP IPBASE) of IP) (UNFOLD (fetch (IP IPHEADERLENGTH) of IP) 2)))) (PUTPROPS \IPDATALENGTH MACRO (LAMBDA (IP) (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of IP) (LLSH (fetch (IP IPHEADERLENGTH) of IP) 2)))) (RPAQQ IPADDRESSTYPES ((\IP.CLASS.A 0) (\IP.CLASS.A.BYTESPEC (BYTE 1 31)) (\IP.CLASS.A.NET.BYTESPEC ( BYTE 8 24)) (\IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (\IP.CLASS.B 2) (\IP.CLASS.B.BYTESPEC (BYTE 2 30)) (\IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (\IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (\IP.CLASS.C 6) ( \IP.CLASS.C.BYTESPEC (BYTE 3 29)) (\IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (\IP.CLASS.C.HOST.BYTESPEC ( BYTE 8 0)))) (RPAQQ \IP.CLASS.A 0) (RPAQ \IP.CLASS.A.BYTESPEC (BYTE 1 31)) (RPAQ \IP.CLASS.A.NET.BYTESPEC (BYTE 8 24)) (RPAQ \IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (RPAQQ \IP.CLASS.B 2) (RPAQ \IP.CLASS.B.BYTESPEC (BYTE 2 30)) (RPAQ \IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (RPAQ \IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (RPAQQ \IP.CLASS.C 6) (RPAQ \IP.CLASS.C.BYTESPEC (BYTE 3 29)) (RPAQ \IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (RPAQ \IP.CLASS.C.HOST.BYTESPEC (BYTE 8 0)) (CONSTANTS (\IP.CLASS.A 0) (\IP.CLASS.A.BYTESPEC (BYTE 1 31)) (\IP.CLASS.A.NET.BYTESPEC (BYTE 8 24)) ( \IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (\IP.CLASS.B 2) (\IP.CLASS.B.BYTESPEC (BYTE 2 30)) ( \IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (\IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (\IP.CLASS.C 6) ( \IP.CLASS.C.BYTESPEC (BYTE 3 29)) (\IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (\IP.CLASS.C.HOST.BYTESPEC ( BYTE 8 0))) (RPAQQ IPPROTOCOLTYPES ((\ICMP.PROTOCOL 1) (\TCP.PROTOCOL 6) (\UDP.PROTOCOL 17))) (RPAQQ \ICMP.PROTOCOL 1) (RPAQQ \TCP.PROTOCOL 6) (RPAQQ \UDP.PROTOCOL 17) (CONSTANTS (\ICMP.PROTOCOL 1) (\TCP.PROTOCOL 6) (\UDP.PROTOCOL 17)) (RECORD AssemblyRecord (Packet FirstHole Fragments Timeout) Packet _ (\ALLOCATE.ETHERPACKET) FirstHole _ 0) (RECORD FragmentRecord (Start Length LastFragment)) (RECORD FragmentID (AssemblyRecord SourceAddress ID Protocol . DestinationAddress)) (RPAQQ IPOPTIONTYPES ((IPOPT.END 0) (IPOPT.NOP 1) (IPOPT.SECURITY 2) (IPOPT.LSRR 3) (IPOPT.TIMESTAMP 4 ) (IPOPT.RECRT 7) (IPOPT.STREAMID 8) (IPOPT.SSSR 9))) (RPAQQ IPOPT.END 0) (RPAQQ IPOPT.NOP 1) (RPAQQ IPOPT.SECURITY 2) (RPAQQ IPOPT.LSRR 3) (RPAQQ IPOPT.TIMESTAMP 4) (RPAQQ IPOPT.RECRT 7) (RPAQQ IPOPT.STREAMID 8) (RPAQQ IPOPT.SSSR 9) (CONSTANTS (IPOPT.END 0) (IPOPT.NOP 1) (IPOPT.SECURITY 2) (IPOPT.LSRR 3) (IPOPT.TIMESTAMP 4) ( IPOPT.RECRT 7) (IPOPT.STREAMID 8) (IPOPT.SSSR 9)) (RPAQ IP.OPTION.NUMBER.BYTESPEC (BYTE 5 0)) (CONSTANTS (IP.OPTION.NUMBER.BYTESPEC (BYTE 5 0))) (PUTPROPS \IP.GET.BYTE DMACRO (LAMBDA (IP BYTE INHEADER) (* ;; "Retrieve a byte from an IP packet. If INHEADER is T, BYTE is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\GETBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE))) (PUTPROPS \IP.GET.CELL DMACRO (LAMBDA (IP CELL INHEADER) (* ;; "Retrieve a cell from an IP packet. If INHEADER is not NIL, the cell is written to the header portion of the IP packet, else it's written to the data portion. CELL is the offset, in 16-bit units" ) (\GETBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL))) (PUTPROPS \IP.GET.STRING DMACRO (LAMBDA (IP BYTEOFFSET NCHARS INHEADER) (* ;; "Retrieve a string from an IP packet. If INHEADER is T, BYTEOFFSET is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\GETBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET NCHARS)) ) (PUTPROPS \IP.GET.WORD DMACRO (LAMBDA (IP WORD INHEADER) (* ;; "Retrieve a word from an IP packet. If INHEADER is T, WORD is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\GETBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD))) (PUTPROPS \IP.PUT.BYTE DMACRO (LAMBDA (IP BYTE VALUE INHEADER) (* ;; "Store a byte in an IP packet. If INHEADER is T, BYTE is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\PUTBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE VALUE))) (PUTPROPS \IP.PUT.CELL DMACRO (LAMBDA (IP CELL VALUE INHEADER) (* ;; "Store a cell in an IP packet. If INHEADER is not NIL, the cell is written to the header portion of the IP packet, else it's written to the data portion. CELL is the offset, in 16-bit units" ) (\PUTBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL VALUE))) (PUTPROPS \IP.PUT.STRING DMACRO (LAMBDA (IP BYTEOFFSET STRING INHEADER) (* ;; "Store a string ib an IP packet. If INHEADER is T, BYTEOFFSET is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\PUTBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET STRING)) ) (PUTPROPS \IP.PUT.WORD DMACRO (LAMBDA (IP WORD VALUE INHEADER) (* ;; "Store a word in an IP packet. If INHEADER is T, WORD is an offset from the start of the packet, else it's an offset from the start of the IP data section" ) (\PUTBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD VALUE))) (PUTPROP (QUOTE TCPLLIP) (QUOTE IMPORTDATE) (IDATE "11-Sep-89 15:24:32")) (PUTPROP (QUOTE TCPNAMES) (QUOTE IMPORTDATE) (IDATE " 2-Jun-88 20:58:40")) (RECORD TFTPCON (UDPSOCKET DESTSOCKET STREAM HOST)) (ACCESSFNS TFTP ((TFTPBASE (fetch (UDP UDPCONTENTS) of DATUM))) (BLOCKRECORD TFTPBASE ((OPCODE WORD) ( BLOCK# WORD))) (ACCESSFNS TFTP ((TFTPCONTENTS (\ADDBASE (fetch (UDP UDPCONTENTS) of DATUM) (FOLDHI \TFTPOVLEN BYTESPERWORD))))) (BLOCKRECORD TFTPBASE ((NIL WORD) (ERRORCODE WORD)))) (ACCESSFNS TFTPSTREAM ((TFTPCON (fetch (STREAM F1) of DATUM) (replace (STREAM F1) of DATUM with NEWVALUE)) (LASTPACKETIN (fetch (STREAM F2) of DATUM) (replace (STREAM F2) of DATUM with NEWVALUE)))) (RPAQQ \TFTPOVLEN 4) (RPAQQ \TFTP.SOCKET 69) (CONSTANTS (\TFTPOVLEN 4) (\TFTP.SOCKET 69)) (RPAQQ TFTPOPCODES ((\TFTP.RRQ 1) (\TFTP.WRQ 2) (\TFTP.DATA 3) (\TFTP.ACK 4) (\TFTP.ERROR 5))) (RPAQQ \TFTP.RRQ 1) (RPAQQ \TFTP.WRQ 2) (RPAQQ \TFTP.DATA 3) (RPAQQ \TFTP.ACK 4) (RPAQQ \TFTP.ERROR 5) (CONSTANTS (\TFTP.RRQ 1) (\TFTP.WRQ 2) (\TFTP.DATA 3) (\TFTP.ACK 4) (\TFTP.ERROR 5)) (PUTPROP (QUOTE TCPTFTP) (QUOTE IMPORTDATE) (IDATE " 1-Jul-87 10:54:35")) (ACCESSFNS UDP ((UDPBASE (\IPDATABASE DATUM))) (BLOCKRECORD UDPBASE ((UDPSOURCEPORT WORD) (UDPDESTPORT WORD) (UDPLENGTH WORD) (UDPCHECKSUM WORD))) (ACCESSFNS UDP ((UDPCONTENTS (\ADDBASE (\IPDATABASE DATUM ) (FOLDHI \UDPOVLEN BYTESPERWORD)))))) (RPAQQ \UDPOVLEN 8) (CONSTANTS (\UDPOVLEN 8)) (PUTPROP (QUOTE TCPUDP) (QUOTE IMPORTDATE) (IDATE " 6-Jan-89 16:37:41")) (PUTPROP (QUOTE TCPEXPORTS) (QUOTE FILEDATES) (QUOTE (("11-Sep-89 16:22:57" . "{ERIS}Library>TCPEXPORTS.;8")))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPFTP b/obsolete/tcp/TCPFTP new file mode 100644 index 00000000..519099e2 --- /dev/null +++ b/obsolete/tcp/TCPFTP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Jun-90 16:23:19" {DSK}local>lde>lispcore>library>TCPFTP.;3 50122 changes to%: (VARS TCPFTPCOMS) previous date%: "20-Jun-89 19:47:44" {DSK}local>lde>lispcore>library>TCPFTP.;2) (* ; " Copyright (c) 1985, 1986, 1900, 1987, 1988, 1989, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPFTPCOMS) (RPAQQ TCPFTPCOMS [[COMS (* ;; "FNS from Larry's Interlisp-10 LISPUSERS package") (FNS ARPACMD FTPHELP CMDREADCODE CMDREAD DISCARDLINE GETLINE \TCPFTP.INPUT TELNET.EOL) (INITVARS (\TCPFTP.ARPACMD.LOCK (CREATE.MONITORLOCK "ARPACMD Lock"))) (GLOBALVARS \TCPFTP.ARPACMD.LOCK) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA FTPHELP] (COMS (* ;; "FNS for the Interlisp-D streams facility") (FNS \TCPFTP.CONTROL.CLOSED \TCPFTP.GET.OSTYPE \TCPFTP.EVENTFN \TCPFTP.HOSTNAMEP \GET.TCPFTP.CONNECTION \TCPFTP.OPEN.CONNECTION \TCPFTP.ASSURE.CLEANUP \TCPFTP.CLEANUP \TCPFTP.RELEASE.CONNECTION \TCPFTP.LOGIN \TCPFTP.DELETEFILE \TCPFTP.DIRECTORYNAMEP \TCPFTP.ENDOFSTREAMOP \TCPFTP.GENERATEFILES \TCPFTP.GENERATENEXTFILE \TCPFTP.GETFILENAME \TCPFTP.GETFILEINFO \TCPFTP.SETFILEINFO \TCPFTP.RENAMEFILE \TCPFTP.CONNECT \TCPFTP.OPENFILE \TCPFTP.CLOSE \TCPFTP.FLUSH \TCPFTP.INIT SET.TCP.EOL.CONVENTION) (DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (RECORDS TCPDATASTREAM TCPFTPCON))) (ADDVARS (TCPFTP.DEFAULT.FILETYPES (NIL . TEXT) (DFASL . BINARY) (dfasl . BINARY) (LCOM . BINARY) (lcom . BINARY) (DCOM . BINARY) (dcom . BINARY) (LISP . TEXT) (lisp . TEXT) (LSP . TEXT) (lsp . TEXT) (RST . BINARY) (rst . BINARY) (BIN . BINARY) (bin . BINARY))) (INITVARS (TCP.DEFAULTFILETYPE 'BINARY) (TCP.USE.STANDARD.EOL T) (\TCPFTP.DEVICES) (\TCPFTP.CLEANUP.PROCESS)) (GLOBALVARS \TCPFTP.DEVICES \TCPFTP.CLEANUP.PROCESS TCP.DEFAULTFILETYPE TCP.USE.STANDARD.EOL)) (COMS (* ;; "Data connection handling") (FNS \TCP.BYE \TCPFTP.MAYBE.ABORT \TCPFTP.DATA.CLOSED \TCPFTP.OPEN.DATA.CONNECTION \TCPFTP.PORT.STRING \TCPFTP.SPAWN.DATACONNECTION \TCPFTP.READ.UNTIL.EOF \TCPFTP.TRANSFER.COMPLETE \TCPFTP.WAIT.FOR.DATACONNECTION \TCPFTP.DELETE.CONNECTION) (INITVARS (\TCPFTP.DATACONNECTION.LOCK (CREATE.MONITORLOCK "TCPFTP Data Connection Lock")) (\TCPFTP.CONNECTION.LOCK (CREATE.MONITORLOCK "TCPFTP Connection Lock")) (\TCPFTP.IDLE.TIMEOUT (TIMES 10 60 1000))) (GLOBALVARS \TCPFTP.DATACONNECTION.LOCK \TCPFTP.CONNECTION.LOCK \TCPFTP.IDLE.TIMEOUT)) (FILES (SYSLOAD) TCPNAMES TCP) (P (\TCPFTP.INIT)) (VARS TCPFTP.DEFAULT.FILETYPES) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA]) (* ;; "FNS from Larry's Interlisp-10 LISPUSERS package") (DEFINEQ (ARPACMD (LAMBDA (TCPFTPCON CMD ARG WANT DISCARD WANTARG) (* ejs%: "15-Nov-86 15:09") (* lmm "16-OCT-78 02:57") (DECLARE (GLOBALVARS \TCPFTP.ARPACMD.LOCK)) (WITH.MONITOR \TCPFTP.ARPACMD.LOCK (LET ((INC (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (OUTC (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (RESETLST (RESETSAVE NIL (BQUOTE (COND (RESETSTATE (AND (OPENP %, INC (QUOTE INPUT)) (CLOSEF %, INC)) (AND (OPENP %, OUTC (QUOTE OUTPUT)) (CLOSEF %, OUTC)))))) (PROG NIL (COND (CMD (COND (FTPDEBUGFLG (printout FTPDEBUGLOG CMD) (COND (ARG (printout FTPDEBUGLOG " " ARG))))) (PRIN3 CMD OUTC) (COND (ARG (PRIN3 " " OUTC) (PRIN3 ARG OUTC))) (TELNET.EOL OUTC) (FORCEOUTPUT OUTC) (* flush) (COND (FTPDEBUGFLG (TERPRI FTPDEBUGLOG))))) LP (COND (FTPDEBUGFLG (printout FTPDEBUGLOG "< "))) (SETQ CMD (\TCPFTP.INPUT INC)) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG CMD " "))) (COND ((EQMEMB CMD WANTARG) (AND (EQ (BIN INC) (CHARCODE -)) (FTPHELP CMD)) (RETURN CMD))) (COND ((EQ (BIN INC) (CHARCODE -)) (do (DISCARDLINE INC) repeatuntil (EQ (\TCPFTP.INPUT INC) CMD)))) (COND ((EQMEMB CMD WANT) (DISCARDLINE INC) (RETURN CMD)) ((EQMEMB CMD DISCARD) (DISCARDLINE INC) (GO LP))) (SELECTQ (AND (FIXP CMD) (IQUOTIENT CMD 100)) ((2 3) (FTPHELP CMD)) ((4 5) (ERROR (GETLINE INC T))) NIL) (DISCARDLINE INC) (GO LP)))))) ) (FTPHELP (LAMBDA (ARG) (* ejs%: "29-Jan-85 17:02") (ERROR ARG " unrecognized response from remote FTP server")) ) (CMDREADCODE (LAMBDA (IN) (* lmm "31-MAY-78 00:45") (PACK* (CMDREAD IN) (CMDREAD IN) (CMDREAD IN)))) (CMDREAD (LAMBDA (IN) (* ejs%: "12-Jan-85 14:28") ((LAMBDA (CH) (COND (FTPDEBUGFLG (BOUT CH FTPDEBUGLOG))) CH) (BIN IN))) ) (DISCARDLINE (LAMBDA (IN) (* ejs%: " 3-Feb-86 16:16") (* lmm "31-MAY-78 00:45") (DECLARE (GLOBALVARS FTPDEBUGFLG FTPDEBUGLOG)) (COND (FTPDEBUGFLG (\BACKFILEPTR IN) (bind CH until (FMEMB (SETQ CH (BIN IN)) (CONSTANT (LIST (CHARCODE LF) (CHARCODE NULL)))) do (BOUT FTPDEBUGLOG CH) finally (TERPRI FTPDEBUGLOG))) (T (until (FMEMB (BIN IN) (CONSTANT (LIST (CHARCODE LF) (CHARCODE NULL)))))))) ) (GETLINE (LAMBDA (IN FLG) (* ejs%: "12-Jan-85 14:40") (* lmm "31-MAY-78 00:46") (bind CH (STRING _ (ALLOCSTRING 80)) for POS from 1 while (NEQ (SETQ CH (BIN IN)) (CHARCODE LF)) do (COND ((LEQ POS 80) (RPLCHARCODE STRING POS CH))) finally (RETURN (SUBSTRING STRING 1 (SUB1 POS))))) ) (\TCPFTP.INPUT (LAMBDA (STREAM) (* ; "Edited 17-Nov-88 15:16 by cdl") (DECLARE (GLOBALVARS FTPDEBUGFLG FTPDEBUGLOG)) (LET (CCODE (RESULT 0)) (to 3 do (SETQ CCODE (BIN STREAM)) (if (AND (GEQ CCODE (CHARCODE 0)) (LEQ CCODE (CHARCODE 9))) then (SETQ RESULT (PLUS (TIMES RESULT 10) (DIFFERENCE CCODE (CHARCODE 0))))) repeatuntil (OR (EQ CCODE (CHARCODE SPACE)) (EQ CCODE (CHARCODE -)) (EQ CCODE 0)) finally (if (EQ CCODE (CHARCODE -)) then (if FTPDEBUGFLG then (printout FTPDEBUGLOG T "< " RESULT)) (DISCARDLINE STREAM) (\TCPFTP.INPUT STREAM))) RESULT)) ) (TELNET.EOL (LAMBDA (STREAM) (* ejs%: " 5-Jan-85 18:44") (BOUT STREAM (CHARCODE CR)) (BOUT STREAM (CHARCODE LF)) (FORCEOUTPUT STREAM)) ) ) (RPAQ? \TCPFTP.ARPACMD.LOCK (CREATE.MONITORLOCK "ARPACMD Lock")) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCPFTP.ARPACMD.LOCK) ) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA FTPHELP) ) (* ;; "FNS for the Interlisp-D streams facility") (DEFINEQ (\TCPFTP.CONTROL.CLOSED (LAMBDA (INSTREAM OUTSTREAM) (* ejs%: "28-Jul-86 14:30") (LET* ((DEVICE (fetch (STREAM DEVICE) of INSTREAM)) (TCPFTPCON (for CONN in (fetch (FDEV DEVICEINFO) of DEVICE) thereis (EQ (fetch (TCPFTPCON TCPIN) of CONN) INSTREAM)))) (COND (TCPFTPCON (replace (STREAM ACCESS) of INSTREAM with (replace (STREAM ACCESS) of OUTSTREAM with NIL)) (replace (FDEV DEVICEINFO) of DEVICE with (DREMOVE TCPFTPCON (fetch (FDEV DEVICEINFO) of DEVICE))))))) ) (\TCPFTP.GET.OSTYPE [LAMBDA (DEVICE) (* ; "Edited 12-May-89 14:10 by welch") (LET* ((HOST (fetch (FDEV DEVICENAME) of DEVICE)) ENTRY) (GETHOSTINFO HOST 'OSTYPE]) (\TCPFTP.EVENTFN (LAMBDA (FDEV FLG) (* ejs%: "23-Apr-85 18:56") (* * Called when a major event happens) (SELECTQ FLG ((BEFORELOGOUT BEFORESYSOUT BEFOREMAKESYS) (bind TCPIN TCPOUT DATASTREAM for TCPFTPCON in (fetch (FDEV DEVICEINFO) of FDEV) do (SETQ TCPIN (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (SETQ TCPOUT (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (SETQ DATASTREAM (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON)) (COND ((OPENP TCPIN (QUOTE INPUT)) (CLOSEF TCPIN))) (COND ((OPENP TCPOUT (QUOTE OUTPUT)) (CLOSEF TCPOUT))) (COND ((OPENP DATASTREAM) (CLOSEF DATASTREAM))))) NIL)) ) (\TCPFTP.HOSTNAMEP [LAMBDA (HOST DEVICE) (* ejs%: "24-Mar-86 14:36") (DECLARE (GLOBALVARS \TCP.DEVICE \TCPFTP.DEVICES)) (PROG ((SERVER (OR (DODIP.HOSTP HOST) (\IP.READ.STRING.ADDRESS HOST))) FULLHOSTNAME FILINGNAME) (RETURN (COND ((NOT SERVER) NIL) ((\GETDEVICEFROMNAME (SETQ FULLHOSTNAME (MKATOM (U-CASE HOST))) T T)) (T (SETQ FILINGNAME (PACK* HOST " Filing")) (\DEFINEDEVICE FULLHOSTNAME (SETQ DEVICE (create FDEV using \TCP.DEVICE DEVICENAME _ FULLHOSTNAME OPENFILE _ (FUNCTION \TCPFTP.OPENFILE) RENAMEFILE _ (FUNCTION \TCPFTP.RENAMEFILE) REOPENFILE _ (FUNCTION NILL) GETFILEINFO _ (FUNCTION \TCPFTP.GETFILEINFO) SETFILEINFO _ (FUNCTION \TCPFTP.SETFILEINFO) GETEOFPTR _ (FUNCTION \TCPFTP.GETEOFPTR ) DELETEFILE _ (FUNCTION \TCPFTP.DELETEFILE) HOSTNAMEP _ (FUNCTION NILL) GETFILENAME _ (FUNCTION \TCPFTP.GETFILENAME) DIRECTORYNAMEP _ (FUNCTION \TCPFTP.DIRECTORYNAMEP ) GENERATEFILES _ (FUNCTION \TCPFTP.GENERATEFILES) EVENTFN _ (FUNCTION NILL) DEVICEINFO _ NIL))) (push \TCPFTP.DEVICES DEVICE) DEVICE]) (\GET.TCPFTP.CONNECTION (LAMBDA (DEVICE) (* ejs%: " 4-Jun-85 17:54") (LET ((CONNECTIONS (fetch (FDEV DEVICEINFO) of DEVICE)) TCPFTPCON INSTREAM OUTSTREAM) (WITH.MONITOR \TCPFTP.CONNECTION.LOCK (COND ((SETQ TCPFTPCON (for TCPFTPCON in CONNECTIONS thereis (NULL (fetch (TCPFTPCON BUSY?) of TCPFTPCON)))) (COND ((AND (SETQ INSTREAM (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (SETQ OUTSTREAM (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (OPENP INSTREAM (QUOTE INPUT)) (OPENP OUTSTREAM (QUOTE OUTPUT)) (NOT (EOFP INSTREAM))) (while (READP INSTREAM) do (BIN INSTREAM)) (replace (TCPFTPCON BUSY?) of TCPFTPCON with T) TCPFTPCON) (T (\TCPFTP.DELETE.CONNECTION TCPFTPCON DEVICE) (\TCPFTP.OPEN.CONNECTION DEVICE)))) (T (\TCPFTP.OPEN.CONNECTION DEVICE)))))) ) (\TCPFTP.OPEN.CONNECTION (LAMBDA (DEVICE) (* ; "Edited 24-Apr-87 16:09 by FS") (LET* ((HOST (DODIP.HOSTP (fetch (FDEV DEVICENAME) of DEVICE))) (TCPFTPCON (create TCPFTPCON BUSY? _ T)) (INSTREAM (TCP.OPEN HOST \TCP.FTP.PORT NIL (QUOTE ACTIVE) (QUOTE INPUT) NIL (QUOTE (WHENCLOSEDFN \TCPFTP.CONTROL.CLOSED)))) (OUTSTREAM (COND (INSTREAM (TCP.OTHER.STREAM INSTREAM))))) (RESETLST (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (CON DEV) (COND (RESETSTATE (COND ((AND (EQ (\TCPFTP.GET.OSTYPE DEV) (QUOTE UNIX)) (READP (fetch (TCPFTPCON TCPIN) of CON))) (\TCPFTP.INPUT (fetch (TCPFTPCON TCPIN) of CON)))) (ARPACMD CON "QUIT" NIL (QUOTE (221 500))) (\TCPFTP.DELETE.CONNECTION CON DEV))))) TCPFTPCON DEVICE)) (COND (INSTREAM (replace (STREAM ENDOFSTREAMOP) of INSTREAM with (FUNCTION (LAMBDA (STREAM) (ZERO)))) (replace (STREAM DEVICE) of INSTREAM with DEVICE) (replace (STREAM DEVICE) of OUTSTREAM with DEVICE) (replace (TCPFTPCON TCPIN) of TCPFTPCON with INSTREAM) (replace (TCPFTPCON TCPOUT) of TCPFTPCON with OUTSTREAM) (SELECTQ (\TCPFTP.INPUT INSTREAM) (220 (COND (FTPDEBUGFLG (printout FTPDEBUGLOG T "< 220 ") (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)))) (\TCPFTP.LOGIN DEVICE TCPFTPCON) (push (fetch (FDEV DEVICEINFO) of DEVICE) TCPFTPCON) TCPFTPCON) (PROGN (\TCPFTP.DELETE.CONNECTION TCPFTPCON DEVICE) NIL))))))) ) (\TCPFTP.ASSURE.CLEANUP (LAMBDA NIL (* ejs%: "27-Apr-85 14:08") (* * Spawn a cleanup function if necessary) (COND ((AND (PROCESSP \TCPFTP.CLEANUP.PROCESS) (NOT (PROCESS.FINISHEDP \TCPFTP.CLEANUP.PROCESS)))) (T (SETQ \TCPFTP.CLEANUP.PROCESS (ADD.PROCESS (QUOTE (\TCPFTP.CLEANUP)) (QUOTE RESTARTABLE) (QUOTE NO)))))) ) (\TCPFTP.CLEANUP (LAMBDA NIL (* ejs%: "28-Jul-86 12:26") (DECLARE (GLOBALVARS \TCPFTP.IDLE.TIMEOUT \TCPFTP.DEVICES \TCPFTP.CONNECTION.LOCK)) (LET ((INTERVAL (QUOTIENT \TCPFTP.IDLE.TIMEOUT 4)) CONNECTIONSP) (repeatwhile (NOT (ZEROP CONNECTIONSP)) do (SETQ CONNECTIONSP 0) (for DEVICE in \TCPFTP.DEVICES do (for CONNECTION in (APPEND (fetch (FDEV DEVICEINFO) of DEVICE)) do (add CONNECTIONSP 1) (WITH.MONITOR \TCPFTP.CONNECTION.LOCK (NLSETQ (COND ((AND (NULL (fetch (TCPFTPCON BUSY?) of CONNECTION)) (TIMEREXPIRED? (fetch (TCPFTPCON IDLETIMER) of CONNECTION))) (CLOSEF? (fetch (TCPFTPCON TCPIN) of CONNECTION)) (CLOSEF? (fetch (TCPFTPCON TCPOUT) of CONNECTION)) (COND ((fetch (TCPFTPCON DATASTREAM) of CONNECTION) (CLOSEF? (fetch (TCPFTPCON DATASTREAM) of CONNECTION)))) (add CONNECTIONSP -1) (\TCPFTP.DELETE.CONNECTION CONNECTION DEVICE T)) ((OR (NOT (OPENP (fetch (TCPFTPCON TCPIN) of CONNECTION) (QUOTE INPUT))) (NEQ (QUOTE ESTABLISHED) (fetch (TCP.CONTROL.BLOCK TCB.STATE) of (fetch (TCPSTREAM TCB) of (fetch (TCPFTPCON TCPIN) of CONNECTION))))) (add CONNECTIONSP -1) (\TCPFTP.DELETE.CONNECTION CONNECTION DEVICE))))) (BLOCK))) (COND ((NOT (ZEROP CONNECTIONSP)) (BLOCK INTERVAL)))))) ) (\TCPFTP.RELEASE.CONNECTION (LAMBDA (TCPFTPCON) (* jmh "11-Oct-85 13:43") (COND (TCPFTPCON (replace (TCPFTPCON BUSY?) of TCPFTPCON with NIL) (replace (TCPFTPCON DATASTREAM) of TCPFTPCON with NIL) (replace (TCPFTPCON IDLETIMER) of TCPFTPCON with (SETUPTIMER \TCPFTP.IDLE.TIMEOUT)) (\TCPFTP.ASSURE.CLEANUP)))) ) (\TCPFTP.LOGIN (LAMBDA (DEVICE TCPFTPCON) (* ; "Edited 24-Apr-87 16:17 by FS") (* * Log us in) (PROG ((OSTYPE (\TCPFTP.GET.OSTYPE DEVICE)) (HOST (fetch (FDEV DEVICENAME) of DEVICE)) (LOGINRETRYCOUNT 0) INFO) RETRY (SETQ INFO (\INTERNAL/GETPASSWORD HOST)) (* * Loop through this label if the server rejected the our name) (COND ((OR (NULL INFO) (EQ 0 (NCHARS (CAR INFO))) (EQ 0 (NCHARS (CDR INFO)))) (* Need to login. Can't send Unix hosts a string of no chars as name or password!) (LOGIN HOST) (GO RETRY))) RETRY1 (* * Loop through this label if the server rejected something else) (SELECTQ (ARPACMD TCPFTPCON "USER" (COND ((AND (EQ OSTYPE (QUOTE UNIX)) (EQ (CAR INFO) (U-CASE (CAR INFO))) (EQ LOGINRETRYCOUNT 0)) (L-CASE (CAR INFO))) (T (CAR INFO))) (QUOTE (202 230 331 332 500 503 530))) ((230 202) (* We're logged in) (RETURN T)) (331 (* Needs a password) (SELECTQ (ARPACMD TCPFTPCON "PASS" (\DECRYPT.PWD (CDR INFO)) (QUOTE (230 331 332 530))) (230 (RETURN T)) (332 (SELECTQ (ARPACMD TCPFTPCON "ACCT" (PROMPTFORWORD (CONCAT "Account for logging into " HOST)) (QUOTE (230 202 530))) (230 (RETURN T)) (GO RETRY1))) ((331 530) (LOGIN HOST) (add LOGINRETRYCOUNT 1) (GO RETRY)) (FTPHELP))) (332 (SELECTQ (ARPACMD TCPFTPCON "ACCT" (PROMPTFORWORD (CONCAT "Account for logging into " HOST)) (QUOTE (230 202 530))) (230 (RETURN T)) (GO RETRY1))) (503 (COND ((EQ OSTYPE (QUOTE UNIX)) (* ;; "Well, the sequence of events to get here was probably that the D-machine sent an illegal name/password pair, such that the name was not a registered user on the Unix machine. There's a bug in the Unix FTP server which causes it to send a 530 error--illegal user name--immediately after it sent a 331 to prompt us for the password. This is blatantly in violation of the FTP specification, which states that only 100 class errors can have multiple responses. Now we're out of sync with the server, and need somehow to reinitialize our state") (\PEEKBIN (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (\TCPFTP.INPUT (fetch (TCPFTPCON TCPIN) of TCPFTPCON)))) (GO RETRY1)) ((500 530) (* No such user?) (LOGIN HOST) (add LOGINRETRYCOUNT 1) (GO RETRY)) (FTPHELP)))) ) (\TCPFTP.DELETEFILE (LAMBDA (NAME DEVICE) (* ejs%: " 7-Apr-86 11:52") (* * FTP delete request) (LET* ((TCPFTPCON (\GET.TCPFTP.CONNECTION DEVICE)) (OSTYPE (\TCPFTP.GET.OSTYPE DEVICE)) (CODE (CAR (NLSETQ (ARPACMD TCPFTPCON "DELE" (REPACKFILENAME.STRING (PACKFILENAME.STRING (QUOTE HOST) NIL (QUOTE BODY) NAME) OSTYPE) (QUOTE (200 226 250 450 550))))))) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) (SELECTQ CODE ((250 226 200) NAME) NIL))) ) (\TCPFTP.DIRECTORYNAMEP (LAMBDA (HOST/DIR DEVICE) (* ejs%: "27-Apr-85 14:04") (LET ((TCPFTPCON (\GET.TCPFTP.CONNECTION DEVICE))) (RESETLST (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (TCPFTPCON) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) (COND (RESETSTATE (AND (OPENP (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (CLOSEF (fetch (TCPFTPCON TCPIN) of TCPFTPCON))) (replace (TCPFTPCON TCPIN) of TCPFTPCON with NIL) (AND (OPENP (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (CLOSEF (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (replace (TCPFTPCON TCPOUT) of TCPFTPCON with NIL))))) TCPFTPCON)) (\TCPFTP.CONNECT DEVICE TCPFTPCON (FILENAMEFIELD HOST/DIR (QUOTE DIRECTORY)))))) ) (\TCPFTP.ENDOFSTREAMOP (LAMBDA (STREAM SILENTLY) (* ejs%: " 3-Feb-85 17:01") (\TCPFTP.TRANSFER.COMPLETE STREAM) (OR SILENTLY (\EOSERROR STREAM))) ) (\TCPFTP.GENERATEFILES [LAMBDA (DEVICE PATTERN DESIREDPROPS OPTIONS) (* ; "Edited 12-May-89 14:00 by welch") (* * FTP directory request) (LET* ((TCPFTPCON (\GET.TCPFTP.CONNECTION DEVICE)) (OSTYPE (\TCPFTP.GET.OSTYPE DEVICE)) DATASTREAMEVENT DATASTREAM CODE) (SETQ DATASTREAMEVENT (\TCPFTP.SPAWN.DATACONNECTION TCPFTPCON 'INPUT)) (BLOCK) [SETQ CODE (CAR (NLSETQ (ARPACMD TCPFTPCON "NLST" [COND [(EQ OSTYPE 'UNIX) (COND ((AND (EQ (FILENAMEFIELD PATTERN 'VERSION) '*) (EQ (FILENAMEFIELD PATTERN 'EXTENSION) '*) (EQ (FILENAMEFIELD PATTERN 'NAME) '*)) (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'VERSION NIL 'EXTENSION NIL 'NAME "*" 'BODY PATTERN) 'UNIX)) ((EQ (FILENAMEFIELD PATTERN 'VERSION) '*) (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'VERSION NIL 'BODY PATTERN) 'UNIX)) (T (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY PATTERN) 'UNIX] (T (COND ((EQ OSTYPE 'INTERLISP) (PACKFILENAME.STRING 'HOST NIL 'BODY PATTERN)) (T (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY PATTERN) OSTYPE] 150] (SELECTQ CODE (150 (* * Here we go) (COND ((SETQ DATASTREAM (\TCPFTP.WAIT.FOR.DATACONNECTION DEVICE TCPFTPCON DATASTREAMEVENT 'INPUT)) (replace (TCPFTPCON GENERATEFILESDIRECTORY) of TCPFTPCON with (FILENAMEFIELD PATTERN 'DIRECTORY)) (create FILEGENOBJ NEXTFILEFN _ (FUNCTION \TCPFTP.GENERATENEXTFILE) FILEINFOFN _ (FUNCTION NILL) GENFILESTATE _ TCPFTPCON)) (T (ERROR "Couldn't open data connection to remote TCPFTP server")))) (PROGN (DEL.PROCESS (CAR DATASTREAMEVENT)) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) (\NULLFILEGENERATOR]) (\TCPFTP.GENERATENEXTFILE [LAMBDA (TCPFTPCON NAMEONLY) (* ; "Edited 8-Mar-89 22:54 by akw:") (PROG ((DATASTREAM (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON)) [OSTYPE (\TCPFTP.GET.OSTYPE (fetch (STREAM DEVICE) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON] [FILENAMERDTBL (DEFERREDCONSTANT (PROG [(R (COPYREADTABLE 'ORIG] (SETBRK NIL NIL R) (SETSYNTAX '%% 'OTHER R) (SETSEPR '(13 10 31) NIL R) (RETURN R] CODE NAME) LOOP (RETURN (COND [[AND (OPENP DATASTREAM 'INPUT) (NOT (EOFP DATASTREAM)) (SETQ NAME (CAR (NLSETQ (READ DATASTREAM FILENAMERDTBL] (COND ((AND (OR (EQ OSTYPE 'TOPS-20) (EQ OSTYPE 'TOPS20)) (STRPOS "? Not found" NAME NIL NIL NIL NIL UPPERCASEARRAY)) (NLSETQ (until (EOFP DATASTREAM) do (READ DATASTREAM FILENAMERDTBL) )) (AND (OPENP DATASTREAM) (CLOSEF DATASTREAM)) (SELECTQ [SETQ CODE (ARPACMD TCPFTPCON NIL NIL '(226 250] ((250 226) (AND (OPENP DATASTREAM) (CLOSEF DATASTREAM)) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) NIL) (FTPHELP CODE))) ((AND (EQ OSTYPE 'UNIX) (STREQUAL ":" (SUBSTRING NAME -1))) (replace (TCPFTPCON GENERATEFILESDIRECTORY) of TCPFTPCON with (REPACKFILENAME.STRING (SUBSTRING NAME 1 -2) 'INTERLISP)) (GO LOOP)) (NAMEONLY (REPACKFILENAME.STRING NAME 'INTERLISP)) (T (if (STRPOS "*" (fetch (TCPFTPCON GENERATEFILESDIRECTORY) of TCPFTPCON)) then (PACKFILENAME.STRING 'HOST (fetch (FDEV DEVICENAME) of (fetch (STREAM DEVICE) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON) )) 'BODY (REPACKFILENAME.STRING NAME 'INTERLISP)) else (PACKFILENAME.STRING 'HOST (fetch (FDEV DEVICENAME) of (fetch (STREAM DEVICE) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON))) 'DIRECTORY (fetch (TCPFTPCON GENERATEFILESDIRECTORY) of TCPFTPCON) 'BODY (REPACKFILENAME.STRING NAME 'INTERLISP] (T (AND (OPENP DATASTREAM) (CLOSEF DATASTREAM)) (SELECTQ [SETQ CODE (ARPACMD TCPFTPCON NIL NIL '(226 250] ((250 226) (AND (OPENP DATASTREAM) (CLOSEF DATASTREAM)) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) NIL) (FTPHELP CODE]) (\TCPFTP.GETFILENAME [LAMBDA (NAME RECOG DEVICE) (* ; "Edited 12-May-89 13:35 by welch") (* * FTP directory request) (COND ((EQ RECOG 'NEW) NAME) (T (PROG ((TCPFTPCON (\GET.TCPFTP.CONNECTION DEVICE)) (OSTYPE (\TCPFTP.GET.OSTYPE DEVICE)) DATASTREAMEVENT DATASTREAM CODE GENERATOR ALLPOSSIBILITIES) (SETQ DATASTREAMEVENT (\TCPFTP.SPAWN.DATACONNECTION TCPFTPCON 'INPUT)) (BLOCK) [SETQ CODE (CAR (NLSETQ (ARPACMD TCPFTPCON "NLST" (COND ((EQ OSTYPE 'INTERLISP) (PACKFILENAME.STRING 'HOST NIL 'BODY NAME)) (T (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY NAME) OSTYPE))) 150] (RETURN (SELECTQ CODE (150 (* * Here we go) (COND ((AND (SETQ DATASTREAM (\TCPFTP.WAIT.FOR.DATACONNECTION DEVICE TCPFTPCON DATASTREAMEVENT 'INPUT)) (SETQ GENERATOR (create FILEGENOBJ NEXTFILEFN _ (FUNCTION \TCPFTP.GENERATENEXTFILE ) FILEINFOFN _ (FUNCTION NILL) GENFILESTATE _ TCPFTPCON))) (replace (TCPFTPCON GENERATEFILESDIRECTORY) of TCPFTPCON with (FILENAMEFIELD NAME 'DIRECTORY)) (SETQ ALLPOSSIBILITIES (bind FILE while (SETQ FILE ( \GENERATENEXTFILE GENERATOR)) collect FILE)) (MKATOM (CAR ALLPOSSIBILITIES))) (T (ERROR "Couldn't open data connection to remote TCPFTP server." )))) (PROGN (DEL.PROCESS (CAR DATASTREAMEVENT)) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) NIL]) (\TCPFTP.GETFILEINFO (LAMBDA (STREAM ATTRIB DEVICE) (* ejs%: "20-Mar-86 21:01") (COND ((type? STREAM STREAM) (STREAMPROP STREAM ATTRIB)) ((EQ ATTRIB (QUOTE EOL)) (QUOTE CRLF)))) ) (\TCPFTP.SETFILEINFO (LAMBDA (STREAM ATTRIB VALUE DEVICE) (* ejs%: " 9-Nov-85 14:20") (STREAMPROP STREAM ATTRIB VALUE))) (\TCPFTP.RENAMEFILE (LAMBDA (OLDDEVICE OLDNAME NEWDEVICE NEWNAME) (* ; "Edited 15-Jun-88 13:41 by atm") (* * FTP delete request) (COND ((NEQ OLDDEVICE NEWDEVICE) (\GENERIC.RENAMEFILE OLDDEVICE OLDNAME NEWDEVICE NEWNAME)) (T (LET ((OSTYPE (\TCPFTP.GET.OSTYPE OLDDEVICE)) (TCPFTPCON (\GET.TCPFTP.CONNECTION OLDDEVICE)) CODE) (RESETLST (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (CON) (\TCPFTP.RELEASE.CONNECTION CON))) TCPFTPCON)) (PROG NIL RETRY (SETQ CODE (CAR (NLSETQ (ARPACMD TCPFTPCON "RNFR" (REPACKFILENAME.STRING (PACKFILENAME.STRING (QUOTE HOST) NIL (QUOTE BODY) OLDNAME) OSTYPE) (QUOTE (350 450 550)))))) (SELECTQ CODE (350 (SETQ CODE (CAR (NLSETQ (ARPACMD TCPFTPCON "RNTO" (REPACKFILENAME.STRING (PACKFILENAME.STRING (QUOTE HOST) NIL (QUOTE BODY) NEWNAME) OSTYPE) (QUOTE (200 250 553)))))) (SELECTQ CODE ((200 250) (RETURN NEWNAME)) NIL)) (PROGN (SETQ OLDNAME (LISPERROR "FILE NOT FOUND" OLDNAME T)) (GO RETRY))))))))) ) (\TCPFTP.CONNECT (LAMBDA (DEVICE TCPFTPCON DIRECTORY) (* ejs%: "24-Jun-85 17:10") (LET ((DIRECTORYNAME (REPACKFILENAME.STRING (PACKFILENAME.STRING (QUOTE DIRECTORY) DIRECTORY) (\TCPFTP.GET.OSTYPE DEVICE)))) (COND ((NEQ 0 (NCHARS DIRECTORYNAME)) (SELECTQ (ARPACMD TCPFTPCON "CWD" DIRECTORYNAME (QUOTE (200 250 450 550))) ((200 250) T) NIL)) (T (* The user specified no connect directory. We'll have to assume he or she meant his or her own login directory, whose name we can't even accurately guess. Thus, we leave it at this) T)))) ) (\TCPFTP.OPENFILE [LAMBDA (NAME ACCESS RECOG PARAMETERS DEVICE) (* ; "Edited 22-Mar-89 22:31 by welch") (DECLARE (GLOBALVARS TCP.DEFAULTFILETYPE TCP.USE.STANDARD.EOL TCPFTP.EOL.CONVENTION TCPFTP.DEFAULT.FILETYPES)) (LET* ((HOST (fetch (FDEV DEVICENAME) of DEVICE)) (OSTYPE (\TCPFTP.GET.OSTYPE DEVICE)) [FILENAME (COND ((EQ OSTYPE 'INTERLISP) (PACKFILENAME.STRING 'HOST NIL 'BODY NAME)) (T (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY NAME) OSTYPE] (FILENAME.EXTENSION (FILENAMEFIELD FILENAME 'EXTENSION)) (TCPFTPCON (\GET.TCPFTP.CONNECTION DEVICE)) (TYPE (OR (CADR (FASSOC 'TYPE PARAMETERS)) (CDR (FASSOC FILENAME.EXTENSION TCPFTP.DEFAULT.FILETYPES)) (CDR (FASSOC (U-CASE FILENAME.EXTENSION) TCPFTP.DEFAULT.FILETYPES)) TCP.DEFAULTFILETYPE)) DATASTREAMEVENT DATASTREAM CODE FTPCMD STREAMDEV) (SELECTQ TYPE (TEXT (ARPACMD TCPFTPCON "TYPE" "A N" 200)) (ARPACMD TCPFTPCON "TYPE" "L 8" 200)) (SETQ DATASTREAMEVENT (\TCPFTP.SPAWN.DATACONNECTION TCPFTPCON (COND ((EQ ACCESS 'OUTPUT) 'APPEND) (T ACCESS)) T)) (BLOCK) (PROG NIL LOOP (SETQ FTPCMD (SELECTQ ACCESS (INPUT '"RETR") (OUTPUT '"STOR") (APPEND '"APPE") (ERROR "ACCESS must be one of INPUT, OUTPUT, or APPEND" ACCESS))) [SETQ CODE (CAR (NLSETQ (ARPACMD TCPFTPCON FTPCMD FILENAME '(125 150 226 250 425 426 450 451 550] (SELECTQ CODE ((125 150) (* * Here we go) (COND ([SETQ DATASTREAM (\TCPFTP.WAIT.FOR.DATACONNECTION DEVICE TCPFTPCON DATASTREAMEVENT (COND ((EQ ACCESS 'OUTPUT) 'APPEND) (T ACCESS] (replace (STREAM ENDOFSTREAMOP) of DATASTREAM with (FUNCTION \TCPFTP.ENDOFSTREAMOP)) (replace (STREAM FULLFILENAME) of DATASTREAM with NAME) [replace (STREAM EOLCONVENTION) of DATASTREAM with (COND (TCP.USE.STANDARD.EOL CRLF.EOLC) (T (OR TCPFTP.EOL.CONVENTION (SELECTQ OSTYPE (UNIX LF.EOLC) (TOPS-20 CRLF.EOLC) CR.EOLC] (STREAMPROP DATASTREAM 'TYPE TYPE) (replace (TCPDATASTREAM TCPFTPCON) of DATASTREAM with TCPFTPCON ) (SETQ STREAMDEV (fetch (STREAM DEVICE) of DATASTREAM)) (replace (FDEV GETFILENAME) of STREAMDEV with (FUNCTION NILL)) (replace (FDEV GETFILEINFO) of STREAMDEV with (FUNCTION \TCPFTP.GETFILEINFO)) (STREAMADDPROP DATASTREAM 'AFTERCLOSE (FUNCTION \TCPFTP.TRANSFER.COMPLETE)) (STREAMADDPROP DATASTREAM 'BEFORECLOSE (FUNCTION \TCPFTP.READ.UNTIL.EOF) ) (RETURN DATASTREAM)) (T (ERROR "Couldn't open data connection to remote TCPFTP server")))) (425 (* The foreign port is busy) (PROMPTPRINT "TCPFTP: Please wait; the remote ftp server is busy.") (DEL.PROCESS (CAR DATASTREAMEVENT)) (DISMISS 5000) [SETQ DATASTREAMEVENT (\TCPFTP.SPAWN.DATACONNECTION TCPFTPCON (COND ((EQ ACCESS 'OUTPUT) 'APPEND) (T ACCESS] (BLOCK) (GO LOOP)) ((450 550) (DEL.PROCESS (CAR DATASTREAMEVENT)) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON) NIL) (FTPHELP CODE]) (\TCPFTP.CLOSE (LAMBDA (DEVICE) (* ejs%: "23-Apr-85 18:41") (* * This needs work) (PROG ((DEVINFO (fetch (FDEV DEVICEINFO) of DEVICE))) (AND (OPENP (fetch (TCPFTPCON TCPOUT) of DEVINFO) (QUOTE OUTPUT)) (CLOSEF (fetch (TCPFTPCON TCPOUT) of DEVINFO))) (AND (OPENP (fetch (TCPFTPCON TCPIN) of DEVINFO) (QUOTE INPUT)) (CLOSEF (fetch (TCPFTPCON TCPIN) of DEVINFO))))) ) (\TCPFTP.FLUSH (LAMBDA (DEVICE) (* ejs%: "23-Apr-85 18:56") (* * This needs work) (PROG ((INSTREAM (fetch (TCPFTPCON TCPIN) of (fetch (FDEV DEVICEINFO) of DEVICE)))) (COND ((READP INSTREAM) (until (NOT (READP INSTREAM)) do (BIN INSTREAM)))))) ) (\TCPFTP.INIT (LAMBDA NIL (* ejs%: "10-Apr-85 19:25") (\DEFINEDEVICE NIL (create FDEV DEVICENAME _ (QUOTE TCPFTP) HOSTNAMEP _ (FUNCTION \TCPFTP.HOSTNAMEP) EVENTFN _ (FUNCTION \TCPFTP.EVENTFN)))) ) (SET.TCP.EOL.CONVENTION [LAMBDA (EOLTYPE) (* ; "Edited 22-Mar-89 22:31 by welch") (* ; "Sets the EOL convention to use") (DECLARE (GLOBALVARS TCP.USE.STANDARD.EOL TCPFTP.EOL.CONVENTION)) (SELECTQ EOLTYPE (CR (SETQ TCP.USE.STANDARD.EOL NIL) (SETQ TCPFTP.EOL.CONVENTION CR.EOLC)) (LF (SETQ TCP.USE.STANDARD.EOL NIL) (SETQ TCPFTP.EOL.CONVENTION LF.EOLC)) (CRLF (SETQ TCP.USE.STANDARD.EOL NIL) (SETQ TCPFTP.EOL.CONVENTION CRLF.EOLC)) (OS (SETQ TCP.USE.STANDARD.EOL NIL) (SETQ TCPFTP.EOL.CONVENTION NIL)) (SETQ TCP.USE.STANDARD.EOL T]) ) (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (ACCESSFNS TCPDATASTREAM ((TCPCONTROLDEVICE (fetch (STREAM F3) of DATUM) (replace (STREAM F3) of DATUM with NEWVALUE)) (SEENEOS (fetch (STREAM F4) of DATUM) (replace (STREAM F4) of DATUM with NEWVALUE)) (TCPFTPCON (fetch (STREAM F5) of DATUM) (replace (STREAM F5) of DATUM with NEWVALUE)))) (RECORD TCPFTPCON (TCPIN TCPOUT DATASTREAM BUSY? IDLETIMER GENERATEFILESDIRECTORY)) ) (* "END EXPORTED DEFINITIONS") ) (ADDTOVAR TCPFTP.DEFAULT.FILETYPES (NIL . TEXT) (DFASL . BINARY) (dfasl . BINARY) (LCOM . BINARY) (lcom . BINARY) (DCOM . BINARY) (dcom . BINARY) (LISP . TEXT) (lisp . TEXT) (LSP . TEXT) (lsp . TEXT) (RST . BINARY) (rst . BINARY) (BIN . BINARY) (bin . BINARY)) (RPAQ? TCP.DEFAULTFILETYPE 'BINARY) (RPAQ? TCP.USE.STANDARD.EOL T) (RPAQ? \TCPFTP.DEVICES ) (RPAQ? \TCPFTP.CLEANUP.PROCESS ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCPFTP.DEVICES \TCPFTP.CLEANUP.PROCESS TCP.DEFAULTFILETYPE TCP.USE.STANDARD.EOL) ) (* ;; "Data connection handling") (DEFINEQ (\TCP.BYE (LAMBDA (HOST) (* ejs%: "15-Nov-86 15:05") (LET* ((DEVICE (\GETDEVICEFROMNAME HOST NIL T)) (CONNECTIONS (AND DEVICE (fetch (FDEV DEVICEINFO) of DEVICE)))) (bind INSTREAM for TCPFTPCON in CONNECTIONS do (SETQ INSTREAM (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (while (AND (OPENP INSTREAM (QUOTE INPUT)) (READP INSTREAM)) do (BIN INSTREAM)) (NLSETQ (ARPACMD TCPFTPCON "QUIT" NIL (QUOTE (221 500)))) (CLOSEF? (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON)) (CLOSEF? INSTREAM) (CLOSEF? (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) T) (replace (FDEV DEVICEINFO) of DEVICE with NIL))) ) (\TCPFTP.MAYBE.ABORT [LAMBDA (DATASTREAM) (* ; "Edited 18-Mar-89 13:43 by welch") (LET* ((TCPFTPCON (fetch (TCPDATASTREAM TCPFTPCON) of DATASTREAM)) (TCPOUTSTREAM (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (STREAMPROP DATASTREAM 'BEFORECLOSE NIL) (COND ((AND (NOT (fetch (TCPDATASTREAM SEENEOS) of DATASTREAM)) (OPENP DATASTREAM 'INPUT)) (TCP.CLOSE.SENDER (TCP.OTHER.STREAM DATASTREAM)) (BLOCK) (BOUT TCPOUTSTREAM 244) (BOUT TCPOUTSTREAM 242) (TCP.URGENT.MARK TCPOUTSTREAM) (ARPACMD TCPFTPCON "ABOR" NIL '(226 426 250]) (\TCPFTP.DATA.CLOSED (LAMBDA (INSTREAM OUTSTREAM) (* ejs%: "28-Jul-86 14:03") (LET* ((STREAM (OR INSTREAM OUTSTREAM))) (replace (STREAM ACCESS) of STREAM with NIL))) ) (\TCPFTP.OPEN.DATA.CONNECTION (LAMBDA (TCPFTPCON ACCESS EVENT FOR.FILE.TRANSFER) (* ejs%: "26-Sep-86 18:27") (DECLARE (GLOBALVARS \TCPFTP.DATACONNECTION.LOCK)) (* * Tell the FTP control connection on what port we're expecting the data connection to made, and try up to five times to accept a connection. Each time, select a new port (this hopefully a workaround to a Unix bug in which ports sometimes tend to appear busy for 2 minute timeout intervals)) (WITH.MONITOR \TCPFTP.DATACONNECTION.LOCK (bind PORT STREAM for I from 1 to 5 do (SETQ PORT (\TCP.SELECT.PORT)) (ARPACMD TCPFTPCON "PORT" (\TCPFTP.PORT.STRING PORT) (QUOTE (200))) (SETQ STREAM (TCP.OPEN NIL NIL PORT (QUOTE PASSIVE) ACCESS NIL (COND (FOR.FILE.TRANSFER (CONSTANT (BQUOTE (MAXSEG %, BYTESPERPAGE WHENCLOSEDFN \TCPFTP.DATA.CLOSED))))))) (COND (STREAM (replace (TCPFTPCON DATASTREAM) of TCPFTPCON with STREAM) (RETURN))) finally (* * We give up. Place a NIL in the datastream field so the client who was trying to accept the data connection will realize we couldn't succeed) (replace (TCPFTPCON DATASTREAM) of TCPFTPCON with NIL)) (AND (TYPENAMEP EVENT (QUOTE EVENT)) (NOTIFY.EVENT EVENT)) (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON))) ) (\TCPFTP.PORT.STRING (LAMBDA (PORT) (* ejs%: "26-Apr-85 11:54") (* * Returns "h1,h2,h3,h4,p1,p3" corresponding to bytes of local IP host and PORT for port command) (LET ((IPADDRESS (\LOCAL.IP.ADDRESS))) (CONCAT (LOADBYTE IPADDRESS 24 8) "," (LOADBYTE IPADDRESS 16 8) "," (LOADBYTE IPADDRESS 8 8) "," (LOADBYTE IPADDRESS 0 8) "," (LOADBYTE PORT 8 8) "," (LOADBYTE PORT 0 8)))) ) (\TCPFTP.SPAWN.DATACONNECTION (LAMBDA (TCPFTPCON ACCESS FOR.FILE.TRANSFER) (* ejs%: "26-Sep-86 19:21") (* * Called from TCPFTP device methods like \TCPFTP.OPENFILE. Spawns a process to wait for the server program to open a data connection to us. Returns a CONS consisting of the spawned process handle and an event which will be notified when the server has connected to us. This function MUST be called prior to any TCPFTP operations which would cause the server to try to open a data connection to us (otherwise, the server might try to open the connection before we're prepared to accept it)) (LET* ((EVENT (CREATE.EVENT)) (PROCESS (ADD.PROCESS (BQUOTE (\TCPFTP.OPEN.DATA.CONNECTION (QUOTE %, TCPFTPCON) (QUOTE %, ACCESS) %, EVENT %, FOR.FILE.TRANSFER))))) (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (PROCESS INSTREAM OUTSTREAM) (DEL.PROCESS PROCESS) (* CLOSEF? INSTREAM) (* CLOSEF? OUTSTREAM) NIL)) PROCESS (fetch (TCPFTPCON TCPIN) of TCPFTPCON) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (CONS PROCESS EVENT))) ) (\TCPFTP.READ.UNTIL.EOF [LAMBDA (DATASTREAM) (* ; "Edited 20-Jun-89 19:41 by welch") (* ;;; "This function is used to avoid possible deadlock in the case where the stream is opened and closed immediately. ") (PROG ((TCB (fetch (TCPSTREAM TCB) of DATASTREAM)) (TCPFTPCON (fetch (TCPDATASTREAM TCPFTPCON) of DATASTREAM))) (WITH.MONITOR \TCPFTP.DATACONNECTION.LOCK (if (NOT (EOFP DATASTREAM)) then (while (\QUEUEHEAD (fetch TCB.INPUT.QUEUE of TCB)) do (\TCP.GET.SEGMENT DATASTREAM)) (* ;; "read to the end of the file.") (while (NOT (EOFP DATASTREAM)) do (BIN DATASTREAM))))]) (\TCPFTP.TRANSFER.COMPLETE [LAMBDA (DATASTREAM) (* ; "Edited 24-May-89 14:12 by welch") (LET ((TCPFTPCON (fetch (TCPDATASTREAM TCPFTPCON) of DATASTREAM))) (STREAMPROP DATASTREAM 'AFTERCLOSE NIL) (COND ((AND TCPFTPCON (NOT (fetch (TCPDATASTREAM SEENEOS) of DATASTREAM))) [COND ((OPENP DATASTREAM 'INPUT) (TCP.CLOSE.SENDER (TCP.OTHER.STREAM DATASTREAM] (replace (TCPDATASTREAM SEENEOS) of DATASTREAM with T) (replace (TCPDATASTREAM TCPCONTROLDEVICE) of DATASTREAM with NIL) (replace (TCPDATASTREAM TCPFTPCON) of DATASTREAM with NIL) (\TCPFTP.RELEASE.CONNECTION TCPFTPCON]) (\TCPFTP.WAIT.FOR.DATACONNECTION (LAMBDA (DEVICE TCPFTPCON PROCESS.AND.EVENT ACCESS) (* ejs%: "26-Sep-86 18:30") (* * EVENT is a cons of PROCESS and a real event. PROCESS is the process trying to open the connection; EVENT is an event which is notified when the process succeeds or fails to open the connection to the server) (LET (STREAM) (AWAIT.EVENT (CDR PROCESS.AND.EVENT) 120000) (COND ((NULL (SETQ STREAM (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON))) (* * A NIL in this field means the local client code was unable to open the connection to the server program.) NIL) ((OPENP STREAM ACCESS) (replace (TCPDATASTREAM TCPCONTROLDEVICE) of STREAM with DEVICE) STREAM)))) ) (\TCPFTP.DELETE.CONNECTION (LAMBDA (TCPFTPCON DEVICE SENDBYE) (* ejs%: "15-Nov-86 15:09") (LET ((INSTREAM (fetch (TCPFTPCON TCPIN) of TCPFTPCON))) (COND (SENDBYE (NLSETQ (ARPACMD TCPFTPCON "BYE" NIL (QUOTE (221 500)))))) (COND (INSTREAM (DEL.PROCESS (fetch (TCP.CONTROL.BLOCK TCB.PROCESS) of (fetch (TCPSTREAM TCB) of INSTREAM))))) (replace (FDEV DEVICEINFO) of DEVICE with (DREMOVE TCPFTPCON (fetch (FDEV DEVICEINFO) of DEVICE))))) ) ) (RPAQ? \TCPFTP.DATACONNECTION.LOCK (CREATE.MONITORLOCK "TCPFTP Data Connection Lock")) (RPAQ? \TCPFTP.CONNECTION.LOCK (CREATE.MONITORLOCK "TCPFTP Connection Lock")) (RPAQ? \TCPFTP.IDLE.TIMEOUT (TIMES 10 60 1000)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TCPFTP.DATACONNECTION.LOCK \TCPFTP.CONNECTION.LOCK \TCPFTP.IDLE.TIMEOUT) ) (FILESLOAD (SYSLOAD) TCPNAMES TCP) (\TCPFTP.INIT) (RPAQQ TCPFTP.DEFAULT.FILETYPES ((NIL . TEXT) (DFASL . BINARY) (dfasl . BINARY) (LCOM . BINARY) (lcom . BINARY) (DCOM . BINARY) (dcom . BINARY) (LISP . TEXT) (lisp . TEXT) (LSP . TEXT) (lsp . TEXT) (RST . BINARY) (rst . BINARY) (BIN . BINARY) (bin . BINARY) (TXT . TEXT) (txt . TEXT) (TEXT . TEXT) (text . TEXT) (c . TEXT) (h . TEXT) (o . BINARY) (TEDIT . BINARY) (tedit . BINARY) (DISPLAYFONT . BINARY) (WD . BINARY))) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA ) (ADDTOVAR NLAML ) (ADDTOVAR LAMA ) ) (PUTPROPS TCPFTP COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1900 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (4143 7185 (ARPACMD 4153 . 5446) (FTPHELP 5448 . 5565) (CMDREADCODE 5567 . 5671) ( CMDREAD 5673 . 5800) (DISCARDLINE 5802 . 6196) (GETLINE 6198 . 6484) (\TCPFTP.INPUT 6486 . 7041) ( TELNET.EOL 7043 . 7183)) (7526 40072 (\TCPFTP.CONTROL.CLOSED 7536 . 8004) (\TCPFTP.GET.OSTYPE 8006 . 8252) (\TCPFTP.EVENTFN 8254 . 8834) (\TCPFTP.HOSTNAMEP 8836 . 11823) (\GET.TCPFTP.CONNECTION 11825 . 12570) (\TCPFTP.OPEN.CONNECTION 12572 . 13893) (\TCPFTP.ASSURE.CLEANUP 13895 . 14215) (\TCPFTP.CLEANUP 14217 . 15408) (\TCPFTP.RELEASE.CONNECTION 15410 . 15723) (\TCPFTP.LOGIN 15725 . 17870) ( \TCPFTP.DELETEFILE 17872 . 18309) (\TCPFTP.DIRECTORYNAMEP 18311 . 18965) (\TCPFTP.ENDOFSTREAMOP 18967 . 19118) (\TCPFTP.GENERATEFILES 19120 . 22881) (\TCPFTP.GENERATENEXTFILE 22883 . 27772) ( \TCPFTP.GETFILENAME 27774 . 30946) (\TCPFTP.GETFILEINFO 30948 . 31131) (\TCPFTP.SETFILEINFO 31133 . 31257) (\TCPFTP.RENAMEFILE 31259 . 32187) (\TCPFTP.CONNECT 32189 . 32726) (\TCPFTP.OPENFILE 32728 . 38498) (\TCPFTP.CLOSE 38500 . 38868) (\TCPFTP.FLUSH 38870 . 39118) (\TCPFTP.INIT 39120 . 39320) ( SET.TCP.EOL.CONVENTION 39322 . 40070)) (41953 48826 (\TCP.BYE 41963 . 42548) (\TCPFTP.MAYBE.ABORT 42550 . 43295) (\TCPFTP.DATA.CLOSED 43297 . 43468) (\TCPFTP.OPEN.DATA.CONNECTION 43470 . 44677) ( \TCPFTP.PORT.STRING 44679 . 45060) (\TCPFTP.SPAWN.DATACONNECTION 45062 . 46078) ( \TCPFTP.READ.UNTIL.EOF 46080 . 46897) (\TCPFTP.TRANSFER.COMPLETE 46899 . 47705) ( \TCPFTP.WAIT.FOR.DATACONNECTION 47707 . 48384) (\TCPFTP.DELETE.CONNECTION 48386 . 48824))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPFTPSRV b/obsolete/tcp/TCPFTPSRV new file mode 100644 index 00000000..1e95bbcd --- /dev/null +++ b/obsolete/tcp/TCPFTPSRV @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "13-Sep-90 15:07:59" {DSK}TCP>TCPFTPSRV.;6 55339 changes to%: (FNS TCPFTP.SERVER.MERGE.PATHNAMES TCPFTP.SERVER.PATH TCPFTP.SERVER.LIST TCPFTP.SERVER.RETRIEVE) previous date%: "11-Sep-90 13:34:33" {DSK}TCP>TCPFTPSRV.;5) (* ; " Copyright (c) 1986, 1987, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPFTPSRVCOMS) (RPAQQ TCPFTPSRVCOMS ((FNS TCPFTP.SERVER TCPFTP.SERVER.ABORTED TCPFTP.SERVER.ACCOUNT TCPFTP.SERVER.APPEND TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTP.SERVER.COMMAND.LOOP TCPFTP.SERVER.CONNECTED.INFO TCPFTP.SERVER.DELETE TCPFTP.SERVER.DIRECTORY TCPFTP.SERVER.EXIT TCPFTP.SERVER.IDLE.INFO TCPFTP.SERVER.LIST TCPFTP.SERVER.MERGE.PATHNAMES TCPFTP.SERVER.MODE TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTP.SERVER.PARSE.PORT TCPFTP.SERVER.PASSWORD TCPFTP.SERVER.PATH TCPFTP.SERVER.PORT TCPFTP.SERVER.PROCESS TCPFTP.SERVER.RENAME.FROM TCPFTP.SERVER.RENAME.TO TCPFTP.SERVER.RESPONSE TCPFTP.SERVER.RETRIEVE TCPFTP.SERVER.RETURN.FILE TCPFTP.SERVER.STORE TCPFTP.SERVER.STRUCTURE TCPFTP.SERVER.TYPE TCPFTP.SERVER.USER TCPFTP.SERVER.VERBOSE.LIST TCPFTP.SERVER.WAIT.FOR.IDLE TCPFTP.UNIX.LS.DATE) (INITVARS (TCPFTP.SERVER.HERALD.STRING "Venue Medley FTP Service 1.0 at your service") (TCPFTP.SERVER.USE.TOPS20.SYNTAX NIL) (TCPFTP.SERVER.RETRYCOUNT 5)) (GLOBALVARS TCPFTP.SERVER.HERALD.STRING TCPFTP.SERVER.USE.TOPS20.SYNTAX TCPFTP.SERVER.RETRYCOUNT) (FILES (SYSLOAD) TCPFTP))) (DEFINEQ (TCPFTP.SERVER [LAMBDA (PORT DEFAULT.FILE.PATH) (* ; "Edited 24-Aug-87 17:57 by scp") (* * This is the TCP-based FTP server top-level) (ADD.PROCESS `(TCPFTP.SERVER.PROCESS ,PORT ,DEFAULT.FILE.PATH) 'RESTARTABLE 'HARDRESET]) (TCPFTP.SERVER.ABORTED [LAMBDA (INSTREAM OUTSTREAM) (* ejs%: "20-Mar-86 19:53") (TCPFTP.SERVER.EXIT INSTREAM OUTSTREAM]) (TCPFTP.SERVER.ACCOUNT [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 11:40") (* * This function parses USER commands) (LET ((ACCT (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL))) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG ACCT T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 230 "You sure are formal!" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.APPEND [LAMBDA (TCPFTPCON RDTBL USERPORT TYPE DEFAULT.PATH) (* ejs%: "24-Mar-86 14:07") (* * This function parses USER commands) (LET* [(FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T)) (TRUENAME (CAR (NLSETQ (OR (INFILEP PACKED.FILENAME) (OUTFILEP PACKED.FILENAME] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND [TRUENAME (LET [(FILESTREAM (CAR (NLSETQ (OPENSTREAM TRUENAME 'APPEND NIL `((TYPE %, TYPE] (COND [FILESTREAM (TCPFTP.SERVER.RESPONSE 150 (CONCAT "Opening data connection for append to " (FULLNAME FILESTREAM)) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (LET ((DATASTREAM (TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTPCON USERPORT T ))) (COND (DATASTREAM [replace (STREAM ENDOFSTREAMOP) of DATASTREAM with (FUNCTION (LAMBDA (STREAM) (ERROR!] (RESETLST (RESETSAVE (COND ((EQ TYPE 'BINARY) (COPYBYTES DATASTREAM FILESTREAM)) (T (COPYCHARS DATASTREAM FILESTREAM ))) (LIST [FUNCTION (LAMBDA (FILESTREAM TCPFTPCON) (CLOSEF? FILESTREAM) (  TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTPCON) (TCPFTP.SERVER.RESPONSE 226 "Data transfer complete" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] FILESTREAM TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 450 (CONCAT "Couldn't open file " TRUENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 550 (CONCAT "Unable to create output filename - " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.CLOSE.DATA.CONNECTION [LAMBDA (TCPFTPCON) (* ejs%: "20-Mar-86 17:53") (LET ((DATASTREAM (fetch (TCPFTPCON DATASTREAM) of TCPFTPCON)) (EVENT (fetch (TCPFTPCON BUSY?) of TCPFTPCON))) (CLOSEF? DATASTREAM) (replace (TCPFTPCON DATASTREAM) of TCPFTPCON with NIL) (replace (TCPFTPCON BUSY?) of TCPFTPCON with NIL) (NOTIFY.EVENT EVENT) T]) (TCPFTP.SERVER.COMMAND.LOOP [LAMBDA (CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM PATH) (* ; "Edited 31-Aug-90 17:15 by gadener") (DECLARE (SPECVARS TCPFTPCON COMMAND)) (LET ([COMMAND.RDTBL (DEFERREDCONSTANT (PROG [(R (COPYREADTABLE 'ORIG] (SETBRK NIL NIL R) (SETSYNTAX '%% 'OTHER R) (SETSEPR '(13 10 31 32) NIL R) (RETURN R] (TCPFTPCON (create TCPFTPCON TCPIN _ CONTROL.INPUT.STREAM TCPOUT _ CONTROL.OUTPUT.STREAM)) (TYPE TCP.DEFAULTFILETYPE) RENAME.FROM.FILE LAST.COMMAND USERPORT) (OR PATH (SETQ PATH "{DSK}")) (while (AND (OPENP CONTROL.INPUT.STREAM 'INPUT) (OPENP CONTROL.OUTPUT.STREAM 'OUTPUT) (NOT (EOFP CONTROL.INPUT.STREAM))) first [PROCESSPROP (THIS.PROCESS) 'NAME (CONCAT "FTP#" (\IP.ADDRESS.TO.STRING (fetch (TCP.CONTROL.BLOCK TCB.DST.HOST) of (fetch (TCPSTREAM TCB) of CONTROL.INPUT.STREAM ] do (LET [(COMMAND (U-CASE (CAR (NLSETQ (READ CONTROL.INPUT.STREAM COMMAND.RDTBL] [COND ((AND (OPENP CONTROL.INPUT.STREAM 'INPUT) (NOT (EOFP CONTROL.INPUT.STREAM))) (COND ([NOT (FMEMB COMMAND '(QUIT REIN ABOR NOOP NIL] (BIN CONTROL.INPUT.STREAM] (* Advance past the space preceding  the argument) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG T "> " COMMAND " "))) (SELECTQ COMMAND (USER (TCPFTP.SERVER.USER TCPFTPCON COMMAND.RDTBL)) (PASS (TCPFTP.SERVER.PASSWORD TCPFTPCON COMMAND.RDTBL)) (ACCT (TCPFTP.SERVER.ACCOUNT TCPFTPCON COMMAND.RDTBL)) (CWD (SETQ PATH (OR (TCPFTP.SERVER.PATH TCPFTPCON COMMAND.RDTBL PATH) PATH))) (PWD (TCPFTP.SERVER.RESPONSE 250 (CONCAT "Default pathname is " PATH) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (PORT (SETQ USERPORT (OR (TCPFTP.SERVER.PORT TCPFTPCON COMMAND.RDTBL) USERPORT))) (TYPE (SETQ TYPE (OR (TCPFTP.SERVER.TYPE TCPFTPCON COMMAND.RDTBL) TYPE))) (MODE (TCPFTP.SERVER.MODE TCPFTPCON COMMAND.RDTBL)) (STRU (TCPFTP.SERVER.STRUCTURE TCPFTPCON COMMAND.RDTBL)) (* ;; "Depending on the COMMAND (LIST -> verbose), TCPFTP.SERVER.LIST will return a verbose listing or a simple list of file names ") ((NLST LIST) (* ;  "Depending on the COMMAND, TCPFTP.SERVER.LIST will return") (TCPFTP.SERVER.LIST TCPFTPCON COMMAND.RDTBL USERPORT PATH COMMAND)) (RETR (TCPFTP.SERVER.RETRIEVE TCPFTPCON COMMAND.RDTBL USERPORT TYPE PATH)) (STOR (TCPFTP.SERVER.STORE TCPFTPCON COMMAND.RDTBL USERPORT TYPE PATH )) (APPE (TCPFTP.SERVER.APPEND TCPFTPCON COMMAND.RDTBL USERPORT TYPE PATH)) (DELE (TCPFTP.SERVER.DELETE TCPFTPCON COMMAND.RDTBL PATH)) (RNFR (SETQ RENAME.FROM.FILE (TCPFTP.SERVER.RENAME.FROM TCPFTPCON COMMAND.RDTBL PATH))) (RNTO (COND ((EQ LAST.COMMAND 'RNFR) (TCPFTP.SERVER.RENAME.TO TCPFTPCON COMMAND.RDTBL PATH RENAME.FROM.FILE)) (T (TCPFTP.SERVER.RESPONSE 503 "I need a RNFR command immediately preceding a RNTO command." CONTROL.OUTPUT.STREAM)))) (REIN (DISCARDLINE CONTROL.INPUT.STREAM) (TCPFTP.SERVER.WAIT.FOR.IDLE TCPFTPCON) (TCPFTP.SERVER.RESPONSE 220 "Go ahead" CONTROL.OUTPUT.STREAM)) (QUIT (DISCARDLINE CONTROL.INPUT.STREAM) (TCPFTP.SERVER.WAIT.FOR.IDLE TCPFTPCON) (TCPFTP.SERVER.RESPONSE 221 "It's been real" CONTROL.OUTPUT.STREAM) (RETURN)) (NOOP (TCPFTP.SERVER.RESPONSE 200 "I'm still here" CONTROL.OUTPUT.STREAM)) (NIL (* Error reading from control stream) (ERROR!)) (PROGN (DISCARDLINE CONTROL.INPUT.STREAM) (TCPFTP.SERVER.RESPONSE 502 (CONCAT "Unrecognized command " COMMAND) CONTROL.OUTPUT.STREAM))) (SETQ LAST.COMMAND COMMAND]) (TCPFTP.SERVER.CONNECTED.INFO [LAMBDA (PROCESS BUTTON) (* ejs%: "21-Mar-86 17:07") [PROMPTPRINT "TCPFTP server connected to " (IPHOSTNAME (fetch (TCP.CONTROL.BLOCK TCB.DST.HOST) of (fetch (TCPSTREAM TCB) of CONTROL.INPUT.STREAM ] (COND ((EQ BUTTON 'MIDDLE) (COND ((AND (BOUNDP 'TCPFTPCON) (fetch (TCPFTPCON BUSY?) of TCPFTPCON)) (printout PROMPTWINDOW T " Server is busy; last command was " (OR (AND (BOUNDP 'COMMAND) COMMAND) "???"))) ((AND (BOUNDP COMMAND) COMMAND) (printout PROMPTWINDOW T " Last command was " COMMAND]) (TCPFTP.SERVER.DELETE [LAMBDA (TCPFTPCON RDTBL DEFAULT.PATH) (* ejs%: " 7-Apr-86 11:42") (* * This function parses USER commands) (LET* ((FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T T)) TRUENAME) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND [PACKED.FILENAME (COND ([SETQ TRUENAME (CAR (NLSETQ (DELFILE PACKED.FILENAME] (TCPFTP.SERVER.RESPONSE 250 (CONCAT "Deleted " (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY TRUENAME) 'TOPS-20)) (T TRUENAME))) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (T (TCPFTP.SERVER.RESPONSE 450 (CONCAT "Couldn't delete file " TRUENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 550 (CONCAT "File not found - " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.DIRECTORY [LAMBDA (TCPFTPCON RDTBL USERPORT DEFAULT.PATH COMMAND) (* ; "Edited 30-Aug-90 17:47 by gadener") (* * This function parses USER commands) (LET* [(PATH (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (FILES (CAR (NLSETQ (DIRECTORY (TCPFTP.SERVER.MERGE.PATHNAMES PATH DEFAULT.PATH T] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG PATH T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 150 (CONCAT "Opening data connection for directory of " PATH " [" (LENGTH FILES) " file name(s)]") (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (LET ((DATASTREAM (TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTPCON USERPORT))) (COND (DATASTREAM (for FILE in FILES do (PRIN1 [COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY FILE) 'TOPS-20)) (T (TCPFTP.SERVER.RETURN.FILE FILE DEFAULT.PATH 'INFO] DATASTREAM) (TERPRI DATASTREAM) finally (  TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 226 "Data transfer complete" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON ]) (TCPFTP.SERVER.EXIT [LAMBDA (CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM) (* ejs%: "20-Mar-86 19:52") (CLOSEF? CONTROL.OUTPUT.STREAM) (CLOSEF? CONTROL.INPUT.STREAM]) (TCPFTP.SERVER.IDLE.INFO [LAMBDA (PROCESS BUTTON) (* ejs%: "21-Mar-86 16:58") (PROMPTPRINT "Idle TCPFTP server"]) (TCPFTP.SERVER.LIST [LAMBDA (TCPFTPCON RDTBL USERPORT DEFAULT.PATH COMMAND) (* ; "Edited 13-Sep-90 14:41 by gadener") (* * This function parses USER commands) (LET* ((PATH (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) [FILES (CAR (NLSETQ (DIRECTORY (TCPFTP.SERVER.MERGE.PATHNAMES PATH DEFAULT.PATH T] (NFILES (LENGTH FILES))) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG PATH T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 150 (CONCAT "Opening data connection for directory " DEFAULT.PATH " [" NFILES " file name(s)]") (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (LET ((DATASTREAM (TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTPCON USERPORT))) (COND (DATASTREAM (for FILE in FILES do (PRIN1 (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY FILE) 'TOPS-20)) (T (TCPFTP.SERVER.RETURN.FILE FILE DEFAULT.PATH COMMAND))) DATASTREAM) (TERPRI DATASTREAM) finally (  TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 226 "Data transfer complete" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON ]) (TCPFTP.SERVER.MERGE.PATHNAMES [LAMBDA (NAME DEFAULT.PATH NODEVICE.IF.LOCAL NOVERSION.IF.LOCAL DIRFLG) (* ; "Edited 13-Sep-90 14:16 by gadener") (LET* ((NAMEFIELDS (UNPACKFILENAME.STRING NAME NIL DIRFLG)) (DEFAULTFIELDS (UNPACKFILENAME.STRING DEFAULT.PATH NIL DIRFLG)) [HOST (OR (LISTGET NAMEFIELDS 'HOST) (LISTGET DEFAULTFIELDS 'HOST] [HOSTSPECIFIED (NOT (NULL (LISTGET NAMEFIELDS 'HOST] DIRECTORY1) (PACKFILENAME.STRING 'HOST HOST 'DEVICE [COND ((AND NODEVICE.IF.LOCAL (EQ HOST 'DSK)) NIL) ((OR (LISTGET NAMEFIELDS 'DEVICE) (COND (HOSTSPECIFIED NIL) (T (LISTGET DEFAULTFIELDS 'DEVICE] 'DIRECTORY [COND ((LISTGET NAMEFIELDS 'DIRECTORY)) ([COND [(SETQ DIRECTORY1 (LISTGET NAMEFIELDS 'SUBDIRECTORY] ((SETQ DIRECTORY1 (LISTGET NAMEFIELDS 'RELATIVEDIRECTORY] (CL:CONCATENATE 'STRING (LISTGET DEFAULTFIELDS 'DIRECTORY) ">" DIRECTORY1)) (HOSTSPECIFIED NIL) (T (LISTGET DEFAULTFIELDS 'DIRECTORY] 'NAME (OR (LISTGET NAMEFIELDS 'NAME) (LISTGET DEFAULTFIELDS 'NAME)) 'EXTENSION (OR (LISTGET NAMEFIELDS 'EXTENSION) (LISTGET DEFAULTFIELDS 'EXTENSION)) 'VERSION (COND ((AND NOVERSION.IF.LOCAL (EQ HOST 'DSK)) NIL) (T (OR (LISTGET NAMEFIELDS 'VERSION) (LISTGET DEFAULTFIELDS 'VERSION]) (TCPFTP.SERVER.MODE [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 15:38") (* * This function parses USER commands) (LET ((MODE (READ (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (RESPONSE.STRING) (ERRORFLG)) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG MODE T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (SELECTQ MODE (S (SETQ RESPONSE.STRING "Now in stream mode")) (PROGN (SETQ RESPONSE.STRING (CONCAT "Unsupported mode - " MODE)) (SETQ ERRORFLG T))) (COND (ERRORFLG (TCPFTP.SERVER.RESPONSE 504 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL) (T (TCPFTP.SERVER.RESPONSE 200 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.OPEN.DATA.CONNECTION [LAMBDA (TCPFTPCON USERPORT FORINPUT) (* ejs%: "11-Apr-86 16:09") (* * This function handles opening data connections and marking said tcp  connections as busy) (bind (TCB _ (fetch (TCPSTREAM TCB) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON))) DATASTREAM for RETRIES from 0 to TCPFTP.SERVER.RETRYCOUNT until (SETQ DATASTREAM (TCP.OPEN (COND (USERPORT (CAR USERPORT)) (T (fetch (TCP.CONTROL.BLOCK TCB.DST.HOST) of TCB))) (COND (USERPORT (CDR USERPORT)) (T (fetch (TCP.CONTROL.BLOCK TCB.DST.PORT) of TCB))) (SUB1 (fetch (TCP.CONTROL.BLOCK TCB.SRC.PORT) of TCB)) 'ACTIVE (COND (FORINPUT 'INPUT) (T 'OUTPUT)) T)) finally (RETURN (COND (DATASTREAM (replace (TCPFTPCON DATASTREAM) of TCPFTPCON with DATASTREAM ) (replace (TCPFTPCON BUSY?) of TCPFTPCON with (CREATE.EVENT )) (* TELNET standard EOL convention on  DATASTREAMS) (SETFILEINFO DATASTREAM 'EOL 'CRLF) DATASTREAM) (T (TCPFTP.SERVER.RESPONSE 426 "Couldn't open data connection" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL]) (TCPFTP.SERVER.PARSE.PORT [LAMBDA (PSTRING) (* ; "Edited 28-May-87 18:00 by jop") (* ;;; "Parse a port string, in the form 'h1,h2,h3,h4,p1,p2' , where the hx are bytes from an internet host address, and the px are bytes from a 16-bit TCP port number") (LET ((IPADDRESS (CREATECELL \FIXP)) (TCPPORT 0)) (bind (BYTECOUNTER _ 0) (ACCUMULATOR _ 0) ERRORFLG for CH instring PSTRING do (COND ((EQ CH (CHARCODE %,)) (COND ((IGREATERP BYTECOUNTER 3) (SETQ TCPPORT (IPLUS (ITIMES TCPPORT 256) ACCUMULATOR))) (T (\PUTBASEBYTE IPADDRESS BYTECOUNTER ACCUMULATOR))) (SETQ ACCUMULATOR 0) (add BYTECOUNTER 1)) [(AND (ILEQ CH (CHARCODE 9)) (IGEQ CH (CHARCODE 0))) (SETQ ACCUMULATOR (IPLUS (IDIFFERENCE CH (CHARCODE 0)) (ITIMES ACCUMULATOR 10))) (COND ((IGREATERP ACCUMULATOR 255) (SETQ ERRORFLG T) (GO $$OUT] (T (SETQ ERRORFLG T) (GO $$OUT))) finally (COND (ERRORFLG (RETURN NIL)) (T (COND ((NEQ BYTECOUNTER 5) (RETURN NIL)) (T (RETURN (CONS IPADDRESS (IPLUS (ITIMES TCPPORT 256) ACCUMULATOR]) (TCPFTP.SERVER.PASSWORD [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 11:39") (* * This function parses USER commands) (LET ((PASS (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL))) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG PASS T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 230 "OK, so you're logged in. Now what?" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.PATH [LAMBDA (TCPFTPCON COMMAND.RDTBL OLDPATH) (* ; "Edited 13-Sep-90 13:37 by gadener") (LET* ((PATH (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) COMMAND.RDTBL)) (TRUEPATH (TCPFTP.SERVER.MERGE.PATHNAMES PATH OLDPATH NIL T 'RETURN)) (* ;; "The last argument, RETURN, makes sure that even though a directory was specified as /a/b/c, we really meant /a/b/c") ) (IF TRUEPATH THEN (TCPFTP.SERVER.RESPONSE 250 (CONCAT "Default pathname now " TRUEPATH) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) TRUEPATH else (TCPFTP.SERVER.RESPONSE 501 (CONCAT "Couldn't interpret " NEWPATH " as a pathname") (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL]) (TCPFTP.SERVER.PORT [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 11:41") (LET* ((PORTSTRING (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PARSEDPORT (TCPFTP.SERVER.PARSE.PORT PORTSTRING))) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG PORTSTRING T))) (COND (PARSEDPORT (TCPFTP.SERVER.RESPONSE 200 (CONCAT "User port now " PORTSTRING) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) PARSEDPORT) (T (TCPFTP.SERVER.RESPONSE 501 (CONCAT "Couldn't parse port specification " PORTSTRING) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL]) (TCPFTP.SERVER.PROCESS [LAMBDA (PORT DEFAULT.FILE.PATH) (* ; "Edited 24-Aug-87 17:55 by scp") (* * This is the TCP-based FTP server top-level) (PROCESSPROP (THIS.PROCESS) 'INFOHOOK (FUNCTION TCPFTP.SERVER.IDLE.INFO)) (LET* ((CONTROL.INPUT.STREAM (TCP.OPEN NIL NIL (OR PORT \TCP.FTP.PORT) 'PASSIVE 'INPUT)) (CONTROL.OUTPUT.STREAM (TCP.OTHER.STREAM CONTROL.INPUT.STREAM))) (* EOL convention -> TELNET Standard) (SETFILEINFO CONTROL.OUTPUT.STREAM 'EOL 'CRLF) (* Say hello quickly) (TCPFTP.SERVER.RESPONSE 220 TCPFTP.SERVER.HERALD.STRING CONTROL.OUTPUT.STREAM) (* Spawn a new server) (ADD.PROCESS (LIST (FUNCTION TCPFTP.SERVER) PORT (KWOTE DEFAULT.FILE.PATH)) 'RESTARTABLE 'HARDRESET) (* Now that we're "established,"  errors are fatal) (PROCESSPROP (THIS.PROCESS) 'RESTARTABLE 'NO) (PROCESSPROP (THIS.PROCESS) 'INFOHOOK (FUNCTION TCPFTP.SERVER.CONNECTED.INFO)) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM) (COND (RESETSTATE (TCPFTP.SERVER.ABORTED CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM)) (T (TCPFTP.SERVER.EXIT CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM] CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM)) (TCPFTP.SERVER.COMMAND.LOOP CONTROL.INPUT.STREAM CONTROL.OUTPUT.STREAM DEFAULT.FILE.PATH]) (TCPFTP.SERVER.RENAME.FROM [LAMBDA (TCPFTPCON RDTBL DEFAULT.PATH) (* ejs%: "24-Mar-86 14:16") (* * This function parses RNFR commands) (LET* [(FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T)) (TRUENAME (CAR (NLSETQ (INFILEP PACKED.FILENAME] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND (TRUENAME (TCPFTP.SERVER.RESPONSE 350 (CONCAT "About to rename " (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY TRUENAME) 'TOPS-20)) (T TRUENAME))) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) TRUENAME) (T (TCPFTP.SERVER.RESPONSE 550 (CONCAT "File not found - " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL]) (TCPFTP.SERVER.RENAME.TO [LAMBDA (TCPFTPCON RDTBL DEFAULT.PATH FROM.FILE) (* ejs%: "24-Mar-86 14:34") (* * This function parses RNTO commands) (LET* [(FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T)) (TRUENAME (CAR (NLSETQ (OUTFILEP PACKED.FILENAME] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND (TRUENAME (RENAMEFILE FROM.FILE TRUENAME) (TCPFTP.SERVER.RESPONSE 250 (CONCAT "Renamed " (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING ( PACKFILENAME.STRING 'HOST NIL 'BODY FROM.FILE) 'TOPS-20)) (T FROM.FILE)) " to " (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING ( PACKFILENAME.STRING 'HOST NIL 'BODY TRUENAME) 'TOPS-20)) (T TRUENAME))) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (T (TCPFTP.SERVER.RESPONSE 553 (CONCAT "Couldn't make an output file named " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.RESPONSE [LAMBDA (CODE STRING STREAM) (* edited%: "21-Mar-86 11:44") (RESETFORM (RADIX 10) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG "> " CODE " " STRING T))) (printout STREAM CODE " " STRING T)) (FORCEOUTPUT STREAM]) (TCPFTP.SERVER.RETRIEVE [LAMBDA (TCPFTPCON RDTBL USERPORT TYPE DEFAULT.PATH) (* ; "Edited 13-Sep-90 14:59 by gadener") (* * This function parses USER commands) (LET* [(FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T)) (TRUENAME (CAR (NLSETQ (INFILEP PACKED.FILENAME] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND [TRUENAME (LET [(FILESTREAM (CAR (NLSETQ (OPENSTREAM TRUENAME 'INPUT 'OLD `((TYPE %, TYPE] (COND [FILESTREAM (TCPFTP.SERVER.RESPONSE 150 (CONCAT "Opening " TYPE " data connection for " (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (FULLNAME FILESTREAM) 'TOPS-20)) (T (FULLNAME FILESTREAM))) " (" [\IP.ADDRESS.TO.STRING (OR (CAR USERPORT) (fetch (TCP.CONTROL.BLOCK TCB.DST.HOST) of (fetch (TCPSTREAM TCB) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON] "," [OR (CDR USERPORT) (fetch (TCP.CONTROL.BLOCK TCB.DST.PORT) of (fetch (TCPSTREAM TCB) of (fetch (TCPFTPCON TCPIN) of TCPFTPCON] ") (" (OR (GETFILEINFO FILESTREAM 'LENGTH) 0) " bytes).") (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (LET ((DATASTREAM (TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTPCON USERPORT))) (COND (DATASTREAM (LET [(RESULT (NLSETQ (COND ((EQ TYPE 'BINARY) (COPYBYTES FILESTREAM DATASTREAM)) (T (COPYCHARS FILESTREAM DATASTREAM] (CLOSEF? FILESTREAM) (TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTPCON) (COND (RESULT (TCPFTP.SERVER.RESPONSE 226 "Data transfer complete" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON))) (T (TCPFTP.SERVER.RESPONSE 426 "Couldn't complete retrieve operation" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 450 (CONCAT "Couldn't open file " TRUENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 550 (CONCAT "File not found - " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.RETURN.FILE [LAMBDA (FILE DEFAULT.PATH COMMAND) (* ; "Edited 31-Aug-90 17:57 by gadener") (* ;; "If COMMAND is LIST , it will return a verbose listing of the file and some of its properties. If the command is NLIST, it will just return the filename with extension and version. ") (* ;; "Note that since the D-mahines don't have a true directory structure, it will return the relative pathname to the file , in relation to DEFAULT.PATH.") (LET* [(DEFAULT.PATH.STRING.LENGTH (NCHARS DEFAULT.PATH)) (PATH (SUBSTRING FILE (PLUS 1 DEFAULT.PATH.STRING.LENGTH))) (TAB (CHARACTER (CHARCODE TAB] (COND ((EQUAL COMMAND 'LIST) (CONCAT (GETFILEINFO FILE 'TYPE) TAB (GETFILEINFO FILE 'LENGTH) TAB (GETFILEINFO FILE 'WRITEDATE) TAB (GETFILEINFO FILE 'AUTHOR) TAB PATH)) (T PATH]) (TCPFTP.SERVER.STORE [LAMBDA (TCPFTPCON RDTBL USERPORT TYPE DEFAULT.PATH) (* ejs%: "24-Mar-86 15:27") (* * This function parses USER commands) (LET* [(FILENAME (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (PACKED.FILENAME (TCPFTP.SERVER.MERGE.PATHNAMES FILENAME DEFAULT.PATH T)) (TRUENAME (CAR (NLSETQ (OUTFILEP PACKED.FILENAME] (COND (FTPDEBUGFLG (printout FTPDEBUGLOG FILENAME T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (COND [TRUENAME (LET [(FILESTREAM (CAR (NLSETQ (OPENSTREAM TRUENAME 'OUTPUT 'NEW `((TYPE %, TYPE] (COND [FILESTREAM (TCPFTP.SERVER.RESPONSE 150 (CONCAT "Opening data connection for store of " (FULLNAME FILESTREAM)) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (LET ((DATASTREAM (TCPFTP.SERVER.OPEN.DATA.CONNECTION TCPFTPCON USERPORT T ))) (COND (DATASTREAM [replace (STREAM ENDOFSTREAMOP) of DATASTREAM with (FUNCTION (LAMBDA (STREAM) (ERROR!] (RESETLST (RESETSAVE (COND ((EQ TYPE 'BINARY) (COPYBYTES DATASTREAM FILESTREAM)) (T (COPYCHARS DATASTREAM FILESTREAM ))) (LIST [FUNCTION (LAMBDA (FILESTREAM TCPFTPCON) (CLOSEF? FILESTREAM) (  TCPFTP.SERVER.CLOSE.DATA.CONNECTION TCPFTPCON) (TCPFTP.SERVER.RESPONSE 226 "Data transfer complete" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] FILESTREAM TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 450 (CONCAT "Couldn't open file " TRUENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON] (T (TCPFTP.SERVER.RESPONSE 550 (CONCAT "Unable to create output filename - " PACKED.FILENAME) (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.STRUCTURE [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 14:08") (* * This function parses USER commands) (LET ((STRUCTURE (READ (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (RESPONSE.STRING) (ERRORFLG)) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG STRUCTURE T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (SELECTQ STRUCTURE (F (SETQ RESPONSE.STRING "Now in stream mode")) (PROGN (SETQ RESPONSE.STRING (CONCAT "Unsupported mode - " STRUCTURE)) (SETQ ERRORFLG T))) (COND (ERRORFLG (TCPFTP.SERVER.RESPONSE 504 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL) (T (TCPFTP.SERVER.RESPONSE 200 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.TYPE [LAMBDA (TCPFTPCON RDTBL) (* ejs%: "24-Mar-86 15:26") (* * This function parses USER commands) (LET* ((MAJOR.TYPE (READ (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) [MINOR.TYPE (LET [(TERM.CHAR (BIN (fetch (TCPFTPCON TCPIN) of TCPFTPCON] (COND ((EQ TERM.CHAR (CHARCODE SPACE)) (READ (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL)) (T (SELECTQ MAJOR.TYPE (A 'N) (L 8) NIL] (RESPONSE.STRING) (ERRORFLG)) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG MAJOR.TYPE " " MINOR.TYPE T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (SELECTQ MAJOR.TYPE (A (SELECTQ MINOR.TYPE (N (SETQ RESPONSE.STRING "Type is now standard ASCII")) (PROGN (SETQ RESPONSE.STRING (CONCAT "ASCII subtype " MINOR.TYPE " not recognized")) (SETQ ERRORFLG T)))) (E (SETQ RESPONSE.STRING "EBCDIC not supported") (SETQ ERRORFLG T)) (I (SETQ RESPONSE.STRING "Type is now 8-bit binary")) (L (COND ((NEQ MINOR.TYPE 8) (SETQ RESPONSE.STRING (CONCAT "Binary byte size " MINOR.TYPE " not supported")) (SETQ ERRORFLG T)) (T (SETQ RESPONSE.STRING "Type is now 8-bit binary")))) NIL) (COND (ERRORFLG (TCPFTP.SERVER.RESPONSE 504 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) NIL) (T (TCPFTP.SERVER.RESPONSE 200 RESPONSE.STRING (fetch (TCPFTPCON TCPOUT) of TCPFTPCON)) (SELECTQ MAJOR.TYPE (A 'TEXT) 'BINARY]) (TCPFTP.SERVER.USER [LAMBDA (TCPFTPCON RDTBL) (* edited%: "21-Mar-86 11:39") (* * This function parses USER commands) (LET ((USER (RSTRING (fetch (TCPFTPCON TCPIN) of TCPFTPCON) RDTBL))) (COND (FTPDEBUGFLG (printout FTPDEBUGLOG USER T))) (DISCARDLINE (fetch (TCPFTPCON TCPIN) of TCPFTPCON)) (TCPFTP.SERVER.RESPONSE 230 "Hi, there!" (fetch (TCPFTPCON TCPOUT) of TCPFTPCON]) (TCPFTP.SERVER.VERBOSE.LIST [LAMBDA (FILE STREAM) (* edited%: "26-Mar-86 11:32") (printout STREAM (COND (TCPFTP.SERVER.USE.TOPS20.SYNTAX (REPACKFILENAME.STRING (PACKFILENAME.STRING 'HOST NIL 'BODY (FULLNAME FILE)) 'TOPS-20)) (T (FULLNAME FILE))) ";P775252;AFORYOURSELF," (FOLDHI (OR (GETFILEINFO FILE 'SIZE) 0) 4) "," (GETFILEINFO FILE 'CREATIONDATE) "," (GETFILEINFO FILE 'WRITEDATE) T]) (TCPFTP.SERVER.WAIT.FOR.IDLE [LAMBDA (TCPFTPCON) (* ejs%: "20-Mar-86 16:39") (bind BUSY? while (SETQ BUSY? (fetch (TCPFTPCON BUSY?) of TCPFTPCON)) do (AWAIT.EVENT BUSY?]) (TCPFTP.UNIX.LS.DATE [LAMBDA (FILE) (* edited%: "21-Mar-86 13:38") (LET* [(CREATIONDATE (GETFILEINFO FILE 'CREATIONDATE)) (MONTHPOS (STRPOS "-" CREATIONDATE)) (YEARPOS (STRPOS "-" CREATIONDATE (ADD1 MONTHPOS))) (TIMEPOS (ADD1 (STRPOS " " CREATIONDATE] (CONCAT (SUBSTRING CREATIONDATE (ADD1 MONTHPOS) (SUB1 YEARPOS)) " " (SUBSTRING CREATIONDATE 1 (SUB1 MONTHPOS)) " " (SUBSTRING CREATIONDATE TIMEPOS -4]) ) (RPAQ? TCPFTP.SERVER.HERALD.STRING "Venue Medley FTP Service 1.0 at your service") (RPAQ? TCPFTP.SERVER.USE.TOPS20.SYNTAX NIL) (RPAQ? TCPFTP.SERVER.RETRYCOUNT 5) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS TCPFTP.SERVER.HERALD.STRING TCPFTP.SERVER.USE.TOPS20.SYNTAX TCPFTP.SERVER.RETRYCOUNT) ) (FILESLOAD (SYSLOAD) TCPFTP) (PUTPROPS TCPFTPSRV COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1782 54890 (TCPFTP.SERVER 1792 . 2089) (TCPFTP.SERVER.ABORTED 2091 . 2263) ( TCPFTP.SERVER.ACCOUNT 2265 . 2817) (TCPFTP.SERVER.APPEND 2819 . 6531) ( TCPFTP.SERVER.CLOSE.DATA.CONNECTION 6533 . 7031) (TCPFTP.SERVER.COMMAND.LOOP 7033 . 13702) ( TCPFTP.SERVER.CONNECTED.INFO 13704 . 14690) (TCPFTP.SERVER.DELETE 14692 . 16577) ( TCPFTP.SERVER.DIRECTORY 16579 . 18921) (TCPFTP.SERVER.EXIT 18923 . 19115) (TCPFTP.SERVER.IDLE.INFO 19117 . 19282) (TCPFTP.SERVER.LIST 19284 . 21609) (TCPFTP.SERVER.MERGE.PATHNAMES 21611 . 23718) ( TCPFTP.SERVER.MODE 23720 . 24743) (TCPFTP.SERVER.OPEN.DATA.CONNECTION 24745 . 27732) ( TCPFTP.SERVER.PARSE.PORT 27734 . 30442) (TCPFTP.SERVER.PASSWORD 30444 . 31090) (TCPFTP.SERVER.PATH 31092 . 32075) (TCPFTP.SERVER.PORT 32077 . 32886) (TCPFTP.SERVER.PROCESS 32888 . 35079) ( TCPFTP.SERVER.RENAME.FROM 35081 . 36653) (TCPFTP.SERVER.RENAME.TO 36655 . 39136) ( TCPFTP.SERVER.RESPONSE 39138 . 39457) (TCPFTP.SERVER.RETRIEVE 39459 . 44526) ( TCPFTP.SERVER.RETURN.FILE 44528 . 45581) (TCPFTP.SERVER.STORE 45583 . 49232) (TCPFTP.SERVER.STRUCTURE 49234 . 50287) (TCPFTP.SERVER.TYPE 50289 . 52577) (TCPFTP.SERVER.USER 52579 . 53118) ( TCPFTP.SERVER.VERBOSE.LIST 53120 . 54036) (TCPFTP.SERVER.WAIT.FOR.IDLE 54038 . 54285) ( TCPFTP.UNIX.LS.DATE 54287 . 54888))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPHTE b/obsolete/tcp/TCPHTE new file mode 100644 index 00000000..dda05d9a --- /dev/null +++ b/obsolete/tcp/TCPHTE @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP") (FILECREATED "12-Jun-90 17:31:06" {DSK}local>lde>lispcore>library>TCPHTE.;3 5753 changes to%: (VARS TCPHTECOMS) previous date%: "11-Feb-89 11:06:54" {DSK}local>lde>lispcore>library>TCPHTE.;2) (* ; " Copyright (c) 1985, 1987, 1988, 1989, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPHTECOMS) (RPAQQ TCPHTECOMS ((PROP MAKEFILE-ENVIRONMENT TCPHTE) (RECORDS HOSTS.TXT.ENTRY) (FNS \HTE.PARSE.ENTRY \HTE.READ.FILE \HTE.READ; \HTE.READLINE) (INITVARS (HOSTS.TEXT.DIRECTORIES) (\HTE.RDTBL)) (DECLARE%: EVAL@COMPILE DONTCOPY (GLOBALVARS \HTE.RDTBL \IP.HOSTNAMES) (RECORDS HTELINE)))) (PUTPROPS TCPHTE MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP")) (DECLARE%: EVAL@COMPILE (DATATYPE HOSTS.TXT.ENTRY (HTE.TYPE HTE.ADDRESSES HTE.NAMES HTE.MACHINE.TYPE HTE.OS.TYPE HTE.PROTOCOLS)) ) (/DECLAREDATATYPE 'HOSTS.TXT.ENTRY '(POINTER POINTER POINTER POINTER POINTER POINTER) '((HOSTS.TXT.ENTRY 0 POINTER) (HOSTS.TXT.ENTRY 2 POINTER) (HOSTS.TXT.ENTRY 4 POINTER) (HOSTS.TXT.ENTRY 6 POINTER) (HOSTS.TXT.ENTRY 8 POINTER) (HOSTS.TXT.ENTRY 10 POINTER)) '12) (DEFINEQ (\HTE.PARSE.ENTRY [LAMBDA (ENTRY) (* ; "Edited 11-Feb-89 11:04 by akw:") (DECLARE (GLOBALVARS NETWORKOSTYPES)) (LET* [[NAMES (for NAME in (fetch (HTELINE NAMES) of ENTRY) collect (MKATOM (U-CASE NAME] (OSTYPE (CAR (fetch (HTELINE OS.TYPE) of ENTRY)) (MKATOM (U-CASE))) (HTE.ENTRY (create HOSTS.TXT.ENTRY HTE.TYPE _ (CAR (fetch (HTELINE TYPE) of ENTRY)) HTE.ADDRESSES _ (for X in (fetch (HTELINE ADDRESSES) of ENTRY) collect (\IP.READ.STRING.ADDRESS X)) HTE.NAMES _ NAMES HTE.MACHINE.TYPE _ [MKATOM (U-CASE (CAR (fetch (HTELINE MACHINE.TYPE ) of ENTRY] HTE.OS.TYPE _ [AND OSTYPE (SETQ OSTYPE (MKATOM (U-CASE OSTYPE] HTE.PROTOCOLS _ (for PROTOENTRY in (fetch (HTELINE PROTOCOLS ) of ENTRY) bind SLASH when (SETQ SLASH (STRPOS '/ PROTOENTRY)) collect (CONS (SUBATOM PROTOENTRY 1 (SUB1 SLASH)) (SUBATOM PROTOENTRY (ADD1 SLASH] (for NAME in NAMES do (PUTHASH NAME HTE.ENTRY \IP.HOSTNAMES]) (\HTE.READ.FILE (LAMBDA (FILE WANTEDTYPES) (* ; "Edited 24-May-88 16:57 by bvm") (DECLARE (GLOBALVARS \IP.HOSTNAMES \TCP.LAST.HOSTS.FILE.DATE \TCP.LAST.HOSTS.FILE.READ)) (OR WANTEDTYPES (SETQ WANTEDTYPES (QUOTE (HOST)))) (CL:WITH-OPEN-FILE (STREAM FILE) (LET ((FILENAME (FULLNAME STREAM)) (DATE (GETFILEINFO STREAM (QUOTE ICREATIONDATE))) ENTRY) (PRINTOUT PROMPTWINDOW T "Reading " FILENAME " of " (GDATE DATE (DATEFORMAT NO.SECONDS))) (CLRHASH \IP.HOSTNAMES) (until (EOFP STREAM) when (AND (SETQ ENTRY (\HTE.READLINE STREAM WANTEDTYPES)) (FMEMB (CAR (fetch (HTELINE TYPE) of ENTRY)) WANTEDTYPES)) do (\HTE.PARSE.ENTRY ENTRY)) (SETQ \TCP.LAST.HOSTS.FILE.DATE DATE) (SETQ \TCP.LAST.HOSTS.FILE.READ FILENAME)))) ) (\HTE.READ; (LAMBDA (FL RDTBL) (* ; "Edited 24-May-88 14:45 by bvm") (until (SELCHARQ (READCCODE FL) ((CR LF EOL) T) NIL)) NIL) ) (\HTE.READLINE (LAMBDA (STREAM WANTEDTYPES) (* ; "Edited 24-May-88 16:57 by bvm") (while (EQ (PEEKCCODE STREAM T) (CHARCODE ";")) do (\HTE.READ; STREAM)) (AND (NOT (EOFP STREAM)) (for FIELD# from 1 bind FIELDCONTENTS DONE (RDTBL _ (COND (\HTE.RDTBL) (T (SETQ \HTE.RDTBL (COPYREADTABLE (QUOTE ORIG))) (SETSEPR (CHARCODE (SPACE TAB %,)) NIL \HTE.RDTBL) (SETBRK (CHARCODE (":" ";" CR LF)) NIL \HTE.RDTBL) (READTABLEPROP \HTE.RDTBL (QUOTE CASEINSENSITIVE) T) \HTE.RDTBL))) until DONE collect (SETQ FIELDCONTENTS (until (SELCHARQ (SKIPSEPRCODES STREAM RDTBL) (":" (* ; "End of field") (READCCODE STREAM) T) (";" (* ; "end of line") (\HTE.READ; STREAM) (SETQ DONE T)) ((CR LF) (* ; "end of line--consume the terminator") (READCCODE STREAM) (SETQ DONE T)) (NIL (* ; "Eof") (SETQ DONE T)) NIL) collect (* ; "Read up to the next field delimiter") (if (EQ FIELD# 1) then (* ; "Canonicalize the type field") (READ STREAM RDTBL) else (RSTRING STREAM RDTBL)))) (if (AND (EQ FIELD# 1) WANTEDTYPES (NOT (FMEMB (CAR FIELDCONTENTS) WANTEDTYPES))) then (* ; "Don't care about this line") (OR DONE (\HTE.READ; STREAM)) (RETURN NIL)) FIELDCONTENTS))) ) ) (RPAQ? HOSTS.TEXT.DIRECTORIES ) (RPAQ? \HTE.RDTBL ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \HTE.RDTBL \IP.HOSTNAMES) ) (DECLARE%: EVAL@COMPILE (RECORD HTELINE (TYPE ADDRESSES NAMES MACHINE.TYPE OS.TYPE PROTOCOLS)) ) ) (PUTPROPS TCPHTE COPYRIGHT ("Venue & Xerox Corporation" 1985 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (1360 5370 (\HTE.PARSE.ENTRY 1370 . 3378) (\HTE.READ.FILE 3380 . 4095) (\HTE.READ; 4097 . 4230) (\HTE.READLINE 4232 . 5368))))) STOP \ No newline at end of file diff --git a/library/TCPIP.TEDIT b/obsolete/tcp/TCPIP.TEDIT similarity index 100% rename from library/TCPIP.TEDIT rename to obsolete/tcp/TCPIP.TEDIT diff --git a/obsolete/tcp/TCPLLAR b/obsolete/tcp/TCPLLAR new file mode 100644 index 00000000..12e028d3 --- /dev/null +++ b/obsolete/tcp/TCPLLAR @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "17-Aug-90 12:32:20" {DSK}ETHERNET>TCP>NEW>TCPLLAR.;3 22788 changes to%: (FNS \AR.DAEMON \AR.ENTER.RESOLUTION \AR.NOTE.RESOLUTION \AR.UPDATE.RESOLUTION \PRINTAR SPUTASSOC \AR.TRANSLATE.TO.10MB \AR.REQUEST.IP.TO.10MB \AR.REQUEST.IP.TO.3MB \AR.RESOLVE \AR.TRANSLATE.TO.3MB \HANDLE.RAW.AR) previous date%: " 6-Jan-89 15:18:06" {DSK}ETHERNET>TCP>NEW>TCPLLAR.;2) (* " Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPLLARCOMS) (RPAQQ TCPLLARCOMS [(COMS (* ;;; "IP Ethernet address translation module") [DECLARE%: DONTCOPY (EXPORT (RECORDS AR ARETHER AREXPETHER ARENTRY) (CONSTANTS (\AR.HARDWARE.SPACE.ETHERNET 1) (\AR.ETHERNET.ADDRESS.LENGTH 6) (\AR.IP.ADDRESS.LENGTH 4) (\AR.REQUEST 1) (\AR.RESPONSE 2) (\AR.ETHER.PACKET.LENGTH 28] (INITRECORDS ARENTRY) (INITVARS (\AR.IP.TO.10MB.ALIST (CONS)) (\AR.SEARCH.TIMEOUT.INTERVAL 300000) (\AR.VALID.TIMEOUT.INTERVAL 600000)) (GLOBALVARS \AR.IP.TO.10MB.ALIST \AR.SEARCH.TIMEOUT.INTERVAL \AR.VALID.TIMEOUT.INTERVAL) (FNS \AR.DAEMON \AR.ENTER.RESOLUTION \AR.NOTE.RESOLUTION \AR.UPDATE.RESOLUTION \PRINTAR SPUTASSOC \AR.TRANSLATE.TO.10MB \AR.REQUEST.IP.TO.10MB \AR.REQUEST.IP.TO.3MB \AR.RESOLVE \AR.TRANSLATE.TO.3MB \HANDLE.RAW.AR) (ADDVARS (\PACKET.PRINTERS (2054 . \PRINTAR]) (* ;;; "IP Ethernet address translation module") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (ACCESSFNS AR [(ARBASE (LOCF (fetch (ETHERPACKET EPBODY) of DATUM] [BLOCKRECORD ARBASE ((ARHARDWARESPACE WORD) (ARPROTOCOLSPACE WORD) (ARHARDWARELEN BYTE) (ARPROTOCOLLEN BYTE) (AROPCODE WORD) (AR1STWORD WORD)) (ACCESSFNS AR1STWORD ((ARCONTENTS (LOCF DATUM]) (ACCESSFNS ARETHER ((ARETHERBASE (fetch (AR ARCONTENTS) of DATUM))) [BLOCKRECORD ARETHERBASE ((ARLCLHDW0 WORD) (ARLCLHDW1 WORD) (ARLCLHDW2 WORD) (ARLCLPTCL FIXP) (ARFRNHDW0 WORD) (ARFRNHDW1 WORD) (ARFRNHDW2 WORD) (ARFRNPTCL FIXP)) [ACCESSFNS ARLCLHDW0 ((ARSENDERHDW (\LOADNSHOSTNUMBER (LOCF DATUM)) (\STORENSHOSTNUMBER (LOCF DATUM) NEWVALUE] (ACCESSFNS ARFRNHDW0 ((ARTARGETHDW (\LOADNSHOSTNUMBER (LOCF DATUM)) (\STORENSHOSTNUMBER (LOCF DATUM) NEWVALUE]) (ACCESSFNS AREXPETHER ((ARETHERBASE (fetch (AR ARCONTENTS) of DATUM))) (BLOCKRECORD ARETHERBASE ((ARLCLHDW WORD) (ARLCLPTCL FIXP) (ARFRNHDW WORD) (ARFRNPTCL FIXP)))) (DATATYPE ARENTRY ((RECENT FLAG) (SEARCHING FLAG) (IPADDRESS POINTER) (ETHERADDRESS POINTER) (TIMER POINTER)) TIMER _ (NCREATE 'FIXP)) ) (/DECLAREDATATYPE 'ARENTRY '(FLAG FLAG POINTER POINTER POINTER) '((ARENTRY 0 (FLAGBITS . 0)) (ARENTRY 0 (FLAGBITS . 16)) (ARENTRY 0 POINTER) (ARENTRY 2 POINTER) (ARENTRY 4 POINTER)) '6) (DECLARE%: EVAL@COMPILE (RPAQQ \AR.HARDWARE.SPACE.ETHERNET 1) (RPAQQ \AR.ETHERNET.ADDRESS.LENGTH 6) (RPAQQ \AR.IP.ADDRESS.LENGTH 4) (RPAQQ \AR.REQUEST 1) (RPAQQ \AR.RESPONSE 2) (RPAQQ \AR.ETHER.PACKET.LENGTH 28) (CONSTANTS (\AR.HARDWARE.SPACE.ETHERNET 1) (\AR.ETHERNET.ADDRESS.LENGTH 6) (\AR.IP.ADDRESS.LENGTH 4) (\AR.REQUEST 1) (\AR.RESPONSE 2) (\AR.ETHER.PACKET.LENGTH 28)) ) (* "END EXPORTED DEFINITIONS") ) (/DECLAREDATATYPE 'ARENTRY '(FLAG FLAG POINTER POINTER POINTER) '((ARENTRY 0 (FLAGBITS . 0)) (ARENTRY 0 (FLAGBITS . 16)) (ARENTRY 0 POINTER) (ARENTRY 2 POINTER) (ARENTRY 4 POINTER)) '6) (RPAQ? \AR.IP.TO.10MB.ALIST (CONS)) (RPAQ? \AR.SEARCH.TIMEOUT.INTERVAL 300000) (RPAQ? \AR.VALID.TIMEOUT.INTERVAL 600000) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \AR.IP.TO.10MB.ALIST \AR.SEARCH.TIMEOUT.INTERVAL \AR.VALID.TIMEOUT.INTERVAL) ) (DEFINEQ (\AR.DAEMON [LAMBDA NIL (* ejs%: "25-Jun-85 18:47") (for ARENTRY in \AR.IP.TO.10MB.ALIST do (\AR.UPDATE.RESOLUTION ARENTRY) (BLOCK]) (\AR.ENTER.RESOLUTION [LAMBDA (IPADDRESS ETHERADDRESS ONLY-IF-PRESENT-P) (* ; "Edited 21-Dec-88 20:10 by Briggs") (* * Enter a new resolution in the AR table, or update an existing resolution) (LET [(OLDENTRY (find ENTRY in \AR.IP.TO.10MB.ALIST suchthat (EQUAL IPADDRESS (fetch (ARENTRY IPADDRESS) of ENTRY] (COND (OLDENTRY (freplace (ARENTRY TIMER) of OLDENTRY with (SETUPTIMER \AR.VALID.TIMEOUT.INTERVAL (ffetch (ARENTRY TIMER) of OLDENTRY))) (freplace (ARENTRY ETHERADDRESS) of OLDENTRY with ETHERADDRESS) (freplace (ARENTRY RECENT) of OLDENTRY with T) (freplace (ARENTRY SEARCHING) of OLDENTRY with NIL) OLDENTRY) ((NOT ONLY-IF-PRESENT-P) (CAR (push \AR.IP.TO.10MB.ALIST (create ARENTRY IPADDRESS _ IPADDRESS ETHERADDRESS _ ETHERADDRESS TIMER _ (SETUPTIMER \AR.VALID.TIMEOUT.INTERVAL) RECENT _ T]) (\AR.NOTE.RESOLUTION [LAMBDA (AR) (* ; "Edited 21-Dec-88 20:11 by Briggs") (* ;;; "Use the information in the AR to update any existing entry in the cache, and if this was a response (presumably to our query) add the new information.") [COND ((NOT (AND (EQ (fetch (ARETHER ARLCLHDW0) of AR) 0) (EQ (fetch (ARETHER ARLCLHDW1) of AR) 0) (EQ (fetch (ARETHER ARLCLHDW2) of AR) 0))) (\AR.ENTER.RESOLUTION (fetch (ARETHER ARLCLPTCL) of AR) (fetch (ARETHER ARSENDERHDW) of AR) (NOT (MEMBER (fetch (ARETHER ARFRNPTCL) of AR) \IP.LOCAL.ADDRESSES] (COND ([AND (EQ (fetch (AR AROPCODE) of AR) \AR.RESPONSE) (NOT (AND (EQ (fetch (ARETHER ARFRNHDW0) of AR) 0) (EQ (fetch (ARETHER ARFRNHDW1) of AR) 0) (EQ (fetch (ARETHER ARFRNHDW2) of AR) 0] (\AR.ENTER.RESOLUTION (fetch (ARETHER ARFRNPTCL) of AR) (fetch (ARETHER ARTARGETHDW) of AR]) (\AR.UPDATE.RESOLUTION [LAMBDA (ARENTRY) (* ; "Edited 21-Dec-88 18:27 by Briggs") (* ;;; "Called when a resolution is no longer recent. Does ARP requests to update our cache. Eventually, the entry is marked invalid and is removed") (COND [(TIMEREXPIRED? (fetch (ARENTRY TIMER) of ARENTRY)) (COND ((ffetch (ARENTRY RECENT) of ARENTRY) (freplace (ARENTRY RECENT) of ARENTRY with NIL) (freplace (ARENTRY SEARCHING) of ARENTRY with T) (freplace (ARENTRY TIMER) of ARENTRY with (SETUPTIMER \AR.SEARCH.TIMEOUT.INTERVAL (ffetch (ARENTRY TIMER) of ARENTRY))) (* ;;  "ask the system in the table to respond to avoid clogging the net with broadcasts") (\AR.REQUEST.IP.TO.10MB (ffetch (ARENTRY IPADDRESS) of ARENTRY) (ffetch (ARENTRY ETHERADDRESS) of ARENTRY))) ((ffetch (ARENTRY SEARCHING) of ARENTRY) (SETQ \AR.IP.TO.10MB.ALIST (DREMOVE ARENTRY \AR.IP.TO.10MB.ALIST] ((ffetch (ARENTRY SEARCHING) of ARENTRY) (\AR.REQUEST.IP.TO.10MB (ffetch (ARENTRY IPADDRESS) of ARENTRY) (ffetch (ARENTRY ETHERADDRESS) of ARENTRY]) (\PRINTAR [LAMBDA (AR CALLER FILE) (* ejs%: " 2-Jun-85 13:58") (PROG NIL (SELECTC (fetch (ETHERPACKET EPTYPE) of AR) (\EPT.AR NIL) (3 (RETURN)) (RETURN)) (COND ((AND (EQ (fetch (AR ARHARDWARESPACE) of AR) \AR.HARDWARE.SPACE.ETHERNET) (EQ (fetch (AR ARHARDWARELEN) of AR) \AR.ETHERNET.ADDRESS.LENGTH) (EQ (fetch (AR ARPROTOCOLSPACE) of AR) \EPT.IP) (EQ (fetch (AR ARPROTOCOLLEN) of AR) \AR.IP.ADDRESS.LENGTH)) (printout FILE CALLER ": Address resolution " (SELECTC (fetch (AR AROPCODE) of AR) (\AR.REQUEST "request.") (\AR.RESPONSE "response.") "unknown opcode.") T "Sender's protocol address is " (\IP.ADDRESS.TO.STRING (fetch (ARETHER ARLCLPTCL) of AR)) "." T "Sender's hardware address is " (fetch (ARETHER ARSENDERHDW) of AR) "." T) (SELECTC (fetch (AR AROPCODE) of AR) (\AR.REQUEST (printout FILE "Sender desires hardware address for " (\IP.ADDRESS.TO.STRING (fetch (ARETHER ARFRNPTCL) of AR)) T)) (\AR.RESPONSE (printout FILE "Sender says hardware address for " (\IP.ADDRESS.TO.STRING (fetch (ARETHER ARFRNPTCL) of AR)) T " is " (fetch (ARETHER ARTARGETHDW) of AR) T)) NIL))) (TERPRI FILE]) (SPUTASSOC [LAMBDA (KEY VAL ALIST) (* ejs%: "27-Dec-84 17:52") (PROG (OLDENTRY) [COND ([SETQ OLDENTRY (for ENTRY in ALIST thereis (EQUAL KEY (CAR ENTRY] (RPLACD OLDENTRY VAL)) (T (NCONC1 ALIST (CONS KEY VAL] (RETURN VAL]) (\AR.TRANSLATE.TO.10MB [LAMBDA (IPADDRESS DONTPROBE) (* ; "Edited 21-Dec-88 20:11 by Briggs") (* ;;; "Translate an IPADDRESS to a 10MBHOSTNUMBER, or initiate request and fail for now") (COND ((\IP.BROADCAST.ADDRESS IPADDRESS) BROADCASTNSHOSTNUMBER) [(bind FOUNDIT find ENTRY in \AR.IP.TO.10MB.ALIST suchthat (AND (EQUAL IPADDRESS (fetch (ARENTRY IPADDRESS) of ENTRY)) (SETQ FOUNDIT T)) finally (COND (FOUNDIT (RETURN (ffetch (ARENTRY ETHERADDRESS ) of ENTRY] ((NOT DONTPROBE) (\AR.REQUEST.IP.TO.10MB IPADDRESS) NIL]) (\AR.REQUEST.IP.TO.10MB [LAMBDA (IPADDRESS PDH) (* ; "Edited 21-Dec-88 18:31 by Briggs") (* ;;; "Request an address translation, either from the specified host, or by broadcasting the request.") (PROG ((AR (\ALLOCATE.ETHERPACKET))) (replace (AR ARHARDWARESPACE) of AR with \AR.HARDWARE.SPACE.ETHERNET) (replace (AR ARPROTOCOLSPACE) of AR with \EPT.IP) (replace (AR ARHARDWARELEN) of AR with \AR.ETHERNET.ADDRESS.LENGTH) (replace (AR ARPROTOCOLLEN) of AR with \AR.IP.ADDRESS.LENGTH) (replace (AR AROPCODE) of AR with \AR.REQUEST) (replace (ARETHER ARSENDERHDW) of AR with \MY.NSHOSTNUMBER) (replace (ARETHER ARLCLPTCL) of AR with (ffetch (NDB NDBIPHOST#) of \10MBLOCALNDB)) (replace (ARETHER ARFRNPTCL) of AR with IPADDRESS) (replace (ETHERPACKET EPTYPE) of AR with \EPT.AR) (ENCAPSULATE.ETHERPACKET \10MBLOCALNDB AR (OR PDH BROADCASTNSHOSTNUMBER) \AR.ETHER.PACKET.LENGTH \EPT.AR) (COND ((EQ IPTRACEFLG T) (PRINTPACKET AR 'PUT IPTRACEFILE)) (IPTRACEFLG (PRIN1 (COND (PDH "!") (T "^")) IPTRACEFILE))) (TRANSMIT.ETHERPACKET \10MBLOCALNDB AR]) (\AR.REQUEST.IP.TO.3MB [LAMBDA (IPADDRESS) (* ejs%: " 2-Jan-85 17:12") (* * Broadcast a request for an address translation) (PROG ((AR (\ALLOCATE.ETHERPACKET))) (replace (AR ARHARDWARESPACE) of AR with \AR.HARDWARE.SPACE.ETHERNET) (replace (AR ARPROTOCOLSPACE) of AR with \EET.IP) (replace (AR ARHARDWARELEN) of AR with 2) (replace (AR ARPROTOCOLLEN) of AR with \AR.IP.ADDRESS.LENGTH) (replace (AR AROPCODE) of AR with \AR.REQUEST) (replace (AREXPETHER ARLCLHDW) of AR with (LOGAND \LOCALPUPNETHOST (MASK.1'S 0 8))) (replace (AREXPETHER ARLCLPTCL) of AR with (ffetch (NDB NDBIPHOST#) of \3MBLOCALNDB)) (replace (AREXPETHER ARFRNPTCL) of AR with IPADDRESS) (ENCAPSULATE.ETHERPACKET \3MBLOCALNDB AR 0 20 \EPT.AR) (COND (IPTRACEFLG (PRINTPACKET AR 'PUT IPTRACEFILE))) (TRANSMIT.ETHERPACKET \3MBLOCALNDB AR]) (\AR.RESOLVE [LAMBDA (AR) (* ; "Edited 6-Jan-89 14:50 by Briggs") (* ;;; "Try to respond to an address resolution request. Release the packet if we can't") (DECLARE (GLOBALVARS \10MBLOCALNDB \MY.NSHOSTNUMBER)) (LET* ((TargetProtocolAddress (fetch (ARETHER ARFRNPTCL) of AR)) (TargetHardwareAddress (COND ((MEMBER TargetProtocolAddress \IP.LOCAL.ADDRESSES) (\AR.ENTER.RESOLUTION TargetProtocolAddress \MY.NSHOSTNUMBER) \MY.NSHOSTNUMBER) ([AND \IP.GATEWAY.FLG (LET* ((SUBNETMASK (CDR (SASSOC (fetch NDBIPHOST# of \10MBLOCALNDB) \IP.SUBNET.MASKS))) (MASKEDTARGET (LOGAND TargetProtocolAddress SUBNETMASK))) (COND ([AND SUBNETMASK (NOT (EQP MASKEDTARGET (LOGAND (fetch NDBIPHOST# of \10MBLOCALNDB) SUBNETMASK] (for ADDRPAIR in \IP.ROUTING.TABLE when (LISTP ADDRPAIR) thereis (EQP MASKEDTARGET (CAR ADDRPAIR] \MY.NSHOSTNUMBER))) (SenderHardwareAddress (fetch (ARETHER ARSENDERHDW) of AR))) (COND (TargetHardwareAddress (swap (fetch (ARETHER ARLCLPTCL) of AR) (fetch (ARETHER ARFRNPTCL) of AR)) (replace (ARETHER ARTARGETHDW) of AR with (fetch (ARETHER ARSENDERHDW ) of AR)) (replace (ARETHER ARSENDERHDW) of AR with TargetHardwareAddress) (replace (ARETHER ARLCLPTCL) of AR with TargetProtocolAddress) (replace (AR AROPCODE) of AR with \AR.RESPONSE) (ENCAPSULATE.ETHERPACKET \10MBLOCALNDB AR SenderHardwareAddress \AR.ETHER.PACKET.LENGTH \EPT.AR) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (PRINTPACKET AR 'PUT IPTRACEFILE)) (T (PRIN1 "!" IPTRACEFILE] (TRANSMIT.ETHERPACKET \10MBLOCALNDB AR)) (T (\RELEASE.ETHERPACKET AR]) (\AR.TRANSLATE.TO.3MB [LAMBDA (IPADDRESS) (* ejs%: "27-Jun-85 12:43") (COND ((\IP.BROADCAST.ADDRESS IPADDRESS) 0) (T (LDB (BYTE 8 0) IPADDRESS]) (\HANDLE.RAW.AR [LAMBDA (AR TYPE) (* ejs%: " 2-Jun-85 14:12") (PROG ((NDB (ffetch (ETHERPACKET EPNETWORK) of AR))) (SELECTQ (ffetch (NDB NETTYPE) of NDB) (10 (COND ((NEQ TYPE \EPT.AR) (RETURN)))) (3 (RETURN)) (ERROR "Unknown net type" (fetch (NDB NETTYPE) of NDB))) [COND ((AND (EQ (fetch (AR ARHARDWARESPACE) of AR) \AR.HARDWARE.SPACE.ETHERNET) (EQ (fetch (AR ARHARDWARELEN) of AR) \AR.ETHERNET.ADDRESS.LENGTH) (EQ (fetch (AR ARPROTOCOLSPACE) of AR) \EPT.IP) (EQ (fetch (AR ARPROTOCOLLEN) of AR) \AR.IP.ADDRESS.LENGTH)) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (PRINTPACKET AR 'ARGET IPTRACEFILE)) (T (PRIN1 "*" IPTRACEFILE] (\AR.NOTE.RESOLUTION AR) (COND ((EQ (fetch (AR AROPCODE) of AR) \AR.REQUEST) (\AR.RESOLVE AR)) (T (\RELEASE.ETHERPACKET AR] (RETURN T]) ) (ADDTOVAR \PACKET.PRINTERS (2054 . \PRINTAR)) (PUTPROPS TCPLLAR COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (5949 22633 (\AR.DAEMON 5959 . 6223) (\AR.ENTER.RESOLUTION 6225 . 7972) ( \AR.NOTE.RESOLUTION 7974 . 9329) (\AR.UPDATE.RESOLUTION 9331 . 10916) (\PRINTAR 10918 . 13356) ( SPUTASSOC 13358 . 13700) (\AR.TRANSLATE.TO.10MB 13702 . 14709) (\AR.REQUEST.IP.TO.10MB 14711 . 16270) (\AR.REQUEST.IP.TO.3MB 16272 . 17510) (\AR.RESOLVE 17512 . 20996) (\AR.TRANSLATE.TO.3MB 20998 . 21232) (\HANDLE.RAW.AR 21234 . 22631))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPLLICMP b/obsolete/tcp/TCPLLICMP new file mode 100644 index 00000000..62f1f4bb --- /dev/null +++ b/obsolete/tcp/TCPLLICMP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "17-Aug-90 12:34:42" {DSK}ETHERNET>TCP>NEW>TCPLLICMP.;2 20237 changes to%: (FNS PRINTICMP \ICMP.HANDLE.REDIRECT \ICMP.INPUT) previous date%: " 6-Jan-89 16:38:06" {DSK}ETHERNET>TCP>NEW>TCPLLICMP.;1) (* " Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPLLICMPCOMS) (RPAQQ TCPLLICMPCOMS [(COMS (* * ICMP functions) (DECLARE%: DONTCOPY (EXPORT (RECORDS ICMPADMASK ICMP ICMPECHO ICMPDESTUN ICMPREDIRECT) (CONSTANTS * ICMPTYPES) (CONSTANTS * ICMPUNREACHABLES) (CONSTANTS * ICMPREDIRECTS) (CONSTANTS \ICMPOVLEN) (CONSTANTS \ICMP.PROTOCOL) (MACROS ICMPLENGTH))) (DECLARE%: EVAL@COMPILE DONTCOPY (MACROS IP.FROM.ICMP)) (INITVARS * ICMPTIMEXS) (INITVARS (\ICMP.ECHO.REPLY.QUEUE (NCREATE 'SYSQUEUE)) (\ICMP.ECHO.REPLY.EVENT (CREATE.EVENT "ICMP Echo reply")) (\ICMP.ECHOING)) (GLOBALVARS \ICMP.ECHO.REPLY.QUEUE \ICMP.ECHO.REPLY.EVENT \ICMP.ECHOING) (FNS PRINTICMP \ICMP.DEST.UNREACHABLE \ICMP.REDIRECT \ICMP.ECHO.TEST \ICMP.HANDLE.ECHO.REPLY \ICMP.HANDLE.REDIRECT \ICMP.INPUT \ICMP.REPLY.TO.ECHO \ICMP.SETUPICMP \ICMP.TIME.EXCEEDED \ICMP.TRANSMIT) (FNS ICMP.HANDLE.ADDRESS.MASK \ICMP.INPUT \ICMP.REQUEST.ADDRESS.MASK) (ADDVARS (IPPRINTMACROS (1 . PRINTICMP]) (* * ICMP functions) (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (ACCESSFNS ICMPADMASK ((ICMPADMASKBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPADMASKBASE ((ICMPADMASKID WORD) (ICMPADMASKSEQNO WORD) (ICMPADMASKADMASK FIXP)))) (ACCESSFNS ICMP ((ICMPBASE (\IPDATABASE DATUM))) (BLOCKRECORD ICMPBASE ((ICMPTYPE BYTE) (ICMPCODE BYTE) (ICMPCHECKSUM WORD) (ICMPDATASTART WORD))) [ACCESSFNS ICMP ((ICMPCONTENTS (LOCF (fetch (ICMP ICMPDATASTART) of DATUM]) (ACCESSFNS ICMPECHO ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPECHOBASE ((ICMPECHOID WORD) (ICMPECHOSEQNO WORD) (ICMPECHODATA BYTE)))) (ACCESSFNS ICMPDESTUN ((ICMPECHOBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPECHOBASE ((NIL FIXP) (ICMPIPSTART WORD))) [ACCESSFNS ICMPDESTUN ((ICMPIPHEADER (LOCF (fetch (ICMPDESTUN ICMPIPSTART) of DATUM]) (ACCESSFNS ICMPREDIRECT ((ICMPREDIRECTBASE (fetch (ICMP ICMPCONTENTS) of DATUM))) (BLOCKRECORD ICMPREDIRECTBASE ((ICMPGATEWAY FIXP) (ICMPIPSTART WORD))) [ACCESSFNS ICMPREDIRECT ((ICMPIPHEADER (LOCF (fetch (ICMPREDIRECT ICMPIPSTART) of DATUM]) ) (RPAQQ ICMPTYPES ((\ICMP.ECHO.REPLY 0) (\ICMP.DEST.UNREACHABLE 3) (\ICMP.SOURCE.QUENCH 4) (\ICMP.REDIRECT 5) (\ICMP.ECHO 8) (\ICMP.TIME.EXCEEDED 11) (\ICMP.PARAMETER.PROBLEM 12) (\ICMP.TIMESTAMP 13) (\ICMP.TIMESTAMP.REPLY 14) (\ICMP.INFO.REQUEST 15) (\ICMP.INFO.REPLY 16) (\ICMP.ADDRESS.MASK.REQUEST 17) (\ICMP.ADDRESS.MASK.REPLY 18))) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.ECHO.REPLY 0) (RPAQQ \ICMP.DEST.UNREACHABLE 3) (RPAQQ \ICMP.SOURCE.QUENCH 4) (RPAQQ \ICMP.REDIRECT 5) (RPAQQ \ICMP.ECHO 8) (RPAQQ \ICMP.TIME.EXCEEDED 11) (RPAQQ \ICMP.PARAMETER.PROBLEM 12) (RPAQQ \ICMP.TIMESTAMP 13) (RPAQQ \ICMP.TIMESTAMP.REPLY 14) (RPAQQ \ICMP.INFO.REQUEST 15) (RPAQQ \ICMP.INFO.REPLY 16) (RPAQQ \ICMP.ADDRESS.MASK.REQUEST 17) (RPAQQ \ICMP.ADDRESS.MASK.REPLY 18) (CONSTANTS (\ICMP.ECHO.REPLY 0) (\ICMP.DEST.UNREACHABLE 3) (\ICMP.SOURCE.QUENCH 4) (\ICMP.REDIRECT 5) (\ICMP.ECHO 8) (\ICMP.TIME.EXCEEDED 11) (\ICMP.PARAMETER.PROBLEM 12) (\ICMP.TIMESTAMP 13) (\ICMP.TIMESTAMP.REPLY 14) (\ICMP.INFO.REQUEST 15) (\ICMP.INFO.REPLY 16) (\ICMP.ADDRESS.MASK.REQUEST 17) (\ICMP.ADDRESS.MASK.REPLY 18)) ) (RPAQQ ICMPUNREACHABLES ((\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5))) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.NET.UNREACHABLE 0) (RPAQQ \ICMP.HOST.UNREACHABLE 1) (RPAQQ \ICMP.PROTOCOL.UNREACHABLE 2) (RPAQQ \ICMP.PORT.UNREACHABLE 3) (RPAQQ \ICMP.CANT.FRAGMENT 4) (RPAQQ \ICMP.SOURCE.ROUTE 5) (CONSTANTS (\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5)) ) (RPAQQ ICMPREDIRECTS ((\ICMP.REDIRECT.NET 0) (\ICMP.REDIRECT.HOST 1) (\ICMP.REDIRECT.SVC.AND.NET 2) (\ICMP.REDIRECT.SVC.AND.HOST 3))) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.REDIRECT.NET 0) (RPAQQ \ICMP.REDIRECT.HOST 1) (RPAQQ \ICMP.REDIRECT.SVC.AND.NET 2) (RPAQQ \ICMP.REDIRECT.SVC.AND.HOST 3) (CONSTANTS (\ICMP.REDIRECT.NET 0) (\ICMP.REDIRECT.HOST 1) (\ICMP.REDIRECT.SVC.AND.NET 2) (\ICMP.REDIRECT.SVC.AND.HOST 3)) ) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMPOVLEN 4) (CONSTANTS \ICMPOVLEN) ) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.PROTOCOL 1) (CONSTANTS \ICMP.PROTOCOL) ) (DECLARE%: EVAL@COMPILE [PUTPROPS ICMPLENGTH MACRO (LAMBDA (ICMP) (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of ICMP) (LLSH (fetch (IP IPHEADERLENGTH) of ICMP) 2] ) (* "END EXPORTED DEFINITIONS") ) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: EVAL@COMPILE [PUTPROPS IP.FROM.ICMP MACRO (OPENLAMBDA (PKT) (* ;; "Returns a pointer to the 'Internet header + 64 bits' found in an ICMP packet, offset so that it looks like an IP record. I.e., add to the base the size of the IP header + ICMP header") (\ADDBASE PKT (+ (UNFOLD (fetch (IP IPHEADERLENGTH) of PKT) WORDSPERCELL) (CONSTANT (+ (FOLDHI \ICMPOVLEN BYTESPERWORD) 2] ) ) (RPAQQ ICMPTIMEXS ((\ICMP.TRANSIT.TIME.EXCEEDED 0) (\ICMP.FRAGMENT.TIME.EXCEEDED 1))) (RPAQ? \ICMP.TRANSIT.TIME.EXCEEDED 0) (RPAQ? \ICMP.FRAGMENT.TIME.EXCEEDED 1) (RPAQ? \ICMP.ECHO.REPLY.QUEUE (NCREATE 'SYSQUEUE)) (RPAQ? \ICMP.ECHO.REPLY.EVENT (CREATE.EVENT "ICMP Echo reply")) (RPAQ? \ICMP.ECHOING ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \ICMP.ECHO.REPLY.QUEUE \ICMP.ECHO.REPLY.EVENT \ICMP.ECHOING) ) (DEFINEQ (PRINTICMP [LAMBDA (ICMP FILE) (* ; "Edited 13-Sep-88 11:35 by bvm") (LET ((*PRINT-BASE* 10) (TYPE (fetch (ICMP ICMPTYPE) of ICMP)) (CODE (fetch (ICMP ICMPCODE) of ICMP))) (PRINTCONSTANT TYPE ICMPTYPES FILE "\ICMP.") (SPACES 1 FILE) (SELECTC TYPE (\ICMP.REDIRECT (PRINTCONSTANT CODE ICMPREDIRECTS FILE "\ICMP.REDIRECT.") (PRINTOUT FILE " " (\IP.ADDRESS.TO.STRING (fetch (ICMPREDIRECT ICMPGATEWAY) of ICMP)))) (\ICMP.DEST.UNREACHABLE (PRINTCONSTANT CODE ICMPUNREACHABLES FILE "\ICMP.")) (PRIN3 CODE FILE)) (TERPRI FILE]) (\ICMP.DEST.UNREACHABLE (LAMBDA (PACKET CODE) (* ejs%: " 2-Feb-86 11:35") (* * Returns an ICMP unreachable packet of proper code to sender) (PROG ((ICMP (\ALLOCATE.ETHERPACKET)) NWORDS) (\IP.SETUPIP ICMP (fetch (IP IPSOURCEADDRESS) of PACKET) 0 (\IP.FIND.PROTOCOL \ICMP.PROTOCOL)) (\ICMP.SETUPICMP ICMP \ICMP.DEST.UNREACHABLE CODE) (SETQ NWORDS (IPLUS (FOLDHI 64 BITSPERWORD) (UNFOLD (fetch (IP IPHEADERLENGTH) of PACKET) WORDSPERCELL))) (\BLT (fetch (ICMPDESTUN ICMPIPHEADER) of ICMP) (fetch (IP IPBASE) of PACKET) NWORDS) (add (fetch (IP IPTOTALLENGTH) of ICMP) (UNFOLD NWORDS BYTESPERWORD)) (\ICMP.TRANSMIT ICMP) (\RELEASE.ETHERPACKET PACKET))) ) (\ICMP.REDIRECT (LAMBDA (PACKET CODE) (* ejs%: " 2-Feb-86 12:13") (* * Returns an ICMP unreachable packet of proper code to sender) (PROG ((ICMP (\ALLOCATE.ETHERPACKET)) NWORDS) (\IP.SETUPIP ICMP (fetch (IP IPSOURCEADDRESS) of PACKET) 0 (\IP.FIND.PROTOCOL \ICMP.PROTOCOL)) (\ICMP.SETUPICMP ICMP \ICMP.REDIRECT CODE) (SETQ NWORDS (IPLUS (FOLDHI 64 BITSPERWORD) (UNFOLD (fetch (IP IPHEADERLENGTH) of PACKET) WORDSPERCELL) WORDSPERCELL)) (replace (ICMPREDIRECT ICMPGATEWAY) of ICMP with (OR \IP.DEFAULT.GATEWAY 0)) (\BLT (fetch (ICMPREDIRECT ICMPIPHEADER) of ICMP) (fetch (IP IPBASE) of PACKET) NWORDS) (add (fetch (IP IPTOTALLENGTH) of ICMP) (UNFOLD NWORDS BYTESPERWORD)) (\ICMP.TRANSMIT ICMP) (\RELEASE.ETHERPACKET PACKET))) ) (\ICMP.ECHO.TEST (LAMBDA (IPADDRESS ECHOSTREAM DATALENGTH) (* ejs%: "12-May-86 18:01") (* * An ICMP echo tester) (while (\QUEUEHEAD \ICMP.ECHO.REPLY.QUEUE) do (\RELEASE.ETHERPACKET (\DEQUEUE \ICMP.ECHO.REPLY.QUEUE))) (RESETVAR \ICMP.ECHOING T (PROG (ICMP (IPSOCKET (\IP.FIND.PROTOCOL \ICMP.PROTOCOL))) (for SEQUENCE from 0 do ((SETQ ICMP (\ALLOCATE.ETHERPACKET)) (\IP.SETUPIP ICMP (DODIP.HOSTP IPADDRESS) 0 IPSOCKET) (\ICMP.SETUPICMP ICMP \ICMP.ECHO 0) (replace (ICMPECHO ICMPECHOID) of ICMP with 0) (replace (ICMPECHO ICMPECHOSEQNO) of ICMP with SEQUENCE) (add (fetch (IP IPTOTALLENGTH) of ICMP) 4) (AND (NUMBERP DATALENGTH) (add (fetch (IP IPTOTALLENGTH) of ICMP) DATALENGTH)) (printout ECHOSTREAM "!") (\ICMP.TRANSMIT ICMP) (AWAIT.EVENT \ICMP.ECHO.REPLY.EVENT \ETHERTIMEOUT) (COND ((SETQ ICMP (\DEQUEUE \ICMP.ECHO.REPLY.QUEUE)) (COND ((IGREATERP (fetch (ICMPECHO ICMPECHOSEQNO) of ICMP) SEQUENCE) (printout T "ICMP echo out of sequence" T) (PRINTPACKET ICMP (QUOTE GET) ECHOSTREAM) (RETURN ICMP)) (T (printout ECHOSTREAM "+") (\RELEASE.ETHERPACKET ICMP)))) (T (printout ECHOSTREAM ".")))))))) ) (\ICMP.HANDLE.ECHO.REPLY (LAMBDA (ICMP) (* ejs%: "28-Dec-84 09:02") (COND (\ICMP.ECHOING (\ENQUEUE \ICMP.ECHO.REPLY.QUEUE ICMP) (NOTIFY.EVENT \ICMP.ECHO.REPLY.EVENT)) (T (\RELEASE.ETHERPACKET ICMP)))) ) (\ICMP.HANDLE.REDIRECT [LAMBDA (ICMP) (* ; "Edited 24-Aug-88 16:16 by bvm") (* ;;; "Called when a gateway tells us a better route to the destination. There is a code for type of redirect, but it's not obviously meaningful ") (LET* ((NDB (fetch EPNETWORK of ICMP)) (GATEWAY (fetch (ICMPREDIRECT ICMPGATEWAY) of ICMP)) (DESTADDRESS (fetch (IP IPDESTINATIONADDRESS) of (IP.FROM.ICMP ICMP))) (DESTNET (\IPNETADDRESS DESTADDRESS))) (* ;; "Store the new route in the routing table") (COND [(= DESTNET (fetch (NDB NDBIPNET#) of NDB)) (LET* ((SOURCEADDRESS (fetch (NDB NDBIPHOST#) of NDB)) (SUBNETMASK (CDR (SASSOC SOURCEADDRESS \IP.SUBNET.MASKS))) (DESTSUBNET (LOGAND DESTADDRESS SUBNETMASK))) (* ;; "The dest net is a local net. Either we fouled up in our routing, or the dest net is really a subnet") (COND ((NOT (= DESTSUBNET (LOGAND SOURCEADDRESS SUBNETMASK))) (* ;  "Yes, this is a redirect for a subnet, if such is possible") (SPUTASSOC DESTSUBNET GATEWAY \IP.ROUTING.TABLE] (T (* ; "Non-local net") (SPUTASSOC DESTNET GATEWAY \IP.ROUTING.TABLE))) (* ;; "If it's a 10MB network, see if we have the 10MB address of this gateway, and if not, request the address") (SELECTQ (fetch (NDB NETTYPE) of NDB) (10 (COND ((NOT (\AR.TRANSLATE.TO.10MB GATEWAY T)) (\AR.TRANSLATE.TO.10MB GATEWAY)))) NIL) (\RELEASE.ETHERPACKET ICMP]) (\ICMP.INPUT [LAMBDA (ICMP) (* ; "Edited 25-Aug-88 11:51 by bvm") (* ;;; "ICMP packet received") (COND ((\IP.CHECKSUM.OK (\IPCHECKSUM ICMP (fetch (ICMP ICMPBASE) of ICMP) (\IPDATALENGTH ICMP))) (SELECTC (fetch (ICMP ICMPTYPE) of ICMP) (\ICMP.ECHO.REPLY (\ICMP.HANDLE.ECHO.REPLY ICMP)) (\ICMP.ECHO (\ICMP.REPLY.TO.ECHO ICMP)) (\ICMP.DEST.UNREACHABLE (* ; "Some packet couldn't reach its destination. Tell the protocol that sent the packet (found in the enclosed header)") [LET* [(SEGMENT (IP.FROM.ICMP ICMP)) (PROTOCOL (\IP.FIND.PROTOCOL (fetch (IP IPPROTOCOL) of SEGMENT] (COND (PROTOCOL (CL:FUNCALL (fetch (IPSOCKET IPSICMPFN) of PROTOCOL) ICMP SEGMENT PROTOCOL]) (\ICMP.REDIRECT (\ICMP.HANDLE.REDIRECT ICMP)) (\ICMP.ADDRESS.MASK.REPLY (ICMP.HANDLE.ADDRESS.MASK ICMP)) (\RELEASE.ETHERPACKET ICMP))) (T (AND IPTRACEFLG (PRINTPACKET ICMP 'ICMPGET IPTRACEFILE "[dropping packet--bad ICMP checksum]"]) (\ICMP.REPLY.TO.ECHO (LAMBDA (ICMP) (* ejs%: "12-May-86 17:34") (* * Reply to an echo request) (swap (fetch (IP IPSOURCEADDRESS) of ICMP) (fetch (IP IPDESTINATIONADDRESS) of ICMP)) (replace (ICMP ICMPTYPE) of ICMP with \ICMP.ECHO.REPLY) (replace EPREQUEUE of ICMP with (QUOTE FREE)) (\ICMP.TRANSMIT ICMP)) ) (\ICMP.SETUPICMP (LAMBDA (ICMP TYPE CODE) (* ejs%: "27-Dec-84 19:00") (replace (ICMP ICMPTYPE) of ICMP with TYPE) (replace (ICMP ICMPCODE) of ICMP with CODE) (add (fetch (IP IPTOTALLENGTH) of ICMP) \ICMPOVLEN)) ) (\ICMP.TIME.EXCEEDED (LAMBDA (PACKET CODE) (* ejs%: " 3-Feb-86 11:00") (* * Returns an ICMP unreachable packet of proper code to sender) (PROG ((ICMP (\ALLOCATE.ETHERPACKET)) NWORDS) (\IP.SETUPIP ICMP (fetch (IP IPSOURCEADDRESS) of PACKET) 0 (\IP.FIND.PROTOCOL \ICMP.PROTOCOL)) (\ICMP.SETUPICMP ICMP \ICMP.TIME.EXCEEDED CODE) (SETQ NWORDS (IPLUS (FOLDHI 64 BITSPERWORD) (UNFOLD (fetch (IP IPHEADERLENGTH) of PACKET) WORDSPERCELL))) (\BLT (fetch (ICMPDESTUN ICMPIPHEADER) of ICMP) (fetch (IP IPBASE) of PACKET) NWORDS) (add (fetch (IP IPTOTALLENGTH) of ICMP) (UNFOLD NWORDS BYTESPERWORD)) (\ICMP.TRANSMIT ICMP))) ) (\ICMP.TRANSMIT (LAMBDA (ICMP) (* ejs%: "31-Dec-84 14:27") (* * Checksum and transmit an ICMP packet) (\IP.SET.CHECKSUM ICMP (fetch (ICMP ICMPBASE) of ICMP) (\IPDATALENGTH ICMP) (LOCF (fetch (ICMP ICMPCHECKSUM) of ICMP))) (\IP.TRANSMIT ICMP)) ) ) (DEFINEQ (ICMP.HANDLE.ADDRESS.MASK (LAMBDA (ICMP) (* ; "Edited 22-Mar-88 18:49 by eweaver") (* ;; "Called when an address-mask-reply icmp comes in.") (LET* ((FROM (fetch (IP IPSOURCEADDRESS) of ICMP)) (DESTADDR (fetch (IP IPDESTINATIONADDRESS) of ICMP)) (LOCALADDR (COND ((AND \3MBLOCALNDB (EQ (fetch NDBIPHOST# of \3MBLOCALNDB) DESTADDR)) DESTADDR) ((AND \10MBLOCALNDB (EQ (fetch NDBIPHOST# of \10MBLOCALNDB) DESTADDR)) DESTADDR))) (MASK (fetch (ICMPADMASK ICMPADMASKADMASK) of ICMP))) (* ;; (CL:FORMAT PROMPTWINDOW "ICMP AdMask from ~a mask ~a" (\IP.ADDRESS.TO.STRING FROM) (\IP.ADDRESS.TO.STRING MASK))) (COND ((NULL \IP.DEFAULT.GATEWAY) (SETQ \IP.DEFAULT.GATEWAY FROM))) (COND ((NULL (SASSOC DESTADDR \IP.SUBNET.MASKS)) (CL:PUSH (CONS DESTADDR MASK) \IP.SUBNET.MASKS))))) ) (\ICMP.INPUT [LAMBDA (ICMP) (* ; "Edited 25-Aug-88 11:51 by bvm") (* ;;; "ICMP packet received") (COND ((\IP.CHECKSUM.OK (\IPCHECKSUM ICMP (fetch (ICMP ICMPBASE) of ICMP) (\IPDATALENGTH ICMP))) (SELECTC (fetch (ICMP ICMPTYPE) of ICMP) (\ICMP.ECHO.REPLY (\ICMP.HANDLE.ECHO.REPLY ICMP)) (\ICMP.ECHO (\ICMP.REPLY.TO.ECHO ICMP)) (\ICMP.DEST.UNREACHABLE (* ; "Some packet couldn't reach its destination. Tell the protocol that sent the packet (found in the enclosed header)") [LET* [(SEGMENT (IP.FROM.ICMP ICMP)) (PROTOCOL (\IP.FIND.PROTOCOL (fetch (IP IPPROTOCOL) of SEGMENT] (COND (PROTOCOL (CL:FUNCALL (fetch (IPSOCKET IPSICMPFN) of PROTOCOL) ICMP SEGMENT PROTOCOL]) (\ICMP.REDIRECT (\ICMP.HANDLE.REDIRECT ICMP)) (\ICMP.ADDRESS.MASK.REPLY (ICMP.HANDLE.ADDRESS.MASK ICMP)) (\RELEASE.ETHERPACKET ICMP))) (T (AND IPTRACEFLG (PRINTPACKET ICMP 'ICMPGET IPTRACEFILE "[dropping packet--bad ICMP checksum]"]) (\ICMP.REQUEST.ADDRESS.MASK (LAMBDA NIL (* ; "Edited 8-Jan-88 15:15 by eweaver") (* ;; "Broadcast a request for the subnet mask. The reply is handled asynchronously by") (* ;; " \handle-icmp-address-mask.") (LET ((ICMP (\ALLOCATE.ETHERPACKET)) (IPSOCKET (\IP.FIND.PROTOCOL \ICMP.PROTOCOL))) (\IP.SETUPIP ICMP 0 0 IPSOCKET) (\ICMP.SETUPICMP ICMP \ICMP.ADDRESS.MASK.REQUEST 0) (replace (ICMPADMASK ICMPADMASKID) of ICMP with 0) (replace (ICMPADMASK ICMPADMASKSEQNO) of ICMP with 0) (add (fetch (IP IPTOTALLENGTH) of ICMP) 4) (\ICMP.TRANSMIT ICMP))) ) ) (ADDTOVAR IPPRINTMACROS (1 . PRINTICMP)) (PUTPROPS TCPLLICMP COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (9098 17355 (PRINTICMP 9108 . 9918) (\ICMP.DEST.UNREACHABLE 9920 . 10573) ( \ICMP.REDIRECT 10575 . 11304) (\ICMP.ECHO.TEST 11306 . 12407) (\ICMP.HANDLE.ECHO.REPLY 12409 . 12615) (\ICMP.HANDLE.REDIRECT 12617 . 14564) (\ICMP.INPUT 14566 . 15953) (\ICMP.REPLY.TO.ECHO 15955 . 16266) (\ICMP.SETUPICMP 16268 . 16484) (\ICMP.TIME.EXCEEDED 16486 . 17103) (\ICMP.TRANSMIT 17105 . 17353)) ( 17356 20085 (ICMP.HANDLE.ADDRESS.MASK 17366 . 18138) (\ICMP.INPUT 18140 . 19527) ( \ICMP.REQUEST.ADDRESS.MASK 19529 . 20083))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPLLIP b/obsolete/tcp/TCPLLIP new file mode 100644 index 00000000..b5ec716b --- /dev/null +++ b/obsolete/tcp/TCPLLIP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP") (FILECREATED "30-Aug-90 13:46:39" {DSK}TCP>TCPLLIP.;3 151757 changes to%: (VARS TCPLLIPCOMS) previous date%: "29-Aug-90 16:28:12" {DSK}TCP>TCPLLIP.;2) (* ; " Copyright (c) 1985, 1986, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPLLIPCOMS) (RPAQQ TCPLLIPCOMS ((PROP MAKEFILE-ENVIRONMENT TCPLLIP) (COMS (* ;; "IP definitions and addressing") (DECLARE%: DONTCOPY (EXPORT (RECORDS IP IPSOCKET IPADDRESS) (CONSTANTS \IPOVLEN \MAX.IPDATALENGTH \IP.PROTOCOLVERSION \IP.MAX.EPKTS.ON.QUEUE \IP.DEFAULT.TIME.TO.LIVE \IP.WAKEUP.INTERVAL) (CONSTANTS * IPPACKETTYPES) (CONSTANTS * ICMPUNREACHABLES) (MACROS \IPDATABASE \IPDATALENGTH))) (ADDVARS (*IP-PROTOCOL-NAME-FROM-NUMBER* (17 . "UDP") (6 . "TCP") (1 . "ICMP"))) (GLOBALVARS *IP-PROTOCOL-NAME-FROM-NUMBER*) (* ;; "value in sysout is too small. This is 512-(indexf (fetch epencapsulation))-2. 489 is more correct, but let's leave a word of slop for off-by-ones") (VARS (\10MBPACKETLENGTH 488)) (* ;; "Make it easier to see queuelength without opening up q.") (FNS \SYSQUEUE.DEFPRINT \IPSOCKET.DEFPRINT) [DECLARE%: DONTEVAL@LOAD DOCOPY (P (DEFPRINT 'IPSOCKET '\IPSOCKET.DEFPRINT)) (P (DEFPRINT 'SYSQUEUE '\SYSQUEUE.DEFPRINT] (INITVARS (IPTRACETIME) (IPONLYTYPES) (IPIGNORETYPES) (IPPRINTMACROS) (IPTRACEFLG) (IPTRACEFILE) (\IP.INIT.FILE) (\IP.DEFAULT.CONFIGURATION) (\IP.HOSTNAMES (HASHARRAY 40 1.1)) (\IP.HOSTNUMBERS) (INTERNET.LOCAL.DOMAIN)) (INITRECORDS IP IPSOCKET IPADDRESS) (GLOBALVARS IPTRACEFILE IPTRACEFLG IPIGNORETYPES IPONLYTYPES IPPRINTMACROS \IP.HOSTNAMES \IP.INIT.FILE INTERNET.LOCAL.DOMAIN \IP.DEFAULT.CONFIGURATION \IP.HOSTNUMBERS) (FILES (SYSLOAD) TCPHTE TCPLLICMP TCPLLAR) (ADDVARS (\PACKET.PRINTERS (2048 . PRINTIP))) (FNS \CANONICALIZE.IP.HOSTNAME DODIP.HOSTP IPHOSTADDRESS IPHOSTNAME IPTRACE IPTRACEWINDOW.BUTTONFN PRINTIP PRINTIPDATA \IPADDRESSCLASS \IPEVENTFN \IPHOSTADDRESS \IPNETADDRESS \IP.ADDRESS.TO.STRING \IP.BROADCAST.ADDRESS \IP.LEGAL.ADDRESS \IP.MAKE.BROADCAST.ADDRESS \IP.PRINT.ADDRESS \IP.READ.STRING.ADDRESS \DOMAIN.NAME.QUALIFY.FULLY)) (COMS (* ;; "Startup and shutdown") (INITVARS (*IP-DEFAULT-HOSTS-FILE*) (TCP.ALWAYS.READ.HOSTS.FILE T) (\TCP.LAST.HOSTS.FILE.DATE) (\TCP.LAST.HOSTS.FILE.READ) (\IPFLG) (\IP.READY) (\IP.READY.EVENT (CREATE.EVENT "IP Ready")) (\IP.WAKEUP.TIMER) (IPTRACEFLG) (\IP.WAKEUP.EVENT (CREATE.EVENT "IP Wakeup"))) (GLOBALVARS \IPFLG \IP.READY \IP.READY.EVENT \IP.WAKEUP.TIMER \IP.WAKEUP.EVENT TCP.ALWAYS.READ.HOSTS.FILE \TCP.LAST.HOSTS.FILE.DATE \TCP.LAST.HOSTS.FILE.READ *IP-DEFAULT-HOSTS-FILE*) (FNS STOPIP \IPINIT \IPLISTENER \IP.REINITIALIZE.FROM.SCRATCH \IP.RESTART.FROM.CONFIGURATION \IP.MAYBE.READ.HOSTS.TXT \IP.READ.INIT.FILE \IP.PROMPT.FOR.FILE.NAME) (ADDVARS (RESTARTETHERFNS \IPEVENTFN))) (COMS (* ;; "Early IP reception functions") (DECLARE%: DONTCOPY (EXPORT (CONSTANTS * IPADDRESSTYPES))) (INITVARS (\IP.LOCAL.ADDRESSES) (\IP.SUBNET.MASKS) (\IP.GATEWAY.FLG)) (VARS (\IP.ADDRESS.BOX (\CREATECELL \FIXP))) (GLOBALVARS \IP.LOCAL.ADDRESSES \IP.SUBNET.MASKS \IP.GATEWAY.FLG \IP.ADDRESS.BOX) (MACROS \IP.FIX.DEST.HOST \IP.FIX.DEST.NET \IP.FIX.SOURCE.HOST \IP.FIX.SOURCE.NET) (FNS \HANDLE.RAW.IP \FORWARD.IP \IP.LOCAL.DESTINATION \IPCHECKSUM \IP.CHECKSUM.OK \IP.SET.CHECKSUM)) (COMS (* ;; "Protocol Distribution") (DECLARE%: DONTCOPY (EXPORT (CONSTANTS * IPPROTOCOLTYPES))) (INITVARS (\IP.PROTOCOLS)) (GLOBALVARS \IP.PROTOCOLS) (FNS \IP.HAND.TO.PROTOCOL \IP.DEFAULT.INPUTFN \IP.DEFAULT.NOSOCKETFN \IP.ADD.PROTOCOL \IP.DELETE.PROTOCOL \IP.FIND.PROTOCOL \IP.FIND.PROTOCOL.SOCKET \IP.FIND.SOCKET \IP.OPEN.SOCKET \IP.CLOSE.SOCKET)) (COMS (* ;; "Fragmentation Handling") (DECLARE%: DONTCOPY (EXPORT (RECORDS AssemblyRecord FragmentRecord FragmentID))) (INITVARS (\IP.FRAGMENT.LIST) (\IP.FRAGMENT.LOCK (CREATE.MONITORLOCK "IP Fragment Processing Lock"))) (GLOBALVARS \IP.FRAGMENT.LIST \IP.FRAGMENT.LOCK) (CONSTANTS (\IP.FRAGMENTATION.UNIT 8)) (FNS \HANDLE.RAW.IP.FRAGMENT \IP.NEW.FRAGMENT.LST \IP.COPY.FRAGMENT.HEADER.TO.PACKET.HEADER \IP.ADD.FRAGMENT \IP.FIND.MATCHING.FRAGMENTS \IP.FRAGMENTED.PACKET \IP.CHECK.REASSEMBLY.TIMEOUTS \IP.DELETE.FRAGMENT \IP.PRINT.FRAGMENT)) (COMS (* ;; "Option Processing") [DECLARE%: DONTCOPY (EXPORT (CONSTANTS * IPOPTIONTYPES) (CONSTANTS (IP.OPTION.NUMBER.BYTESPEC (BYTE 5 0] (FNS \IP.PROCESS.OPTIONS \IP.OPTION.RECORD.ROUTE \IP.OPTION.STRICT.SOURCE.ROUTE \IP.OPTION.TIMESTAMP)) (COMS (* ;; "Packet Transmission and routing") (INITVARS (\IP.ROUTING.TABLE (CONS)) (\IP.DEFAULT.GATEWAY) (\IP.LOCAL.NETWORKS) (\IP.GATEWAY.FORWARDING.FUNCTIONS)) (GLOBALVARS \IP.ROUTING.TABLE \IP.DEFAULT.GATEWAY \IP.LOCAL.NETWORKS \IP.GATEWAY.FORWARDING.FUNCTIONS) (FNS \IP.SETUPIP \IP.TRANSMIT \IP.ROUTE.PACKET) (FNS IP.GET IP.SEND IP.PACKET.WATCHER) (MACROS IP.SEND)) (COMS (* ;; "Client functions for building packets") (FNS \IP.APPEND.BYTE \IP.APPEND.CELL \IP.APPEND.STRING \IP.APPEND.WORD \IP.GET.BYTE \IP.GET.CELL \IP.GET.STRING \IP.GET.WORD \IP.PUT.BYTE \IP.PUT.CELL \IP.PUT.STRING \IP.PUT.WORD) (MACROS \IP.GET.BYTE \IP.GET.CELL \IP.GET.STRING \IP.GET.WORD \IP.PUT.BYTE \IP.PUT.CELL \IP.PUT.STRING \IP.PUT.WORD)) (P (MOVD? 'NILL 'IP.DEFAULT.CONFIGURATION)) (DECLARE%: EVAL@COMPILE DONTCOPY (GLOBALVARS \IP.LOCAL.NETWORKS \IP.DEFAULT.GATEWAY \IP.INIT.FILE \IP.SUBNET.MASKS \PROCESS.AFTEREXIT.EVENT \PROC.READY \AR.IP.TO.10MB.ALIST)))) (PUTPROPS TCPLLIP MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP")) (* ;; "IP definitions and addressing") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (ACCESSFNS IP [(IPBASE (LOCF (fetch (ETHERPACKET EPBODY) of DATUM] [BLOCKRECORD IPBASE ((IPVERSION BITS 4) (* ; "Protocol version") (IPHEADERLENGTH BITS 4) (* ; "Head length, in cells") (IPSERVICE BYTE) (* ; "Service type") (IPTOTALLENGTH WORD) (* ; "Packet length, in bytes") (IPID WORD) (* ; "Packet id") (NIL BITS 1) (IPDONTFRAGMENT FLAG) (* ; "Don't fragment me") (IPMOREFRAGMENTS FLAG)(* ; "Last fragment") (IPFRAGMENTOFFSET BITS 13) (* ; "Fragment position") (IPTIMETOLIVE BYTE) (* ; "Hop limiter") (IPPROTOCOL BYTE) (* ; "Client protocol") (IPHEADERCHECKSUM WORD) (* ; "Header-only checksum") (IPSOURCEADDRESS FIXP) (IPDESTINATIONADDRESS FIXP) (IPOPTIONSSTART BYTE) (* ; "Options or data start here") ) [ACCESSFNS IPSERVICE ((IPSERVICEBASE (LOCF DATUM))) (BLOCKRECORD IPSERVICEBASE ((IPPRECEDENCE BITS 3) (IPDELAY FLAG) (IPTHROUGHPUT FLAG) (IPRELIABILITY FLAG) (NIL BITS 2] [ACCESSFNS IPDESTINATIONADDRESS ((IPDESTBASE (LOCF DATUM))) (ACCESSFNS IPDESTBASE ([IPDESTINATIONNET (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSANET) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBNET) of DATUM)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (fetch (IPADDRESS CLASSCNET) of DATUM)) (T (ERROR "Illegal address class" DATUM))) (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (replace (IPADDRESS CLASSANET) of DATUM with NEWVALUE)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (replace (IPADDRESS CLASSBNET) of DATUM with NEWVALUE)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (replace (IPADDRESS CLASSCNET) of DATUM with NEWVALUE)) (T (ERROR "Illegal address class" DATUM] (IPDESTINATIONHOST (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSAHOST) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBHOST) of DATUM)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (fetch (IPADDRESS CLASSCHOST) of DATUM)) (T (ERROR "Illegal address class" DATUM))) (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (replace (IPADDRESS CLASSAHOST) of DATUM with NEWVALUE)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (replace (IPADDRESS CLASSBHOST) of DATUM with NEWVALUE)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (replace (IPADDRESS CLASSCHOST) of DATUM with NEWVALUE)) (T (ERROR "Illegal address class" DATUM] (ACCESSFNS IPSOURCEADDRESS ((IPSOURCEBASE (LOCF DATUM))) (ACCESSFNS IPSOURCEBASE ([IPSOURCENET (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSANET) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBNET) of DATUM)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (fetch (IPADDRESS CLASSCNET) of DATUM)) (T (ERROR "Illegal address class" DATUM))) (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (replace (IPADDRESS CLASSANET ) of DATUM with NEWVALUE )) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (replace (IPADDRESS CLASSBNET ) of DATUM with NEWVALUE )) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (replace (IPADDRESS CLASSCNET ) of DATUM with NEWVALUE )) (T (ERROR "Illegal address class" DATUM] (IPSOURCEHOST (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (fetch (IPADDRESS CLASSAHOST) of DATUM)) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (fetch (IPADDRESS CLASSBHOST) of DATUM)) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (fetch (IPADDRESS CLASSCHOST) of DATUM)) (T (ERROR "Illegal address class" DATUM))) (COND ((EQ \IP.CLASS.A (fetch (IPADDRESS CLASSA) of DATUM)) (replace (IPADDRESS CLASSAHOST) of DATUM with NEWVALUE )) ((EQ \IP.CLASS.B (fetch (IPADDRESS CLASSB) of DATUM)) (replace (IPADDRESS CLASSBHOST) of DATUM with NEWVALUE )) ((EQ \IP.CLASS.C (fetch (IPADDRESS CLASSC) of DATUM)) (replace (IPADDRESS CLASSCHOST) of DATUM with NEWVALUE )) (T (ERROR "Illegal address class" DATUM] (TYPE? (type? ETHERPACKET DATUM))) (DATATYPE IPSOCKET ((PROTOCOL BYTE) (IPSLINK POINTER) (* ;  "Other sockets of this protocol type") (NIL BYTE) (IPSQUEUE POINTER) (* ;  "Queue of packets for this protocol") (IPSQUEUELENGTH WORD) (* ; "Count of packets of input queue") (IPSQUEUEALLOC WORD) (* ; "Max count allowed") (IPSDESTSOCKETCOMPAREFN POINTER) (* ;  "Call this to compare dest protocol socket to this socket") (IPSOCKET POINTER) (* ; "This socket") (IPSINPUTFN POINTER) (* ; "Call to hand packet to protocol") (IPSEVENT POINTER) (* ; "Notify me when a packet arrives") (IPSNOSOCKETFN POINTER) (* ; "Call this when no socket found") (IPSICMPFN POINTER) (* ;  "Call this when an ICMP packet is received on this protocol") ) IPSQUEUE _ (create SYSQUEUE) IPSQUEUEALLOC _ \IP.MAX.EPKTS.ON.QUEUE IPSEVENT _ (CREATE.EVENT) IPSINPUTFN _ (FUNCTION \IP.DEFAULT.INPUTFN) IPSICMPFN _ (FUNCTION \RELEASE.ETHERPACKET)) (BLOCKRECORD IPADDRESS ((ADDRESS FIXP)) (* ;; "Class A nets: high bit is 0") (BLOCKRECORD IPADDRESS ((CLASSA BITS 1) (CLASSANET BITS 7) (CLASSAHOST BITS 24))) (* ;; "Class B nets: high 2 bits are 10") (BLOCKRECORD IPADDRESS ((CLASSB BITS 2))) (BLOCKRECORD IPADDRESS ((CLASSBNET BITS 16) (CLASSBHOST BITS 16))) (* ;; "Class C nets: high 3 bits are 110") (BLOCKRECORD IPADDRESS ((CLASSC BITS 3))) (BLOCKRECORD IPADDRESS ((CLASSCNETB1 BITS 8) (CLASSCNETB2 BITS 8) (CLASSCNETB3 BITS 8) (CLASSCHOST BITS 8))) (* ;  "I wish I could say just net bits 24, host bits 8, but BLOCKRECORD barfs") (BLOCKRECORD IPADDRESS ((CLASSCNETHI BITS 16))) [ACCESSFNS IPADDRESS ((CLASSCNET (\MAKENUMBER (FETCH CLASSCNETB1 OF DATUM) (LOGOR (LLSH (FETCH CLASSCNETB2 OF DATUM) 8) (FETCH CLASSCNETB3 OF DATUM))) (PROGN (REPLACE CLASSCNETHI OF DATUM WITH (LRSH NEWVALUE 8)) (REPLACE CLASSCNETB3 OF DATUM WITH (LOGAND NEWVALUE 255)) DATUM]) ) (/DECLAREDATATYPE 'IPSOCKET '(BYTE POINTER BYTE POINTER WORD WORD POINTER POINTER POINTER POINTER POINTER POINTER) '((IPSOCKET 0 (BITS . 7)) (IPSOCKET 0 POINTER) (IPSOCKET 2 (BITS . 7)) (IPSOCKET 2 POINTER) (IPSOCKET 4 (BITS . 15)) (IPSOCKET 5 (BITS . 15)) (IPSOCKET 6 POINTER) (IPSOCKET 8 POINTER) (IPSOCKET 10 POINTER) (IPSOCKET 12 POINTER) (IPSOCKET 14 POINTER) (IPSOCKET 16 POINTER)) '18) (DECLARE%: EVAL@COMPILE (RPAQQ \IPOVLEN 20) (RPAQQ \MAX.IPDATALENGTH 556) (RPAQQ \IP.PROTOCOLVERSION 4) (RPAQQ \IP.MAX.EPKTS.ON.QUEUE 16) (RPAQQ \IP.DEFAULT.TIME.TO.LIVE 120) (RPAQQ \IP.WAKEUP.INTERVAL 15000) (CONSTANTS \IPOVLEN \MAX.IPDATALENGTH \IP.PROTOCOLVERSION \IP.MAX.EPKTS.ON.QUEUE \IP.DEFAULT.TIME.TO.LIVE \IP.WAKEUP.INTERVAL) ) (RPAQQ IPPACKETTYPES ((\EPT.IP 2048) (\EPT.AR 2054) (\EET.IP 513) (\EPT.CHAOS 2052))) (DECLARE%: EVAL@COMPILE (RPAQQ \EPT.IP 2048) (RPAQQ \EPT.AR 2054) (RPAQQ \EET.IP 513) (RPAQQ \EPT.CHAOS 2052) (CONSTANTS (\EPT.IP 2048) (\EPT.AR 2054) (\EET.IP 513) (\EPT.CHAOS 2052)) ) (RPAQQ ICMPUNREACHABLES ((\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5))) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.NET.UNREACHABLE 0) (RPAQQ \ICMP.HOST.UNREACHABLE 1) (RPAQQ \ICMP.PROTOCOL.UNREACHABLE 2) (RPAQQ \ICMP.PORT.UNREACHABLE 3) (RPAQQ \ICMP.CANT.FRAGMENT 4) (RPAQQ \ICMP.SOURCE.ROUTE 5) (CONSTANTS (\ICMP.NET.UNREACHABLE 0) (\ICMP.HOST.UNREACHABLE 1) (\ICMP.PROTOCOL.UNREACHABLE 2) (\ICMP.PORT.UNREACHABLE 3) (\ICMP.CANT.FRAGMENT 4) (\ICMP.SOURCE.ROUTE 5)) ) (DECLARE%: EVAL@COMPILE [PUTPROPS \IPDATABASE MACRO (LAMBDA (IP) (* ejs%: "26-Dec-84 17:50") (* Returns the LOCF of the start of  the data in the packet) (\ADDBASE (fetch (IP IPBASE) of IP) (UNFOLD (fetch (IP IPHEADERLENGTH) of IP) 2] [PUTPROPS \IPDATALENGTH MACRO (LAMBDA (IP) (IDIFFERENCE (fetch (IP IPTOTALLENGTH) of IP) (LLSH (fetch (IP IPHEADERLENGTH) of IP) 2] ) (* "END EXPORTED DEFINITIONS") ) (ADDTOVAR *IP-PROTOCOL-NAME-FROM-NUMBER* (17 . "UDP") (6 . "TCP") (1 . "ICMP")) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS *IP-PROTOCOL-NAME-FROM-NUMBER*) ) (* ;; "value in sysout is too small. This is 512-(indexf (fetch epencapsulation))-2. 489 is more correct, but let's leave a word of slop for off-by-ones" ) (RPAQQ \10MBPACKETLENGTH 488) (* ;; "Make it easier to see queuelength without opening up q.") (DEFINEQ (\SYSQUEUE.DEFPRINT [LAMBDA (Q STREAM) (* ; "Edited 8-Sep-89 11:06 by bvm") (\DEFPRINT.BY.NAME Q STREAM (if (fetch (SYSQUEUE SYSQUEUEHEAD) of Q) then (\QUEUELENGTH Q) else "Empty") "SysQueue"]) (\IPSOCKET.DEFPRINT [LAMBDA (SOCKET STREAM) (* ; "Edited 25-Aug-88 17:51 by bvm") (* ;; "Print an object using its name, for example, #. NAME is the object's name (or NIL if this one happens to be nameless), TYPENAME is a string giving the generic name you want to appear in front, e.g., %"FDev%"") (\OUTCHAR STREAM (fetch (READTABLEP HASHMACROCHAR) of *READTABLE*)) (\OUTCHAR STREAM (CHARCODE <)) (LET ((TYPE (CDR (ASSOC (fetch (IPSOCKET PROTOCOL) of SOCKET) *IP-PROTOCOL-NAME-FROM-NUMBER*))) (NUM (fetch (IPSOCKET IPSOCKET) of SOCKET)) (*PRINT-BASE* 10)) (\SOUT (if TYPE then (MKSTRING TYPE) else "IP") STREAM) (\SOUT " Socket" STREAM) (if (if (FIXP NUM) elseif (NULL NUM) then (* ; "I assume this is the master") (SETQ NUM "Head")) then (\OUTCHAR STREAM (CHARCODE SPACE)) (PRIN3 NUM STREAM))) (\OUTCHAR STREAM (CHARCODE /)) (\PRINTADDR SOCKET STREAM) (\OUTCHAR STREAM (CHARCODE >)) T]) ) (DECLARE%: DONTEVAL@LOAD DOCOPY (DEFPRINT 'IPSOCKET '\IPSOCKET.DEFPRINT) (DEFPRINT 'SYSQUEUE '\SYSQUEUE.DEFPRINT) ) (RPAQ? IPTRACETIME ) (RPAQ? IPONLYTYPES ) (RPAQ? IPIGNORETYPES ) (RPAQ? IPPRINTMACROS ) (RPAQ? IPTRACEFLG ) (RPAQ? IPTRACEFILE ) (RPAQ? \IP.INIT.FILE ) (RPAQ? \IP.DEFAULT.CONFIGURATION ) (RPAQ? \IP.HOSTNAMES (HASHARRAY 40 1.1)) (RPAQ? \IP.HOSTNUMBERS ) (RPAQ? INTERNET.LOCAL.DOMAIN ) (/DECLAREDATATYPE 'IPSOCKET '(BYTE POINTER BYTE POINTER WORD WORD POINTER POINTER POINTER POINTER POINTER POINTER) '((IPSOCKET 0 (BITS . 7)) (IPSOCKET 0 POINTER) (IPSOCKET 2 (BITS . 7)) (IPSOCKET 2 POINTER) (IPSOCKET 4 (BITS . 15)) (IPSOCKET 5 (BITS . 15)) (IPSOCKET 6 POINTER) (IPSOCKET 8 POINTER) (IPSOCKET 10 POINTER) (IPSOCKET 12 POINTER) (IPSOCKET 14 POINTER) (IPSOCKET 16 POINTER)) '18) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS IPTRACEFILE IPTRACEFLG IPIGNORETYPES IPONLYTYPES IPPRINTMACROS \IP.HOSTNAMES \IP.INIT.FILE INTERNET.LOCAL.DOMAIN \IP.DEFAULT.CONFIGURATION \IP.HOSTNUMBERS) ) (FILESLOAD (SYSLOAD) TCPHTE TCPLLICMP TCPLLAR) (ADDTOVAR \PACKET.PRINTERS (2048 . PRINTIP)) (DEFINEQ (\CANONICALIZE.IP.HOSTNAME [LAMBDA (NAME) (* ; "Edited 12-Apr-88 17:18 by bvm") (AND \IP.READY (IPHOSTADDRESS NAME) NAME]) (DODIP.HOSTP [LAMBDA (NAME) (* ; "Edited 27-Feb-89 21:49 by welch") (COND ((NULL NAME) NIL) ((NUMBERP NAME)) (T (LET [(NAME (\DOMAIN.NAME.QUALIFY.FULLY (U-CASE NAME] (COND ((IPHOSTADDRESS NAME)) (T (if (CL:FBOUNDP 'DOMAIN.LOOKUP.ADDRESS) then (CAR (DOMAIN.LOOKUP.ADDRESS NAME]) (IPHOSTADDRESS [LAMBDA (NAME) (* ; "Edited 19-Jan-88 14:41 by FS") (LET (ENTRY) (* ;; "Hack to handle strings, by canonicalizing NAME") (SETQ NAME (MKATOM (U-CASE NAME))) (SETQ ENTRY (GETHASH NAME \IP.HOSTNAMES)) (COND (ENTRY (LET [(ADDRESS (CAR (fetch (HOSTS.TXT.ENTRY HTE.ADDRESSES) of ENTRY] [COND ((NOT (SASSOC ADDRESS \IP.HOSTNUMBERS)) (push \IP.HOSTNUMBERS (CONS ADDRESS NAME] ADDRESS)) ((\IP.READ.STRING.ADDRESS NAME]) (IPHOSTNAME [LAMBDA (IPADDRESS) (* ejs%: "22-Apr-85 13:54") (OR (CDR (SASSOC IPADDRESS \IP.HOSTNUMBERS)) (MKATOM (\IP.ADDRESS.TO.STRING IPADDRESS]) (IPTRACE [LAMBDA (FLG REGION) (* ; "Edited 13-Sep-88 14:53 by bvm") (MAKE-NETWORK-TRACE-WINDOW 'IPTRACEFLG 'IPTRACEFILE "IP traffic" REGION FLG]) (IPTRACEWINDOW.BUTTONFN [LAMBDA (WINDOW) (* ejs%: " 2-Jun-85 13:05") (COND ((MOUSESTATE (NOT UP)) (SETQ IPTRACEFLG (SELECTQ IPTRACEFLG (NIL T) (T 'PEEK) (PEEK NIL) NIL)) (printout WINDOW T "[Tracing " (SELECTQ IPTRACEFLG (T "on") (PEEK "peek") "off") "]" T]) (PRINTIP [LAMBDA (IP CALLER FILE PRE.NOTE DOFILTER) (* ; "Edited 28-Apr-88 14:05 by bvm") (PROG ((*STANDARD-OUTPUT* (GETSTREAM (OR FILE IPTRACEFILE) 'OUTPUT)) (PROTOCOL (fetch (IP IPPROTOCOL) of IP)) MACRO LENGTH) [COND (DOFILTER (COND ((COND (IPONLYTYPES (NOT (FMEMB PROTOCOL IPONLYTYPES))) (IPIGNORETYPES (FMEMB PROTOCOL IPIGNORETYPES))) (RETURN (PRIN1 (SELECTQ CALLER ((PUT RAWPUT) '!) ((GET RAWGET) '+) '?] (AND PRE.NOTE (printout NIL T PRE.NOTE)) (if CALLER then (* ; "Print GET or PUT") (FRESHLINE) (PRINTOUT NIL CALLER " ")) (printout NIL "From " (\IP.ADDRESS.TO.STRING (fetch (IP IPSOURCEADDRESS) of IP)) " to " (\IP.ADDRESS.TO.STRING (fetch (IP IPDESTINATIONADDRESS) of IP))) (if IPTRACETIME then (LET ((CSECS (\CENTICLOCK IP))) (PRINTOUT NIL " [" |.I4| (IQUOTIENT CSECS 100) "." |.I2..T| (IREMAINDER CSECS 100) "]"))) (TERPRI) [COND ((AND (SETQ MACRO (CDR (FASSOC PROTOCOL IPPRINTMACROS))) (NLISTP MACRO)) (* ;  "Macro is a function to which to dispatch for the printing.") (CL:FUNCALL MACRO IP *STANDARD-OUTPUT*) (RETURN (TERPRI] (printout NIL "Length = " |.P2| (SETQ LENGTH (fetch (IP IPTOTALLENGTH) of IP)) " bytes" " (header + " |.P2| (IDIFFERENCE LENGTH \IPOVLEN) ")" T "Protocol = ") (PRINTCONSTANT PROTOCOL IPPROTOCOLTYPES NIL) (TERPRI) [COND ((IGREATERP LENGTH \IPOVLEN) (* ; "MACRO tells how to print data.") (PRIN1 "Contents: ") (PRINTIPDATA IP (OR MACRO '(BYTES 12 |...|] (TERPRI) (RETURN IP]) (PRINTIPDATA [LAMBDA (IP MACRO OFFSET FILE) (* ejs%: "27-Dec-84 18:43") (* * Prints DATA part of IP starting at OFFSET  (Default zero) according to MACRO. MACRO contains elements describing what  format the data is in -  WORDS, BYTES, CHARS%: print as words, bytes  (numeric) or ascii characters -  %: subsequent commands apply starting at this byte offset -  ...%: print "..." and quit if you still have data at this point) (PROG ((DATA (\IPDATABASE IP)) (LENGTH (\IPDATALENGTH IP))) (PRINTPACKETDATA DATA OFFSET MACRO LENGTH FILE]) (\IPADDRESSCLASS [LAMBDA (IPADDRESS) (* ; "Edited 26-Oct-88 12:49 by bvm") (if (SMALLP IPADDRESS) then (* ; "bogus unless it's broadcastp") '\IP.CLASS.A elseif (EQ \IP.CLASS.C (SETQ IPADDRESS (fetch (IPADDRESS CLASSC) of IPADDRESS))) then '\IP.CLASS.C elseif (EQ \IP.CLASS.B (SETQ IPADDRESS (LRSH IPADDRESS 1))) then '\IP.CLASS.B elseif (EQ \IP.CLASS.A (LRSH IPADDRESS 1)) then '\IP.CLASS.A]) (\IPEVENTFN [LAMBDA (EVENT) (* ; "Edited 13-Sep-88 18:53 by Hiroshi Hayata") (* ;; "If maiko, do nothing. ") (* ;; "Call of \IPINIT with AFTERSYSOUT on maiko cause RAID.") (COND ((EQ \MACHINETYPE \MAIKO) NIL) (T (COND (\IPFLG (\IPINIT EVENT]) (\IPHOSTADDRESS [LAMBDA (IPADDRESS) (* ; "Edited 26-Oct-88 12:43 by bvm") (if (SMALLP IPADDRESS) then (* ; "can only be class a or bogus") (LOGAND IPADDRESS MAX.SMALLP) elseif (EQ (fetch (IPADDRESS CLASSA) of IPADDRESS) \IP.CLASS.A) then (fetch (IPADDRESS CLASSAHOST) of IPADDRESS) elseif (EQ (fetch (IPADDRESS CLASSB) of IPADDRESS) \IP.CLASS.B) then (fetch (IPADDRESS CLASSBHOST) of IPADDRESS) elseif (EQ (fetch (IPADDRESS CLASSC) of IPADDRESS) \IP.CLASS.C) then (fetch (IPADDRESS CLASSCHOST) of IPADDRESS]) (\IPNETADDRESS [LAMBDA (IPADDRESS) (* ; "Edited 26-Oct-88 12:45 by bvm") (if (SMALLP IPADDRESS) then (* ; "bogus unless it's broadcastp") (if (< IPADDRESS 0) then -1 else 0) elseif (EQ (fetch (IPADDRESS CLASSA) of IPADDRESS) \IP.CLASS.A) then (fetch (IPADDRESS CLASSANET) of IPADDRESS) elseif (EQ (fetch (IPADDRESS CLASSB) of IPADDRESS) \IP.CLASS.B) then (fetch (IPADDRESS CLASSBNET) of IPADDRESS) elseif (EQ (fetch (IPADDRESS CLASSC) of IPADDRESS) \IP.CLASS.C) then (fetch (IPADDRESS CLASSCNET) of IPADDRESS]) (\IP.ADDRESS.TO.STRING [LAMBDA (IPADDRESS) (* ejs%: "28-Dec-84 08:43") (RESETFORM (RADIX 10) (CONCAT (LDB (BYTE 8 24) IPADDRESS) "." (LDB (BYTE 8 16) IPADDRESS) "." (LDB (BYTE 8 8) IPADDRESS) "." (LDB (BYTE 8 0) IPADDRESS]) (\IP.BROADCAST.ADDRESS [LAMBDA (IPADDRESS) (* ; "Edited 26-Oct-88 14:59 by bvm") (* ;;  "0's in the host field are now considered broadcasts, so this code works with Berkeley Unix") (LET (HOST MASK) (if (SMALLP IPADDRESS) then (OR (EQ IPADDRESS 0) (EQ IPADDRESS -1)) elseif (EQ (fetch (IPADDRESS CLASSA) of IPADDRESS) \IP.CLASS.A) then [if (AND \IP.SUBNET.MASKS (ASSOC (fetch (IPADDRESS CLASSANET) of IPADDRESS) \IP.LOCAL.NETWORKS)) then (* ;  "If it's our subnet, check only the subnetted host part. The LOGOR patches bogus subnet masks") [SETQ HOST (LOGAND IPADDRESS (SETQ MASK (LOGXOR (LOGOR (CDAR \IP.SUBNET.MASKS ) -16777216) -1] (OR (EQ HOST 0) (EQL HOST MASK)) else (SETQ HOST (fetch (IPADDRESS CLASSAHOST) of IPADDRESS)) (OR (EQ HOST 0) (EQL HOST (MASK.1'S 0 24] elseif (EQ (fetch (IPADDRESS CLASSB) of IPADDRESS) \IP.CLASS.B) then [if (AND \IP.SUBNET.MASKS (ASSOC (fetch (IPADDRESS CLASSBNET) of IPADDRESS) \IP.LOCAL.NETWORKS)) then [SETQ HOST (LOGAND IPADDRESS (SETQ MASK (LOGXOR (LOGOR (CDAR \IP.SUBNET.MASKS ) -65536) -1] (OR (EQ HOST 0) (EQ HOST MASK)) else (SETQ HOST (fetch (IPADDRESS CLASSBHOST) of IPADDRESS)) (OR (EQ HOST 0) (EQ HOST (MASK.1'S 0 16] elseif (EQ (fetch (IPADDRESS CLASSC) of IPADDRESS) \IP.CLASS.C) then (SETQ HOST (fetch (IPADDRESS CLASSCHOST) of IPADDRESS)) (* ; "No subnetting here") (OR (EQ HOST 0) (EQ HOST (MASK.1'S 0 8))) elseif (EQ (fetch (IPADDRESS CLASSBNET) of IPADDRESS) MAX.SMALLP) then (* ;  "Sort of illegal, but recognize all ones as broadcast") (EQ (fetch (IPADDRESS CLASSBHOST) of IPADDRESS) MAX.SMALLP]) (\IP.LEGAL.ADDRESS [LAMBDA (ADDRESS) (* ejs%: "25-Mar-86 16:00") (AND (NOT (EQ ADDRESS 0)) (NOT (EQ ADDRESS -1)) (OR (EQ \IP.CLASS.C (SETQ ADDRESS (LRSH ADDRESS 29))) (EQ \IP.CLASS.B (SETQ ADDRESS (LRSH ADDRESS 1))) (EQ \IP.CLASS.A (LRSH ADDRESS 1]) (\IP.MAKE.BROADCAST.ADDRESS [LAMBDA (IPADDRESS) (* ejs%: " 3-Jun-85 01:02") (SELECTQ (\IPADDRESSCLASS IPADDRESS) (\IP.CLASS.A (LOGOR (MASK.1'S 0 24) IPADDRESS)) (\IP.CLASS.B (LOGOR (MASK.1'S 0 16) IPADDRESS)) (\IP.CLASS.C (LOGOR (MASK.1'S 0 8) IPADDRESS)) (SHOULDNT]) (\IP.PRINT.ADDRESS [LAMBDA (IPADDRESS FILE) (* ejs%: "28-Dec-84 08:42") (RESETFORM (RADIX 10) (PRIN1 (LDB (BYTE 8 24) IPADDRESS) FILE) (PRIN1 "." FILE) (PRIN1 (LDB (BYTE 8 16) IPADDRESS) FILE) (PRIN1 "." FILE) (PRIN1 (LDB (BYTE 8 8) IPADDRESS) FILE) (PRIN1 "." FILE) (PRIN1 (LDB (BYTE 8 0) IPADDRESS) FILE) IPADDRESS]) (\IP.READ.STRING.ADDRESS [LAMBDA (STRING.OR.ATOM) (* ; "Edited 21-Apr-88 14:41 by bvm") (for CHAR instring (MKSTRING STRING.OR.ATOM) bind (RESULT _ (NCREATE 'FIXP)) (INDEX _ 0) BYTE do (if (> INDEX 3) then (* ;  "Got 3 parts and there's still more to go, must be bad") (RETURN NIL) elseif (EQ CHAR (CHARCODE %.)) then (if BYTE then (\PUTBASEBYTE RESULT INDEX BYTE)) (SETQ BYTE NIL) (add INDEX 1) elseif (AND (SETQ CHAR (CL:DIGIT-CHAR-P (CL:INT-CHAR CHAR))) (< (SETQ BYTE (+ (if BYTE then (TIMES BYTE 10) else 0) CHAR)) 256)) then (* ;  "Accumulated decimal digit, and we haven't overflowed a byte yet") else (* ; "Malformed") (RETURN NIL)) finally (if BYTE then (\PUTBASEBYTE RESULT INDEX BYTE) (add INDEX 1)) (RETURN (AND (EQ INDEX 4) RESULT]) (\DOMAIN.NAME.QUALIFY.FULLY [LAMBDA (NAME) (* ; "Edited 29-Aug-90 16:27 by gadener") (* Make a fully qualified domain  name from a partial one) (if (OR (NULL INTERNET.LOCAL.DOMAIN) (STRPOS "." NAME)) then NAME else (MKATOM (CONCAT NAME "." INTERNET.LOCAL.DOMAIN]) ) (* ;; "Startup and shutdown") (RPAQ? *IP-DEFAULT-HOSTS-FILE* ) (RPAQ? TCP.ALWAYS.READ.HOSTS.FILE T) (RPAQ? \TCP.LAST.HOSTS.FILE.DATE ) (RPAQ? \TCP.LAST.HOSTS.FILE.READ ) (RPAQ? \IPFLG ) (RPAQ? \IP.READY ) (RPAQ? \IP.READY.EVENT (CREATE.EVENT "IP Ready")) (RPAQ? \IP.WAKEUP.TIMER ) (RPAQ? IPTRACEFLG ) (RPAQ? \IP.WAKEUP.EVENT (CREATE.EVENT "IP Wakeup")) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IPFLG \IP.READY \IP.READY.EVENT \IP.WAKEUP.TIMER \IP.WAKEUP.EVENT TCP.ALWAYS.READ.HOSTS.FILE \TCP.LAST.HOSTS.FILE.DATE \TCP.LAST.HOSTS.FILE.READ *IP-DEFAULT-HOSTS-FILE*) ) (DEFINEQ (STOPIP [LAMBDA NIL (* ejs%: "28-Dec-84 08:10") (\DEL.PACKET.FILTER (FUNCTION \HANDLE.RAW.IP)) (\DEL.PACKET.FILTER (FUNCTION \HANDLE.RAW.AR)) (DEL.PROCESS '\IPLISTENER) (SETQ \IPFLG (SETQ \IP.READY NIL]) (\IPINIT [LAMBDA (EVENT) (* ; "Edited 18-Mar-88 17:22 by bvm") (* ;; "Initialize IP protocol. Called with EVENT NIL for explicit restart, RESTART from RESTART.ETHER, otherwise from usual around exit events via \ETHEREVENTFN and RESTARTETHERFNS after Pup and/an \icmp.echo.reply") (* ;; "or NS turned on.") (SELECTQ EVENT ((NIL RESTART AFTERSYSOUT AFTERMAKESYS AFTERLOGOUT AFTERSAVEVM) (if (AND (NULL \IPFLG) (NOT (NULL EVENT))) then (* ;  "Nothing to do. Only turn IP on for explicit call to \IPINIT") NIL elseif [OR (NULL EVENT) (NULL \IP.DEFAULT.CONFIGURATION) (NOT (EQUAL \MY.NSHOSTNUMBER (fetch (IPINIT LOCAL.NSHOSTNUMBER) of \IP.DEFAULT.CONFIGURATION] then (* ;  "Machine changed, or caller explicitly wants us to reread the init file") (SETQ \IP.DEFAULT.CONFIGURATION NIL) (SETQ \IP.LOCAL.ADDRESSES NIL) (SETQ \IP.LOCAL.NETWORKS NIL) (SETQ \IP.SUBNET.MASKS NIL) (DEL.PROCESS '\IPLISTENER) [SELECTQ EVENT ((NIL RESTART) (* ; "Can do it here--explicit manual restart. Otherwise spawn process, so that we can do arbitrary things like rely on other devices initialized later than ether") (\IP.REINITIALIZE.FROM.SCRATCH)) (ADD.PROCESS `(\IP.REINITIALIZE.FROM.SCRATCH ',EVENT] else (\IP.RESTART.FROM.CONFIGURATION EVENT))) NIL]) (\IPLISTENER [LAMBDA NIL (* ejs%: "25-Jun-85 18:52") (* * IP background process) (SETQ \IP.WAKEUP.TIMER (SETUPTIMER \IP.WAKEUP.INTERVAL)) (bind [\AR.WAKEUP.TIMER _ (SETUPTIMER (CONSTANT (ITIMES 4 \IP.WAKEUP.INTERVAL] while T do (AWAIT.EVENT \IP.WAKEUP.EVENT \IP.WAKEUP.INTERVAL) (\IP.CHECK.REASSEMBLY.TIMEOUTS) (COND ((TIMEREXPIRED? \AR.WAKEUP.TIMER) (\AR.DAEMON) (SETQ \AR.WAKEUP.TIMER (SETUPTIMER (CONSTANT (ITIMES 4 \IP.WAKEUP.INTERVAL)) \AR.WAKEUP.TIMER]) (\IP.REINITIALIZE.FROM.SCRATCH [LAMBDA (EVENT) (* ; "Edited 20-Jan-89 18:35 by bvm") (DECLARE (GLOBALVARS \IP.DEFAULT.CONFIGURATION \IP.LOCAL.ADDRESSES)) (* ;; "Called when we have never enabled IP, or the machine's address has changed.") (RESETBUFS (PROG (FILE ADDRESS.STRING HOSTS.FILE HOSTNAME ADDRESSES) (* ;;  "This is a kludge until we know more about IP routing and reverse address resolution (??)") [SETQ \IP.DEFAULT.CONFIGURATION (COND ((AND (SETQ FILE (INFILEP '{DSK}IP.INIT)) (\IP.READ.INIT.FILE FILE))) ((IP.DEFAULT.CONFIGURATION)) ((AND (SETQ FILE (\IP.PROMPT.FOR.FILE.NAME "Please enter the name of the IP initialization file for this host: " )) (\IP.READ.INIT.FILE FILE))) (T (* ;  "User declined to specify, or init file failed, so give up") (PRINTOUT T "IP not initialized" T) (RETURN NIL] (COND ((SETQ FILE (OR (fetch (IPINIT HTE.FILE) of \IP.DEFAULT.CONFIGURATION ) *IP-DEFAULT-HOSTS-FILE*)) (* ;;  "there is a hosts file in the configuration. Now see if we really want to read it.") (\IP.MAYBE.READ.HOSTS.TXT T FILE))) (COND ([AND (NOT (SETQ HOSTNAME (fetch (IPINIT HOSTNAME) of \IP.DEFAULT.CONFIGURATION ))) (SETQ HOSTNAME (AND (EQ \PUP.READY T) (U-CASE (ETHERHOSTNAME] (replace (IPINIT HOSTNAME) of \IP.DEFAULT.CONFIGURATION with HOSTNAME))) [COND [(SETQ ADDRESSES (fetch (IPINIT LOCAL.ADDRESSES) of \IP.DEFAULT.CONFIGURATION )) (SETQ \IP.LOCAL.ADDRESSES (for ADDR in ADDRESSES collect (\IP.READ.STRING.ADDRESS ADDR] ((AND HOSTNAME (SETQ ADDRESSES (DODIP.HOSTP HOSTNAME))) (SETQ \IP.LOCAL.ADDRESSES (LIST ADDRESSES))) (T (until (SETQ ADDRESS.STRING (PROMPTFORWORD "Please enter this machine's IP host address (e.g. 39.9.0.9)" ))) (SETQ \IP.LOCAL.ADDRESSES (LIST (\IP.READ.STRING.ADDRESS ADDRESS.STRING))) (COND (HOSTNAME (* ;  "Associate name with local address(es)") (PUTHASH HOSTNAME [create HOSTS.TXT.ENTRY HTE.TYPE _ 'HOST HTE.ADDRESSES _ \IP.LOCAL.ADDRESSES HTE.NAMES _ (LIST HOSTNAME) HTE.MACHINE.TYPE _ (SELECTQ (MACHINETYPE) (DOVE 'XEROX-1185) (DANDELION 'XEROX-1108) (DOLPHIN 'XEROX-1100) (DORADO 'XEROX-1132) 'XEROX-11XX) HTE.OS.TYPE _ 'INTERLISP HTE.PROTOCOLS _ '((TCP) (IP] \IP.HOSTNAMES] (\IP.RESTART.FROM.CONFIGURATION EVENT T]) (\IP.RESTART.FROM.CONFIGURATION [LAMBDA (EVENT NEW.INIT) (* ; "Edited 26-Feb-89 21:28 by welch") (* ;; "Reinitialize IP after logout, etc, from the info in the default configuration. This is the only place that sets \IP.READY true.") (GLOBALVARS INTERNET.LOCAL.DOMAIN) (PROG ((GATE (fetch (IPINIT DEFAULT.GATEWAY) of \IP.DEFAULT.CONFIGURATION)) (NETS (fetch (IPINIT LOCAL.NETWORKS) of \IP.DEFAULT.CONFIGURATION)) PROC NDB) (SETQ \IP.DEFAULT.GATEWAY (AND GATE (\IP.READ.STRING.ADDRESS GATE))) (SETQ \IP.ROUTING.TABLE (CONS)) (SETQ \AR.IP.TO.10MB.ALIST NIL) (SETQ INTERNET.LOCAL.DOMAIN (fetch (IPINIT LOCAL.DOMAIN) of \IP.DEFAULT.CONFIGURATION )) [COND [(EQLENGTH NETS (LENGTH \IP.LOCAL.ADDRESSES)) (* ;;  "List tells net numbers of each directly connected net. Each element = (%"net.number%" . type).") (SETQ \IP.LOCAL.NETWORKS (bind NDB for NET.AND.TYPE in NETS as ADDRESS in \IP.LOCAL.ADDRESSES collect (LET* [(TYPE (CDR NET.AND.TYPE)) [NET (\IPNETADDRESS (\IP.READ.STRING.ADDRESS (CAR NET.AND.TYPE] (NDB (SELECTQ TYPE (3 \3MBLOCALNDB) (10 \10MBLOCALNDB) (SHOULDNT] (replace (NDB NDBIPNET#) of NDB with NET) (replace (NDB NDBIPHOST#) of NDB with ADDRESS) (CONS NET NDB] ((NULL \IP.LOCAL.ADDRESSES) (RETURN (CL:WARN "Error in IP init file. No local host address specified"))) ((AND (NULL (CDR \IP.LOCAL.ADDRESSES)) (NULL (fetch (NDB NDBNEXT) of \LOCALNDBS))) (* ;  "Only one address, so it goes with our one net") [SETQ \IP.LOCAL.NETWORKS (LIST (CONS (\IPNETADDRESS (CAR \IP.LOCAL.ADDRESSES)) (SETQ NDB (OR \10MBLOCALNDB \3MBLOCALNDB] (replace (NDB NDBIPNET#) of NDB with (CAAR \IP.LOCAL.NETWORKS)) (replace (NDB NDBIPHOST#) of NDB with (CAR \IP.LOCAL.ADDRESSES))) (T (RETURN (CL:WARN "Error in IP init file. Network list and local address list do not correlate." ] [SETQ \IP.SUBNET.MASKS (for LOCALADDR in \IP.LOCAL.ADDRESSES as MASK in (fetch (IPINIT SUBNETMASK) of \IP.DEFAULT.CONFIGURATION ) as NETADDRESS in NETS collect (CONS LOCALADDR (\IP.READ.STRING.ADDRESS (OR MASK (CAR NETADDRESS] (COND ((BOUNDP '\DOMAIN.NAMESERVERS) (\DOMAIN.INIT EVENT))) (\ADD.PACKET.FILTER (FUNCTION \HANDLE.RAW.IP)) (\ADD.PACKET.FILTER (FUNCTION \HANDLE.RAW.AR)) (SETQ \IPFLG T) (\IP.ADD.PROTOCOL \ICMP.PROTOCOL (FUNCTION TRUE) (FUNCTION NILL) (FUNCTION \ICMP.INPUT)) (COND ((SETQ PROC (FIND.PROCESS '\IPLISTENER)) (RESTART.PROCESS PROC)) (T (ADD.PROCESS '(\IPLISTENER) 'RESTARTABLE 'SYSTEM 'AFTEREXIT \IP.READY.EVENT))) (if (NOT NEW.INIT) then (* ; "Finally, check for new hosts.txt file, but we can do this in background. If NEW.INIT, the configuration code has already read it.") (ADD.PROCESS '(\IP.MAYBE.READ.HOSTS.TXT T) 'AFTEREXIT 'DELETE)) (SETQ \IP.READY T) (NOTIFY.EVENT \IP.READY.EVENT) (\ICMP.REQUEST.ADDRESS.MASK) (RETURN T]) (\IP.MAYBE.READ.HOSTS.TXT [LAMBDA (AFTEREXIT FILE) (* ; "Edited 20-Jan-89 11:56 by bvm") (* ;; "Read the hosts.txt file if it has changed") (if AFTEREXIT then (* ;  "Have to wait until all devices are happy") (until \PROC.READY do (AWAIT.EVENT \PROCESS.AFTEREXIT.EVENT 10000))) (LET (FULLNAME) (COND ((NULL FILE)) (TCP.ALWAYS.READ.HOSTS.FILE (* ;  "the user wants us to always read it fresh.") (\HTE.READ.FILE FILE)) ((NULL (SETQ FULLNAME (INFILEP FILE))) (CL:FORMAT PROMPTWINDOW "~%%Couldn't find hosts file ~A" FILE)) ([AND \TCP.LAST.HOSTS.FILE.DATE (STRING-EQUAL FULLNAME \TCP.LAST.HOSTS.FILE.READ) (EQUAL \TCP.LAST.HOSTS.FILE.DATE (GETFILEINFO FILE 'ICREATIONDATE] (* ;  "the file names and the file write dates are the same, don't re-read the hosts file.") NIL) (T (* ;  "Haven't read this particular file before, so snarf it") (\HTE.READ.FILE FILE]) (\IP.READ.INIT.FILE [LAMBDA (FILE) (* ; "Edited 18-Mar-88 18:34 by bvm") (CL:MULTIPLE-VALUE-BIND (CONFIGURATION CONDITION) [IGNORE-ERRORS (LET ((*UPPER-CASE-FILE-NAMES* NIL) (*READTABLE* (FIND-READTABLE "INTERLISP"))) (CL:WITH-OPEN-FILE (S FILE) (READ S] (if CONDITION then (PRINTOUT T "Failed to read init file because: " CONDITION) NIL else (LET ((HOST (fetch (IPINIT LOCAL.NSHOSTNUMBER) of CONFIGURATION))) (if (NULL HOST) then (* ;  "Old file that doesn't have its processor identification in it") (create IPINIT using CONFIGURATION LOCAL.NSHOSTNUMBER _ \MY.NSHOSTNUMBER) elseif (EQUAL HOST \MY.NSHOSTNUMBER) then (* ; "Good, init file for same host") CONFIGURATION else (PRINTOUT T FILE " gives configuration for host " ( \COERCE.TO.NSADDRESS HOST) " but this is machine " (\COERCE.TO.NSADDRESS \MY.NSHOSTNUMBER) T) NIL]) (\IP.PROMPT.FOR.FILE.NAME [LAMBDA (PROMPT DEFAULT) (* ; "Edited 18-Mar-88 18:14 by bvm") (* ;; "Prompts for a file name from user and returns its full name if it is infilep") (bind NAME do (if [NULL (SETQ NAME (PROG1 (PROMPTFORWORD PROMPT DEFAULT NIL NIL NIL NIL (CHARCODE (CR))) (TERPRI] then (RETURN NIL) elseif (SETQ NAME (INFILEP NAME)) then (RETURN NAME) else (PRINTOUT T "File not found" T]) ) (ADDTOVAR RESTARTETHERFNS \IPEVENTFN) (* ;; "Early IP reception functions") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (RPAQQ IPADDRESSTYPES ((\IP.CLASS.A 0) (\IP.CLASS.A.BYTESPEC (BYTE 1 31)) (\IP.CLASS.A.NET.BYTESPEC (BYTE 8 24)) (\IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (\IP.CLASS.B 2) (\IP.CLASS.B.BYTESPEC (BYTE 2 30)) (\IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (\IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (\IP.CLASS.C 6) (\IP.CLASS.C.BYTESPEC (BYTE 3 29)) (\IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (\IP.CLASS.C.HOST.BYTESPEC (BYTE 8 0)))) (DECLARE%: EVAL@COMPILE (RPAQQ \IP.CLASS.A 0) (RPAQ \IP.CLASS.A.BYTESPEC (BYTE 1 31)) (RPAQ \IP.CLASS.A.NET.BYTESPEC (BYTE 8 24)) (RPAQ \IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (RPAQQ \IP.CLASS.B 2) (RPAQ \IP.CLASS.B.BYTESPEC (BYTE 2 30)) (RPAQ \IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (RPAQ \IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (RPAQQ \IP.CLASS.C 6) (RPAQ \IP.CLASS.C.BYTESPEC (BYTE 3 29)) (RPAQ \IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (RPAQ \IP.CLASS.C.HOST.BYTESPEC (BYTE 8 0)) (CONSTANTS (\IP.CLASS.A 0) (\IP.CLASS.A.BYTESPEC (BYTE 1 31)) (\IP.CLASS.A.NET.BYTESPEC (BYTE 8 24)) (\IP.CLASS.A.HOST.BYTESPEC (BYTE 24 0)) (\IP.CLASS.B 2) (\IP.CLASS.B.BYTESPEC (BYTE 2 30)) (\IP.CLASS.B.NET.BYTESPEC (BYTE 16 16)) (\IP.CLASS.B.HOST.BYTESPEC (BYTE 16 0)) (\IP.CLASS.C 6) (\IP.CLASS.C.BYTESPEC (BYTE 3 29)) (\IP.CLASS.C.NET.BYTESPEC (BYTE 24 8)) (\IP.CLASS.C.HOST.BYTESPEC (BYTE 8 0))) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? \IP.LOCAL.ADDRESSES ) (RPAQ? \IP.SUBNET.MASKS ) (RPAQ? \IP.GATEWAY.FLG ) (RPAQ \IP.ADDRESS.BOX (\CREATECELL \FIXP)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.LOCAL.ADDRESSES \IP.SUBNET.MASKS \IP.GATEWAY.FLG \IP.ADDRESS.BOX) ) (DECLARE%: EVAL@COMPILE [PUTPROPS \IP.FIX.DEST.HOST MACRO (LAMBDA (IP NDB) (* ejs%: "26-Dec-84 15:07") (replace (IP IPDESTINATIONHOST) of IP with (ffetch (NDB NDBIPHOST#) of NDB] [PUTPROPS \IP.FIX.DEST.NET MACRO (LAMBDA (IP NDB) (* ejs%: "26-Dec-84 15:08") (* * Put the IP net# corresponding to the given NDB into the destination net  field of the dest address of the IP packet) (replace (IP IPDESTINATIONADDRESS) of IP with (LOGOR (fetch (IP IPDESTINATIONADDRESS) of IP) (LLSH (fetch (NDB NDBIPNET#) of NDB) (SELECTQ (\IPADDRESSCLASS (fetch (NDB NDBIPHOST#) of NDB)) (\IP.CLASS.A 24) (\IP.CLASS.B 16) (\IP.CLASS.C 8) (SHOULDNT] [PUTPROPS \IP.FIX.SOURCE.HOST MACRO (LAMBDA (IP NDB) (* ejs%: "26-Dec-84 15:07") (replace (IP IPSOURCEHOST) of IP with (ffetch (NDB NDBIPHOST#) of NDB] [PUTPROPS \IP.FIX.SOURCE.NET MACRO (LAMBDA (IP NDB) (* ejs%: "26-Dec-84 15:08") (* * Put the IP net# corresponding to the given NDB into the destination net  field of the dest address of the IP packet) (replace (IP IPSOURCENET) of IP with (ffetch (NDB NDBIPNET#) of NDB] ) (DEFINEQ (\HANDLE.RAW.IP [LAMBDA (IP TYPE) (* ejs%: " 3-Feb-86 11:01") (PROG ((NDB (ffetch (ETHERPACKET EPNETWORK) of IP))) (COND ((NOT (type? NDB NDB)) (ERROR "No NDB in ETHERPACKET!" IP))) (SELECTQ (ffetch (NDB NETTYPE) of NDB) (10 (COND ((NEQ TYPE \EPT.IP) (RETURN)))) (3 (COND ((NEQ TYPE \EET.IP) (RETURN)))) (ERROR "Unknown net type" (ffetch (NDB NETTYPE) of NDB))) [COND ((NOT \IP.READY) (\RELEASE.ETHERPACKET IP)) ([NOT (\IP.CHECKSUM.OK (\IPCHECKSUM IP (ffetch (IP IPBASE) of IP) (TIMES (ffetch (IP IPHEADERLENGTH) of IP) BYTESPERCELL] (AND IPTRACEFLG (PRINTPACKET IP 'GET IPTRACEFILE "[Packet dropped--bad IP header checksum]")) (\RELEASE.ETHERPACKET IP)) ((ZEROP (ffetch (IP IPTIMETOLIVE) of IP)) (\ICMP.TIME.EXCEEDED IP \ICMP.TRANSIT.TIME.EXCEEDED) (\RELEASE.ETHERPACKET IP)) ((\IP.PROCESS.OPTIONS IP) (COND ((NOT (\IP.LOCAL.DESTINATION IP)) (\FORWARD.IP IP)) [(\IP.FRAGMENTED.PACKET IP) (COND ((SETQ IP (\HANDLE.RAW.IP.FRAGMENT IP)) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (PRINTIP IP 'GETFRAGMENT IPTRACEFILE NIL T)) (T (PRIN1 "+" IPTRACEFILE] (\IP.HAND.TO.PROTOCOL IP] (T [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (PRINTIP IP 'GET IPTRACEFILE NIL T)) (T (PRIN1 "+" IPTRACEFILE] (\IP.HAND.TO.PROTOCOL IP] (RETURN T]) (\FORWARD.IP [LAMBDA (IP) (* ejs%: "10-Feb-86 11:32") (DECLARE (GLOBALVARS \IP.GATEWAY.FLG \IP.GATEWAY.FORWARDING.FUNCTIONS)) (COND [\IP.GATEWAY.FLG (LET* ((DESTADDRESS (ffetch (IP IPDESTINATIONADDRESS) of IP)) (NETADDRESS (\IPNETADDRESS DESTADDRESS)) (NDB (fetch (ETHERPACKET EPNETWORK) of IP)) (SOURCEADDRESS (fetch NDBIPHOST# of NDB)) (SUBNETMASK (CDR (SASSOC SOURCEADDRESS \IP.SUBNET.MASKS))) SUBNETINUSE ROUTE FORWARDING.FUNCTION) [COND [(AND NDB SUBNETMASK (OR (EQP (LOGAND SOURCEADDRESS SUBNETMASK) (LOGAND DESTADDRESS SUBNETMASK)) (PROGN (SETQ SUBNETINUSE T) NIL] ((NULL NDB) (COND ((SETQ ROUTE (CDR (SASSOC NETADDRESS \IP.ROUTING.TABLE))) (SETQ NDB (CDR (SASSOC (\IPNETADDRESS ROUTE) \IP.LOCAL.NETWORKS] (COND [NDB (replace EPREQUEUE of IP with 'FREE) (add (ffetch (IP IPTIMETOLIVE) of IP) -1) [SETQ NETADDRESS (COND (SUBNETINUSE (LOGAND DESTADDRESS SUBNETMASK )) (T (BITCLEAR DESTADDRESS (\IPHOSTADDRESS DESTADDRESS] (COND ((SETQ FORWARDING.FUNCTION (CDR (SASSOC NETADDRESS \IP.GATEWAY.FORWARDING.FUNCTIONS ))) (APPLY* FORWARDING.FUNCTION IP NDB NETADDRESS ROUTE)) (T (\RELEASE.ETHERPACKET IP] (T (\ICMP.REDIRECT IP \ICMP.REDIRECT.NET] (T (\RELEASE.ETHERPACKET IP]) (\IP.LOCAL.DESTINATION [LAMBDA (IP) (* ejs%: "25-Mar-86 16:03") (* * Return T if IP packet is destined for us) (UNINTERRUPTABLY (\BLT \IP.ADDRESS.BOX (LOCF (fetch (IP IPDESTINATIONADDRESS) of IP)) WORDSPERCELL) [LET [(LOCALNETADDRESS (fetch NDBIPNET# of (fetch EPNETWORK of IP] (COND ((MEMBER \IP.ADDRESS.BOX \IP.LOCAL.ADDRESSES) T) ((AND (\IP.BROADCAST.ADDRESS \IP.ADDRESS.BOX) (EQP LOCALNETADDRESS (\IPNETADDRESS \IP.ADDRESS.BOX))) T) ((NOT (\IP.LEGAL.ADDRESS \IP.ADDRESS.BOX)) (* Bogus destination address) NIL) ((EQP 0 (\IPNETADDRESS \IP.ADDRESS.BOX)) (* Source doesn't know its network?) (SELECTQ (INTEGERLENGTH LOCALNETADDRESS) (8 (\PUTBASEBYTE \IP.ADDRESS.BOX 0 LOCALNETADDRESS)) (16 (\PUTBASE \IP.ADDRESS.BOX 0 LOCALNETADDRESS)) (24 [for I from 0 to 2 do (\PUTBASEBYTE \IP.ADDRESS.BOX I (LOGAND 255 (LRSH LOCALNETADDRESS (ITIMES 8 (IDIFFERENCE 2 I]) NIL) (COND ((\IP.BROADCAST.ADDRESS \IP.ADDRESS.BOX) T) ((MEMBER \IP.ADDRESS.BOX \IP.LOCAL.ADDRESSES) T])]) (\IPCHECKSUM [LAMBDA (ETHERPACKET CHECKSUMBASE NBYTES IGNOREDWORD) (* ejs%: "31-Dec-84 13:53") (* * Compute a general checksum for a packet starting at CHECKSUMBASE and  extending NBYTES. If NBYTES is odd, a 0 byte is padded on the end.  The IGNOREDWORD field is the LOCF of the field which will contain the checksum,  and is to be considered 0 for the calculation.) (PROG ((MAXINDEX (SUB1 (FOLDHI NBYTES BYTESPERWORD))) (CHECKSUM 0) (ODDFLG (ODDP NBYTES)) DIFF WORDCONTENTS) (AND IGNOREDWORD (\PUTBASE IGNOREDWORD 0 0)) [for WORD from 0 to MAXINDEX do (SETQ CHECKSUM (COND [(AND ODDFLG (EQ WORD MAXINDEX)) (COND ([ILEQ CHECKSUM (SETQ DIFF (IDIFFERENCE MAX.SMALL.INTEGER (SETQ WORDCONTENTS (LOGAND (\GETBASE CHECKSUMBASE WORD) (MASK.1'S 8 8] (IPLUS CHECKSUM WORDCONTENTS)) (T (IDIFFERENCE CHECKSUM DIFF] (T (COND ([ILEQ CHECKSUM (SETQ DIFF (IDIFFERENCE MAX.SMALL.INTEGER (SETQ WORDCONTENTS (\GETBASE CHECKSUMBASE WORD] (IPLUS CHECKSUM WORDCONTENTS)) (T (IDIFFERENCE CHECKSUM DIFF] (RETURN CHECKSUM]) (\IP.CHECKSUM.OK [LAMBDA (CHECKSUM) (* ejs%: "28-Dec-84 19:40") (OR (EQ CHECKSUM (MASK.1'S 0 16)) (EQ CHECKSUM 0]) (\IP.SET.CHECKSUM [LAMBDA (PACKET CHECKSUMBASE NBYTES CHECKSUMWORD) (* ejs%: " 4-Jun-85 22:47") (PROG ((CHECKSUM (\IPCHECKSUM PACKET CHECKSUMBASE NBYTES CHECKSUMWORD))) (\PUTBASE CHECKSUMWORD 0 (COND ((EQ CHECKSUM (MASK.1'S 0 16)) CHECKSUM) (T (LOGAND (LOGNOT CHECKSUM) (MASK.1'S 0 16]) ) (* ;; "Protocol Distribution") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (RPAQQ IPPROTOCOLTYPES ((\ICMP.PROTOCOL 1) (\TCP.PROTOCOL 6) (\UDP.PROTOCOL 17))) (DECLARE%: EVAL@COMPILE (RPAQQ \ICMP.PROTOCOL 1) (RPAQQ \TCP.PROTOCOL 6) (RPAQQ \UDP.PROTOCOL 17) (CONSTANTS (\ICMP.PROTOCOL 1) (\TCP.PROTOCOL 6) (\UDP.PROTOCOL 17)) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? \IP.PROTOCOLS ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.PROTOCOLS) ) (DEFINEQ (\IP.HAND.TO.PROTOCOL [LAMBDA (IP) (* ejs%: "31-Mar-86 15:39") (PROG ((PROTOCOL (ffetch (IP IPPROTOCOL) of IP)) PROTOCOLCHAIN IPSOCKET) (COND ((NOT (SETQ PROTOCOLCHAIN (\IP.FIND.PROTOCOL PROTOCOL \IP.PROTOCOLS))) (OR (\IP.BROADCAST.ADDRESS (fetch (IP IPDESTINATIONADDRESS) of IP)) (\ICMP.DEST.UNREACHABLE IP \ICMP.PROTOCOL.UNREACHABLE))) ((NOT (SETQ IPSOCKET (\IP.FIND.PROTOCOL.SOCKET IP PROTOCOLCHAIN))) (APPLY* (ffetch (IPSOCKET IPSNOSOCKETFN) of PROTOCOLCHAIN) IP)) (T (APPLY* (ffetch (IPSOCKET IPSINPUTFN) of (COND ((type? IPSOCKET IPSOCKET) IPSOCKET) (T PROTOCOLCHAIN))) IP IPSOCKET]) (\IP.DEFAULT.INPUTFN [LAMBDA (IP IPSOCKET) (* ejs%: " 3-Feb-85 19:19") (COND ((EQ (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) (fetch (IPSOCKET IPSQUEUEALLOC) of IPSOCKET)) (\RELEASE.ETHERPACKET IP)) (T (UNINTERRUPTABLY (\ENQUEUE (fetch (IPSOCKET IPSQUEUE) of IPSOCKET) IP) (add (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) 1) (NOTIFY.EVENT (fetch (IPSOCKET IPSEVENT) of IPSOCKET)))]) (\IP.DEFAULT.NOSOCKETFN [LAMBDA (IP) (* ejs%: " 2-Feb-86 11:38") (COND ([OR (NEQ 0 (fetch (IP IPDESTINATIONHOST) of IP)) (NOT (\IP.BROADCAST.ADDRESS (fetch (IP IPDESTINATIONADDRESS) of IP] (\ICMP.DEST.UNREACHABLE IP \ICMP.PORT.UNREACHABLE)) (T (\RELEASE.ETHERPACKET IP]) (\IP.ADD.PROTOCOL [LAMBDA (PROTOCOL SOCKETCOMPAREFN NOSOCKETFN INPUTFN ICMPFN) (* ; "Edited 25-Aug-88 12:10 by bvm") (* ;;; "Find an existing protocol, or create a new one, and return the socket chain head. If the protocol already exists, the remaining arguments redefine the current slots.") (LET* [(FOUND (find SOCKET in \IP.PROTOCOLS suchthat (EQ (fetch (IPSOCKET PROTOCOL) of SOCKET) PROTOCOL))) (SOCKET (OR FOUND (create IPSOCKET PROTOCOL _ PROTOCOL IPSQUEUE _ NIL IPSQUEUEALLOC _ 0 IPSEVENT _ NIL] (replace (IPSOCKET IPSDESTSOCKETCOMPAREFN) of SOCKET with SOCKETCOMPAREFN) (replace (IPSOCKET IPSINPUTFN) of SOCKET with (OR INPUTFN (FUNCTION \IP.DEFAULT.INPUTFN ))) (replace (IPSOCKET IPSNOSOCKETFN) of SOCKET with (OR NOSOCKETFN (FUNCTION \IP.DEFAULT.NOSOCKETFN))) (replace (IPSOCKET IPSICMPFN) of SOCKET with (OR ICMPFN (FUNCTION \RELEASE.ETHERPACKET)) ) (if (NOT FOUND) then (* ;  "Now that it's all filled in, add it to the protocol set") (push \IP.PROTOCOLS SOCKET)) SOCKET]) (\IP.DELETE.PROTOCOL [LAMBDA (PROTOCOL) (* ejs%: "10-Apr-85 16:24") (LET ((PROTOCOLCHAIN (\IP.FIND.PROTOCOL PROTOCOL))) (COND (PROTOCOLCHAIN (until (NULL (fetch (IPSOCKET IPSLINK) of PROTOCOLCHAIN)) do (\IP.CLOSE.SOCKET (fetch (IPSOCKET IPSOCKET) of (fetch (IPSOCKET IPSLINK) of PROTOCOLCHAIN)) PROTOCOL)) (SETQ \IP.PROTOCOLS (DREMOVE PROTOCOLCHAIN \IP.PROTOCOLS)) T]) (\IP.FIND.PROTOCOL [LAMBDA (PROTOCOL) (* ejs%: "27-Dec-84 11:18") (* * Find the protocol chain for this protocol#) (CAR (SOME \IP.PROTOCOLS (FUNCTION (LAMBDA (IPSOCKET) (EQ (ffetch (IPSOCKET PROTOCOL) of IPSOCKET) PROTOCOL]) (\IP.FIND.PROTOCOL.SOCKET [LAMBDA (IP PROTOCOLCHAIN) (* ; "Edited 26-Aug-88 12:44 by bvm") (* ;; "Find the socket specified by IP packet. PROTOCOLCHAIN is the head of the socket chain for this protocol; if NIL we look it up.") (LET ([SOCKET (OR PROTOCOLCHAIN (\IP.FIND.PROTOCOL (ffetch (IP IPPROTOCOL) of IP] RESULT) (* ;; "Note that we start the comparisons with the dummy head, even though we expect that to fail. This is so that a socketless protocol, such as ICMP can use this dummy head as the sole handler of the protocol.") (AND SOCKET (when (SETQ RESULT (CL:FUNCALL (ffetch (IPSOCKET IPSDESTSOCKETCOMPAREFN) of SOCKET) IP SOCKET)) do (RETURN (COND ((EQ RESULT T) SOCKET) (T (* ; "This is a little strange. Non-T comparison result will be passed as the second arg to the chain head's inputfn when a packet arrives here.") RESULT))) repeatwhile (SETQ SOCKET (ffetch (IPSOCKET IPSLINK ) of SOCKET]) (\IP.FIND.SOCKET [LAMBDA (SOCKET# SOCKETCHAIN) (* ejs%: "27-Dec-84 11:39") (* * Called to find the socket open on the socketchain, or NIL if no such open  socket. Socketchain comes from \IP.FIND.PROTOCOL) (while SOCKETCHAIN until (COND ((EQUAL SOCKET# (ffetch (IPSOCKET IPSOCKET) of SOCKETCHAIN )) SOCKETCHAIN) (T (SETQ SOCKETCHAIN (ffetch (IPSOCKET IPSLINK) of SOCKETCHAIN)) NIL)) finally (RETURN SOCKETCHAIN]) (\IP.OPEN.SOCKET [LAMBDA (PROTOCOL SOCKET NOERRORFLG DESTSOCKETCOMPAREFN NOSOCKETFN INPUTFN ICMPFN) (* ; "Edited 25-Aug-88 12:43 by bvm") (* ;;; "Open a new socket for a protocol. The last 4 fns default to those specified when the protocol was enabled.") (* ;; "Keeping NOSOCKETFN for back compatibility, but it doesn't really make any sense --bvm.") (LET ((MASTERSOC (\IP.FIND.PROTOCOL PROTOCOL)) OLDSOC NEWSOC) (COND [(NOT (type? IPSOCKET MASTERSOC)) (COND ((NOT NOERRORFLG) (ERROR "Attempt to open socket in unknown protocol" PROTOCOL SOCKET] [(if SOCKET then (SETQ OLDSOC (\IP.FIND.SOCKET SOCKET MASTERSOC)) else (* ;  "Pick a random socket that is smallp but not very small, so as to avoid well-known sockets") (SETQ SOCKET (LOGOR (LOGAND (DAYTIME) 65535) 32768)) (while (\IP.FIND.SOCKET SOCKET MASTERSOC) do (SETQ SOCKET (- SOCKET 1))) NIL) (COND (NOERRORFLG OLDSOC) (T (ERROR "Attempt to open an existing socket" OLDSOC] (T [SETQ NEWSOC (create IPSOCKET IPSLINK _ (ffetch (IPSOCKET IPSLINK) of MASTERSOC) IPSOCKET _ SOCKET PROTOCOL _ PROTOCOL IPSDESTSOCKETCOMPAREFN _ (OR DESTSOCKETCOMPAREFN (ffetch (IPSOCKET IPSDESTSOCKETCOMPAREFN ) of MASTERSOC )) IPSNOSOCKETFN _ (OR NOSOCKETFN (ffetch (IPSOCKET IPSNOSOCKETFN ) of MASTERSOC )) IPSINPUTFN _ (OR INPUTFN (ffetch (IPSOCKET IPSINPUTFN) of MASTERSOC)) IPSICMPFN _ (OR ICMPFN (ffetch (IPSOCKET IPSICMPFN) of MASTERSOC] (freplace (IPSOCKET IPSLINK) of MASTERSOC with NEWSOC) NEWSOC]) (\IP.CLOSE.SOCKET [LAMBDA (SOCKET PROTOCOL NOERRORFLG) (* ; "Edited 26-Aug-88 12:33 by bvm") (* ;;; "Close the given socket. Call this only after the higher level protocol has finished doing its closing operations.") (* ;; "For some silly reason, this fn was defined to take not an IPSOCKET object but rather the socket number, or whatever was in the socket slot. For backward compatibility, let's do both (sigh).") (LET ((PREV (\IP.FIND.PROTOCOL PROTOCOL)) NEXT) (COND [(AND PREV (while (SETQ NEXT (ffetch (IPSOCKET IPSLINK) of PREV)) do (if (OR (EQ SOCKET NEXT) (EQ SOCKET (ffetch (IPSOCKET IPSOCKET) of NEXT)) ) then (* ; "Found it, so splice it out") (freplace (IPSOCKET IPSLINK) of PREV with (ffetch (IPSOCKET IPSLINK) of NEXT)) (freplace (IPSOCKET IPSLINK) of NEXT with NIL) (RETURN T)) (SETQ PREV NEXT] ((NOT NOERRORFLG) (ERROR "Socket not found" SOCKET]) ) (* ;; "Fragmentation Handling") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (RECORD AssemblyRecord (Packet FirstHole Fragments Timeout) Packet _ (\ALLOCATE.ETHERPACKET) FirstHole _ 0) (RECORD FragmentRecord (Start Length LastFragment)) (RECORD FragmentID (AssemblyRecord SourceAddress ID Protocol . DestinationAddress)) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? \IP.FRAGMENT.LIST ) (RPAQ? \IP.FRAGMENT.LOCK (CREATE.MONITORLOCK "IP Fragment Processing Lock")) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.FRAGMENT.LIST \IP.FRAGMENT.LOCK) ) (DECLARE%: EVAL@COMPILE (RPAQQ \IP.FRAGMENTATION.UNIT 8) (CONSTANTS (\IP.FRAGMENTATION.UNIT 8)) ) (DEFINEQ (\HANDLE.RAW.IP.FRAGMENT [LAMBDA (IP) (* ejs%: " 1-Feb-86 14:24") (* * Add the next fragment to a packet under assembly.  If this fragment completes a packet, return the completed packet to be  processed by higher-level protocol routines.) (WITH.MONITOR \IP.FRAGMENT.LOCK (LET ((AssemblyRecord (\IP.FIND.MATCHING.FRAGMENTS IP))) (COND (AssemblyRecord (\IP.ADD.FRAGMENT AssemblyRecord IP)) (T (\IP.NEW.FRAGMENT.LST IP) NIL))))]) (\IP.NEW.FRAGMENT.LST [LAMBDA (IP) (* ejs%: " 3-Feb-86 10:57") (* * Add a new fragment to the fragment list) (PROG ((Source (ffetch (IP IPSOURCEADDRESS) of IP)) (Dest (ffetch (IP IPDESTINATIONADDRESS) of IP)) (Protocol (ffetch (IP IPPROTOCOL) of IP)) (ID (ffetch (IP IPID) of IP)) NewFragmentID FragmentRecord AssemblyPacket AssemblyRecord) [SETQ NewFragmentID (create FragmentID SourceAddress _ Source ID _ ID Protocol _ Protocol DestinationAddress _ Dest AssemblyRecord _ (SETQ AssemblyRecord (create AssemblyRecord Timeout _ (SETUPTIMER (ITIMES 1000 (ffetch (IP IPTIMETOLIVE) of IP))) Fragments _ (LIST (SETQ FragmentRecord (create FragmentRecord Start _ (UNFOLD (ffetch (IP IPFRAGMENTOFFSET ) of IP) \IP.FRAGMENTATION.UNIT) Length _ (IDIFFERENCE (ffetch (IP IPTOTALLENGTH) of IP) (UNFOLD (ffetch (IP IPHEADERLENGTH ) of IP) BYTESPERCELL] (COND ((EQ IPTRACEFLG T) (\IP.PRINT.FRAGMENT NewFragmentID IP IPTRACEFILE))) (SETQ AssemblyPacket (fetch (AssemblyRecord Packet) of AssemblyRecord)) (\IP.COPY.FRAGMENT.HEADER.TO.PACKET.HEADER AssemblyPacket IP) (* * Copy the packet data to the packet) (\BLT (\ADDBASE (\IPDATABASE AssemblyPacket) (FOLDLO (fetch (FragmentRecord Start) of FragmentRecord) BYTESPERWORD)) (\IPDATABASE IP) (FOLDLO (fetch (FragmentRecord Length) of FragmentRecord) BYTESPERWORD)) (\RELEASE.ETHERPACKET IP) (push \IP.FRAGMENT.LIST NewFragmentID]) (\IP.COPY.FRAGMENT.HEADER.TO.PACKET.HEADER [LAMBDA (Packet Fragment) (* ejs%: " 1-Feb-86 14:14") (* * Copy information from the header of the fragment packet into the header of  the reassembled packet) (\MOVEBYTES (fetch (IP IPBASE) of Fragment) 0 (fetch (IP IPBASE) of Packet) 0 (UNFOLD (fetch (IP IPHEADERLENGTH) of Fragment) BYTESPERCELL]) (\IP.ADD.FRAGMENT [LAMBDA (FragmentID NewIP) (* ejs%: " 1-Feb-86 18:41") (* * Called to add a fragment to a fragment list.  The fragment is added in order. If the fragment completes a fragmented IP  packet, a new packet is assembled and returned, else NIL is returned) (LET* ((AssemblyRecord (fetch (FragmentID AssemblyRecord) of FragmentID)) [NewFrag (create FragmentRecord Start _ (UNFOLD (ffetch (IP IPFRAGMENTOFFSET) of NewIP) \IP.FRAGMENTATION.UNIT) Length _ (IDIFFERENCE (ffetch (IP IPTOTALLENGTH) of NewIP) (UNFOLD (ffetch (IP IPHEADERLENGTH) of NewIP) BYTESPERCELL)) LastFragment _ (NOT (fetch (IP IPMOREFRAGMENTS) of NewIP] (Fragments (fetch (AssemblyRecord Fragments) of AssemblyRecord)) Status NextHole AssemblyPacket) (COND ((EQ IPTRACEFLG T) (\IP.PRINT.FRAGMENT FragmentID NewIP IPTRACEFILE))) (SETQ AssemblyPacket (fetch (AssemblyRecord Packet) of AssemblyRecord)) (replace (AssemblyRecord Timeout) of AssemblyRecord with (SETUPTIMER (ITIMES 1000 (ffetch (IP IPTIMETOLIVE) of NewIP)) (fetch (AssemblyRecord Timeout) of AssemblyRecord))) [SETQ Status (COND ((ILESSP (fetch (FragmentRecord Start) of NewFrag) (fetch (FragmentRecord Start) of (CAR Fragments))) (* Earlier than the earliest  existing fragment) (SETQ Fragments (push (fetch (AssemblyRecord Fragments) of AssemblyRecord ) NewFrag)) 'INSERTED.FRAGMENT) ((EQ (fetch (FragmentRecord Start) of NewFrag) (fetch (FragmentRecord Start) of (CAR Fragments))) (* Duplicate of earliest fragment) 'DUPLICATE) (T (* Have to search) (for OldFragTail on Fragments while (CDR OldFragTail) thereis (COND ((EQ (fetch (FragmentRecord Start) of NewFrag) (fetch (FragmentRecord Start) of (CADR OldFragTail ))) (* Duplicate) (SETQ Status 'DUPLICATE) T) ((ILESSP (fetch (FragmentRecord Start) of NewFrag) (fetch (FragmentRecord Start) of (CADR OldFragTail))) (* Found the hole to insert) T)) finally (COND (Status (* Duplicate) (RETURN Status)) ((CDR OldFragTail) (* Inserted in middle of list) (RPLACD OldFragTail (CONS NewFrag (CDR OldFragTail) )) (RETURN 'INSERTED.FRAGMENT)) (T (* Inserted at end of list) (NCONC1 OldFragTail NewFrag) (RETURN 'INSERTED.FRAGMENT] (PROG1 (SELECTQ Status (DUPLICATE NIL) (INSERTED.FRAGMENT (* Copy bytes into assembly) (\MOVEBYTES (\IPDATABASE NewIP) 0 (\IPDATABASE AssemblyPacket) (fetch (FragmentRecord Start) of NewFrag) (fetch (FragmentRecord Length) of NewFrag)) (add (ffetch (IP IPTOTALLENGTH) of AssemblyPacket) (fetch (FragmentRecord Length) of NewFrag)) (* Update Assembly record) [COND ((ILESSP (fetch (FragmentRecord Start) of NewFrag) (fetch (AssemblyRecord FirstHole) of AssemblyRecord)) (ERROR "Error in IP fragment reassembly!" NewFrag)) (T (COND ((EQ [bind End Status for FragTail on Fragments while (CDR FragTail) thereis [COND ((NEQ [SETQ End (IPLUS (fetch ( FragmentRecord Start) of (CAR FragTail)) (fetch ( FragmentRecord Length) of (CAR FragTail] (fetch (FragmentRecord Start) of (CADR FragTail))) (replace (AssemblyRecord FirstHole) of AssemblyRecord with End) (SETQ Status 'FOUND.HOLE] finally (RETURN (COND [(NULL Status) (COND ((fetch (FragmentRecord LastFragment) of (CAR FragTail)) (COND ((EQ IPTRACEFLG T) (printout IPTRACEFILE T "Complete IP Fragment received" T))) 'COMPLETE.PACKET) (T (replace (AssemblyRecord FirstHole) of AssemblyRecord with End) 'INCOMPLETE.BUT.NO.HOLES] (T Status] 'COMPLETE.PACKET) (\IP.DELETE.FRAGMENT FragmentID) AssemblyPacket]) NIL) (\RELEASE.ETHERPACKET NewIP]) (\IP.FIND.MATCHING.FRAGMENTS [LAMBDA (IP) (* ejs%: " 1-Feb-86 14:41") (* * Find the list of fragments matching this IP packet, or NIL if none exists) (DECLARE (GLOBALVARS \IP.FRAGMENT.LIST)) (LET* ((Source (ffetch (IP IPSOURCEADDRESS) of IP)) (Dest (ffetch (IP IPDESTINATIONADDRESS) of IP)) (Protocol (ffetch (IP IPPROTOCOL) of IP)) (ID (ffetch (IP IPID) of IP)) (FragmentEntry)) (for FragmentID in \IP.FRAGMENT.LIST thereis (AND (EQP (fetch (FragmentID SourceAddress ) of FragmentID) Source) (EQ (fetch (FragmentID ID) of FragmentID) ID) (EQ (fetch (FragmentID Protocol) of FragmentID) Protocol) (EQP (fetch (FragmentID DestinationAddress ) of FragmentID) Dest]) (\IP.FRAGMENTED.PACKET [LAMBDA (IP) (* ejs%: " 1-Feb-86 16:50") (* * Return T if IP packet is a fragment) (OR (ffetch (IP IPMOREFRAGMENTS) of IP) (NEQ 0 (ffetch (IP IPFRAGMENTOFFSET) of IP]) (\IP.CHECK.REASSEMBLY.TIMEOUTS [LAMBDA NIL (* ejs%: " 3-Feb-86 11:00") (* * Kill any fragments in the process of reassembly if their timeout has  expired. Report timeout via ICMP) (WITH.MONITOR \IP.FRAGMENT.LOCK (bind AssemblyRecord for Fragment in \IP.FRAGMENT.LIST when [TIMEREXPIRED? (fetch (AssemblyRecord Timeout) of (SETQ AssemblyRecord (fetch (FragmentID AssemblyRecord ) of Fragment] do (COND ((EQ IPTRACEFLG T) (printout IPTRACEFILE T "IP Fragment timeout expired" T))) (\ICMP.TIME.EXCEEDED (fetch (AssemblyRecord Packet) of AssemblyRecord) \ICMP.FRAGMENT.TIME.EXCEEDED) (\IP.DELETE.FRAGMENT Fragment T)))]) (\IP.DELETE.FRAGMENT [LAMBDA (FragmentID FreePacketToo) (* ejs%: " 3-Feb-86 10:59") (* * Delete FragmentID from the list of Fragment ID's) (PROG [(IP (fetch (AssemblyRecord Packet) of (fetch (FragmentID AssemblyRecord) of FragmentID] (SETQ \IP.FRAGMENT.LIST (DREMOVE FragmentID \IP.FRAGMENT.LIST)) (AND FreePacketToo (\RELEASE.ETHERPACKET IP]) (\IP.PRINT.FRAGMENT [LAMBDA (FragmentID IPFragment File) (* ejs%: " 2-Feb-86 10:39") (* * Print information about this fragement to File) (printout File T "Received IP Fragment:" T "Source " (\IP.ADDRESS.TO.STRING (fetch (FragmentID SourceAddress) of FragmentID)) " Dest " (\IP.ADDRESS.TO.STRING (fetch (FragmentID DestinationAddress) of FragmentID)) T "Protocol ") (PRINTCONSTANT (fetch (FragmentID Protocol) of FragmentID) IPPROTOCOLTYPES File) (printout File " ID " (fetch (FragmentID ID) of FragmentID) T "Covering [" (UNFOLD (ffetch (IP IPFRAGMENTOFFSET) of IPFragment) \IP.FRAGMENTATION.UNIT) ".." (IPLUS (UNFOLD (ffetch (IP IPFRAGMENTOFFSET) of IPFragment) \IP.FRAGMENTATION.UNIT) (IDIFFERENCE (ffetch (IP IPTOTALLENGTH) of IPFragment) (UNFOLD (ffetch (IP IPHEADERLENGTH) of IPFragment) BYTESPERCELL))) "]" T) (bind C for I from 0 to [SUB1 (IMIN 40 (IDIFFERENCE (ffetch (IP IPTOTALLENGTH ) of IPFragment) (UNFOLD (ffetch (IP IPHEADERLENGTH ) of IPFragment) BYTESPERCELL] do (SETQ C (\GETBASEBYTE (\IPDATABASE IPFragment) I)) (COND ((AND (IGEQ C (CHARCODE SPACE)) (ILEQ C 126)) (BOUT File C)) (T (printout File "[" C "]"]) ) (* ;; "Option Processing") (DECLARE%: DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (RPAQQ IPOPTIONTYPES ((IPOPT.END 0) (IPOPT.NOP 1) (IPOPT.SECURITY 2) (IPOPT.LSRR 3) (IPOPT.TIMESTAMP 4) (IPOPT.RECRT 7) (IPOPT.STREAMID 8) (IPOPT.SSSR 9))) (DECLARE%: EVAL@COMPILE (RPAQQ IPOPT.END 0) (RPAQQ IPOPT.NOP 1) (RPAQQ IPOPT.SECURITY 2) (RPAQQ IPOPT.LSRR 3) (RPAQQ IPOPT.TIMESTAMP 4) (RPAQQ IPOPT.RECRT 7) (RPAQQ IPOPT.STREAMID 8) (RPAQQ IPOPT.SSSR 9) (CONSTANTS (IPOPT.END 0) (IPOPT.NOP 1) (IPOPT.SECURITY 2) (IPOPT.LSRR 3) (IPOPT.TIMESTAMP 4) (IPOPT.RECRT 7) (IPOPT.STREAMID 8) (IPOPT.SSSR 9)) ) (DECLARE%: EVAL@COMPILE (RPAQ IP.OPTION.NUMBER.BYTESPEC (BYTE 5 0)) (CONSTANTS (IP.OPTION.NUMBER.BYTESPEC (BYTE 5 0))) ) (* "END EXPORTED DEFINITIONS") ) (DEFINEQ (\IP.PROCESS.OPTIONS [LAMBDA (IP) (* ; "Edited 20-Jan-89 12:24 by bvm") (* ;;; "Process option fields in IP header. Return T if OK, else handle internally needed actions like redirection or reporting of parameter problems") (bind (OPTIONSSTART _ (LOCF (ffetch (IP IPOPTIONSSTART) of IP))) (INDEX _ 0) (RESULT _ T) REROUTING OPTION until (OR (>= INDEX (- (UNFOLD (fetch (IP IPHEADERLENGTH) of IP) BYTESPERCELL) \IPOVLEN)) (EQ (SETQ OPTION (LDB (BYTE 5 0) (\GETBASEBYTE OPTIONSSTART INDEX))) IPOPT.END)) do (if (EQ OPTION IPOPT.NOP) then (* ;  "This is the only one-byte option we know of other than IPOPT.END") (add INDEX 1) else (SELECTC OPTION ((LIST IPOPT.LSRR IPOPT.SSSR) (COND (REROUTING (SETQ RESULT INDEX)) ((NEQ (SETQ RESULT (\IP.OPTION.STRICT.SOURCE.ROUTE IP INDEX) ) 'REROUTE) (SETQ REROUTING T)))) (IPOPT.RECRT (SETQ RESULT (\IP.OPTION.RECORD.ROUTE IP INDEX))) (IPOPT.TIMESTAMP (\IP.OPTION.TIMESTAMP IP INDEX)) (IPOPT.SECURITY) (IPOPT.STREAMID) (PROGN (* ;  "Unknown option code-- we can't continue, since it could be some unknown 1-byte option") (RETURN NIL))) (COND ((NUMBERP RESULT) (* ;;  "If the result is a number then there was a parameter problem. We could process them here.") (RETURN NIL))) (add INDEX (\GETBASEBYTE OPTIONSSTART (ADD1 INDEX))) (* ; "Increment by the length field") ) finally (RETURN RESULT]) (\IP.OPTION.RECORD.ROUTE [LAMBDA (IP INDEX) (* ; "Edited 2-Aug-88 14:57 by atm") (LET* [(OPTIONSSTART (LOCF (ffetch (IP IPOPTIONSSTART) of IP))) (LENGTH (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 1))) (PTR (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 2] (* ;; "From RFC 791: If the route data area is already full just forward. If there is room , but not enough for a full address to be inserted, signal an ICMP error. Otherwise insert the address into the datagram and update PTR.") (COND ((IGREATERP PTR LENGTH) NIL) ((ILESSP (IDIFFERENCE LENGTH PTR) 3) INDEX) (T (\PUTBASEFIXP OPTIONSSTART (IPLUS INDEX PTR) (CAR \IP.LOCAL.ADDRESSES)) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 2) (LDB (BYTE 8 0) (IPLUS PTR 4))) T]) (\IP.OPTION.STRICT.SOURCE.ROUTE [LAMBDA (IP INDEX) (* ; "Edited 8-Aug-88 12:05 by atm") (LET* ((OPTIONSSTART (LOCF (ffetch (IP IPOPTIONSSTART) of IP))) (LENGTH (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 1))) (PTR (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 2))) (DESTINATIONADDRESSLOC (LOCF (ffetch (IP IPDESTINATIONADDRESS) of IP))) (DESTINATIONADDRESS (\GETBASEFIXP DESTINATIONADDRESSLOC 0))) (* ;; "From RFC 791: If the address in the destination field has been reached and PTR is not greater than LENGTH, the next address in the source route replaces the address in the destination address field, and the recorded route address replaces the source address just used, and PTR is increased by four.") (COND ((IGREATERP PTR LENGTH) NIL) ((ILESSP (IDIFFERENCE LENGTH PTR) 3) INDEX) (T (COND ((MEMBER DESTINATIONADDRESS \IP.LOCAL.ADDRESSES) (\PUTBASEFIXP OPTIONSSTART (IPLUS PTR INDEX 4) DESTINATIONADDRESS) (\PUTBASEFIXP DESTINATIONADDRESSLOC 0 (\GETBASEFIXP OPTIONSSTART (IPLUS PTR INDEX ))) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 2) (LDB (BYTE 8 0) (IPLUS PTR 4))) 'REROUTE) (T]) (\IP.OPTION.TIMESTAMP [LAMBDA (IP INDEX) (* ; "Edited 8-Aug-88 12:08 by atm") (LET* ((OPTIONSSTART (LOCF (ffetch (IP IPOPTIONSSTART) of IP))) (LENGTH (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 1))) (PTR (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 2))) (OFLW/FLG (\GETBASEBYTE OPTIONSSTART (IPLUS INDEX 3))) FLAG) (* ;; "From RFC 791: If the timestamp area is already full then increment the overflow flag and forward the datagram without inserting the timestamp. If there is room but not enough for a full timestamp to be inserted then signal an ICMP error. Otherwise insert the timestamp or the timestamp and the internet address depending on the flag; 0 indicates timestamp only, 1 indicates timestamp and address, 3 indicates that the address is prespecified.") (COND ((IGREATERP PTR LENGTH) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 3) (IPLUS OFLW/FLG (LSH 1 4))) T) (T (SELECTQ (LOGAND 15 OFLW/FLG) (0 (COND ((ILESSP (IDIFFERENCE LENGTH PTR) 3) INDEX) (T (\PUTBASEFIXP OPTIONSSTART (IPLUS INDEX PTR) (\CLOCK0 (\CREATECELL \FIXP))) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 2) (LDB (BYTE 8 0) (IPLUS PTR 4))) T))) (1 (COND ((IGREATERP 8 (IDIFFERENCE LENGTH (SUB1 PTR))) INDEX) (T (\PUTBASEFIXP OPTIONSSTART (IPLUS INDEX PTR) (CAR \IP.LOCAL.ADDRESSES)) (\PUTBASEFIXP OPTIONSSTART (IPLUS INDEX PTR 4) (\CLOCK0 (\CREATECELL \FIXP))) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 2) (LDB (BYTE 8 0) (IPLUS PTR 8))) T))) (3 [COND ((IGREATERP 8 (IDIFFERENCE LENGTH (SUB1 PTR))) INDEX) (T (COND ((MEMBER (\GETBASEFIXP OPTIONSSTART (IPLUS INDEX PTR)) \IP.LOCAL.ADDRESSES) (\PUTBASEFIXP OPTIONSSTART (IPLUS INDEX PTR 4) (\CLOCK0 (\CREATECELL \FIXP))) (\PUTBASEBYTE OPTIONSSTART (IPLUS INDEX 2) (LDB (BYTE 8 0) (IPLUS PTR 8))) T) (T NIL]) INDEX]) ) (* ;; "Packet Transmission and routing") (RPAQ? \IP.ROUTING.TABLE (CONS)) (RPAQ? \IP.DEFAULT.GATEWAY ) (RPAQ? \IP.LOCAL.NETWORKS ) (RPAQ? \IP.GATEWAY.FORWARDING.FUNCTIONS ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.ROUTING.TABLE \IP.DEFAULT.GATEWAY \IP.LOCAL.NETWORKS \IP.GATEWAY.FORWARDING.FUNCTIONS ) ) (DEFINEQ (\IP.SETUPIP [LAMBDA (IP DESTHOST ID SOCKET REQUEUE) (* ejs%: "31-Mar-86 15:01") (* * Initialize IP header of packet.) (OR IP (SETQ IP (\ALLOCATE.ETHERPACKET))) (replace (IP IPVERSION) of IP with \IP.PROTOCOLVERSION) (freplace (IP IPHEADERLENGTH) of IP with (FOLDHI \IPOVLEN BYTESPERCELL)) (freplace (IP IPTOTALLENGTH) of IP with \IPOVLEN) [freplace (IP IPID) of IP with (OR (SMALLP ID) (LOGAND (DAYTIME) (MASK.1'S 0 16] (freplace (IP IPMOREFRAGMENTS) of IP with NIL) (freplace (IP IPFRAGMENTOFFSET) of IP with 0) (freplace (IP IPTIMETOLIVE) of IP with \IP.DEFAULT.TIME.TO.LIVE) (freplace (IP IPPROTOCOL) of IP with (fetch (IPSOCKET PROTOCOL) of SOCKET)) (freplace (IP IPSOURCEADDRESS) of IP with (CAR \IP.LOCAL.ADDRESSES)) (freplace (IP IPDESTINATIONADDRESS) of IP with DESTHOST) (freplace EPREQUEUE of IP with REQUEUE) IP]) (\IP.TRANSMIT [LAMBDA (IP ROUTINGREADONLY) (* ejs%: "27-Jan-86 15:59") (* * Sends an IP packet, after first computing the IP header checksum) (PROG (NDB) (SETQ IP (\DTEST IP 'ETHERPACKET)) (until \IP.READY do (AWAIT.EVENT \IP.READY.EVENT)) (\RCLK (LOCF (ffetch EPTIMESTAMP of IP))) (replace EPTYPE of IP with \EPT.IP) (RETURN (COND ((ffetch EPTRANSMITTING of IP) (AND IPTRACEFLG (printout IPTRACEFILE "[Put fails--packet already being transmitted]")) 'AlreadyQueued) ((NOT (SETQ NDB (\IP.ROUTE.PACKET IP ROUTINGREADONLY))) (AND IPTRACEFLG (PRINTPACKET IP 'PUT IPTRACEFILE "[Put fails--no routing]")) (\REQUEUE.ETHERPACKET IP) 'NoRouting) (T (\IP.SET.CHECKSUM IP (ffetch (IP IPBASE) of IP) (LLSH (ffetch (IP IPHEADERLENGTH) of IP) 2) (LOCF (ffetch (IP IPHEADERCHECKSUM) of IP))) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (PRINTPACKET IP 'PUT IPTRACEFILE)) (T (PRIN1 "!" IPTRACEFILE] (TRANSMIT.ETHERPACKET NDB IP) NIL]) (\IP.ROUTE.PACKET [LAMBDA (IP READONLY) (* ; "Edited 19-Jan-89 18:00 by bvm") (* ;; "Encapsulates XIP, choosing the right network and immediate destination host. Returns an NDB for the transmission. Unless READONLY is true, defaults source and destination nets if needed") (DECLARE (GLOBALVARS \10MBLOCALNDB \3MBLOCALNDB \IP.LOCAL.NETWORKS \IP.DEFAULT.GATEWAY)) (PROG ((DESTADDRESS (fetch (IP IPDESTINATIONADDRESS) of IP)) DESTNET SUBNETMASK SOURCEHOSTADDRESS SUBNETINUSE PDH ROUTE NDB EPTYPE BROADCASTP) (SETQ DESTNET (\IPNETADDRESS DESTADDRESS)) (* ;; "Try to resolve a destination network of 0.0 If we have two attached networks, fail.") [COND ((AND (EQ 0 DESTADDRESS) \10MBLOCALNDB \3MBLOCALNDB) (RETURN)) ((EQ 0 DESTADDRESS) '[SETQ DESTADDRESS (\IP.MAKE.BROADCAST.ADDRESS (fetch NDBIPHOST# of (OR \10MBLOCALNDB \3MBLOCALNDB] (SETQ DESTADDRESS -1) (SETQ BROADCASTP T) '(SETQ DESTNET (\IPNETADDRESS DESTADDRESS)) (SETQ DESTNET (CAAR \IP.LOCAL.NETWORKS] (* ;; "First see if the destination network is one of our local networks") [COND [(AND (SETQ NDB (CDR (SASSOC DESTNET \IP.LOCAL.NETWORKS))) (SETQ SUBNETMASK (CDR (SASSOC (SETQ SOURCEHOSTADDRESS (fetch (NDB NDBIPHOST#) of NDB)) \IP.SUBNET.MASKS))) (OR (AND (\IP.BROADCAST.ADDRESS DESTADDRESS) (SETQ BROADCASTP T)) (EQP (LOGAND SOURCEHOSTADDRESS SUBNETMASK) (LOGAND DESTADDRESS SUBNETMASK)) (PROGN (SETQ SUBNETINUSE T) NIL))) (* ;; "A local net. Try to find the Ethernet address of the host") (COND [(SETQ PDH (SELECTQ (fetch (NDB NETTYPE) of NDB) (10 (SETQ EPTYPE \EPT.IP) (COND (BROADCASTP BROADCASTNSHOSTNUMBER) (T (\AR.TRANSLATE.TO.10MB DESTADDRESS)))) (3 (SETQ EPTYPE \EET.IP) (\AR.TRANSLATE.TO.3MB DESTADDRESS)) (SHOULDNT] (T (* ; "Nope") (RETURN] (T (* ;; "The host is not on a local net. See if we have a route to that host, or use the default route if necessary") (COND [(SETQ ROUTE (OR [COND (SUBNETINUSE (CDR (SASSOC (LOGAND DESTADDRESS SUBNETMASK) \IP.ROUTING.TABLE))) (T (CDR (SASSOC DESTNET \IP.ROUTING.TABLE] \IP.DEFAULT.GATEWAY)) (* ;; "We've got the IP address of the gateway") (COND [(SETQ NDB (CDR (SASSOC (\IPNETADDRESS ROUTE) \IP.LOCAL.NETWORKS))) (* ;; "We know what network it's on") (COND [(SETQ PDH (SELECTQ (fetch (NDB NETTYPE) of NDB) (10 (SETQ EPTYPE \EPT.IP) (\AR.TRANSLATE.TO.10MB ROUTE)) (3 (SETQ EPTYPE \EET.IP) (\AR.TRANSLATE.TO.3MB ROUTE)) (SHOULDNT] (T (RETURN] (T (ERROR "IP routing table contains non-local gateway address for network" DESTNET] (T (RETURN] (freplace EPNETWORK of IP with NDB) (ENCAPSULATE.ETHERPACKET NDB IP PDH (ffetch (IP IPTOTALLENGTH) of IP) EPTYPE) (replace EPTYPE of IP with EPTYPE) [COND ((NOT READONLY) (COND ((EQ 0 (fetch (IP IPDESTINATIONADDRESS) of IP)) (freplace (IP IPDESTINATIONADDRESS) of IP with DESTADDRESS))) (freplace (IP IPSOURCEADDRESS) of IP with (fetch NDBIPHOST# of NDB] (RETURN NDB]) ) (DEFINEQ (IP.GET [LAMBDA (IPSOCKET WAIT) (* ejs%: "31-Mar-86 14:30") (* * Returns the next IP packet on the queue, or NIL if none exist and WAIT is  NIL. If WAIT is T, this function waits forever.  If WAIT is an integer, it is interpreted as the number of milliseconds to wait  before returning NIL or a packet which arrives during that time.  This function therefore is like GETXIP and GETPUP) (PROG ((QUEUE (fetch (IPSOCKET IPSQUEUE) of IPSOCKET)) IP TIMER) LP (UNINTERRUPTABLY (COND ((SETQ IP (\DEQUEUE QUEUE)) (add (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) -1)))) [COND ((NULL IP) (COND (WAIT (COND ((EQ WAIT T)) [TIMER (COND ((TIMEREXPIRED? TIMER) (RETURN] (T (OR (FIXP WAIT) (LISPERROR "NON-NUMERIC ARG" WAIT)) (SETQ TIMER (SETUPTIMER WAIT)) T)) (AWAIT.EVENT (fetch (IPSOCKET IPSEVENT) of IPSOCKET) TIMER T) (GO LP)) (T (BLOCK] (RETURN IP]) (IP.SEND [LAMBDA (IP) (* ejs%: "31-Mar-86 15:07") (\IP.TRANSMIT IP]) (IP.PACKET.WATCHER [LAMBDA (IPSOCKET PACKET.FUNCTION) (* ejs%: "31-Mar-86 15:50") (* * Infinite loop which waits for packet on IPSOCKET, and calls  PACKET.FUNCTION whenever one arrives) (COND ((NOT (type? IPSOCKET IPSOCKET)) (ERROR "ARG NOT IPSOCKET" IPSOCKET)) ((NOT (FNTYP PACKET.FUNCTION)) (ERROR "UNDEFINED FUNCTION" PACKET.FUNCTION)) (T (while T do (APPLY* PACKET.FUNCTION (IP.GET IPSOCKET T) IPSOCKET]) ) (DECLARE%: EVAL@COMPILE [PUTPROPS IP.SEND MACRO (LAMBDA (IP) (* ejs%: "31-Mar-86 15:07") (\IP.TRANSMIT IP] ) (* ;; "Client functions for building packets") (DEFINEQ (\IP.APPEND.BYTE [LAMBDA (IP BYTE INHEADER) (* ejs%: "28-Dec-84 08:23") (* * Append a byte to an IP packet. If INHEADER is not NIL, we adjust the  header length field as well.) (PROG (NEWLENGTH) (\PUTBASEBYTE (fetch (IP IPBASE) of IP) (fetch (IP IPTOTALLENGTH) of IP) BYTE) (SETQ NEWLENGTH (add (ffetch (IP IPTOTALLENGTH) of IP) 1)) [COND (INHEADER (freplace (IP IPHEADERLENGTH) of IP with (FOLDHI NEWLENGTH 4] (RETURN NEWLENGTH]) (\IP.APPEND.CELL [LAMBDA (IP CELL INHEADER) (* ejs%: "28-Dec-84 08:33") (* * Append a cell to an IP packet. If INHEADER is not NIL, we adjust the  header length field as well.) (PROG (NEWLENGTH (OFFSET (fetch (IP IPTOTALLENGTH) of IP))) [COND ((EVENP OFFSET) (\PUTBASEFIXP (fetch (IP IPBASE) of IP) (FOLDLO OFFSET 2) CELL)) (T (\PUTBASEBYTE (fetch (IP IPBASE) of IP) OFFSET (LDB (BYTE 8 24) CELL)) (\PUTBASEBYTE (fetch (IP IPBASE) of IP) (\ADDBASE OFFSET 1) (LDB (BYTE 8 16) CELL)) (\PUTBASEBYTE (fetch (IP IPBASE) of IP) (\ADDBASE OFFSET 2) (LDB (BYTE 8 8) CELL)) (\PUTBASEBYTE (fetch (IP IPBASE) of IP) (\ADDBASE OFFSET 3) (LDB (BYTE 8 0) CELL] (SETQ NEWLENGTH (add (ffetch (IP IPTOTALLENGTH) of IP) 4)) (COND (INHEADER (add (ffetch (IP IPHEADERLENGTH) of IP) 1))) (RETURN NEWLENGTH]) (\IP.APPEND.STRING [LAMBDA (IP STRING) (* ejs%: " 9-Feb-85 19:44") (PROG ((LENGTH (fetch (STRINGP LENGTH) of STRING))) (\MOVEBYTES (fetch (STRINGP BASE) of STRING) (fetch (STRINGP OFFST) of STRING) (fetch (IP IPBASE) of IP) (fetch (IP IPTOTALLENGTH) of IP) LENGTH) (RETURN (add (ffetch (IP IPTOTALLENGTH) of IP) LENGTH]) (\IP.APPEND.WORD [LAMBDA (IP WORD INHEADER) (* ejs%: "28-Dec-84 08:28") (* * Append a word to an IP packet. If INHEADER is not NIL, we adjust the  header length field as well.) (PROG (NEWLENGTH (OFFSET (fetch (IP IPTOTALLENGTH) of IP))) [COND ((EVENP OFFSET) (\PUTBASE (fetch (IP IPBASE) of IP) (FOLDLO OFFSET 2) WORD)) (T (\PUTBASEBYTE (fetch (IP IPBASE) of IP) OFFSET (LDB (BYTE 8 8) WORD)) (\PUTBASEBYTE (fetch (IP IPBASE) of IP) (\ADDBASE OFFSET 1) (LDB (BYTE 8 0) WORD] (SETQ NEWLENGTH (add (ffetch (IP IPTOTALLENGTH) of IP) 2)) [COND (INHEADER (freplace (IP IPHEADERLENGTH) of IP with (FOLDHI NEWLENGTH 4] (RETURN NEWLENGTH]) (\IP.GET.BYTE [LAMBDA (IP BYTE INHEADER) (* ejs%: "30-Mar-86 14:49") (* * Retrieve a byte from an IP packet.  If INHEADER is T, BYTE is an offset from the start of the packet, else it's an  offset from the start of the IP data section) (\GETBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE]) (\IP.GET.CELL [LAMBDA (IP CELL INHEADER) (* ejs%: "30-Mar-86 15:07") (* * Retrieve a cell from an IP packet.  If INHEADER is not NIL, the cell is written to the header portion of the IP  packet, else it's written to the data portion.  CELL is the offset, in 16-bit units) (\GETBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL]) (\IP.GET.STRING [LAMBDA (IP BYTEOFFSET NCHARS INHEADER) (* ejs%: "30-Mar-86 15:13") (* * Retrieve a string from an IP packet.  If INHEADER is T, BYTEOFFSET is an offset from the start of the packet, else  it's an offset from the start of the IP data section) (\GETBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET NCHARS]) (\IP.GET.WORD [LAMBDA (IP WORD INHEADER) (* ejs%: "30-Mar-86 14:51") (* * Retrieve a word from an IP packet.  If INHEADER is T, WORD is an offset from the start of the packet, else it's an  offset from the start of the IP data section) (\GETBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD]) (\IP.PUT.BYTE [LAMBDA (IP BYTE VALUE INHEADER) (* ejs%: "30-Mar-86 14:52") (* * Store a byte in an IP packet. If INHEADER is T, BYTE is an offset from the  start of the packet, else it's an offset from the start of the IP data section) (\PUTBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE VALUE]) (\IP.PUT.CELL [LAMBDA (IP CELL VALUE INHEADER) (* ejs%: "30-Mar-86 15:06") (* * Store a cell in an IP packet. If INHEADER is not NIL, the cell is written  to the header portion of the IP packet, else it's written to the data portion.  CELL is the offset, in 16-bit units) (\PUTBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL VALUE]) (\IP.PUT.STRING [LAMBDA (IP BYTEOFFSET STRING INHEADER) (* ejs%: "30-Mar-86 15:13") (* * Store a string ib an IP packet. If INHEADER is T, BYTEOFFSET is an offset  from the start of the packet, else it's an offset from the start of the IP data  section) (\PUTBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET STRING]) (\IP.PUT.WORD [LAMBDA (IP WORD VALUE INHEADER) (* ejs%: "30-Mar-86 14:50") (* * Store a word in an IP packet. If INHEADER is T, WORD is an offset from the  start of the packet, else it's an offset from the start of the IP data section) (\PUTBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD VALUE]) ) (DECLARE%: EVAL@COMPILE [PUTPROPS \IP.GET.BYTE DMACRO (LAMBDA (IP BYTE INHEADER) (* ejs%: "30-Mar-86 14:49") (* * Retrieve a byte from an IP packet.  If INHEADER is T, BYTE is an offset from the start of the packet, else it's an  offset from the start of the IP data section) (\GETBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE] [PUTPROPS \IP.GET.CELL DMACRO (LAMBDA (IP CELL INHEADER) (* ejs%: "30-Mar-86 15:07") (* * Retrieve a cell from an IP packet.  If INHEADER is not NIL, the cell is written to the header portion of the IP  packet, else it's written to the data portion.  CELL is the offset, in 16-bit units) (\GETBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL] [PUTPROPS \IP.GET.STRING DMACRO (LAMBDA (IP BYTEOFFSET NCHARS INHEADER) (* ejs%: "30-Mar-86 15:13") (* * Retrieve a string from an IP packet.  If INHEADER is T, BYTEOFFSET is an offset from the start of the packet, else  it's an offset from the start of the IP data section) (\GETBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET NCHARS] [PUTPROPS \IP.GET.WORD DMACRO (LAMBDA (IP WORD INHEADER) (* ejs%: "30-Mar-86 14:51") (* * Retrieve a word from an IP packet.  If INHEADER is T, WORD is an offset from the start of the packet, else it's an  offset from the start of the IP data section) (\GETBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD] [PUTPROPS \IP.PUT.BYTE DMACRO (LAMBDA (IP BYTE VALUE INHEADER) (* ejs%: "30-Mar-86 14:52") (* * Store a byte in an IP packet. If INHEADER is T, BYTE is an offset from the  start of the packet, else it's an offset from the start of the IP data section) (\PUTBASEBYTE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTE VALUE] [PUTPROPS \IP.PUT.CELL DMACRO (LAMBDA (IP CELL VALUE INHEADER) (* ejs%: "30-Mar-86 15:06") (* * Store a cell in an IP packet. If INHEADER is not NIL, the cell is written  to the header portion of the IP packet, else it's written to the data portion.  CELL is the offset, in 16-bit units) (\PUTBASEFIXP (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) CELL VALUE] [PUTPROPS \IP.PUT.STRING DMACRO (LAMBDA (IP BYTEOFFSET STRING INHEADER) (* ejs%: "30-Mar-86 15:13") (* * Store a string ib an IP packet. If INHEADER is T, BYTEOFFSET is an offset  from the start of the packet, else it's an offset from the start of the IP data  section) (\PUTBASESTRING (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) BYTEOFFSET STRING] [PUTPROPS \IP.PUT.WORD DMACRO (LAMBDA (IP WORD VALUE INHEADER) (* ejs%: "30-Mar-86 14:50") (* * Store a word in an IP packet. If INHEADER is T, WORD is an offset from the  start of the packet, else it's an offset from the start of the IP data section) (\PUTBASE (COND (INHEADER (fetch (IP IPBASE) of IP)) (T (\IPDATABASE IP))) WORD VALUE] ) (MOVD? 'NILL 'IP.DEFAULT.CONFIGURATION) (DECLARE%: EVAL@COMPILE DONTCOPY (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \IP.LOCAL.NETWORKS \IP.DEFAULT.GATEWAY \IP.INIT.FILE \IP.SUBNET.MASKS \PROCESS.AFTEREXIT.EVENT \PROC.READY \AR.IP.TO.10MB.ALIST) ) ) (PUTPROPS TCPLLIP COPYRIGHT ("Xerox Corporation" 1985 1986 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (33488 35161 (\SYSQUEUE.DEFPRINT 33498 . 33847) (\IPSOCKET.DEFPRINT 33849 . 35159)) ( 36483 52693 (\CANONICALIZE.IP.HOSTNAME 36493 . 36686) (DODIP.HOSTP 36688 . 37144) (IPHOSTADDRESS 37146 . 37814) (IPHOSTNAME 37816 . 38028) (IPTRACE 38030 . 38227) (IPTRACEWINDOW.BUTTONFN 38229 . 38826) ( PRINTIP 38828 . 41424) (PRINTIPDATA 41426 . 42106) (\IPADDRESSCLASS 42108 . 42705) (\IPEVENTFN 42707 . 43055) (\IPHOSTADDRESS 43057 . 43873) (\IPNETADDRESS 43875 . 44739) (\IP.ADDRESS.TO.STRING 44741 . 45229) (\IP.BROADCAST.ADDRESS 45231 . 48921) (\IP.LEGAL.ADDRESS 48923 . 49271) ( \IP.MAKE.BROADCAST.ADDRESS 49273 . 49713) (\IP.PRINT.ADDRESS 49715 . 50333) (\IP.READ.STRING.ADDRESS 50335 . 52200) (\DOMAIN.NAME.QUALIFY.FULLY 52202 . 52691)) (53342 70901 (STOPIP 53352 . 53628) ( \IPINIT 53630 . 55639) (\IPLISTENER 55641 . 56413) (\IP.REINITIALIZE.FROM.SCRATCH 56415 . 61690) ( \IP.RESTART.FROM.CONFIGURATION 61692 . 66877) (\IP.MAYBE.READ.HOSTS.TXT 66879 . 68355) ( \IP.READ.INIT.FILE 68357 . 70174) (\IP.PROMPT.FOR.FILE.NAME 70176 . 70899)) (75225 84872 ( \HANDLE.RAW.IP 75235 . 77533) (\FORWARD.IP 77535 . 80265) (\IP.LOCAL.DESTINATION 80267 . 82052) ( \IPCHECKSUM 82054 . 84204) (\IP.CHECKSUM.OK 84206 . 84382) (\IP.SET.CHECKSUM 84384 . 84870)) (85442 97726 (\IP.HAND.TO.PROTOCOL 85452 . 86504) (\IP.DEFAULT.INPUTFN 86506 . 87105) (\IP.DEFAULT.NOSOCKETFN 87107 . 87491) (\IP.ADD.PROTOCOL 87493 . 89620) (\IP.DELETE.PROTOCOL 89622 . 90351) ( \IP.FIND.PROTOCOL 90353 . 90740) (\IP.FIND.PROTOCOL.SOCKET 90742 . 92342) (\IP.FIND.SOCKET 92344 . 93234) (\IP.OPEN.SOCKET 93236 . 96216) (\IP.CLOSE.SOCKET 96218 . 97724)) (98507 118821 ( \HANDLE.RAW.IP.FRAGMENT 98517 . 99124) (\IP.NEW.FRAGMENT.LST 99126 . 102391) ( \IP.COPY.FRAGMENT.HEADER.TO.PACKET.HEADER 102393 . 102894) (\IP.ADD.FRAGMENT 102896 . 111986) ( \IP.FIND.MATCHING.FRAGMENTS 111988 . 114409) (\IP.FRAGMENTED.PACKET 114411 . 114700) ( \IP.CHECK.REASSEMBLY.TIMEOUTS 114702 . 116007) (\IP.DELETE.FRAGMENT 116009 . 116501) ( \IP.PRINT.FRAGMENT 116503 . 118819)) (119865 128230 (\IP.PROCESS.OPTIONS 119875 . 122592) ( \IP.OPTION.RECORD.ROUTE 122594 . 123607) (\IP.OPTION.STRICT.SOURCE.ROUTE 123609 . 125209) ( \IP.OPTION.TIMESTAMP 125211 . 128228)) (128581 136430 (\IP.SETUPIP 128591 . 129761) (\IP.TRANSMIT 129763 . 131402) (\IP.ROUTE.PACKET 131404 . 136428)) (136431 138607 (IP.GET 136441 . 137907) (IP.SEND 137909 . 138041) (IP.PACKET.WATCHER 138043 . 138605)) (138832 146433 (\IP.APPEND.BYTE 138842 . 139504) (\IP.APPEND.CELL 139506 . 140978) (\IP.APPEND.STRING 140980 . 141518) (\IP.APPEND.WORD 141520 . 142611) (\IP.GET.BYTE 142613 . 143077) (\IP.GET.CELL 143079 . 143589) (\IP.GET.STRING 143591 . 144084) (\IP.GET.WORD 144086 . 144538) (\IP.PUT.BYTE 144540 . 144994) (\IP.PUT.CELL 144996 . 145496) ( \IP.PUT.STRING 145498 . 145987) (\IP.PUT.WORD 145989 . 146431))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPNAMES b/obsolete/tcp/TCPNAMES new file mode 100644 index 00000000..13c7aa25 --- /dev/null +++ b/obsolete/tcp/TCPNAMES @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "IL" READTABLE "INTERLISP" BASE 10) (FILECREATED " 8-Oct-90 17:23:42" |{LISPDEV:LAIR:OHIO-STATE}TCPNAMES.;2| 70558 changes to%: (VARS TCPNAMESCOMS) (FNS REPACKFILENAME.STRING REPACKFILENAME.STRING.D REPACKFILENAME.STRING.MSDOS REPACKFILENAME.STRING.TI REPACKFILENAME.STRING.VMS REPACKFILENAME.STRING.3600 REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.UNIX \REPACKFILENAME.NEW.TRANSLATION \REPACKFILENAME.NEW.TRANSLATIONS) previous date%: "12-Sep-90 17:37:35" {DSK}gadener>medley>work>tcp>tcpnames.;2) (* ; " Copyright (c) 1985, 1987, 1988, 1989, 1990 by Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPNAMESCOMS) (RPAQQ TCPNAMESCOMS [(PROP MAKEFILE-ENVIRONMENT TCPNAMES) (PROP FILETYPE TCPNAMES) (FNS REPACKFILENAME.STRING REPACKFILENAME.STRING.D REPACKFILENAME.STRING.MSDOS REPACKFILENAME.STRING.TI REPACKFILENAME.STRING.VMS REPACKFILENAME.STRING.3600 REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.UNIX \REPACKFILENAME.NEW.TRANSLATION \REPACKFILENAME.NEW.TRANSLATIONS) (INITVARS (\REPACKFILENAME.OSTYPE.TABLE (HASHARRAY 30 1.1))) (GLOBALVARS \REPACKFILENAME.OSTYPE.TABLE) (P (\REPACKFILENAME.NEW.TRANSLATIONS (INTERLISP IFS) REPACKFILENAME.STRING.D (TOPS-20 TOPS20) REPACKFILENAME.STRING.TOPS20 (SYMBOLICS-3600 LISPM GENERA) REPACKFILENAME.STRING.3600 VMS REPACKFILENAME.STRING.VMS UNIX REPACKFILENAME.STRING.UNIX MS-DOS REPACKFILENAME.STRING.MSDOS)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA \REPACKFILENAME.NEW.TRANSLATIONS) (NLAML) (LAMA REPACKFILENAME.STRING.UNIX REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.3600 REPACKFILENAME.STRING.VMS REPACKFILENAME.STRING.TI REPACKFILENAME.STRING.MSDOS REPACKFILENAME.STRING.D]) (PUTPROPS TCPNAMES MAKEFILE-ENVIRONMENT (:PACKAGE "IL" :READTABLE "INTERLISP" :BASE 10)) (PUTPROPS TCPNAMES FILETYPE :BCOMPL) (DEFINEQ (REPACKFILENAME.STRING [LAMBDA (NAME FOROSTYPE) (* ; "Edited 29-Sep-90 11:47 by welch") (DECLARE (GLOBALVARS \REPACKFILENAME.OSTYPE.TABLE)) (LET ((REPACKFUNCTION (GETHASH FOROSTYPE \REPACKFILENAME.OSTYPE.TABLE))) (COND ((NULL REPACKFUNCTION) NAME) (T (APPLY REPACKFUNCTION (UNPACKFILENAME.STRING NAME]) (REPACKFILENAME.STRING.D [LAMBDA N (* ; "Edited 8-Oct-90 16:23 by welch") (* * Convert file names to native format) (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.D) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY DIR NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.D VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (%: (LIST DEVICE)) (LIST DEVICE '%:] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE \) (CHARCODE /] (RPLCHARCODE DIRECTORY C (CHARCODE >] (LIST "<" DIRECTORY ">")) (LIST "<" DIRECTORY ">")) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (CHARCODE >) (LIST (CHARCODE \) (CHARCODE /] (RPLCHARCODE SUBDIRECTORY C (CHARCODE >] (LIST "<" SUBDIRECTORY ">")) (LIST "<" SUBDIRECTORY ">")) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (CHARCODE >) (LIST (CHARCODE \) (CHARCODE /] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE >] (LIST "<" RELATIVEDIRECTORY ">")) (LIST "<" RELATIVEDIRECTORY ">")) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T '%.)) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST '; VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST '; (SUBSTRING VERSION 2 -1))) (LIST '; VERSION]) (REPACKFILENAME.STRING.MSDOS [LAMBDA N (* ; "Edited 8-Oct-90 16:48 by welch") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.MSDOS) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION PACKLIST VAR RELATIVEDIRECTORY SUBDIRECTORY VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY SUBDIRECTORY RELATIVEDIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.MSDOS VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) (AND DEVICE (NEQ DEVICE BLIP) (LIST ":" DEVICE)) (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE %.) (CHARCODE /] (RPLCHARCODE DIRECTORY C (CHARCODE \] (LIST "\" DIRECTORY "\")) (LIST "\" DIRECTORY "\")) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE %.) (CHARCODE /] (RPLCHARCODE SUBDIRECTORY C (CHARCODE \] (LIST "\" SUBDIRECTORY "\")) (LIST "\" SUBDIRECTORY "\")) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE %.) (CHARCODE /] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE \] (LIST "\" RELATIVEDIRECTORY "\")) (LIST "\" RELATIVEDIRECTORY "\")) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((OR (AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) (OR (NULL EXTENSION) (EQ EXTENSION BLIP) (STREQUAL EXTENSION ""))) BLIP) (T '%.)) (OR EXTENSION BLIP]) (REPACKFILENAME.STRING.TI [LAMBDA N (* ; "Edited 8-Oct-90 16:59 by welch") (* * Can you believe this???) (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.TI) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY NAME EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.TI VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST HOST ":")) (AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (%: (LIST DEVICE)) (LIST DEVICE |':|))) (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE /) (CHARCODE \] (RPLCHARCODE DIRECTORY C (CHARCODE %.] (LIST DIRECTORY ";"))) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE /) (CHARCODE \] (RPLCHARCODE SUBDIRECTORY C (CHARCODE %.] (LIST SUBDIRECTORY ";"))) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (LIST (CHARCODE >) (CHARCODE /) (CHARCODE \] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE %.] (LIST RELATIVEDIRECTORY ";"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T '%.)) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST '%# VERSION)) (T (SELCHARQ (CHCON1 VERSION) (%# (LIST VERSION)) ((%. ! ;) (LIST '%# (SUBSTRING VERSION 2 -1))) (L (LIST '%# 'OLDEST)) ((H 0) (LIST '%# '>)) (LIST '%# VERSION]) (REPACKFILENAME.STRING.VMS [LAMBDA N (* ; "Edited 8-Oct-90 16:52 by welch") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.VMS) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY NAME EXTENSION VERSION TEMPORARY PROTECTION ACCOUNT PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY NAME EXTENSION VERSION TEMPORARY PROTECTION ACCOUNT)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.VMS VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (%: (LIST DEVICE)) (LIST DEVICE '%:] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE DIRECTORY C (CHARCODE %.] (LIST "[" DIRECTORY "]"))) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE SUBDIRECTORY C (CHARCODE %.] (LIST "[" SUBDIRECTORY "]"))) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE %.] (LIST "[" RELATIVEDIRECTORY "]"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T '%.)) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST '; VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST '; (SUBSTRING VERSION 2 -1))) (LIST '; VERSION]) (REPACKFILENAME.STRING.3600 [LAMBDA N (* ; "Edited 8-Oct-90 16:46 by welch") (* * Can you believe this???) (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.3600) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION PACKLIST VAR VAL TEMP RELATIVEDIRECTORY SUBDIRECTORY) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION SUBDIRECTORY RELATIVEDIRECTORY)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.3600 VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST HOST ":")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (%: (LIST DEVICE)) (LIST DEVICE '%:] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE %.) (CHARCODE /) (CHARCODE \] (RPLCHARCODE DIRECTORY C (CHARCODE >] (LIST ">" DIRECTORY ">"))) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE %.) (CHARCODE /) (CHARCODE \] (RPLCHARCODE SUBDIRECTORY C (CHARCODE >] (LIST ">" SUBDIRECTORY ">"))) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE %.) (CHARCODE /) (CHARCODE \] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE >] (LIST ">" RELATIVEDIRECTORY ">"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T '%.)) (OR EXTENSION BLIP))) (AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST '%. VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST '%. (SUBSTRING VERSION 2 -1))) (L (LIST '%. 'OLDEST)) ((H 0) (LIST '%. 'NEWEST)) (LIST '%. VERSION]) (REPACKFILENAME.STRING.TOPS20 [LAMBDA N (* ; "Edited 8-Oct-90 16:42 by welch") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.TOPS20) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION TEMPORARY RELATIVEDIRECTORY SUBDIRECTORY PROTECTION ACCOUNT PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME EXTENSION VERSION TEMPORARY PROTECTION ACCOUNT)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.TOPS20 VAL)) (T VAL))) [FUNCTION (LAMBDA (X) (* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" (CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (SELECTQ TEMPORARY ((T S ;S) (* hack for Interlisp-D!) (OR HOST DEVICE (PROGN (SETQ HOST 'CORE) (SETQ TEMPORARY)))) NIL) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) [AND DEVICE (NEQ DEVICE BLIP) (SELCHARQ (NTHCHARCODE DEVICE -1) (%: (LIST DEVICE)) (LIST DEVICE '%:] (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ([FMEMB (NTHCHARCODE DIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE DIRECTORY C (CHARCODE %.] (LIST "<" DIRECTORY ">"))) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ([FMEMB (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE SUBDIRECTORY C (CHARCODE %.] (LIST "<" SUBDIRECTORY ">"))) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY) do (COND ([FMEMB (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (LIST (CHARCODE /) (CHARCODE >] (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE %.] (LIST "<" RELATIVEDIRECTORY ">"))) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) BLIP) (T '%.)) (OR EXTENSION BLIP))) [AND VERSION (NEQ VERSION BLIP) (COND ((FIXP VERSION) (LIST '%. VERSION)) (T (SELCHARQ (CHCON1 VERSION) (; (LIST VERSION)) ((%. !) (LIST '%. (SUBSTRING VERSION 2 -1))) (L (LIST '%. -2)) (H (LIST '%. 0)) (LIST '%. VERSION] (AND TEMPORARY (NEQ TEMPORARY BLIP) (LIST '; (SELECTQ TEMPORARY ((S ;S) 'S) T]) (REPACKFILENAME.STRING.UNIX [LAMBDA N (* ; "Edited 8-Oct-90 16:48 by welch") (if (AND (EQ N 1) (LISTP (ARG N 1))) then (* spread argument list) (APPLY (FUNCTION REPACKFILENAME.STRING.UNIX) (ARG N 1)) else (PROG ((BLIP "") (I 1) HOST DEVICE STRUCTURE DIRECTORY RELATIVEDIRECTORY SUBDIRECTORY DIR NAME EXTENSION VERSION PACKLIST VAR VAL TEMP) (DECLARE (SPECVARS HOST DEVICE STRUCTURE DIRECTORY NAME RELATIVEDIRECTORY SUBDIRECTORY EXTENSION VERSION)) LP (COND ((NOT (IGREATERP I N)) (COND ((LISTP (SETQ VAR (ARG N I))) (SETQ VAL (CDR VAR)) (SETQ VAR (CAR VAR))) ((NOT (IGREATERP (SETQ I (ADD1 I)) N)) (SETQ VAL (ARG N I))) (T (SETQ VAL))) (OR (STRINGP VAL) (ATOM VAL) (ERRORX (LIST 27 VAL))) (* fields must be atom) (SELECTQ VAR (BODY (MAP (UNPACKFILENAME.STRING (COND ((LISTP VAL) (* PACKFILENAME.STRING for error  checking of fields) (REPACKFILENAME.STRING.UNIX VAL)) (T VAL))) [FUNCTION (LAMBDA (X)(* NIL => not yet seen, BLIP => seen  as NIL.) (OR (EVALV (CAR X)) (SET (CAR X) (OR (CADR X) BLIP] (FUNCTION CDDR))) (HOST (OR HOST (SETQ HOST (if VAL then (SELCHARQ (CHCON1 VAL) (({ %[ %() (SUBSTRING VAL 2 (SELCHARQ (NTHCHARCODE VAL -1) ((} %] %)) -2) -1))) VAL) else BLIP)))) (SUBDIRECTORY (OR SUBDIRECTORY (SETQ SUBDIRECTORY (if VAL then (CONCAT ( CL:STRING-LEFT-TRIM "<" ( CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (RELATIVEDIRECTORY (OR RELATIVEDIRECTORY (SETQ RELATIVEDIRECTORY (if VAL then (CONCAT (CL:STRING-LEFT-TRIM "<" ( CL:DIRECTORY-NAMESTRING *DEFAULT-PATHNAME-DEFAULTS* )) VAL) else BLIP)))) (DIRECTORY (OR DIRECTORY (SETQ DIRECTORY (OR VAL BLIP)))) ((DEVICE HOST NAME EXTENSION VERSION) (OR (EVALV VAR) (SET VAR (OR VAL BLIP)))) (\ILLEGAL.ARG VAR)) (SETQ I (ADD1 I)) (GO LP))) (RETURN (CONCATLIST (NCONC (AND HOST (NEQ HOST BLIP) (LIST "{" HOST "}")) (AND DEVICE (NEQ DEVICE BLIP) (LIST "/" DEVICE)) (AND DIRECTORY (NEQ DIRECTORY BLIP) (PROGN (SETQ DIRECTORY (CONCAT DIRECTORY)) [for C from 1 to (NCHARS DIRECTORY) do (COND ((EQ (NTHCHARCODE DIRECTORY C) (CONSTANT (CHARCODE >))) (RPLCHARCODE DIRECTORY C (CHARCODE /] (LIST "/" DIRECTORY "/")) (LIST "/" DIRECTORY "/")) (AND SUBDIRECTORY (NEQ SUBDIRECTORY BLIP) (PROGN (SETQ SUBDIRECTORY (CONCAT SUBDIRECTORY)) [for C from 1 to (NCHARS SUBDIRECTORY) do (COND ((EQ (NTHCHARCODE SUBDIRECTORY C) (CONSTANT (CHARCODE >))) (RPLCHARCODE SUBDIRECTORY C (CHARCODE /] (LIST "/" SUBDIRECTORY "/")) (LIST "/" SUBDIRECTORY "/")) (AND RELATIVEDIRECTORY (NEQ RELATIVEDIRECTORY BLIP) (PROGN (SETQ RELATIVEDIRECTORY (CONCAT RELATIVEDIRECTORY)) [for C from 1 to (NCHARS RELATIVEDIRECTORY ) do (COND ((EQ (NTHCHARCODE RELATIVEDIRECTORY C) (CONSTANT (CHARCODE >))) (RPLCHARCODE RELATIVEDIRECTORY C (CHARCODE /] (LIST "/" RELATIVEDIRECTORY "/")) (LIST "/" RELATIVEDIRECTORY "/")) (AND NAME (NEQ NAME BLIP) (LIST NAME)) (AND (OR (AND EXTENSION (NEQ EXTENSION BLIP)) (AND VERSION (NEQ VERSION BLIP))) (LIST (COND ((OR (AND EXTENSION (EQ (CHCON1 EXTENSION) (CHARCODE %.))) (OR (NULL EXTENSION) (EQ EXTENSION BLIP) (STREQUAL EXTENSION ""))) BLIP) (T '%.)) (OR EXTENSION BLIP]) (\REPACKFILENAME.NEW.TRANSLATION [LAMBDA (OSTYPE FUNCTION) (DECLARE (GLOBALVARS \REPACKFILENAME.OSTYPE.TABLE)) (* ejs%: "27-Apr-85 13:36") (PUTHASH OSTYPE FUNCTION \REPACKFILENAME.OSTYPE.TABLE]) (\REPACKFILENAME.NEW.TRANSLATIONS [NLAMBDA NAMES (* ejs%: "27-Apr-85 13:36") (* * Supply a property-list format argument of ostypes and translating  functions to be added to ostype table) (for TAIL on NAMES by (CDDR TAIL) do (for OSTYPE inside (CAR TAIL) do (\REPACKFILENAME.NEW.TRANSLATION OSTYPE (CADR TAIL]) ) (RPAQ? \REPACKFILENAME.OSTYPE.TABLE (HASHARRAY 30 1.1)) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \REPACKFILENAME.OSTYPE.TABLE) ) (\REPACKFILENAME.NEW.TRANSLATIONS (INTERLISP IFS) REPACKFILENAME.STRING.D (TOPS-20 TOPS20) REPACKFILENAME.STRING.TOPS20 (SYMBOLICS-3600 LISPM GENERA) REPACKFILENAME.STRING.3600 VMS REPACKFILENAME.STRING.VMS UNIX REPACKFILENAME.STRING.UNIX MS-DOS REPACKFILENAME.STRING.MSDOS) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDTOVAR NLAMA \REPACKFILENAME.NEW.TRANSLATIONS) (ADDTOVAR NLAML ) (ADDTOVAR LAMA REPACKFILENAME.STRING.UNIX REPACKFILENAME.STRING.TOPS20 REPACKFILENAME.STRING.3600 REPACKFILENAME.STRING.VMS REPACKFILENAME.STRING.TI REPACKFILENAME.STRING.MSDOS REPACKFILENAME.STRING.D) ) (PUTPROPS TCPNAMES COPYRIGHT ("Xerox Corporation" 1985 1987 1988 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2757 69593 (REPACKFILENAME.STRING 2767 . 3171) (REPACKFILENAME.STRING.D 3173 . 12368) ( REPACKFILENAME.STRING.MSDOS 12370 . 21255) (REPACKFILENAME.STRING.TI 21257 . 30611) ( REPACKFILENAME.STRING.VMS 30613 . 39537) (REPACKFILENAME.STRING.3600 39539 . 49180) ( REPACKFILENAME.STRING.TOPS20 49182 . 58763) (REPACKFILENAME.STRING.UNIX 58765 . 68684) ( \REPACKFILENAME.NEW.TRANSLATION 68686 . 68967) (\REPACKFILENAME.NEW.TRANSLATIONS 68969 . 69591))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPOPS b/obsolete/tcp/TCPOPS new file mode 100644 index 00000000..5e47a466 --- /dev/null +++ b/obsolete/tcp/TCPOPS @@ -0,0 +1,212 @@ +(DEFINE-FILE-INFO READTABLE "XCL" PACKAGE "INTERLISP") +(FILECREATED "22-May-90 10:55:20" |{DSK}/home/neptune/jds/TCPOPS.;17| 14660 + + |changes| |to:| (FNS TCP-ACCEPT TCP-LISTEN UDP-RECV) + + |previous| |date:| " 3-May-90 11:40:39" |{DSK}/home/neptune/jds/TCPOPS.;16|) + + +; Copyright (c) 1989, 1990 by Savoir, Inc.. All rights reserved. + +(PRETTYCOMPRINT TCPOPSCOMS) + +(RPAQQ TCPOPSCOMS ((FILES CHARDEVICE) (ADDVARS (\\INITSUBRS (TCP 144))) (COMS (* |;;| "TCP Streams") (FNS \\TCP-DEV-INIT \\TCP-OPENFILE \\TCP-FORCEOUTPUT \\TCP-GETNEXTBUFFER \\TCP-EOFP \\TCP-CLOSEFILE \\TCP-EVENTFN \\TCP.BUFFERED.BOUTS) (P (\\TCP-DEV-INIT))) (COMS (* |;;| "User-level TCP operations") (FNS TCP OPENTCPSTREAM TCP-ACCEPT TCP-LISTEN TCP-CLOSE) (FNS UDP-LISTEN UDP-SEND UDP-RECV) (FNS GETHOSTFROMNAME GETHOSTFROMADDR GETHOSTFROMSOCKET GETHOSTNAME)) (DECLARE\: EVAL@LOAD DONTCOPY (COMS (* |;;| "Debugging functions &c") (VARS (BUFFER (\\ALLOCBLOCK 100))) (FNS TCPRECV TCPSEND SEEBUFFER FOON))))) + +(FILESLOAD CHARDEVICE) + +(ADDTOVAR \\INITSUBRS (TCP 144)) + + + +(* |;;| "TCP Streams") + +(DEFINEQ + +(\\TCP-DEV-INIT +(LAMBDA NIL (* \; "Edited 20-Feb-90 12:51 by jds") (* |;;| "Initialization for buffered Unix-character-oriented device (e.g. for TCP streams on SUN)") (SETQ \\TCP-FDEV (|create| FDEV DEVICENAME _ "TCP" FDBINABLE _ T FDBOUTABLE _ T BUFFERED _ T BIN _ (FUNCTION \\BUFFERED.BIN) BOUT _ (FUNCTION \\BUFFCHAR-OTHER-BOUT) OPENFILE _ (FUNCTION \\BUFFCHAR-DEV-OPENFILE) EVENTFN _ (FUNCTION \\CHAR-DEV-EVENTFN) REOPENFILE _ (FUNCTION \\BUFFCHAR-DEV-OPENFILE) CLOSEFILE _ (FUNCTION \\TCP-CLOSEFILE) FORCEOUTPUT _ (FUNCTION \\TCP-FORCEOUTPUT) EOFP _ (FUNCTION \\TCP-EOFP) BLOCKIN _ (FUNCTION \\BUFFERED.BINS) BLOCKOUT _ (FUNCTION \\TCP.BUFFERED.BOUTS) READP _ (FUNCTION \\GENERIC.READP) PEEKBIN _ (FUNCTION \\BUFFERED.PEEKBIN) GETNEXTBUFFER _ (FUNCTION \\TCP-GETNEXTBUFFER))) (\\DEFINEDEVICE (QUOTE TCP) \\TCP-FDEV)) +) + +(\\TCP-OPENFILE +(LAMBDA (NAME ACCESS RECOG OTHERINFO FDEV) (* \; "Edited 7-Mar-90 10:11 by jds") (LET ((UNIX-NAME (SUBSTRING NAME (ADD1 (STRPOS "}" NAME)))) (ERRNO (CREATECELL \\FIXP)) IODESCRIPTOR ACCESS-VALUE STREAM OTHER-STREAM) (SETQ STREAM (|create| STREAM BINABLE _ T BOUTABLE _ NIL DEVICE _ FDEV FULLFILENAME _ NAME USERCLOSEABLE _ T USERVISIBLE _ T EOLCONVENTION _ LF.EOLC)) (SELECTQ ACCESS (INPUT (|replace| (STREAM STRMBINFN) |of| STREAM |with| (FUNCTION \\BUFFERED.BIN)) (SETQ ACCESS-VALUE 0)) (OUTPUT (|replace| (STREAM STRMBOUTFN) |of| STREAM |with| (FUNCTION \\BUFFCHAR-OTHER-BOUT)) (REPLACE F2 OF STREAM WITH (SETQ OTHER-STREAM (|create| STREAM BINABLE _ NIL BOUTABLE _ NIL DEVICE _ FDEV FULLFILENAME _ NAME STRMBOUTFN _ (FUNCTION \\BUFFERED.BOUT) USERCLOSEABLE _ T USERVISIBLE _ T EOLCONVENTION _ LF.EOLC))) (SETQ ACCESS-VALUE 1)) (BOTH (|replace| (STREAM STRMBINFN) |of| STREAM |with| (FUNCTION \\BUFFERED.BIN)) (|replace| (STREAM STRMBOUTFN) |of| STREAM |with| (FUNCTION \\BUFFCHAR-OTHER-BOUT)) (REPLACE F2 OF STREAM WITH (SETQ OTHER-STREAM (|create| STREAM BINABLE _ NIL BOUTABLE _ NIL DEVICE _ FDEV FULLFILENAME _ NAME STRMBOUTFN _ (FUNCTION \\BUFFERED.BOUT) USERCLOSEABLE _ T USERVISIBLE _ T EOLCONVENTION _ LF.EOLC))) (SETQ ACCESS-VALUE 2)) (APPEND (\\ILLEGAL.ARG ACCESS)) (\\ILLEGAL.ARG ACCESS)) (COND ((SETQ IODESCRIPTOR (SUBRCALL CHAR-OPENFILE UNIX-NAME ACCESS-VALUE ERRNO)) (* |;;| "Open happened, so put things together.") (|replace| (STREAM F1) |of| STREAM |with| IODESCRIPTOR) (COND (OTHER-STREAM (|replace| (STREAM F1) |of| OTHER-STREAM |with| IODESCRIPTOR)))) (T (\\CHAR-ERROR ERRNO NAME))) STREAM)) +) + +(\\TCP-FORCEOUTPUT + (LAMBDA (STREAM WAIT) (* \; "Edited 15-Dec-89 16:09 by jds") + +(* |;;;| "Generic buffer refiller for Buffered character streams (e.g. TCP streams on Sun, or the Lisp side of a shell CHAT, eventually)") + + (PROG (ERRCODE (OTHER-STREAM (|fetch| F2 |of| STREAM)) + (ERRNO (\\CREATECELL \\FIXP)) + BUFFER) + (COND + ((NULL (|fetch| CPPTR |of| OTHER-STREAM)) + + (* |;;| "No buffer allocated yet; create one.") + + (REPLACE CPPTR OF OTHER-STREAM WITH (NCREATE 'VMEMPAGEP)) + (REPLACE CBUFSIZE OF OTHER-STREAM WITH 512) + (REPLACE CBUFMAXSIZE OF OTHER-STREAM WITH 512) + (REPLACE COFFSET OF OTHER-STREAM WITH 0) + T) + ((ZEROP (|fetch| COFFSET |of| OTHER-STREAM)) + T) + ((SETQ ERRCODE (\\CHAR-BOUTS OTHER-STREAM (|fetch| CPPTR |of| OTHER-STREAM) + 0 + (|fetch| COFFSET |of| OTHER-STREAM) + NIL)) + + (* |;;| "WRITE HAPPENED.") + + (|replace| CBUFSIZE |of| OTHER-STREAM |with| 512) + (|replace| CBUFMAXSIZE |of| OTHER-STREAM |with| 512) + (|replace| COFFSET |of| OTHER-STREAM |with| 0) + T))))) + +(\\TCP-GETNEXTBUFFER +(LAMBDA (STREAM WHATFOR NOERRORFLG EOF-TEST) (* \; "Edited 20-Feb-90 12:43 by jds") (* |;;;| "Generic buffer refiller for Buffered character streams (e.g. TCP streams on Sun, or the Lisp side of a shell CHAT, eventually).") (PROG (ERRCODE (ERRNO (\\CREATECELL \\FIXP)) BUFFER) READ-LOOP (RETURN (SELECTQ WHATFOR (READ (* |;;| "READING; GET A FRESH BUFFER FULL OF UN-READ CHARACTERS.") (SETQ BUFFER (OR (FETCH (STREAM CPPTR) OF STREAM) (NCREATE (QUOTE VMEMPAGEP)))) (|replace| CPPTR |of| STREAM |with| BUFFER) (COND ((ZEROP (SETQ ERRCODE (TCP 6 (|fetch| (STREAM F1) |of| STREAM) BUFFER 512))) (AND (NULL NOERRORFLG) (\\EOF.ACTION STREAM)) NIL) ((EQ ERRCODE T) (AND EOF-TEST (RETURN T)) (BLOCK) (GO READ-LOOP)) (ERRCODE (* |;;| "Read succeeded, and ERRCODE has # of chars read.") (|replace| CPPTR |of| STREAM |with| BUFFER) (|replace| COFFSET |of| STREAM |with| 0) (|replace| CBUFSIZE |of| STREAM |with| ERRCODE) (|replace| CBUFMAXSIZE |of| STREAM |with| ERRCODE) T) ((NULL NOERRORFLG) (\\CHAR-ERROR ERRNO STREAM)))) (WRITE (COND ((NULL (FETCH CPPTR OF STREAM)) (* |;;| "No buffer allocated yet; create one.") (REPLACE CPPTR OF STREAM WITH (NCREATE (QUOTE VMEMPAGEP))) (REPLACE CBUFSIZE OF STREAM WITH 512) (REPLACE CBUFMAXSIZE OF STREAM WITH 512) (REPLACE COFFSET OF STREAM WITH 0) T) ((ZEROP (FETCH COFFSET OF STREAM)) T) ((SETQ ERRCODE (\\CHAR-BOUTS STREAM (FETCH CPPTR OF STREAM) 0 (FETCH COFFSET OF STREAM) NOERRORFLG)) (* |;;| "WRITE HAPPENED.") (REPLACE CBUFSIZE OF STREAM WITH 512) (REPLACE CBUFMAXSIZE OF STREAM WITH 512) (REPLACE COFFSET OF STREAM WITH 0) T))) (SHOULDNT))))) +) + +(\\TCP-EOFP +(LAMBDA (STREAM) (* \; "Edited 20-Feb-90 12:42 by jds") (* |;;| "T if there will be no more data on the stream") (AND (OR (NOT (|fetch| (STREAM CPPTR) |of| STREAM)) (IEQP (FETCH (STREAM COFFSET) OF STREAM) (FETCH (STREAM CBUFSIZE) OF STREAM))) (NOT (\\TCP-GETNEXTBUFFER STREAM (QUOTE READ) T T)))) +) + +(\\TCP-CLOSEFILE + (LAMBDA (STREAM) (* \; "Edited 18-Dec-89 11:17 by jds") + + (* |;;| "Close a TCP connection or listening-socket cleanly.") + + (TCP 3 (|fetch| (STREAM F1) |of| STREAM)) + STREAM)) + +(\\TCP-EVENTFN + (LAMBDA (FDEV EVENT) (* \; "Edited 30-Jan-90 13:56 by jds") + (SELECTQ EVENT + ((BEFORELOGOUT BEFORESYSOUT BEFOREMAKESYS BEFORESAVEVM) + (* |;;| + "Clean up existing connections, and remember any LISTENS in progress") + + ) + ((AFTERLOGOUT AFTERSYSOUT AFTERMAKESYS AFTERSAVEVM) + + (* |;;| +"Try to reopen streams that had been open, and re-establish any LISTENs in progress when we exited.") + + ) + NIL))) + +(\\TCP.BUFFERED.BOUTS +(LAMBDA (STREAM SBASE OFFSET NBYTES) (\\BUFFERED.BOUTS (FETCH F2 OF STREAM) SBASE OFFSET NBYTES))) +) + +(\\TCP-DEV-INIT) + + + +(* |;;| "User-level TCP operations") + +(DEFINEQ + +(TCP +(LAMBDA (A B C D E F G H I J K L M) (* \; "Edited 4-Apr-90 17:29 by jds") (* |;;| "Generic TCP-operation hider function. Hides the fact of TCP ops being SUBRCALLs.") (* |;;| "Returns whatever result the TCP operation returns.") (SUBRCALL TCP A B C D E F G H I J K L M)) +) + +(OPENTCPSTREAM +(LAMBDA (HOST PORT) (* \; "Edited 3-May-90 11:38 by jds") (LET ((ERRNO (CREATECELL \\FIXP)) IODESCRIPTOR ACCESS-VALUE STREAM OTHER-STREAM) (SETQ STREAM (|create| STREAM BINABLE _ T BOUTABLE _ T DEVICE _ \\TCP-FDEV FULLFILENAME _ HOST USERCLOSEABLE _ T USERVISIBLE _ T EOLCONVENTION _ LF.EOLC)) (|replace| (STREAM ACCESS) |of| STREAM |with| (QUOTE BOTH)) (|replace| (STREAM STRMBINFN) |of| STREAM |with| (FUNCTION \\BUFFERED.BIN)) (|replace| (STREAM STRMBOUTFN) |of| STREAM |with| (FUNCTION \\BUFFCHAR-OTHER-BOUT)) (|replace| F2 |of| STREAM |with| (SETQ OTHER-STREAM (|create| STREAM BINABLE _ T BOUTABLE _ T DEVICE _ \\TCP-FDEV FULLFILENAME _ HOST STRMBOUTFN _ (FUNCTION \\BUFFERED.BOUT) USERCLOSEABLE _ NIL USERVISIBLE _ NIL EOLCONVENTION _ LF.EOLC))) (COND ((SETQ IODESCRIPTOR (TCP 4 HOST PORT)) (* |;;| "Open happened, so put things together.") (|replace| (STREAM F1) |of| STREAM |with| IODESCRIPTOR) (|replace| (STREAM F1) |of| OTHER-STREAM |with| IODESCRIPTOR)) (T (\\CHAR-ERROR ERRNO HOST))) STREAM)) +) + +(TCP-ACCEPT +(LAMBDA (WAITING-SOCKET) (* \; "Edited 22-May-90 10:18 by jhb") (LET ((ERRNO (CREATECELL \\FIXP)) IODESCRIPTOR ACCESS-VALUE STREAM OTHER-STREAM SOCKET) (|while| (OR (NOT SOCKET) (< SOCKET 0)) |do| (BLOCK) (SETQ SOCKET (TCP 8 WAITING-SOCKET))) (PRINTOUT *TRACE-OUTPUT* "SOCKET ACCEPTED " SOCKET T) (SETQ STREAM (|create| STREAM BINABLE _ T BOUTABLE _ T DEVICE _ \\TCP-FDEV FULLFILENAME _ (GETHOSTFROMSOCKET SOCKET) USERCLOSEABLE _ T USERVISIBLE _ T EOLCONVENTION _ LF.EOLC)) (|replace| (STREAM ACCESS) |of| STREAM |with| (QUOTE BOTH)) (|replace| (STREAM STRMBINFN) |of| STREAM |with| (FUNCTION \\BUFFERED.BIN)) (|replace| (STREAM STRMBOUTFN) |of| STREAM |with| (FUNCTION \\BUFFCHAR-OTHER-BOUT)) (|replace| F2 |of| STREAM |with| (SETQ OTHER-STREAM (|create| STREAM BINABLE _ T BOUTABLE _ T DEVICE _ \\TCP-FDEV FULLFILENAME _ HOST STRMBOUTFN _ (FUNCTION \\BUFFERED.BOUT) USERCLOSEABLE _ NIL USERVISIBLE _ NIL EOLCONVENTION _ LF.EOLC))) (COND (SOCKET (* |;;| "Open happened, so put things together.") (|replace| (STREAM F1) |of| STREAM |with| SOCKET) (|replace| (STREAM F1) |of| OTHER-STREAM |with| SOCKET)) (T (\\CHAR-ERROR ERRNO HOST))) STREAM)) +) + +(TCP-LISTEN +(LAMBDA (SOCKET-NUMBER ACCEPT-FUNCTION ACCEPT-DATA) (* \; "Edited 22-May-90 10:54 by jhb") (LET ((SOCKET (TCP 7 SOCKET-NUMBER))) (SETQ \\MAIKO.IO-INTERRUPT-VECTOR (CONS (LIST (LLSH 1 SOCKET) ACCEPT-FUNCTION SOCKET ACCEPT-DATA) \\MAIKO.IO-INTERRUPT-VECTOR)) SOCKET)) +) + +(TCP-CLOSE +(LAMBDA (DESCRIPTOR-NUMBER) (* \; "Edited 4-Apr-90 14:51 by jds") (LET ((ACCEPTOR (ASSOC (LLSH 1 DESCRIPTOR-NUMBER) \\MAIKO.IO-INTERRUPT-VECTOR))) (TCP 3 DESCRIPTOR-NUMBER) (* \; "Close the TCP connection") (DREMOVE ACCEPTOR \\MAIKO.IO-INTERRUPT-VECTOR) (* \; "REmove any acceptor.") DESCRIPTOR-NUMBER)) +) +) +(DEFINEQ + +(UDP-LISTEN +(LAMBDA (SOCKET-NUMBER ACCEPT-FUNCTION ACCEPT-INFO) (* \; "Edited 4-Apr-90 15:49 by jds") (* |;;| "Listen on a particular UDP socket for incoming packet traffic. Also has the effect of opening the socket for outgoing traffic.") (LET ((SOCKET (TCP 128 SOCKET-NUMBER))) (SETQ \\MAIKO.IO-INTERRUPT-VECTOR (CONS (LIST (LLSH 1 SOCKET) ACCEPT-FUNCTION SOCKET ACCEPT-INFO) \\MAIKO.IO-INTERRUPT-VECTOR)) SOCKET)) +) + +(UDP-SEND +(LAMBDA (SOCKET BUFFER LEN ADDR PORT) (TCP 130 SOCKET ADDR PORT BUFFER LEN))) + +(UDP-RECV +(LAMBDA (SOCKET) (* \; "Edited 3-May-90 11:40 by jds") (* |;;| "Xall recvfrom() to get an incoming packet on a UDP socket.") (* |;;| "Returns 4 results:") (* |;;| " The 1500-byte buffer containing the packet") (* |;;| " The length of the incoming packet") (* |;;| " The address of the guy who sent it") (* |;;| " The port to answer him on (or where he sent it from)") (LET ((BUFFER (NCREATE (QUOTE VMEMPAGEP))) LEN (ADDR (\\CREATECELL \\FIXP)) (PORT (\\CREATECELL \\FIXP))) (SETQ LEN (TCP 131 SOCKET BUFFER 512 ADDR PORT)) (CL:VALUES BUFFER LEN ADDR PORT))) +) +) +(DEFINEQ + +(GETHOSTFROMNAME + (LAMBDA (NAME) (* \; "Edited 1-Feb-90 11:26 by jds") + + (* |;;| + "Given a host name, return the IP address for that host. If the host isn't found, return NIL.") + + (TCP 0 NAME))) + +(GETHOSTFROMADDR +(LAMBDA (ADDR) (* \; "Edited 6-Apr-90 20:23 by jds") (* |;;| "Given a host's IP address, return the string name of the host, or NIL if it can't be found.") (LET* ((BUF (\\ALLOCBLOCK 100 NIL)) (LEN (TCP 66 ADDR BUF))) (COND ((ZEROP LEN) NIL) (T (\\GETBASESTRING BUF 0 LEN))))) +) + +(GETHOSTFROMSOCKET + (LAMBDA (SOCKET) (* \; "Edited 1-Feb-90 11:30 by jds") + + (* |;;| "Given the socket FD of a TCP connection, return the NAME of the remote host, or NIL if it can't be found.") + + (LET* ((BUF (\\ALLOCBLOCK 100 NIL)) + (LEN (TCP 65 SOCKET BUF))) + (COND + ((ZEROP LEN) + NIL) + (T (CONCATLIST (FOR I FROM 0 TO (SUB1 LEN) COLLECT (\\GETBASEBYTE BUF I) + ))))))) + +(GETHOSTNAME +(LAMBDA NIL (* \; "Edited 6-Apr-90 20:25 by jds") (* |;;| "Given a host's IP address, return the string name of the host, or NIL if it can't be found.") (LET* ((BUF (\\ALLOCBLOCK 100 NIL)) (LEN (TCP 67 BUF))) (COND ((ZEROP LEN) NIL) (T (\\GETBASESTRING BUF 0 LEN))))) +) +) +(DECLARE\: EVAL@LOAD DONTCOPY + + + +(* |;;| "Debugging functions &c") + + +(RPAQ BUFFER (\\ALLOCBLOCK 100)) +(DEFINEQ + +(TCPRECV + (LAMBDA (PORT) + (LET ((LEN (TCP 6 PORT BUFFER 100))) + (|for| I |from| 0 |to| (SUB1 LEN) |do| (PRIN1 (CHARACTER (\\GETBASEBYTE + BUFFER I)))) + (TERPRI)))) + +(TCPSEND + (LAMBDA (PORT BASE LEN) (* \; "Edited 15-Dec-89 15:13 by jds") + (TCP 5 PORT BASE OFFSET LEN))) + +(SEEBUFFER +(LAMBDA (BUF) (|for| I |from| 0 |to| 11 |do| (PRIN1 (CHARACTER (\\GETBASEBYTE BUF I)))))) + +(FOON +(LAMBDA (INFO) (* \; "Edited 4-Apr-90 17:35 by jds") (LET ((RES (CL:MULTIPLE-VALUE-LIST (UDP-RECV (CADDR INFO))))) (AND (CADR RES) (SETQ RESULT RES)))) +) +) +) +(PUTPROPS TCPOPS COPYRIGHT ("Savoir, Inc." 1989 1990)) +(DECLARE\: DONTCOPY + (FILEMAP (NIL (1081 8055 (\\TCP-DEV-INIT 1091 . 1918) (\\TCP-OPENFILE 1920 . 3557) (\\TCP-FORCEOUTPUT +3559 . 5060) (\\TCP-GETNEXTBUFFER 5062 . 6672) (\\TCP-EOFP 6674 . 6989) (\\TCP-CLOSEFILE 6991 . 7259) +(\\TCP-EVENTFN 7261 . 7927) (\\TCP.BUFFERED.BOUTS 7929 . 8053)) (8119 11214 (TCP 8129 . 8411) ( +OPENTCPSTREAM 8413 . 9441) (TCP-ACCEPT 9443 . 10604) (TCP-LISTEN 10606 . 10889) (TCP-CLOSE 10891 . +11212)) (11215 12328 (UDP-LISTEN 11225 . 11649) (UDP-SEND 11651 . 11742) (UDP-RECV 11744 . 12326)) ( +12329 13743 (GETHOSTFROMNAME 12339 . 12608) (GETHOSTFROMADDR 12610 . 12909) (GETHOSTFROMSOCKET 12911 + . 13452) (GETHOSTNAME 13454 . 13741)) (13851 14580 (TCPRECV 13861 . 14149) (TCPSEND 14151 . 14306) ( +SEEBUFFER 14308 . 14412) (FOON 14414 . 14578))))) +STOP diff --git a/obsolete/tcp/TCPTFTP b/obsolete/tcp/TCPTFTP new file mode 100644 index 00000000..9f1b3327 --- /dev/null +++ b/obsolete/tcp/TCPTFTP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Jun-90 17:44:14" {DSK}local>lde>lispcore>library>TCPTFTP.;2 53424 changes to%: (VARS TCPTFTPCOMS) previous date%: " 1-Jul-87 10:52:03" {DSK}local>lde>lispcore>library>TCPTFTP.;1) (* ; " Copyright (c) 1986, 1987, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPTFTPCOMS) (RPAQQ TCPTFTPCOMS ((COMS (* ;; "Trivial File Transfer Protocol") (INITVARS (\TFTP.DEVICE) (TFTP.MAXRETRIES 20)) (GLOBALVARS \TFTP.DEVICE TFTP.MAXRETRIES) (DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (RECORDS TFTPCON TFTP TFTPSTREAM) (CONSTANTS (\TFTPOVLEN 4) (\TFTP.SOCKET 69)) (CONSTANTS * TFTPOPCODES))) (INITVARS (TFTP.MAXRETRIES 20)) (FNS \TFTP.ACKNOWLEDGE \TFTP.CLOSEFILE \TFTP.EOFP \TFTP.ERROR \TFTP.GETNEXTBUFFER \TFTP.INIT \TFTP.INPUT.BUFFER \TFTP.OPENFILE \TFTP.READP \TFTP.SEND.ERROR \TFTP.SETUP) (FILES (SYSLOAD) TCPUDP)) (COMS (* ;; "TFTP Server functions") (INITVARS (\TFTP.SERVER.CONNECTIONS)) (GLOBALVARS \TFTP.SERVER.CONNECTIONS) (FNS TFTP.SERVER.PROCESS \TFTP.GET.FILE \TFTP.SEND.FILE)) (COMS (* ;; "User functions") (FNS TFTP.SERVER TFTP.GET TFTP.PUT)) (COMS (* ;; "Tracing functions") (FNS PRINTTFTP \TFTP.PRINT.ACK \TFTP.PRINT.DATA \TFTP.PRINT.ERROR \TFTP.PRINT.REQUEST)) (P (\TFTP.INIT)))) (* ;; "Trivial File Transfer Protocol") (RPAQ? \TFTP.DEVICE ) (RPAQ? TFTP.MAXRETRIES 20) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TFTP.DEVICE TFTP.MAXRETRIES) ) (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (RECORD TFTPCON (UDPSOCKET DESTSOCKET STREAM HOST)) (ACCESSFNS TFTP ((TFTPBASE (fetch (UDP UDPCONTENTS) of DATUM))) (BLOCKRECORD TFTPBASE ((OPCODE WORD) (BLOCK# WORD))) [ACCESSFNS TFTP ((TFTPCONTENTS (\ADDBASE (fetch (UDP UDPCONTENTS) of DATUM) (FOLDHI \TFTPOVLEN BYTESPERWORD] (BLOCKRECORD TFTPBASE ((NIL WORD) (ERRORCODE WORD)))) (ACCESSFNS TFTPSTREAM ((TFTPCON (fetch (STREAM F1) of DATUM) (replace (STREAM F1) of DATUM with NEWVALUE)) (LASTPACKETIN (fetch (STREAM F2) of DATUM) (replace (STREAM F2) of DATUM with NEWVALUE)))) ) (DECLARE%: EVAL@COMPILE (RPAQQ \TFTPOVLEN 4) (RPAQQ \TFTP.SOCKET 69) (CONSTANTS (\TFTPOVLEN 4) (\TFTP.SOCKET 69)) ) (RPAQQ TFTPOPCODES ((\TFTP.RRQ 1) (\TFTP.WRQ 2) (\TFTP.DATA 3) (\TFTP.ACK 4) (\TFTP.ERROR 5))) (DECLARE%: EVAL@COMPILE (RPAQQ \TFTP.RRQ 1) (RPAQQ \TFTP.WRQ 2) (RPAQQ \TFTP.DATA 3) (RPAQQ \TFTP.ACK 4) (RPAQQ \TFTP.ERROR 5) (CONSTANTS (\TFTP.RRQ 1) (\TFTP.WRQ 2) (\TFTP.DATA 3) (\TFTP.ACK 4) (\TFTP.ERROR 5)) ) (* "END EXPORTED DEFINITIONS") ) (RPAQ? TFTP.MAXRETRIES 20) (DEFINEQ (\TFTP.ACKNOWLEDGE [LAMBDA (STREAM ACK#) (* MPL " 2-Jun-85 17:07") (LET ((TFTPCON (fetch (TFTPSTREAM TFTPCON) of STREAM)) (ACK (\ALLOCATE.ETHERPACKET))) (\TFTP.SETUP ACK TFTPCON \TFTP.ACK 'FREE) (UDP.APPEND.WORD ACK ACK#) (UDP.SEND (fetch (TFTPCON UDPSOCKET) of TFTPCON) ACK) (BLOCK) (COND ((AND (EQ (fetch (STREAM ACCESS) of STREAM) 'INPUT) (fetch (TFTPSTREAM LASTPACKETIN) of STREAM)) (UDP.CLOSE.SOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON]) (\TFTP.CLOSEFILE [LAMBDA (STREAM) (* ejs%: " 9-Feb-85 23:47") (LET ((TFTPCON (fetch (TFTPSTREAM TFTPCON) of STREAM))) (SELECTQ (fetch (STREAM ACCESS) of STREAM) (OUTPUT [COND ((AND (fetch (STREAM CBUFPTR) of STREAM) (NOT (fetch (TFTPSTREAM LASTPACKETIN) of STREAM))) (\TFTP.GETNEXTBUFFER STREAM 'WRITE]) NIL) (UDP.CLOSE.SOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON) T) (replace (STREAM ACCESS) of STREAM with NIL) STREAM]) (\TFTP.EOFP [LAMBDA (STREAM) (* ejs%: " 9-Feb-85 21:23") (OR (NULL (fetch (STREAM CBUFPTR) of STREAM)) (AND (fetch (TFTPSTREAM LASTPACKETIN) of STREAM) (EQ (fetch (STREAM COFFSET) of STREAM) (fetch (STREAM CBUFSIZE) of STREAM]) (\TFTP.ERROR [LAMBDA (TFTP TFTPCON) (* ejs%: " 9-Feb-85 19:04") (* * Called upon receipt of error packet in TFTP stream) (LET [(ERRORSTRING (ALLOCSTRING (IDIFFERENCE (fetch (UDP UDPLENGTH) of TFTP) (CONSTANT (IPLUS \UDPOVLEN (ADD1 \TFTPOVLEN] (\MOVEBYTES (fetch (TFTP TFTPCONTENTS) of TFTP) 0 (fetch (STRINGP BASE) of ERRORSTRING) (fetch (STRINGP OFFST) of ERRORSTRING) (fetch (STRINGP LENGTH) of ERRORSTRING)) (ERROR (CONCAT "TFTP error message: " ERRORSTRING " for code") (fetch (TFTP ERRORCODE) of TFTP]) (\TFTP.GETNEXTBUFFER [LAMBDA (STREAM WHATFOR NOERRORFLG) (* MPL " 2-Jun-85 19:48") (DECLARE (GLOBALVARS TFTP.MAXRETRIES)) (LET* ((TFTPCON (fetch (TFTPSTREAM TFTPCON) of STREAM)) (IPSOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (RETRYCOUNT 0) (BUFFER (fetch (STREAM CBUFPTR) of STREAM)) UDP) (SELECTQ WHATFOR (READ [COND [(fetch (TFTPSTREAM LASTPACKETIN) of STREAM) (replace (STREAM ACCESS) of STREAM with NIL) (\RELEASE.ETHERPACKET (fetch (STREAM CBUFPTR) of STREAM)) (replace (STREAM CBUFPTR) of STREAM with NIL) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM] (T (PROG [(NEXT# (COND (BUFFER (ADD1 (fetch (TFTP BLOCK#) of BUFFER))) (T 1] LP [for I from 1 to TFTP.MAXRETRIES until UDP do (SETQ UDP (UDP.GET IPSOCKET \ETHERTIMEOUT)) (COND ((NOT UDP) (\TFTP.ACKNOWLEDGE STREAM (SUB1 NEXT#] (COND [UDP (COND [(EQ (fetch (TFTP OPCODE) of UDP) \TFTP.DATA) (COND ((IEQP (fetch (TFTP BLOCK#) of UDP) NEXT#) (\TFTP.INPUT.BUFFER STREAM UDP) (\TFTP.ACKNOWLEDGE STREAM NEXT#) (RETURN T)) [(ILESSP (fetch (TFTP BLOCK#) of UDP) NEXT#) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (printout IPTRACEFILE "Retransmitting ACK for block " (SUB1 NEXT#) T)) (T (PRIN1 "R" IPTRACEFILE] (\TFTP.ACKNOWLEDGE STREAM (SUB1 NEXT#)) (\RELEASE.ETHERPACKET UDP) (SETQ UDP NIL) (COND ((EQ (add RETRYCOUNT 1) TFTP.MAXRETRIES) (\TFTP.SEND.ERROR TFTPCON 0 "Timeout awaiting next data packet; aborting") (replace (STREAM STRMBINFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (ERROR "Timeout awaiting next data packet; aborting" STREAM)) (T (GO LP] (T (\TFTP.SEND.ERROR TFTPCON 0 "Protocol error: Block # too high. Aborting...") (replace (STREAM STRMBINFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (ERROR "Protocol error: Block # too high. Aborting..." STREAM] ((EQ (fetch (TFTP OPCODE) of UDP) \TFTP.ERROR) (replace (STREAM STRMBINFN) of STREAM with (FUNCTION STREAM.NOT.OPEN)) (\TFTP.ERROR UDP TFTPCON)) (T [\TFTP.SEND.ERROR TFTPCON 0 (CONCAT "Protocol error: Illegal TFTP opcode, expected DATA but got " (SELECTC (fetch (TFTP OPCODE) of UDP) (\TFTP.RRQ "read request.") (\TFTP.WRQ "write request.") (\TFTP.ACK "ack.") (CONCAT "unknown type " (fetch (TFTP OPCODE) of UDP) "."] (replace (STREAM STRMBINFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (ERROR "Illegal TFTP opcode rec'd" STREAM] (T (\TFTP.SEND.ERROR TFTPCON 0 "Timeout awaiting next data packet; aborting") (replace (STREAM STRMBINFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (ERROR "Timeout awaiting next data packet; aborting" STREAM]) (WRITE [COND [(fetch (TFTPSTREAM LASTPACKETIN) of STREAM) (replace (STREAM ACCESS) of STREAM with NIL) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM] (T (PROG (ACK# NBYTES) (SETQ ACK# (fetch (TFTP BLOCK#) of BUFFER)) (SETQ NBYTES (IDIFFERENCE (fetch (STREAM COFFSET) of STREAM) (UNFOLD (IDIFFERENCE (\LOLOC (fetch (TFTP TFTPCONTENTS ) of BUFFER)) (\LOLOC BUFFER)) BYTESPERWORD))) [replace (IP IPTOTALLENGTH) of BUFFER with (IPLUS NBYTES (CONSTANT (IPLUS \UDPOVLEN \TFTPOVLEN \IPOVLEN] [replace (UDP UDPLENGTH) of BUFFER with (IPLUS NBYTES (CONSTANT (IPLUS \UDPOVLEN \TFTPOVLEN ] (COND ((ILESSP NBYTES 512) (replace (TFTPSTREAM LASTPACKETIN) of STREAM with T))) LP (for I from 1 to TFTP.MAXRETRIES until UDP do (SETQ UDP (UDP.EXCHANGE IPSOCKET BUFFER))) (COND [(AND UDP (EQ (fetch (TFTP OPCODE) of UDP) \TFTP.ACK)) (COND ((EQ (fetch (TFTP BLOCK#) of UDP) ACK#) [COND ((EQ NBYTES 512) (\TFTP.SETUP UDP TFTPCON \TFTP.DATA NIL) (UDP.APPEND.WORD UDP (ADD1 ACK#)) (replace (UDP UDPLENGTH) of UDP with (CONSTANT (IPLUS 512 \UDPOVLEN \TFTPOVLEN))) (\TFTP.INPUT.BUFFER STREAM UDP)) (T (replace (STREAM CBUFPTR) of STREAM with NIL) (replace (STREAM ACCESS) of STREAM with NIL) (UDP.CLOSE.SOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON] (RETURN T)) [(ILESSP (fetch (TFTP BLOCK#) of UDP) ACK#) [COND (IPTRACEFLG (COND ((EQ IPTRACEFLG T) (printout IPTRACEFILE "TFTP retransmission on block# " ACK# T )) (T (PRIN1 "R" IPTRACEFILE] (\RELEASE.ETHERPACKET UDP) (SETQ UDP NIL) (COND [(EQ (add RETRYCOUNT 1) TFTP.MAXRETRIES) (\TFTP.SEND.ERROR TFTPCON 0 "Timeout awaiting acknowledgement. Aborting...") (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM] (T (GO LP] (T (\TFTP.SEND.ERROR TFTPCON 0 "Protocol error: Block # too high. Aborting...") (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM] ((AND UDP (EQ (fetch (TFTP OPCODE) of UDP) \TFTP.ERROR)) (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (\TFTP.ERROR UDP TFTPCON)) [UDP [\TFTP.SEND.ERROR TFTPCON 0 (CONCAT "Protocol error: Illegal TFTP opcode, expected ACK but got " (SELECTC (fetch (TFTP OPCODE) of UDP) (\TFTP.RRQ "read request.") (\TFTP.WRQ "write request.") (\TFTP.DATA "data.") (CONCAT "unknown type " (fetch (TFTP OPCODE) of UDP) "."] (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM] (T (\TFTP.SEND.ERROR TFTPCON 0 "Protocol error, aborting...") (replace (STREAM STRMBOUTFN) of STREAM with (FUNCTION \STREAM.NOT.OPEN)) (COND (NOERRORFLG NIL) (T (\EOF.ACTION STREAM]) (ERROR "Illegal ACCESS" WHATFOR]) (\TFTP.INIT [LAMBDA NIL (* ejs%: " 2-Feb-86 12:00") (DECLARE (GLOBALVARS \TFTP.DEVICE)) (OR \TFTP.DEVICE (\DEFINEDEVICE NIL (SETQ \TFTP.DEVICE (create FDEV FDBINABLE _ T FDBOUTABLE _ T NODIRECTORIES _ T RESETABLE _ NIL RANDOMACCESSP _ NIL BUFFERED _ T PAGEMAPPED _ NIL DEVICENAME _ 'TFTP HOSTNAMEP _ (FUNCTION NILL) EVENTFN _ (FUNCTION NILL) FORCEOUTPUT _ (FUNCTION NILL) BIN _ (FUNCTION \BUFFERED.BIN) BOUT _ (FUNCTION \BUFFERED.BOUT) GETNEXTBUFFER _ (FUNCTION \TFTP.GETNEXTBUFFER) READP _ (FUNCTION \TFTP.READP) EOFP _ (FUNCTION \TFTP.EOFP) CLOSEFILE _ (FUNCTION \TFTP.CLOSEFILE]) (\TFTP.INPUT.BUFFER [LAMBDA (STREAM UDP) (* ejs%: " 9-Feb-85 20:51") (* * Sets up the fields of the stream necessary to support buffered operation,  with UDP as the next packet) (LET [(OFFSET (UNFOLD (IDIFFERENCE (\LOLOC (fetch (TFTP TFTPCONTENTS) of UDP)) (\LOLOC UDP)) BYTESPERWORD)) (LENGTH (IDIFFERENCE (fetch (UDP UDPLENGTH) of UDP) (CONSTANT (IPLUS \UDPOVLEN \TFTPOVLEN] [COND ((type? ETHERPACKET (fetch (STREAM CBUFPTR) of STREAM)) (\RELEASE.ETHERPACKET (fetch (STREAM CBUFPTR) of STREAM] (replace (STREAM CBUFPTR) of STREAM with UDP) (replace (STREAM COFFSET) of STREAM with OFFSET) (replace (STREAM CBUFSIZE) of STREAM with (replace (STREAM CBUFMAXSIZE) of STREAM with (IPLUS OFFSET LENGTH))) (COND ((ILESSP LENGTH 512) (replace (TFTPSTREAM LASTPACKETIN) of STREAM with T]) (\TFTP.OPENFILE [LAMBDA (FILENAME ACCESS RECOG PARAMETERS) (* ejs%: "15-Sep-85 17:48") (* * Open a file using TFTP) (LET* ((HOSTNAME (FILENAMEFIELD FILENAME 'HOST)) [DEVICE (COND ((DODIP.HOSTP HOSTNAME) (create FDEV using \TFTP.DEVICE DEVICENAME _ HOSTNAME)) (T (ERROR "Unknown IP host: " HOSTNAME] (STREAM (create STREAM DEVICE _ DEVICE)) [TFTPCON (replace (FDEV DEVICEINFO) of DEVICE with (create TFTPCON UDPSOCKET _ (UDP.OPEN.SOCKET) STREAM _ STREAM HOST _ (DODIP.HOSTP HOSTNAME] (UDP (\ALLOCATE.ETHERPACKET)) UDPIN) (RESETLST (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (SOCKET) (AND RESETSTATE (UDP.CLOSE.SOCKET SOCKET T] (fetch (TFTPCON UDPSOCKET) of TFTPCON))) (replace (TFTPCON DESTSOCKET) of TFTPCON with \TFTP.SOCKET) (\TFTP.SETUP UDP TFTPCON (SELECTQ ACCESS (INPUT \TFTP.RRQ) (OUTPUT \TFTP.WRQ) (ERROR "ACCESS must be INPUT or OUTPUT" ACCESS))) (UDP.APPEND.STRING UDP (SUBATOM FILENAME (STRPOS '} FILENAME NIL NIL NIL T))) (UDP.APPEND.BYTE UDP 0) (UDP.APPEND.STRING UDP (COND ((EQ (CADR (FASSOC 'TYPE PARAMETERS)) 'BINARY) "OCTET") (T "NETASCII"))) (UDP.APPEND.BYTE UDP 0) (for I from 1 to \MAXETHERTRIES do (SETQ UDPIN (UDP.EXCHANGE (fetch (TFTPCON UDPSOCKET ) of TFTPCON) UDP)) until UDPIN finally (\RELEASE.ETHERPACKET UDP)) (COND [UDPIN (SELECTC (fetch (TFTP OPCODE) of UDPIN) (\TFTP.ACK (COND ((AND (EQ ACCESS 'OUTPUT) (EQ (fetch (TFTP BLOCK#) of UDPIN) 0)) (replace (TFTPSTREAM TFTPCON) of STREAM with TFTPCON) (replace (STREAM ACCESS) of STREAM with ACCESS) (replace (STREAM FULLFILENAME) of STREAM with FILENAME) (replace (TFTPCON DESTSOCKET) of TFTPCON with (fetch (UDP UDPSOURCEPORT) of UDPIN)) (\TFTP.SETUP UDPIN TFTPCON \TFTP.DATA NIL) (UDP.APPEND.WORD UDPIN 1) (add (fetch (UDP UDPLENGTH) of UDPIN) 512) (\TFTP.INPUT.BUFFER STREAM UDPIN) STREAM))) (\TFTP.DATA (COND ((AND (EQ ACCESS 'INPUT) (EQ (fetch (TFTP BLOCK#) of UDPIN) 1)) (replace (TFTPSTREAM TFTPCON) of STREAM with TFTPCON) (replace (STREAM ACCESS) of STREAM with ACCESS) (replace (STREAM FULLFILENAME) of STREAM with FILENAME ) (replace (TFTPCON DESTSOCKET) of TFTPCON with (fetch (UDP UDPSOURCEPORT) of UDPIN)) (\TFTP.INPUT.BUFFER STREAM UDPIN) (\TFTP.ACKNOWLEDGE STREAM 1) STREAM))) (\TFTP.ERROR (\TFTP.ERROR UDPIN)) (ERROR "Unknown TFTP opcode" (fetch (TFTP OPCODE) of UDPIN] (T (UDP.CLOSE.SOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON) T) NIL]) (\TFTP.READP [LAMBDA (STREAM) (* ejs%: " 9-Feb-85 20:48") (ILESSP (fetch (STREAM COFFSET) of STREAM) (fetch (STREAM CBUFSIZE) of STREAM]) (\TFTP.SEND.ERROR [LAMBDA (TFTPCON ERRORCODE ERRORSTRING) (* ejs%: " 1-Jun-85 15:34") (* * Send an error back to the requestor) (LET ((TFTP (\ALLOCATE.ETHERPACKET))) (\TFTP.SETUP TFTP TFTPCON \TFTP.ERROR NIL) (UDP.APPEND.WORD TFTP ERRORCODE) (UDP.APPEND.STRING TFTP ERRORSTRING) (UDP.APPEND.BYTE TFTP 0) (UDP.SEND (fetch (TFTPCON UDPSOCKET) of TFTPCON) TFTP]) (\TFTP.SETUP [LAMBDA (UDP TFTPCON OPCODE REQUEUE) (* ejs%: " 9-Feb-85 20:32") (UDP.SETUP UDP (fetch (TFTPCON HOST) of TFTPCON) (fetch (TFTPCON DESTSOCKET) of TFTPCON) 0 (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (replace EPREQUEUE of UDP with REQUEUE) (UDP.APPEND.WORD UDP OPCODE]) ) (FILESLOAD (SYSLOAD) TCPUDP) (* ;; "TFTP Server functions") (RPAQ? \TFTP.SERVER.CONNECTIONS ) (DECLARE%: DOEVAL@COMPILE DONTCOPY (GLOBALVARS \TFTP.SERVER.CONNECTIONS) ) (DEFINEQ (TFTP.SERVER.PROCESS [LAMBDA (LOGSTREAM) (* ejs%: " 3-Jun-85 01:52") (* * A server for TFTP file transfer) (DECLARE (GLOBALVARS \TFTP.SERVER.CONNECTIONS)) (LET* ((DEVICE (create FDEV using \TFTP.DEVICE DEVICENAME _ 'TFTPSERVER)) (SERVERSOCKET (UDP.OPEN.SOCKET \TFTP.SOCKET T)) CONNECTION) [COND ((NULL LOGSTREAM) (COND ((NOT (HASTTYWINDOWP)) (\CREATE.TTYDISPLAYSTREAM))) (SETQ LOGSTREAM (TTYDISPLAYSTREAM] (SETQ \TFTP.SERVER.CONNECTIONS NIL) (COND (SERVERSOCKET (RESETLST (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (SOCKET) (UDP.CLOSE.SOCKET SOCKET T] SERVERSOCKET)) (while T do (LET ((UDP (UDP.GET SERVERSOCKET T))) (SETQ CONNECTION (CONS (fetch (IP IPSOURCEADDRESS) of UDP) (fetch (UDP UDPSOURCEPORT) of UDP))) (COND [(NOT (MEMBER CONNECTION \TFTP.SERVER.CONNECTIONS)) (push \TFTP.SERVER.CONNECTIONS CONNECTION) (SELECTC (fetch (TFTP OPCODE) of UDP) (\TFTP.RRQ (ADD.PROCESS `(\TFTP.SEND.FILE %, UDP (QUOTE %, (create TFTPCON UDPSOCKET _ (UDP.OPEN.SOCKET) )) %, DEVICE %, LOGSTREAM))) (\TFTP.WRQ (ADD.PROCESS `(\TFTP.GET.FILE %, UDP (QUOTE %, (create TFTPCON UDPSOCKET _ (UDP.OPEN.SOCKET) )) %, DEVICE %, LOGSTREAM))) (PROGN (printout LOGSTREAM "TFTP Server: Unexpected opcode " (fetch (TFTP OPCODE) of UDP) T) (SETQ \TFTP.SERVER.CONNECTIONS (DREMOVE CONNECTION \TFTP.SERVER.CONNECTIONS )) (\RELEASE.ETHERPACKET UDP] (T (* Duplicate request) (\RELEASE.ETHERPACKET UDP]) (\TFTP.GET.FILE [LAMBDA (UDP TFTPCON DEVICE LOGSTREAM) (* ; "Edited 14-Apr-87 20:19 by FS") (* ;; "Try to start receiving a file from the requestor as directed by the contents of the received UDP packet") (DECLARE (GLOBALVARS \TFTP.SERVER.CONNECTIONS)) (LET* ([FILENAMELENGTH (for I from BYTESPERWORD until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of UDP) I)) finally (RETURN (IDIFFERENCE I BYTESPERWORD] (FILENAME (ALLOCSTRING FILENAMELENGTH)) [MODELENGTH (for I from (IPLUS BYTESPERWORD FILENAMELENGTH 1) until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of UDP) I)) finally (RETURN (IDIFFERENCE I (IPLUS BYTESPERWORD FILENAMELENGTH 1] (MODE (ALLOCSTRING MODELENGTH)) (HOST (fetch (IP IPSOURCEADDRESS) of UDP)) FILE TYPE TFTPSTREAM RESULT) (RESETLST (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (TFTPCON) (LET* [(UDPSOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (CONNECTION (CONS (fetch (TFTPCON HOST) of TFTPCON) (fetch (TFTPCON DESTSOCKET ) of TFTPCON] (SETQ \TFTP.SERVER.CONNECTIONS (REMOVE CONNECTION \TFTP.SERVER.CONNECTIONS)) (AND RESETSTATE (UDP.CLOSE.SOCKET UDPSOCKET T] TFTPCON)) (replace (TFTPCON DESTSOCKET) of TFTPCON with (fetch (UDP UDPSOURCEPORT) of UDP)) (replace (TFTPCON HOST) of TFTPCON with HOST) (* ;; "Read the filename out of the packet") (\MOVEBYTES (fetch (TFTP TFTPBASE) of UDP) BYTESPERWORD (fetch (STRINGP BASE) of FILENAME) (fetch (STRINGP OFFST) of FILENAME) FILENAMELENGTH) (* ;; "Read the mode out of the packet") (\MOVEBYTES (fetch (TFTP TFTPBASE) of UDP) (IPLUS BYTESPERWORD FILENAMELENGTH 1) (fetch (STRINGP BASE) of MODE) (fetch (STRINGP OFFST) of MODE) MODELENGTH) (SETQ MODE (U-CASE MODE)) (printout LOGSTREAM "TFTP Server: Will attempt to receive " FILENAME " in " MODE " mode from host " (\IP.ADDRESS.TO.STRING HOST) T) (SETQ RESULT (COND [[AND (SETQ TYPE (COND ((STREQUAL MODE "NETASCII") 'TEXT) ((STREQUAL MODE "OCTET") 'BINARY) (T (\TFTP.SEND.ERROR TFTPCON 0 (CONCAT "Unknown transfer type--" MODE)) NIL))) (SETQ FILE (LET [(OUTSTREAM (CAR (NLSETQ (OPENSTREAM FILENAME 'OUTPUT 'NEW (LIST (LIST 'TYPE TYPE] (COND ((NULL OUTSTREAM) (\TFTP.SEND.ERROR TFTPCON 1 (CONCAT "Can't open file--" FILENAME)) NIL) (T OUTSTREAM] (* ;; "Mode is OK, and file is open for input. Open the TFTP stream back to the requestor") (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (FILE) (COND (RESETSTATE (CLOSEF? FILE) (DELFILE (FULLNAME FILE] FILE)) (SETQ TFTPSTREAM (create STREAM DEVICE _ DEVICE)) (replace (TFTPCON STREAM) of TFTPCON with TFTPSTREAM) (replace (STREAM ACCESS) of TFTPSTREAM with 'INPUT) (replace (TFTPSTREAM TFTPCON) of TFTPSTREAM with TFTPCON) (* ;; "Send the first acknowledgement") (\TFTP.ACKNOWLEDGE TFTPSTREAM 0) (\RELEASE.ETHERPACKET UDP) (printout LOGSTREAM "TFTP Server: receiving " (FULLNAME FILE) T) (COND ((NLSETQ (COPYBYTES TFTPSTREAM FILE)) (printout LOGSTREAM "TFTP Server: Done receiving " (FULLNAME FILE) T) (CLOSEF? FILE)) (T (printout LOGSTREAM "TFTP Server: Failed to receive " (FULLNAME FILE) T) (DELFILE (FULLNAME (CLOSEF? FILE] (T (printout LOGSTREAM "TFTP Server: Failed to receive " (FULLNAME FILE) T) (\RELEASE.ETHERPACKET UDP) NIL))) (* ;; "Remove connection from list.") (LET (UDPSOCKET CONNECTION) (SETQ UDPSOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (SETQ CONNECTION (CONS (fetch (TFTPCON HOST) of TFTPCON) (fetch (UDP UDPDESTPORT) of UDPSOCKET))) (SETQ \TFTP.SERVER.CONNECTIONS (REMOVE CONNECTION \TFTP.SERVER.CONNECTIONS))) RESULT]) (\TFTP.SEND.FILE [LAMBDA (UDP TFTPCON DEVICE LOGSTREAM) (* ; "Edited 30-Jun-87 22:12 by scp") (* ;; "Try to start sending a file to the requestor as directed by the contents of the received UDP packet") (DECLARE (GLOBALVARS \TFTP.SERVER.CONNECTIONS)) (LET* ([FILENAMELENGTH (for I from BYTESPERWORD until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of UDP) I)) finally (RETURN (IDIFFERENCE I BYTESPERWORD] (FILENAME (ALLOCSTRING FILENAMELENGTH)) [MODELENGTH (for I from (IPLUS BYTESPERWORD FILENAMELENGTH 1) until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of UDP) I)) finally (RETURN (IDIFFERENCE I (IPLUS BYTESPERWORD FILENAMELENGTH 1] (MODE (ALLOCSTRING MODELENGTH)) (HOST (fetch (IP IPSOURCEADDRESS) of UDP)) FILE TYPE TFTPSTREAM RESULT) (RESETLST (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (TFTPCON) (LET* [(UDPSOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (CONNECTION (CONS (fetch (TFTPCON HOST) of TFTPCON) (fetch (TFTPCON DESTSOCKET) of TFTPCON] (SETQ \TFTP.SERVER.CONNECTIONS (REMOVE CONNECTION \TFTP.SERVER.CONNECTIONS )) (AND RESETSTATE (UDP.CLOSE.SOCKET UDPSOCKET T] TFTPCON)) (replace (TFTPCON DESTSOCKET) of TFTPCON with (fetch (UDP UDPSOURCEPORT) of UDP)) (replace (TFTPCON HOST) of TFTPCON with HOST) (* ;; "Read the filename out of the packet") (\MOVEBYTES (fetch (TFTP TFTPBASE) of UDP) BYTESPERWORD (fetch (STRINGP BASE) of FILENAME) (fetch (STRINGP OFFST) of FILENAME) FILENAMELENGTH) (* ;; "Read the mode out of the packet") (\MOVEBYTES (fetch (TFTP TFTPBASE) of UDP) (IPLUS BYTESPERWORD FILENAMELENGTH 1) (fetch (STRINGP BASE) of MODE) (fetch (STRINGP OFFST) of MODE) MODELENGTH) (SETQ MODE (U-CASE MODE)) (printout LOGSTREAM "TFTP Server: Will attempt to send " FILENAME " in " MODE " mode to host " (\IP.ADDRESS.TO.STRING HOST) T) (SETQ RESULT (COND ([AND (SETQ TYPE (COND ((STREQUAL MODE "NETASCII") 'TEXT) ((STREQUAL MODE "OCTET") 'BINARY) (T (\TFTP.SEND.ERROR TFTPCON 0 (CONCAT "Unknown transfer type--" MODE)) NIL))) (SETQ FILE (LET* [(FULLFILENAME (INFILEP FILENAME)) (INSTREAM (AND FULLFILENAME (CAR (NLSETQ (OPENSTREAM FULLFILENAME 'INPUT 'OLD (LIST (LIST 'TYPE TYPE] (COND ((NULL INSTREAM) (\TFTP.SEND.ERROR TFTPCON 1 (CONCAT "Can't open file--" FILENAME)) NIL) (T INSTREAM] (* ;; "Mode is OK, and file is open for input. Open the TFTP stream back to the requestor") (SETQ TFTPSTREAM (create STREAM DEVICE _ DEVICE)) (replace (TFTPCON STREAM) of TFTPCON with TFTPSTREAM) (replace (STREAM ACCESS) of TFTPSTREAM with 'OUTPUT) (replace (TFTPSTREAM TFTPCON) of TFTPSTREAM with TFTPCON) (* ;; "Use the incoming packet as the first data packet on the way out") (\TFTP.SETUP UDP TFTPCON \TFTP.DATA NIL) (* ;; "This is block number 1") (UDP.APPEND.WORD UDP 1) (add (fetch (UDP UDPLENGTH) of UDP) 512) (\TFTP.INPUT.BUFFER TFTPSTREAM UDP) (printout LOGSTREAM "TFTP Server: Sending " FILENAME T) (COND ((NLSETQ (PROGN (COPYBYTES FILE TFTPSTREAM) (\TFTP.GETNEXTBUFFER TFTPSTREAM 'WRITE T) (\TFTP.CLOSEFILE TFTPSTREAM))) (printout LOGSTREAM "TFTP Server: Done sending " FILENAME T)) (T (printout LOGSTREAM "TFTP Server: Failed to send " FILENAME T))) (CLOSEF? FILE)) (T (printout LOGSTREAM "TFTP Server: Failed to send " FILENAME T) (\RELEASE.ETHERPACKET UDP) NIL))) (* ;; "Remove connection from list.") (LET (UDPSOCKET CONNECTION) (SETQ UDPSOCKET (fetch (TFTPCON UDPSOCKET) of TFTPCON)) (SETQ CONNECTION (CONS (fetch (TFTPCON HOST) of TFTPCON) (fetch (UDP UDPDESTPORT) of UDPSOCKET))) (SETQ \TFTP.SERVER.CONNECTIONS (REMOVE CONNECTION \TFTP.SERVER.CONNECTIONS))) RESULT]) ) (* ;; "User functions") (DEFINEQ (TFTP.SERVER [LAMBDA (LOGSTREAM) (* MPL " 2-Jun-85 19:39") (* * Create a new TFTP server. LOGSTREAM defaults to a popup window) (ADD.PROCESS `(TFTP.SERVER.PROCESS %, LOGSTREAM) 'RESTARTABLE 'HARDRESET]) (TFTP.GET [LAMBDA (FROM TO PARAMETERS) (* MPL " 2-Jun-85 17:15") (LET ((EOLCONVENTION (CADR (FASSOC 'EOLCONVENTION PARAMETERS))) (TYPE (FASSOC 'TYPE PARAMETERS)) (FROMNAME FROM) (TONAME TO)) (RESETLST [SETQ TO (OPENSTREAM TO 'OUTPUT 'NEW NIL (COND (TYPE (LIST TYPE] (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (STREAM) (COND ((AND STREAM RESETSTATE) (CLOSEF? STREAM) (DELFILE (FULLNAME STREAM] TO)) (SETQ FROM (\TFTP.OPENFILE FROM 'INPUT 'OLD PARAMETERS)) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (STREAM) (AND STREAM RESETSTATE (CLOSEF STREAM] FROM)) (COND (EOLCONVENTION (replace (STREAM EOLCONVENTION) of FROM with EOLCONVENTION))) (COND ((AND FROM TO) (COPYCHARS FROM TO) (AND (OPENP FROM) (CLOSEF FROM)) (FULLNAME (CLOSEF TO))) (TO (ERRORX (LIST 9 FROMNAME))) (FROM (ERRORX (LIST 9 TONAME]) (TFTP.PUT [LAMBDA (FROM TO PARAMETERS) (* ; "Edited 15-Apr-87 20:55 by FS") (LET ((EOLCONVENTION (CADR (FASSOC 'EOLCONVENTION PARAMETERS))) (TYPE (FASSOC 'TYPE PARAMETERS))) (* ;; "Why is TYPE not used anywhere?") (RESETLST (SETQ FROM (OPENSTREAM FROM 'INPUT 'OLD)) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (STREAM) (AND RESETSTATE (CLOSEF STREAM] FROM)) (SETQ TO (\TFTP.OPENFILE TO 'OUTPUT 'NEW PARAMETERS)) (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (STREAM) (AND RESETSTATE (CLOSEF STREAM] TO)) (COND (EOLCONVENTION (replace (STREAM EOLCONVENTION) of TO with EOLCONVENTION))) (COPYCHARS FROM TO) (CLOSEF FROM) (* ;; "Removed (FULLNAME (CLOSEF TO))") (CLOSEF TO]) ) (* ;; "Tracing functions") (DEFINEQ (PRINTTFTP [LAMBDA (TFTP FILE) (* ejs%: " 2-Jun-85 14:00") (DECLARE (GLOBALVARS TFTPOPCODES)) (PRINTCONSTANT (fetch (TFTP OPCODE) of TFTP) TFTPOPCODES FILE "TFTP Opcode: ") (SELECTC (fetch (TFTP OPCODE) of TFTP) (\TFTP.RRQ (printout FILE " ") (\TFTP.PRINT.REQUEST TFTP FILE)) (\TFTP.WRQ (printout FILE " ") (\TFTP.PRINT.REQUEST TFTP FILE)) (\TFTP.ACK (printout FILE " ") (\TFTP.PRINT.ACK TFTP FILE)) (\TFTP.DATA (printout FILE " ") (\TFTP.PRINT.DATA TFTP FILE)) (\TFTP.ERROR (printout FILE " ") (\TFTP.PRINT.ERROR TFTP FILE)) NIL) (TERPRI FILE) (TERPRI FILE]) (\TFTP.PRINT.ACK [LAMBDA (TFTP FILE) (* ejs%: " 2-Jun-85 12:48") (printout FILE "Block #: " (fetch (TFTP BLOCK#) of TFTP) T]) (\TFTP.PRINT.DATA [LAMBDA (TFTP FILE) (* ejs%: " 2-Jun-85 14:00") (printout FILE "Block #: " (fetch (TFTP BLOCK#) of TFTP) T) (PRINTPACKETDATA (fetch (TFTP TFTPCONTENTS) of TFTP) \TFTPOVLEN '(CHARS 12 |...|) (IDIFFERENCE (fetch (UDP UDPLENGTH) of TFTP) (CONSTANT (IPLUS \TFTPOVLEN \UDPOVLEN]) (\TFTP.PRINT.ERROR [LAMBDA (TFTP FILE) (* ejs%: " 2-Jun-85 13:15") (printout FILE "Error code: " (fetch (TFTP ERRORCODE) of TFTP) T) (PRINTPACKETDATA (fetch (TFTP TFTPCONTENTS) of TFTP) 0 '(CHARS |...|) (IDIFFERENCE (fetch (UDP UDPLENGTH) of TFTP) (CONSTANT (IPLUS \UDPOVLEN \TFTPOVLEN))) FILE]) (\TFTP.PRINT.REQUEST [LAMBDA (TFTP FILE) (* ejs%: " 2-Jun-85 13:16") (* * Try to start sending a file to the requestor as directed by the contents  of the received TFTP packet) (LET* ([FILENAMELENGTH (for I from BYTESPERWORD until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of TFTP) I)) finally (RETURN (IDIFFERENCE I BYTESPERWORD] (FILENAME (ALLOCSTRING FILENAMELENGTH)) [MODELENGTH (for I from (IPLUS BYTESPERWORD FILENAMELENGTH 1) until (EQ 0 (\GETBASEBYTE (fetch (TFTP TFTPBASE) of TFTP) I)) finally (RETURN (IDIFFERENCE I (IPLUS BYTESPERWORD FILENAMELENGTH 1] (MODE (ALLOCSTRING MODELENGTH))) (* * Read the filename out of the packet) (\MOVEBYTES (fetch (TFTP TFTPBASE) of TFTP) BYTESPERWORD (fetch (STRINGP BASE) of FILENAME) (fetch (STRINGP OFFST) of FILENAME) FILENAMELENGTH) (* * Read the mode out of the packet) (\MOVEBYTES (fetch (TFTP TFTPBASE) of TFTP) (IPLUS BYTESPERWORD FILENAMELENGTH 1) (fetch (STRINGP BASE) of MODE) (fetch (STRINGP OFFST) of MODE) MODELENGTH) (printout FILE (SELECTC (fetch (TFTP OPCODE) of TFTP) (\TFTP.RRQ "Read request for ") (\TFTP.WRQ "Write request for ") (SHOULDNT)) FILENAME " in mode " MODE T]) ) (\TFTP.INIT) (PUTPROPS TCPTFTP COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (3785 28418 (\TFTP.ACKNOWLEDGE 3795 . 4474) (\TFTP.CLOSEFILE 4476 . 5171) (\TFTP.EOFP 5173 . 5530) (\TFTP.ERROR 5532 . 6308) (\TFTP.GETNEXTBUFFER 6310 . 19593) (\TFTP.INIT 19595 . 20684) ( \TFTP.INPUT.BUFFER 20686 . 21902) (\TFTP.OPENFILE 21904 . 27296) (\TFTP.READP 27298 . 27522) ( \TFTP.SEND.ERROR 27524 . 28019) (\TFTP.SETUP 28021 . 28416)) (28610 46223 (TFTP.SERVER.PROCESS 28620 . 31874) (\TFTP.GET.FILE 31876 . 39527) (\TFTP.SEND.FILE 39529 . 46221)) (46256 49207 (TFTP.SERVER 46266 . 46555) (TFTP.GET 46557 . 48098) (TFTP.PUT 48100 . 49205)) (49243 53309 (PRINTTFTP 49253 . 50082) (\TFTP.PRINT.ACK 50084 . 50285) (\TFTP.PRINT.DATA 50287 . 50726) (\TFTP.PRINT.ERROR 50728 . 51181) (\TFTP.PRINT.REQUEST 51183 . 53307))))) STOP \ No newline at end of file diff --git a/obsolete/tcp/TCPUDP b/obsolete/tcp/TCPUDP new file mode 100644 index 00000000..9f0f5b90 --- /dev/null +++ b/obsolete/tcp/TCPUDP @@ -0,0 +1 @@ +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) (FILECREATED "12-Jun-90 17:46:11" {DSK}local>lde>lispcore>library>TCPUDP.;2 11429 changes to%: (VARS TCPUDPCOMS) previous date%: " 6-Jan-89 16:37:55" {DSK}local>lde>lispcore>library>TCPUDP.;1) (* ; " Copyright (c) 1985, 1986, 1987, 1989, 1990 by Venue & Xerox Corporation. All rights reserved. ") (PRETTYCOMPRINT TCPUDPCOMS) (RPAQQ TCPUDPCOMS [(COMS (* ;; "User Datagram Protocol --- Definitions") [DECLARE%: EVAL@COMPILE DONTCOPY (EXPORT (RECORDS UDP) (CONSTANTS (\UDPOVLEN 8] (FILES (SYSLOAD) TCPLLIP)) (COMS (* ;; "Internal functions") (FNS UDP.GET.BYTE UDP.GET.CELL UDP.GET.STRING UDP.GET.WORD \UDP.FLUSH.SOCKET.QUEUE \UDP.PORTCOMPARE \UDP.CHECKSUM \UDP.SET.CHECKSUM) (FNS \UDP.HANDLE.ICMP)) (COMS (* ;; "External functions") (FNS PRINTUDP UDP.INIT UDP.STOP UDP.OPEN.SOCKET UDP.CLOSE.SOCKET UDP.SOCKET.EVENT UDP.SOCKET.NUMBER UDP.GET UDP.SEND UDP.EXCHANGE UDP.SETUP UDP.APPEND.BYTE UDP.APPEND.CELL UDP.APPEND.STRING UDP.APPEND.WORD UDP.INCREMENT.LENGTH) (ADDVARS (IPPRINTMACROS (17 . PRINTUDP))) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD? 'NILL 'PRINTRPCDATA) (UDP.INIT]) (* ;; "User Datagram Protocol --- Definitions") (DECLARE%: EVAL@COMPILE DONTCOPY (* "FOLLOWING DEFINITIONS EXPORTED") (DECLARE%: EVAL@COMPILE (ACCESSFNS UDP ((UDPBASE (\IPDATABASE DATUM))) (BLOCKRECORD UDPBASE ((UDPSOURCEPORT WORD) (UDPDESTPORT WORD) (UDPLENGTH WORD) (UDPCHECKSUM WORD))) [ACCESSFNS UDP ((UDPCONTENTS (\ADDBASE (\IPDATABASE DATUM) (FOLDHI \UDPOVLEN BYTESPERWORD]) ) (DECLARE%: EVAL@COMPILE (RPAQQ \UDPOVLEN 8) (CONSTANTS (\UDPOVLEN 8)) ) (* "END EXPORTED DEFINITIONS") ) (FILESLOAD (SYSLOAD) TCPLLIP) (* ;; "Internal functions") (DEFINEQ (UDP.GET.BYTE (LAMBDA (UDP BYTE#) (* ejs%: "25-Jun-85 21:04") (* * Return a byte from the UDP data area) (COND ((AND (IGEQ BYTE# 0) (ILESSP BYTE# (fetch (UDP UDPLENGTH) of UDP))) (\GETBASEBYTE (fetch (UDP UDPCONTENTS) of UDP) BYTE#)))) ) (UDP.GET.CELL (LAMBDA (UDP CELL#) (* ejs%: "25-Jun-85 21:09") (* * Return a cell from the UDP data area) (COND ((AND (IGEQ CELL# 0) (ILESSP CELL# (FOLDLO (fetch (UDP UDPLENGTH) of UDP) BYTESPERCELL))) (\MAKENUMBER (\GETBASE (fetch (UDP UDPCONTENTS) of UDP) (UNFOLD CELL# WORDSPERCELL)) (\GETBASE (fetch (UDP UDPCONTENTS) of UDP) (ADD1 (UNFOLD CELL# WORDSPERCELL))))))) ) (UDP.GET.STRING (LAMBDA (UDP OFFSET) (* ejs%: "25-Jun-85 21:12") (* * Fetch a string out of the UDP packet) (OR (SMALLP OFFSET) (SETQ OFFSET 0)) (LET* ((LENGTH (IDIFFERENCE (fetch (UDP UDPLENGTH) of UDP) OFFSET)) (STRING (ALLOCSTRING LENGTH))) (\MOVEBYTES (fetch (UDP UDPCONTENTS) of UDP) OFFSET (fetch (STRINGP BASE) of STRING) (fetch (STRINGP OFFST) of STRING) LENGTH) STRING)) ) (UDP.GET.WORD (LAMBDA (UDP WORD#) (* ejs%: "25-Jun-85 21:06") (* * Return a word from the UDP data area) (COND ((AND (IGEQ WORD# 0) (ILESSP WORD# (FOLDLO (fetch (UDP UDPLENGTH) of UDP) BYTESPERWORD))) (\GETBASE (fetch (UDP UDPCONTENTS) of UDP) WORD#)))) ) (\UDP.FLUSH.SOCKET.QUEUE (LAMBDA (IPSOCKET) (* ; "Edited 25-Aug-88 12:57 by bvm") (* ;;; "Called to flush input packet queue on an IPSOCKET") (LET ((QUEUE (fetch (IPSOCKET IPSQUEUE) of IPSOCKET)) PACKET) (UNINTERRUPTABLY (while (SETQ PACKET (\DEQUEUE QUEUE)) do (\RELEASE.ETHERPACKET PACKET) finally (replace (IPSOCKET IPSQUEUELENGTH) of IPSOCKET with 0))))) ) (\UDP.PORTCOMPARE (LAMBDA (UDP IPSOCKET) (* ejs%: " 9-Feb-85 14:37") (* * Compare IPSOCKET until we find the one this UDP was destined for) (EQ (fetch (UDP UDPDESTPORT) of UDP) (fetch (IPSOCKET IPSOCKET) of IPSOCKET))) ) (\UDP.CHECKSUM (LAMBDA (UDP ZeroCheckSumIsOK) (* HAS%: "19-Aug-86 16:47") (* * Compute the UDP checksum for the packet UDP. The packet is assumed to have been setup by UDP.SETUP so that source and destination addresses, protocol, and UDP length have already been set.) (COND ((AND ZeroCheckSumIsOK (EQ (fetch (UDP UDPCHECKSUM) of UDP) 0)) (* * BSD Unix strikes again!) 0) (T (LET ((SOURCE (fetch (IP IPSOURCEADDRESS) of UDP)) (DEST (fetch (IP IPDESTINATIONADDRESS) of UDP)) (LENGTH (fetch (UDP UDPLENGTH) of UDP)) CHECKSUM) (SETQ CHECKSUM (IPLUS (bind (BASE _ (LOCF (fetch (IP IPSOURCEADDRESS) of UDP))) for I from 0 to (CONSTANT (SUB1 (TIMES 2 WORDSPERCELL))) sum (\GETBASE BASE I)) (ffetch (IP IPPROTOCOL) of UDP) LENGTH (\IPCHECKSUM UDP (\IPDATABASE UDP) LENGTH))) (SETQ CHECKSUM (IPLUS (LDB (BYTE 16 16) CHECKSUM) (LDB (BYTE 16 0) CHECKSUM))) (COND ((NOT (EQ (LDB (BYTE 16 16) CHECKSUM) 0)) (SETQ CHECKSUM (IPLUS (LDB (BYTE 16 16) CHECKSUM) (LDB (BYTE 16 0) CHECKSUM))))) CHECKSUM)))) ) (\UDP.SET.CHECKSUM (LAMBDA (UDP) (* ejs%: " 3-Jun-85 00:19") (* * Called to set the UDP checksum in a packet ready to be transmitted) (LET (CHECKSUM) (replace (UDP UDPCHECKSUM) of UDP with 0) (SETQ CHECKSUM (\UDP.CHECKSUM UDP)) (replace (UDP UDPCHECKSUM) of UDP with (COND ((NEQ CHECKSUM MAX.SMALLP) (LOGAND (LOGNOT CHECKSUM) (CONSTANT (MASK.1'S 0 16)))) (T MAX.SMALLP))))) ) ) (DEFINEQ (\UDP.HANDLE.ICMP (LAMBDA (ICMP SENTIP PROTOCOL) (* ; "Edited 13-Sep-88 14:26 by bvm") (* ;; "Handle an ICMP packet sent to a UDP socket. We allow each UDP client to decide how to handle these.") (LET ((SOCKET (\IP.FIND.SOCKET (ffetch (UDP UDPSOURCEPORT) of SENTIP) PROTOCOL)) FN) (if (OR (NULL SOCKET) (EQ (SETQ FN (ffetch (IPSOCKET IPSICMPFN) of SOCKET)) (QUOTE \UDP.HANDLE.ICMP))) then (* ; "Sender went away already, or else didn't specify a handler (so inherited the default)") (\RELEASE.ETHERPACKET ICMP) else (CL:FUNCALL FN ICMP SENTIP SOCKET)))) ) ) (* ;; "External functions") (DEFINEQ (PRINTUDP (LAMBDA (UDP FILE) (* ; "Edited 6-Jan-89 16:18 by Briggs") (printout FILE "UDP Source port: " (fetch (UDP UDPSOURCEPORT) of UDP) " Dest port: " (fetch (UDP UDPDESTPORT) of UDP) T "Length: " (fetch (UDP UDPLENGTH) of UDP) " Checksum: " (fetch (UDP UDPCHECKSUM) of UDP) T) (COND ((OR (EQ (fetch (UDP UDPDESTPORT) of UDP) \TFTP.SOCKET) (EQ (fetch (UDP UDPSOURCEPORT) of UDP) \TFTP.SOCKET)) (PRINTTFTP UDP FILE)) (T (PRINTRPCDATA (fetch (UDP UDPCONTENTS) of UDP) (- (fetch (UDP UDPLENGTH) of UDP) \UDPOVLEN) FILE)))) ) (UDP.INIT (LAMBDA NIL (* ; "Edited 25-Aug-88 12:54 by bvm") (COND ((OR \IPFLG (SELECTQ (ASKUSER 15 (QUOTE Y) "IP is not running. Shall I attempt to initialize it? ") (Y (\IPINIT) \IPFLG) NIL)) (\IP.ADD.PROTOCOL \UDP.PROTOCOL (FUNCTION \UDP.PORTCOMPARE) NIL NIL (FUNCTION \UDP.HANDLE.ICMP))))) ) (UDP.STOP (LAMBDA NIL (* ejs%: " 9-Feb-85 14:43") (\IP.DELETE.PROTOCOL \UDP.PROTOCOL))) (UDP.OPEN.SOCKET (LAMBDA (SKT# IFCLASH ICMPFN) (* ; "Edited 25-Aug-88 13:03 by bvm") (LET ((UDPCHAIN (\IP.FIND.PROTOCOL \UDP.PROTOCOL))) (if (OR UDPCHAIN (SETQ UDPCHAIN (UDP.INIT))) then (if (NULL SKT#) then (* ; "Open any free socket") (\IP.OPEN.SOCKET \UDP.PROTOCOL NIL NIL NIL NIL NIL ICMPFN) else (* ; "Check for clash") (LET ((IPSOCKET (\IP.FIND.SOCKET SKT# UDPCHAIN))) (if (NULL IPSOCKET) then (\IP.OPEN.SOCKET \UDP.PROTOCOL SKT# NIL NIL NIL NIL ICMPFN) else (SELECTQ IFCLASH ((T ACCEPT) (\UDP.FLUSH.SOCKET.QUEUE IPSOCKET) IPSOCKET) ((DON'T FAIL) NIL) (ERROR "UDP Port is already in use" SKT#))))) else (* ; "IP not inited") (SELECTQ IFCLASH ((DON'T FAIL) NIL) (ERROR!))))) ) (UDP.CLOSE.SOCKET (LAMBDA (IPSOCKET NOERRORFLG) (* ejs%: " 9-Feb-85 15:00") (\UDP.FLUSH.SOCKET.QUEUE IPSOCKET) (\IP.CLOSE.SOCKET (fetch (IPSOCKET IPSOCKET) of IPSOCKET) \UDP.PROTOCOL NOERRORFLG)) ) (UDP.SOCKET.EVENT (LAMBDA (IPSOCKET) (* ejs%: " 9-Feb-85 15:07") (fetch (IPSOCKET IPSEVENT) of IPSOCKET))) (UDP.SOCKET.NUMBER (LAMBDA (IPSOCKET) (* ejs%: " 9-Feb-85 15:08") (fetch (IPSOCKET IPSOCKET) of IPSOCKET))) (UDP.GET (LAMBDA (IPSOCKET WAIT) (* ; "Edited 13-Sep-88 11:59 by bvm") (* ;;; "Returns the next UDP packet on the queue, or NIL if none exist and WAIT is NIL. If WAIT is T, this function waits forever. If WAIT is an integer, it is interpreted as the number of milliseconds to wait before returning NIL or a packet which arrives during that time. This function therefore is like GETXIP and GETPUP") (PROG ((QUEUE (fetch (IPSOCKET IPSQUEUE) of IPSOCKET)) UDP TIMER) LP (UNINTERRUPTABLY (COND ((SETQ UDP (\DEQUEUE QUEUE)) (add (fetch (IPSOCKET IPSQUEUELENGTH) of IPSOCKET) -1)))) (COND ((NULL UDP) (COND (WAIT (COND ((EQ WAIT T) (* ; "Wait forever")) (TIMER (COND ((TIMEREXPIRED? TIMER) (RETURN)))) (T (OR (FIXP WAIT) (LISPERROR "NON-NUMERIC ARG" WAIT)) (SETQ TIMER (SETUPTIMER WAIT)) T)) (AWAIT.EVENT (fetch (IPSOCKET IPSEVENT) of IPSOCKET) TIMER T) (GO LP)) (T (BLOCK)))) ((AND (EQ (fetch (IP IPPROTOCOL) of UDP) \UDP.PROTOCOL) (NEQ (fetch (UDP UDPCHECKSUM) of UDP) 0) (NOT (\IP.CHECKSUM.OK (\UDP.CHECKSUM UDP)))) (* ; "Bad checksum on UDP packet. Any other kind of packet must have been put there by someone else") (\RELEASE.ETHERPACKET UDP) (GO LP))) (RETURN UDP))) ) (UDP.SEND (LAMBDA (IPSOCKET UDP) (* ejs%: " 9-Feb-85 15:24") (* * Sends a UDP packet. IP and UDP header assumed set up by UDP.SETUP and \IP.SETUPIP) (\UDP.SET.CHECKSUM UDP) (\IP.TRANSMIT UDP)) ) (UDP.EXCHANGE (LAMBDA (IPSOCKET OUTUDP TIMEOUT) (* ejs%: " 9-Feb-85 22:28") (* * Send a UDP packet and wait for TIMEOUT to receive a packet (TIMEOUT defaults to \ETHERTIMEOUT)) (\UDP.FLUSH.SOCKET.QUEUE IPSOCKET) (UDP.SEND IPSOCKET OUTUDP) (BLOCK) (UDP.GET IPSOCKET (OR (FIXP TIMEOUT) \ETHERTIMEOUT))) ) (UDP.SETUP (LAMBDA (UDP DESTHOST DESTSOCKET ID IPSOCKET REQUEUE) (* ejs%: " 9-Feb-85 16:04") (\IP.SETUPIP UDP DESTHOST ID IPSOCKET REQUEUE) (add (fetch (IP IPTOTALLENGTH) of UDP) \UDPOVLEN) (AND (SMALLP DESTSOCKET) (replace (UDP UDPDESTPORT) of UDP with DESTSOCKET)) (replace (UDP UDPSOURCEPORT) of UDP with (fetch (IPSOCKET IPSOCKET) of IPSOCKET)) (replace (UDP UDPLENGTH) of UDP with \UDPOVLEN) UDP) ) (UDP.APPEND.BYTE (LAMBDA (UDP BYTE) (* ejs%: " 9-Feb-85 16:07") (\IP.APPEND.BYTE UDP BYTE) (add (fetch (UDP UDPLENGTH) of UDP) 1)) ) (UDP.APPEND.CELL (LAMBDA (UDP CELL) (* ejs%: " 9-Feb-85 16:06") (\IP.APPEND.CELL UDP CELL) (add (fetch (UDP UDPLENGTH) of UDP) BYTESPERCELL)) ) (UDP.APPEND.STRING (LAMBDA (UDP STRING) (* ejs%: " 9-Feb-85 16:10") (OR (STRINGP STRING) (SETQ STRING (MKSTRING STRING))) (\IP.APPEND.STRING UDP STRING) (add (fetch (UDP UDPLENGTH) of UDP) (NCHARS STRING))) ) (UDP.APPEND.WORD (LAMBDA (UDP WORD) (* ejs%: " 9-Feb-85 16:07") (\IP.APPEND.WORD UDP WORD) (add (fetch (UDP UDPLENGTH) of UDP) WORDSPERCELL)) ) (UDP.INCREMENT.LENGTH (LAMBDA (UDP INCREMENT) (* ejs%: "12-Apr-86 18:50") (add (fetch (IP IPTOTALLENGTH) of UDP) INCREMENT) (add (fetch (UDP UDPLENGTH) of UDP) INCREMENT) INCREMENT) ) ) (ADDTOVAR IPPRINTMACROS (17 . PRINTUDP)) (DECLARE%: DONTEVAL@LOAD DOCOPY (MOVD? 'NILL 'PRINTRPCDATA) (UDP.INIT) ) (PUTPROPS TCPUDP COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1989 1990)) (DECLARE%: DONTCOPY (FILEMAP (NIL (2357 5603 (UDP.GET.BYTE 2367 . 2608) (UDP.GET.CELL 2610 . 2984) (UDP.GET.STRING 2986 . 3371) (UDP.GET.WORD 3373 . 3632) (\UDP.FLUSH.SOCKET.QUEUE 3634 . 3998) (\UDP.PORTCOMPARE 4000 . 4224) (\UDP.CHECKSUM 4226 . 5220) (\UDP.SET.CHECKSUM 5222 . 5601)) (5604 6176 (\UDP.HANDLE.ICMP 5614 . 6174) ) (6213 11197 (PRINTUDP 6223 . 6752) (UDP.INIT 6754 . 7053) (UDP.STOP 7055 . 7146) (UDP.OPEN.SOCKET 7148 . 7833) (UDP.CLOSE.SOCKET 7835 . 8036) (UDP.SOCKET.EVENT 8038 . 8148) (UDP.SOCKET.NUMBER 8150 . 8261) (UDP.GET 8263 . 9439) (UDP.SEND 9441 . 9639) (UDP.EXCHANGE 9641 . 9947) (UDP.SETUP 9949 . 10356) (UDP.APPEND.BYTE 10358 . 10494) (UDP.APPEND.CELL 10496 . 10643) (UDP.APPEND.STRING 10645 . 10857) ( UDP.APPEND.WORD 10859 . 11006) (UDP.INCREMENT.LENGTH 11008 . 11195))))) STOP \ No newline at end of file diff --git a/run-medley b/run-medley index 05f5c395..63862ca3 100755 --- a/run-medley +++ b/run-medley @@ -113,7 +113,9 @@ while [ "$#" -ne 0 ]; do shift ;; -title) - title="$2" + if [ -n "$2" ] ; then + title="$2" + fi shift ;; -vmem | --vmem | -vmfile) diff --git a/scripts/copy-all.sh b/scripts/copy-all.sh index f04a5e7f..547f81d8 100755 --- a/scripts/copy-all.sh +++ b/scripts/copy-all.sh @@ -22,6 +22,10 @@ fi ./scripts/cpv "${LOADUP_WORKDIR}"/lisp.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" ./scripts/cpv "${LOADUP_WORKDIR}"/full.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" ./scripts/cpv "${LOADUP_WORKDIR}"/whereis.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" +if [ "${1}" = "-apps" ]; then + ./scripts/cpv "${LOADUP_WORKDIR}"/apps.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" +fi + ./scripts/cpv "${LOADUP_WORKDIR}"/RDSYS library | sed -e "s#${MEDLEYDIR}/##g" ./scripts/cpv "${LOADUP_WORKDIR}"/RDSYS.LCOM library | sed -e "s#${MEDLEYDIR}/##g" diff --git a/scripts/copy-full.sh b/scripts/copy-full.sh new file mode 100755 index 00000000..14f084e1 --- /dev/null +++ b/scripts/copy-full.sh @@ -0,0 +1,24 @@ +#!/bin/sh + +if [ ! -x run-medley ] ; then + echo run from MEDLEYDIR + exit 1 +fi + +. scripts/loadup-setup.sh + +echo ">>>>> START ${script_name}" + +./scripts/cpv "${LOADUP_WORKDIR}"/full.sysout "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" +./scripts/cpv "${LOADUP_WORKDIR}"/lisp.sysout "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" + +./scripts/cpv "${LOADUP_WORKDIR}"/init.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" +./scripts/cpv "${LOADUP_WORKDIR}"/lisp.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" +./scripts/cpv "${LOADUP_WORKDIR}"/full.dribble "${LOADUP_OUTDIR}" | sed -e "s#${MEDLEYDIR}/##g" + +./scripts/cpv "${LOADUP_WORKDIR}"/RDSYS library | sed -e "s#${MEDLEYDIR}/##g" +./scripts/cpv "${LOADUP_WORKDIR}"/RDSYS.LCOM library | sed -e "s#${MEDLEYDIR}/##g" + +echo "<<<<< END ${script_name}" +echo "" +exit 0 diff --git a/scripts/loadup-apps-from-full.sh b/scripts/loadup-apps-from-full.sh index 86a59d47..7db94018 100755 --- a/scripts/loadup-apps-from-full.sh +++ b/scripts/loadup-apps-from-full.sh @@ -28,8 +28,9 @@ cat >"${cmfile}" <<"EOF" (PROGN (IL:MEDLEY-INIT-VARS 'IL:GREET) - (IL:LOAD (IL:CONCAT (QUOTE {DSK}) (IL:UNIX-GETENV(QUOTE NOTECARDSDIR))(QUOTE |/system/NOTECARDS.LCOM|)) 'IL:SYSLOAD) + (IL:DRIBBLE (IL:CONCAT (QUOTE {DSK})(IL:UNIX-GETENV(QUOTE LOADUP_WORKDIR))(IL:L-CASE (QUOTE /apps.dribble)))) (IL:LOAD (IL:CONCAT (QUOTE {DSK}) (IL:UNIX-GETENV(QUOTE ROOMSDIR))(QUOTE /ROOMS)) 'IL:SYSLOAD) + (IL:LOAD (IL:CONCAT (QUOTE {DSK}) (IL:UNIX-GETENV(QUOTE NOTECARDSDIR))(QUOTE |/system/NOTECARDS.LCOM|)) 'IL:SYSLOAD) (IL:LOAD (IL:CONCAT (QUOTE {DSK}) (IL:UNIX-GETENV(QUOTE CLOSDIR))(QUOTE /DEFSYS.DFASL)) 'IL:SYSLOAD) (IL:LOAD (IL:CONCAT (QUOTE {DSK}) (IL:UNIX-GETENV(QUOTE MEDLEYDIR))(QUOTE |lispusers/BUTTONS.LCOM|)) 'IL:SYSLOAD) (IL:LOAD @@ -43,6 +44,7 @@ SHH (IL:ENDLOADUP) (CLOS::LOAD-CLOS) (IL:|Apps.LOADUP|) + (IL:DRIBBLE) (IL:MAKESYS (IL:CONCAT (QUOTE {DSK})(IL:UNIX-GETENV(QUOTE LOADUP_WORKDIR))(IL:L-CASE (QUOTE /apps.sysout))) :APPS) diff --git a/scripts/loadup-full.sh b/scripts/loadup-full.sh index a49fdd5a..a5938705 100755 --- a/scripts/loadup-full.sh +++ b/scripts/loadup-full.sh @@ -10,5 +10,14 @@ fi ./scripts/loadup-init.sh && \ ./scripts/loadup-mid-from-init.sh && \ ./scripts/loadup-lisp-from-mid.sh && \ -./scripts/loadup-full-from-lisp.sh +./scripts/loadup-full-from-lisp.sh && \ +./scripts/copy-full.sh + +if [ $? -eq 0 ]; +then + echo "+++++ loadup-full.sh: SUCCESS +++++" +else + echo "----- loadup-full.sh: FAILURE -----" +fi + diff --git a/scripts/medley/medley.cmd b/scripts/medley/medley.cmd index 9fdbeef5..82881fdf 100644 --- a/scripts/medley/medley.cmd +++ b/scripts/medley/medley.cmd @@ -1,3 +1,3 @@ -@echo off -powershell medley.ps1 %* - +@echo off +powershell medley.ps1 %* + diff --git a/scripts/medley/medley.command b/scripts/medley/medley.command index 6029d9b4..14b922a3 100755 --- a/scripts/medley/medley.command +++ b/scripts/medley/medley.command @@ -57,8 +57,7 @@ export MEDLEYDIR=$(cd ${SCRIPTDIR}; cd ../..; pwd) IL_DIR=$(cd ${MEDLEYDIR}; cd ..; pwd) export LOGINDIR=${HOME}/il -# Are we running under Docker or if not under WSL -# or under Darwin? +# Are we running under Docker or WSL or Darwin or Cygwin? # docker=false wsl=false @@ -70,7 +69,8 @@ then elif [ -n "${MEDLEY_DOCKER_BUILD_DATE}" ]; then docker='true' -else +elif [ $(uname -s | head --bytes 6) != "CYGWIN" ]; +then wsl_ver=0 # WSL2 grep --ignore-case --quiet wsl /proc/sys/kernel/osrelease @@ -93,8 +93,6 @@ else echo "Exiting" exit 23 fi - else - wsl='false' fi fi fi @@ -141,7 +139,7 @@ mkdir -p ${LOGINDIR}/vmem if [[ ( ${darwin} = true ) || (( ${wsl} = false || ${use_vnc} = false ) && ${docker} = false) ]]; then # If not using vnc, just call run-medley - ${MEDLEYDIR}/run-medley -id "${run_id}" ${geometry} ${screensize} ${run_args[@]} + ${MEDLEYDIR}/run-medley -id "${run_id}" -title "${title}" ${geometry} ${screensize} ${run_args[@]} else # do the vnc thing on wsl or docker source ${SCRIPTDIR}/medley_vnc.sh diff --git a/scripts/medley/medley_args.sh b/scripts/medley/medley_args.sh index 6687ad7a..82c9a742 100755 --- a/scripts/medley/medley_args.sh +++ b/scripts/medley/medley_args.sh @@ -28,6 +28,7 @@ run_id="default" screensize="" sysout_flag=false sysout_arg="" +title="Medley Interlisp" use_vnc=false windows=false @@ -112,7 +113,7 @@ do ;; -t | --title) check_for_dash_or_end "$1" "$2" - run_args+=(-title $2) + if [ -n "$2" ]; then title="$2"; fi shift ;; -v | --vnc) diff --git a/scripts/medley/medley_utils.sh b/scripts/medley/medley_utils.sh index a0043620..d971cf35 100644 --- a/scripts/medley/medley_utils.sh +++ b/scripts/medley/medley_utils.sh @@ -97,7 +97,7 @@ check_file_readable() { check_dir_writeable_or_creatable() { local msg_core="\"$2\" given as the value of the \"$1\" flag" - if [[ -e "$%2" ]]; + if [[ -e "$2" ]]; then if [[ ! -d "$2" ]]; then diff --git a/scripts/medley/medley_vnc.sh b/scripts/medley/medley_vnc.sh index 60dbc584..6be2a1a1 100755 --- a/scripts/medley/medley_vnc.sh +++ b/scripts/medley/medley_vnc.sh @@ -164,6 +164,7 @@ -SecurityTypes None \ -NeverShared \ -DisconnectClients=0 \ + -desktop "${title}" \ --MaxDisconnectionTime=10 \ >> ${LOG} 2>&1 & diff --git a/sources/ADIR b/sources/ADIR index 4669db0c..444d2d8d 100644 --- a/sources/ADIR +++ b/sources/ADIR @@ -1,13 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "11-May-2023 21:39:25" {DSK}c>Users>Larry>home>il>MEDLEY>SOURCES>ADIR.;2 65907 +(FILECREATED "14-Sep-2023 23:20:17" {WMEDLEY}ADIR.;30 67297 - :EDIT-BY "lmm" + :EDIT-BY rmk - :CHANGES-TO (FNS OPENFILE) + :CHANGES-TO (FNS \COPYSYS) - :PREVIOUS-DATE "31-Oct-2022 23:50:03" -{DSK}c>Users>Larry>home>il>MEDLEY>SOURCES>ADIR.;1) + :PREVIOUS-DATE "14-Sep-2023 22:56:19" {WMEDLEY}ADIR.;29) (PRETTYCOMPRINT ADIRCOMS) @@ -79,16 +78,18 @@ (\GETFILENAME X RECOG]) (INFILE - [LAMBDA (FILE) (* rmk%: " 3-OCT-79 14:23") - (INPUT (OPENFILE FILE 'INPUT 'OLD]) + [LAMBDA (FILE) (* ; "Edited 14-Sep-2023 22:40 by rmk") + (* rmk%: " 3-OCT-79 14:23") + (INPUT (OPENSTREAM FILE 'INPUT 'OLD]) (INFILEP [LAMBDA (FILE) (* rmk%: " 9-OCT-79 22:39") (\GETFILENAME FILE 'OLD]) (IOFILE - [LAMBDA (FILE) (* rmk%: " 5-SEP-81 13:54") - (OPENFILE FILE 'BOTH 'OLD]) + [LAMBDA (FILE) (* ; "Edited 14-Sep-2023 22:56 by rmk") + (* rmk%: " 5-SEP-81 13:54") + (OPENSTREAM FILE 'BOTH 'OLD]) (OPENFILE [LAMBDA (FILE ACCESS RECOG PARAMETERS OPTIONAL) (* ; "Edited 11-May-2023 21:05 by lmm") @@ -167,8 +168,9 @@ (RETURN STREAM]) (OUTFILE - [LAMBDA (FILE) (* rmk%: " 3-OCT-79 14:24") - (OUTPUT (OPENFILE FILE 'OUTPUT 'NEW]) + [LAMBDA (FILE) (* ; "Edited 13-Sep-2023 17:59 by rmk") + (* rmk%: " 3-OCT-79 14:24") + (OUTPUT (OPENSTREAM FILE 'OUTPUT 'NEW]) (OUTFILEP [LAMBDA (FILE) (* rmk%: " 9-OCT-79 22:39") @@ -195,50 +197,69 @@ (fetch (IFPAGE NActivePages) of \InterfacePage]) (\COPYSYS - [LAMBDA (FILE SYSNAME DONTSAVE) (* ; "Edited 31-Oct-2022 23:49 by rmk") + [LAMBDA (FILE SYSNAME DONTSAVE) (* ; "Edited 14-Sep-2023 23:19 by rmk") + (* ; "Edited 3-Jul-2023 19:21 by rmk") + (* ; "Edited 1-Jul-2023 12:34 by rmk") + (* ; "Edited 29-Jun-2023 11:41 by rmk") + (* ; "Edited 31-Oct-2022 23:49 by rmk") (* ; "Edited 16-Mar-2021 19:46 by larry") - (PROG (FULLNAME VAL TFILE THOST) + (PROG (TEMPNAME VAL TARGETFILE TARGETHOST PSEUDOHOSTP) RETRY - (SETQ FILE (PACKFILENAME.STRING 'BODY FILE 'BODY "WORK.SYSOUT" 'BODY \CONNECTED.DIRECTORY)) - (SETQ TFILE (TRUEFILENAME FILE)) - [SELECTQ [SETQ THOST (U-CASE (FILENAMEFIELD TFILE 'HOST] - (DSK [SETQ FULLNAME (PACKFILENAME.STRING 'HOST THOST 'NAME 'tmp 'EXTENSION 'SYSOUT + + + (* ;; "RMK: Get the full target name, including version in particular for DSK, at the outset so we know what the RENAMEFILE will do and we can return that value.") + + (* ;; "We try to make the temp file on the same device, so that the RENAMEFILE (hopefully) won't do a copy. ") + + (* ;; "The reason for all this fooling around is because \FLUSHVM doesn't like version numbers.") + + (* ;; "") + + (* ;; "Perhaps we should also check the value of RENAMEFILE to make sure it succeeded?") + + (SETQ FILE (OUTFILEP (PACKFILENAME.STRING 'BODY FILE 'BODY "WORK.SYSOUT" 'BODY + \CONNECTED.DIRECTORY))) + (SETQ PSEUDOHOSTP (PSEUDOHOSTP FILE)) (* ; + "In order to return the expected name at the end.") + (SETQ TARGETFILE (TRUEFILENAME FILE)) + [SELECTQ [SETQ TARGETHOST (U-CASE (FILENAMEFIELD TARGETFILE 'HOST] + (DSK [SETQ TEMPNAME (PACKFILENAME.STRING 'HOST TARGETHOST 'NAME 'tmp 'EXTENSION + 'SYSOUT 'BODY - (\UFS.RECOGNIZE.FILE TFILE 'NON (\GETDEVICEFROMNAME THOST] - (SETQ VAL (\FLUSHVM FULLNAME)) - (SETQ FULLNAME (RENAMEFILE FULLNAME FILE))) - (UNIX [SETQ FULLNAME (CONCAT "{" THOST "}" (\UFS.RECOGNIZE.FILE TFILE 'NON ( - \GETDEVICEFROMNAME - THOST] + (\UFS.RECOGNIZE.FILE TARGETFILE 'NON (\GETDEVICEFROMNAME + TARGETHOST] + (SETQ VAL (\FLUSHVM TEMPNAME))) + (UNIX [SETQ TEMPNAME (CONCAT "{" TARGETHOST "}" (\UFS.RECOGNIZE.FILE TARGETFILE + 'NON + (\GETDEVICEFROMNAME TARGETHOST] (* ; "\DOFLUSHVM ") - (SETQ VAL (\FLUSHVM FULLNAME)) - (SETQ FULLNAME (RENAMEFILE FULLNAME FILE))) + (SETQ VAL (\FLUSHVM TEMPNAME))) (PROGN (SETQ VAL (\FLUSHVM)) - (LET ((UNIXVAR (UNIX-GETENV "LDEDESTSYSOUT"))) + (LET ((LDEDEST (UNIX-GETENV "LDEDESTSYSOUT"))) (* ; - "\FLSUVM saves image to Unix enviroment var or lisp.virtualmem") - (SETQ FULLNAME (COPYFILE (COND - (UNIXVAR (CONCAT "{DSK}" UNIXVAR)) + "\FLUSHVM saves image to Unix enviroment var or lisp.virtualmem. LDEDEST is assumed to be DSK??") + (SETQ TEMPNAME (COPYFILE (COND + (LDEDEST (CONCAT "{DSK}" LDEDEST)) (T "{DSK}~/lisp.virtualmem")) - FILE + TARGETFILE '((TYPE BINARY] (COND - ((NULL VAL) - - (* ;; "First clause of OR is T when resuming this vmem; second is starting the sysout. Unless \COPYSYS1 itself does a \FLUSHVM, the second never returns T, yes? NIL is normal return (continuing in same image), is error return") - (* ; "Continuing in the current image") + ((NULL VAL) (* ; "Continuing in the current image") + (CL:WHEN TARGETFILE (RENAMEFILE TEMPNAME TARGETFILE)) (\DAYTIME0 \LASTUSERACTION) - (RETURN FULLNAME)) + (RETURN (CL:IF PSEUDOHOSTP + (PSEUDOFILENAME TARGETFILE) + TARGETFILE))) ((AND (SMALLP VAL) (IGREATERP 0 VAL)) (* ;  "Error occurred while making sysout.") (LISPERROR (IMINUS VAL) - FULLNAME) + TEMPNAME) (GO RETRY)) - (T (* ; "Starting sysout") + (T (* ; "Restarting sysout") (\CLEARSYSBUF T) (* ; "Get rid of any spurious typeahead") (\RESETKEYBOARD) (* ; "Enable keyhandler") - (RETURN (LIST FULLNAME]) + (RETURN (LIST (OR FILE TEMPNAME]) (\FLUSHVM [LAMBDA (MAIKO.SYSOUTFILE) (* ; "Edited 16-Mar-2021 10:59 by larry") @@ -1229,14 +1250,14 @@ (ADDTOVAR LAMA PACKFILENAME.STRING PACKFILENAME) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3175 14373 (DELFILE 3185 . 3346) (FULLNAME 3348 . 3715) (INFILE 3717 . 3865) (INFILEP -3867 . 4002) (IOFILE 4004 . 4144) (OPENFILE 4146 . 4449) (OPENSTREAM 4451 . 8791) (OUTFILE 8793 . 8944 -) (OUTFILEP 8946 . 9082) (RENAMEFILE 9084 . 9390) (SIMPLE.FINDFILE 9392 . 9802) (VMEMSIZE 9804 . 9971) - (\COPYSYS 9973 . 13092) (\FLUSHVM 13094 . 14166) (\LOGOUT0 14168 . 14371)) (14831 36736 ( -UNPACKFILENAME.STRING 14841 . 34115) (\UPF.DIRECTORY 34117 . 36734)) (38264 40936 (UNPACKFILENAME -38274 . 38460) (LASTCHPOS 38462 . 39156) (FILENAMEFIELD 39158 . 39643) (FILENAMEFIELD.STRING 39645 . -40224) (PACKFILENAME 40226 . 40569) (PACKFILENAME.STRING 40571 . 40934)) (55406 56319 ( -FILEDIRCASEARRAY 55416 . 56317)) (56486 63666 (LOGOUT 56496 . 57413) (MAKESYS 57415 . 59044) (SYSOUT -59046 . 60598) (SAVEVM 60600 . 61400) (HERALD 61402 . 61562) (INTERPRET.REM.CM 61564 . 63289) ( -\USEREVENT 63291 . 63664)) (63848 65575 (USERNAME 63858 . 64814) (SETUSERNAME 64816 . 65573))))) + (FILEMAP (NIL (3106 15763 (DELFILE 3116 . 3277) (FULLNAME 3279 . 3646) (INFILE 3648 . 3907) (INFILEP +3909 . 4044) (IOFILE 4046 . 4297) (OPENFILE 4299 . 4602) (OPENSTREAM 4604 . 8944) (OUTFILE 8946 . 9208 +) (OUTFILEP 9210 . 9346) (RENAMEFILE 9348 . 9654) (SIMPLE.FINDFILE 9656 . 10066) (VMEMSIZE 10068 . +10235) (\COPYSYS 10237 . 14482) (\FLUSHVM 14484 . 15556) (\LOGOUT0 15558 . 15761)) (16221 38126 ( +UNPACKFILENAME.STRING 16231 . 35505) (\UPF.DIRECTORY 35507 . 38124)) (39654 42326 (UNPACKFILENAME +39664 . 39850) (LASTCHPOS 39852 . 40546) (FILENAMEFIELD 40548 . 41033) (FILENAMEFIELD.STRING 41035 . +41614) (PACKFILENAME 41616 . 41959) (PACKFILENAME.STRING 41961 . 42324)) (56796 57709 ( +FILEDIRCASEARRAY 56806 . 57707)) (57876 65056 (LOGOUT 57886 . 58803) (MAKESYS 58805 . 60434) (SYSOUT +60436 . 61988) (SAVEVM 61990 . 62790) (HERALD 62792 . 62952) (INTERPRET.REM.CM 62954 . 64679) ( +\USEREVENT 64681 . 65054)) (65238 66965 (USERNAME 65248 . 66204) (SETUSERNAME 66206 . 66963))))) STOP diff --git a/sources/ADIR.LCOM b/sources/ADIR.LCOM index 3da09170..f77f1d8a 100644 Binary files a/sources/ADIR.LCOM and b/sources/ADIR.LCOM differ diff --git a/sources/CMLCOMPILE b/sources/CMLCOMPILE index 0ffceec7..9d3854ee 100644 --- a/sources/CMLCOMPILE +++ b/sources/CMLCOMPILE @@ -1,20 +1,48 @@ -(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP") -(FILECREATED " 2-Jul-90 20:24:02" |{PELE:MV:ENVOS}SOURCES>CMLCOMPILE.;7| 21037 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS COMPILE-FILE-EXPRESSION FAKE-COMPILE-FILE COMPILE-FILE-SCAN-FIRST) +(FILECREATED "24-Sep-2023 14:11:25" {WMEDLEY}CMLCOMPILE.;2 22597 - previous date%: "30-Jun-90 18:55:12" |{PELE:MV:ENVOS}SOURCES>CMLCOMPILE.;6|) + :EDIT-BY rmk + + :CHANGES-TO (FNS COMPILE-IN-CORE) + + :PREVIOUS-DATE " 2-Jul-90 20:24:02" {WMEDLEY}CMLCOMPILE.;1) (* ; " -Copyright (c) 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights reserved. +Copyright (c) 1985-1987, 1990 by Venue & Xerox Corporation. ") (PRETTYCOMPRINT CMLCOMPILECOMS) -(RPAQQ CMLCOMPILECOMS ((COMS (FUNCTIONS CL:DISASSEMBLE) (FNS FAKE-COMPILE-FILE INTERLISP-FORMAT-P INTERLISP-NLAMBDA-FUNCTION-P COMPILE-FILE-EXPRESSION COMPILE-FILE-WALK-FUNCTION ARGTYPE.STATE COMPILE.CHECK.ARGTYPE COMPILE.FILE.DEFINEQ COMPILE-FILE-SETF-SYMBOL-FUNCTION COMPILE-FILE-EX/IMPORT COMPILE.FILE.APPLY COMPILE.FILE.RESET COMPILE-IN-CORE) (FNS COMPILE-FILE-SCAN-FIRST) (* ; "This function is support for AR#11185") (VARS ARGTYPE.VARS) (PROP COMPILE-FILE-EXPRESSION DEFINEQ * SETF-SYMBOL-FUNCTION PRETTYCOMPRINT) (FUNCTIONS COMPILE-FILE-DECLARE%:)) (COMS (FNS NEWDEFC) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD (QUOTE NEWDEFC) (QUOTE DEFC))))) (PROP FILETYPE CMLCOMPILE) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) (NLAML) (LAMA FAKE-COMPILE-FILE))))) +(RPAQQ CMLCOMPILECOMS + [(COMS (FUNCTIONS CL:DISASSEMBLE) + (FNS FAKE-COMPILE-FILE INTERLISP-FORMAT-P INTERLISP-NLAMBDA-FUNCTION-P + COMPILE-FILE-EXPRESSION COMPILE-FILE-WALK-FUNCTION ARGTYPE.STATE + COMPILE.CHECK.ARGTYPE COMPILE.FILE.DEFINEQ COMPILE-FILE-SETF-SYMBOL-FUNCTION + COMPILE-FILE-EX/IMPORT COMPILE.FILE.APPLY COMPILE.FILE.RESET COMPILE-IN-CORE) + (FNS COMPILE-FILE-SCAN-FIRST) + (* ; + "This function is support for AR#11185") + (VARS ARGTYPE.VARS) + (PROP COMPILE-FILE-EXPRESSION DEFINEQ * SETF-SYMBOL-FUNCTION PRETTYCOMPRINT) + (FUNCTIONS COMPILE-FILE-DECLARE%:)) + [COMS (FNS NEWDEFC) + (DECLARE%: DONTEVAL@LOAD DOCOPY (P (MOVD 'NEWDEFC 'DEFC] + (PROP FILETYPE CMLCOMPILE) + (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS (ADDVARS (NLAMA) + (NLAML) + (LAMA FAKE-COMPILE-FILE]) -(CL:DEFUN CL:DISASSEMBLE (NAME-OR-COMPILED-FUNCTION &KEY LEVEL-P (RADIX 8) (OUTPUT *STANDARD-OUTPUT*) FIRST-BYTE MARKED-PC) (PRINTCODE (if (CCODEP NAME-OR-COMPILED-FUNCTION) then NAME-OR-COMPILED-FUNCTION else (CL:COMPILE NIL (if (CL:SYMBOLP NAME-OR-COMPILED-FUNCTION) then (CL:SYMBOL-FUNCTION NAME-OR-COMPILED-FUNCTION) else NAME-OR-COMPILED-FUNCTION))) LEVEL-P RADIX OUTPUT FIRST-BYTE MARKED-PC)) +(CL:DEFUN CL:DISASSEMBLE (NAME-OR-COMPILED-FUNCTION &KEY LEVEL-P (RADIX 8) + (OUTPUT *STANDARD-OUTPUT*) + FIRST-BYTE MARKED-PC) + (PRINTCODE (if (CCODEP NAME-OR-COMPILED-FUNCTION) + then NAME-OR-COMPILED-FUNCTION + else (CL:COMPILE NIL (if (CL:SYMBOLP NAME-OR-COMPILED-FUNCTION) + then (CL:SYMBOL-FUNCTION NAME-OR-COMPILED-FUNCTION) + else NAME-OR-COMPILED-FUNCTION))) + LEVEL-P RADIX OUTPUT FIRST-BYTE MARKED-PC)) (DEFINEQ (FAKE-COMPILE-FILE @@ -132,18 +160,24 @@ Copyright (c) 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights r (COMPILE-IN-CORE [LAMBDA (fn-name fn-expr fn-type NOSAVE) (DECLARE (SPECVARS LCFIL LAPFLG STRF SVFLG LSTFIL SPECVARS LOCALVARS DONT-TRANSFER-PUTD)) + (* ; "Edited 24-Sep-2023 14:11 by rmk") (* lmm " 2-Jun-86 22:04") + (* ;; "in-core compiling for functions and forms, without the interview. if X is a list, we assume that we are being called merely to display the lap and machine code. the form is compiled as the definition of FOO but the compiled CODE is thrown away. --- if X is a litatom, then saving, redefining, and printing is controlled by the flags.") + (* in-core compiling for functions and forms, without the interview. - if X is a list, we assume that we are being called merely to display the lap - and machine code. the form is compiled as the definition of FOO but the - compiled :CODE is thrown away. - - if X is a litatom, then saving, redefining, and printing is controlled by the - flags.) + if X is a list, we assume that we are being called merely to display the lap and + machine code. the form is compiled as the definition of FOO but the compiled + :CODE is thrown away. - + if X is a litatom, then saving, redefining, and printing is controlled by the + flags.) (LET ((NOREDEFINE NIL) (PRINTLAP NIL) (DONT-TRANSFER-PUTD T)) + + (* ;; "RMK: Is it really worth saving NULLFILE from one invocation to the next?") + (RESETVARS [(NLAMA NLAMA) (NLAML NLAML) (LAMS LAMS) @@ -155,10 +189,9 @@ Copyright (c) 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights r (STREAMP NULLFILE) (OPENP NULLFILE)) NULLFILE) - (T (SETQ NULLFILE (OPENFILE '{NULL} 'OUTPUT] - (RETURN (RESETLST (* RESETLST to provide reset context - for macros under COMPILE1 as - generated e.g. by DECL.) + (T (SETQ NULLFILE (OPENSTREAM '{NULL} 'OUTPUT] + (RETURN (RESETLST (* ; + "RESETLST to provide reset context for macros under COMPILE1 as generated e.g. by DECL.") [PROG ((LCFIL) [LAPFLG (AND PRINTLAP (COND (BYTECOMPFLG T) @@ -186,17 +219,46 @@ Copyright (c) 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights r (* ; "This function is support for AR#11185") -(RPAQQ ARGTYPE.VARS ((1 NLAML "NLAMBDA spread") (2 LAMA "LAMBDA nospread") (0 LAMS "LAMBDA spread") (3 NLAMA "NLAMBDA no-spread"))) +(RPAQQ ARGTYPE.VARS ((1 NLAML "NLAMBDA spread") + (2 LAMA "LAMBDA nospread") + (0 LAMS "LAMBDA spread") + (3 NLAMA "NLAMBDA no-spread"))) -(PUTPROPS DEFINEQ COMPILE-FILE-EXPRESSION COMPILE.FILE.DEFINEQ) +(PUTPROPS DEFINEQ COMPILE-FILE-EXPRESSION COMPILE.FILE.DEFINEQ) -(PUTPROPS * COMPILE-FILE-EXPRESSION NILL) +(PUTPROPS * COMPILE-FILE-EXPRESSION NILL) -(PUTPROPS SETF-SYMBOL-FUNCTION COMPILE-FILE-EXPRESSION COMPILE-FILE-SETF-SYMBOL-FUNCTION) +(PUTPROPS SETF-SYMBOL-FUNCTION COMPILE-FILE-EXPRESSION COMPILE-FILE-SETF-SYMBOL-FUNCTION) -(PUTPROPS PRETTYCOMPRINT COMPILE-FILE-EXPRESSION NILL) +(PUTPROPS PRETTYCOMPRINT COMPILE-FILE-EXPRESSION NILL) -(CL:DEFUN COMPILE-FILE-DECLARE%: (FORM COMPILED.FILE EVAL@COMPILE DOCOPY DEFER) (CL:DO ((TAIL (CDR FORM) (CDR TAIL))) ((CL:ENDP TAIL)) (CL:IF (CL:SYMBOLP (CAR TAIL)) (CASE (CAR TAIL) ((EVAL@LOAD DOEVAL@LOAD DONTEVAL@LOAD) NIL) ((EVAL@LOADWHEN) (CL:POP TAIL)) ((EVAL@COMPILE DOEVAL@COMPILE) (SETQ EVAL@COMPILE T)) ((DONTEVAL@COMPILE) (SETQ EVAL@COMPILE NIL)) ((EVAL@COMPILEWHEN) (SETQ EVAL@COMPILE (EVAL (CAR (SETQ TAIL (CDR TAIL)))))) ((COPY DOCOPY) (SETQ DOCOPY T)) ((DONTCOPY) (SETQ DOCOPY NIL)) ((COPYWHEN) (SETQ DOCOPY (EVAL (CAR (SETQ TAIL (CDR TAIL)))))) ((FIRST)) ((NOTFIRST COMPILERVARS)) (CL:OTHERWISE (CL:FORMAT COUTFILE "Warning: Ignoring unrecognized DECLARE: tag: ~S~%%" (CAR TAIL)))) (COND ((EQ (QUOTE DECLARE%:) (CAR (CAR TAIL))) (COMPILE-FILE-DECLARE%: (CAR TAIL) COMPILED.FILE EVAL@COMPILE DOCOPY DEFER)) (T (CL:WHEN EVAL@COMPILE (EVAL (CAR TAIL))) (CL:WHEN DOCOPY (COMPILE-FILE-EXPRESSION (CAR TAIL) COMPILED.FILE EVAL@COMPILE DEFER))))))) +(CL:DEFUN COMPILE-FILE-DECLARE%: (FORM COMPILED.FILE EVAL@COMPILE DOCOPY DEFER) + (CL:DO ((TAIL (CDR FORM) + (CDR TAIL))) + ((CL:ENDP TAIL)) + (CL:IF (CL:SYMBOLP (CAR TAIL)) + (CASE (CAR TAIL) + ((EVAL@LOAD DOEVAL@LOAD DONTEVAL@LOAD) NIL) + ((EVAL@LOADWHEN) (CL:POP TAIL)) + ((EVAL@COMPILE DOEVAL@COMPILE) (SETQ EVAL@COMPILE T)) + ((DONTEVAL@COMPILE) (SETQ EVAL@COMPILE NIL)) + ((EVAL@COMPILEWHEN) [SETQ EVAL@COMPILE (EVAL (CAR (SETQ TAIL (CDR TAIL]) + ((COPY DOCOPY) (SETQ DOCOPY T)) + ((DONTCOPY) (SETQ DOCOPY NIL)) + ((COPYWHEN) [SETQ DOCOPY (EVAL (CAR (SETQ TAIL (CDR TAIL]) + ((FIRST) ) + ((NOTFIRST COMPILERVARS) ) + (CL:OTHERWISE (CL:FORMAT COUTFILE "Warning: Ignoring unrecognized DECLARE: tag: ~S~%%" + (CAR TAIL)))) + [COND + ((EQ 'DECLARE%: (CAR (CAR TAIL))) + (COMPILE-FILE-DECLARE%: (CAR TAIL) + COMPILED.FILE EVAL@COMPILE DOCOPY DEFER)) + (T (CL:WHEN EVAL@COMPILE + (EVAL (CAR TAIL))) + (CL:WHEN DOCOPY + (COMPILE-FILE-EXPRESSION (CAR TAIL) + COMPILED.FILE EVAL@COMPILE DEFER))]))) (DEFINEQ (NEWDEFC @@ -228,25 +290,26 @@ Copyright (c) 1985, 1986, 1987, 1990 by Venue & Xerox Corporation. All rights r ) (DECLARE%: DONTEVAL@LOAD DOCOPY -(MOVD (QUOTE NEWDEFC) (QUOTE DEFC)) +(MOVD 'NEWDEFC 'DEFC) ) -(PUTPROPS CMLCOMPILE FILETYPE CL:COMPILE-FILE) +(PUTPROPS CMLCOMPILE FILETYPE CL:COMPILE-FILE) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS -(ADDTOVAR NLAMA) +(ADDTOVAR NLAMA ) -(ADDTOVAR NLAML) +(ADDTOVAR NLAML ) -(ADDTOVAR LAMA FAKE-COMPILE-FILE) +(ADDTOVAR LAMA FAKE-COMPILE-FILE) ) (PUTPROPS CMLCOMPILE COPYRIGHT ("Venue & Xerox Corporation" 1985 1986 1987 1990)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1675 16480 (FAKE-COMPILE-FILE 1685 . 5121) (INTERLISP-FORMAT-P 5123 . 5341) ( -INTERLISP-NLAMBDA-FUNCTION-P 5343 . 5577) (COMPILE-FILE-EXPRESSION 5579 . 8929) ( -COMPILE-FILE-WALK-FUNCTION 8931 . 9178) (ARGTYPE.STATE 9180 . 9340) (COMPILE.CHECK.ARGTYPE 9342 . -11334) (COMPILE.FILE.DEFINEQ 11336 . 11829) (COMPILE-FILE-SETF-SYMBOL-FUNCTION 11831 . 12425) ( -COMPILE-FILE-EX/IMPORT 12427 . 12755) (COMPILE.FILE.APPLY 12757 . 13017) (COMPILE.FILE.RESET 13019 . -13880) (COMPILE-IN-CORE 13882 . 16478)) (16481 18210 (COMPILE-FILE-SCAN-FIRST 16491 . 18208)) (19612 -20676 (NEWDEFC 19622 . 20674))))) + (FILEMAP (NIL (1636 2253 (CL:DISASSEMBLE 1636 . 2253)) (2254 17523 (FAKE-COMPILE-FILE 2264 . 5700) ( +INTERLISP-FORMAT-P 5702 . 5920) (INTERLISP-NLAMBDA-FUNCTION-P 5922 . 6156) (COMPILE-FILE-EXPRESSION +6158 . 9508) (COMPILE-FILE-WALK-FUNCTION 9510 . 9757) (ARGTYPE.STATE 9759 . 9919) ( +COMPILE.CHECK.ARGTYPE 9921 . 11913) (COMPILE.FILE.DEFINEQ 11915 . 12408) ( +COMPILE-FILE-SETF-SYMBOL-FUNCTION 12410 . 13004) (COMPILE-FILE-EX/IMPORT 13006 . 13334) ( +COMPILE.FILE.APPLY 13336 . 13596) (COMPILE.FILE.RESET 13598 . 14459) (COMPILE-IN-CORE 14461 . 17521)) +(17524 19253 (COMPILE-FILE-SCAN-FIRST 17534 . 19251)) (19796 21163 (COMPILE-FILE-DECLARE%: 19796 . +21163)) (21164 22228 (NEWDEFC 21174 . 22226))))) STOP diff --git a/sources/CMLCOMPILE.LCOM b/sources/CMLCOMPILE.LCOM index dadd93be..6e4008f2 100644 Binary files a/sources/CMLCOMPILE.LCOM and b/sources/CMLCOMPILE.LCOM differ diff --git a/sources/COMPILE b/sources/COMPILE index 07bed40c..d87ed2bb 100644 --- a/sources/COMPILE +++ b/sources/COMPILE @@ -1,11 +1,13 @@ -(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10 FORMAT XCCS) -(FILECREATED " 5-Jul-2021 13:46:39"  -{DSK}kaplan>Local>medley3.5>git-medley>sources>COMPILE.;4 77731 +(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) - changes to%: (FNS BCOMPL BCOMPL.BODY) +(FILECREATED "24-Sep-2023 13:59:34" {WMEDLEY}COMPILE.;5 77344 - previous date%: " 5-Jul-2021 09:31:55" -{DSK}kaplan>Local>medley3.5>git-medley>sources>COMPILE.;3) + :EDIT-BY rmk + + :CHANGES-TO (VARS COMPILECOMS) + (FNS COMPSET) + + :PREVIOUS-DATE " 5-Jul-2021 13:46:39" {WMEDLEY}COMPILE.;4) (* ; " @@ -22,7 +24,7 @@ with the terms of said license. [(FNS BCOMPL BCOMPL.BODY PRINT-COMPILE-HEADER RESETOPENFILES BCOMPL1A BCOMPL2 BCOMPL3 BLOCK%: BRECOMPILE BRECOMPILE1 BRECOMPILE2 BRECOMPILE3 BLOCKCOMPILE BLOCKCOMPILE1 COMPSET COMPSETREAD COMPSETY COMPSETF RCOMP3 TCOMPL RECOMPILE RECOMP? COMPILE COMPILE1 COMPILE1A - SHOULD-BE-DWIMIFIED? COMPILE.FILECHECK COMPEM GETCFILE SPECVARS LOCALVARS GLOBALVARS) + SHOULD-BE-DWIMIFIED? COMPEM GETCFILE SPECVARS LOCALVARS GLOBALVARS) (ADDVARS (NOLINKFNS HELP ERRORX ERRORSET EVALV FAULTEVAL INTERRUPT SEARCHPDL MAPDL BREAK1 EDITE EDITL) (LINKFNS) @@ -72,7 +74,7 @@ with the terms of said license. (CL:PROCLAIM '(CL:SPECIAL COMPVARMACROHASH)) (CL:PROCLAIM '(GLOBAL SYSSPECVARS SYSLOCALVARS COMPILE.EXT NOTCOMPILEDFILES CLISPARRAY FILERDTBL DWIMFLG DWIMWAIT LISPXHISTORY] - (COMS (* ; "COMPILEMODE") + (COMS (* ; "COMPILEMODE") (PROP VARTYPE COMPILEMODELST) (FNS COMPILEMODE)) (DECLARE%: DONTEVAL@LOAD DOEVAL@COMPILE DONTCOPY COMPILERVARS @@ -1018,26 +1020,19 @@ with the terms of said license. (RETURN (OR TEM BLKNAME]) (COMPSET - (LAMBDA (FILE FLG) (* bvm%: " 2-Aug-86 16:58") - - (* If FILE is not NIL, COMPSET doesn't ask any questions but simply initializes - the output FILE, LCFIL. If FLG is T (AND FILE IS NIL) COMPSET doesn't ask for - an output FILE, but does set up LAPFLG, STRF, SVFLG, and LSTFIL. - - - - - BCOMPL and BRECOMPILE both call COMPSET twice, once with FILE NIL and FLG T, - and once with FILE set to their output FILE. - - - COMPILE calls COMPSET only once, with both arguments NIL.) + [LAMBDA (FILE FLG) (* ; "Edited 24-Sep-2023 13:59 by rmk") + (* bvm%: " 2-Aug-86 16:58") + + (* ;; "If FILE is not NIL, COMPSET doesn't ask any questions but simply initializes the output FILE, LCFIL. If FLG is T (AND FILE IS NIL) COMPSET doesn't ask for an output FILE, but does set up LAPFLG, STRF, SVFLG, and LSTFIL. --- --- BCOMPL and BRECOMPILE both call COMPSET twice, once with FILE NIL and FLG T, and once with FILE set to their output FILE. --- COMPILE calls COMPSET only once, with both arguments NIL.") (PROG (OLDO) (COND (FILE (GO NT))) - (SELECTQ (SETQ FILE (COMPSETREAD '"listing? " COMPSETKEYLST (OR FLG '(S T % -)))) - (S (COND + [SELECTQ [SETQ FILE (COMPSETREAD '"listing? " COMPSETKEYLST (OR FLG '(S T % +] + (S [COND (LAPFLG (PRIN1 '"file: " T) - (SETQ LSTFIL (COMPSETF (COMPSETREAD))))) + (SETQ LSTFIL (COMPSETF (COMPSETREAD] (GO NOCHANGE)) ((ST STF) (SETQ LAPFLG NIL) @@ -1055,34 +1050,33 @@ with the terms of said license. (PRIN1 '"file: " T) (SETQ FILE (COMPSETREAD))) NIL) - (SETQ LSTFIL (COMPSETF FILE))))) - (COND - ((SETQ STRF (COMPSETY (COMPSETREAD '"redefine? "))) - (SETQ SVFLG (COMPSETY (COMPSETREAD '"save exprs? "))))) + (SETQ LSTFIL (COMPSETF FILE] + [COND + ([SETQ STRF (COMPSETY (COMPSETREAD '"redefine? "] + (SETQ SVFLG (COMPSETY (COMPSETREAD '"save exprs? "] NOCHANGE (COND - ((AND LAPFLG (NEQ LSTFIL 'T) - (NOT (OPENP LSTFIL 'OUTPUT))) - (SETQ LSTFIL1 (SETQ LSTFIL (OPENFILE LSTFIL 'OUTPUT 'NEW NIL '((TYPE TEXT))))) - - (* LSTFIL1 is set when the file is opened for this compilation. - in this case it will be closed when the compilation is finished or aborttd.) + ([AND LAPFLG (NEQ LSTFIL 'T) + (NOT (OPENP LSTFIL 'OUTPUT] + [SETQ LSTFIL1 (SETQ LSTFIL (OPENSTREAM LSTFIL 'OUTPUT 'NEW '((TYPE TEXT] + + (* ;; "LSTFIL1 is set when the file is opened for this compilation. in this case it will be closed when the compilation is finished or aborttd.") ) (T (SETQ LSTFIL1 NIL))) (COND - ((AND (NULL FLG) + ([AND (NULL FLG) (COMPSETY (COMPSETREAD '"output file? " NIL '(N % -)))) +] (PRIN1 '"file name: " T) (SETQ FILE (COMPSETREAD))) (T (SETQ FILE NIL))) - NT (COND + NT [COND ((AND (SETQ LCFIL (COMPSETF FILE)) (NEQ LCFIL T)) (SETQ LCFIL (OR (OPENP LCFIL 'OUTPUT) - (OPENSTREAM LCFIL 'OUTPUT 'NEW NIL '((TYPE BINARY))))))) - (RETURN 'DONE)))) + (OPENSTREAM LCFIL 'OUTPUT 'NEW '((TYPE BINARY] + (RETURN 'DONE]) (COMPSETREAD (LAMBDA (MESS KEYLST DEFAULT) (* wt%: "23-AUG-80 01:29") @@ -1309,10 +1303,6 @@ with the terms of said license. FINALLY (RETURN (EQ (CAR FORM) 'CLISP%:]) -(COMPILE.FILECHECK - (LAMBDA (FILE) (* lmm "11-Jul-84 17:27") - (OPENFILE FILE 'INPUT))) - (COMPEM (LAMBDA (X Y ERRORFLG FL) (* wt%: " 7-JUL-78 13:07") @@ -1414,15 +1404,13 @@ with the terms of said license. THEN (SETQ GLOBALVARS (UNION A GLOBALVARS]) ) -(ADDTOVAR NOLINKFNS HELP ERRORX ERRORSET EVALV FAULTEVAL INTERRUPT SEARCHPDL MAPDL BREAK1 EDITE - EDITL) +(ADDTOVAR NOLINKFNS HELP ERRORX ERRORSET EVALV FAULTEVAL INTERRUPT SEARCHPDL MAPDL BREAK1 EDITE EDITL) (ADDTOVAR LINKFNS ) (ADDTOVAR FREEVARS ) -(ADDTOVAR SYSSPECVARS HELPCLOCK LISPXHIST RESETSTATE OLDVALUE UNDOSIDE0 SPECVARS LOCALVARS - GLOBALVARS) +(ADDTOVAR SYSSPECVARS HELPCLOCK LISPXHIST RESETSTATE OLDVALUE UNDOSIDE0 SPECVARS LOCALVARS GLOBALVARS) (ADDTOVAR SYSLOCALVARS ) @@ -1455,16 +1443,16 @@ with the terms of said license. (RPAQ? COMPSETLST '(ST F STF S Y N 1 2 NIL T)) (RPAQ? COMPSETKEYLST '((ST "ore and redefine " KEYLST ("" (F . "orget exprs"))) - (S . "ame as last time") - (F . "ile only") - (T . "o terminal") - (1) - (2) - (Y . "es") - (N . "o"))) + (S . "ame as last time") + (F . "ile only") + (T . "o terminal") + (1) + (2) + (Y . "es") + (N . "o"))) (RPAQ? COMPSETDEFAULTKEYLST '((Y . "es") - (N . "o"))) + (N . "o"))) (RPAQ? BCOMPL.SCRATCH '{CORE}BCOMPL.SCRATCH) @@ -1490,8 +1478,8 @@ with the terms of said license. (DECLARE%: EVAL@COMPILE (PUTPROPS DIGITCHARP MACRO [LAMBDA (CHAR) - (AND (IGEQ CHAR (CHARCODE 0)) - (ILEQ CHAR (CHARCODE 9]) + (AND (IGEQ CHAR (CHARCODE 0)) + (ILEQ CHAR (CHARCODE 9]) ) (DECLARE%: DOEVAL@COMPILE DONTCOPY @@ -1546,14 +1534,14 @@ with the terms of said license. ) (PUTPROPS COMPILE COPYRIGHT ("Venue & Xerox Corporation" T 1984 1985 1986 1987 1988 1989 1990 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3770 74020 (BCOMPL 3780 . 5430) (BCOMPL.BODY 5432 . 12011) (PRINT-COMPILE-HEADER 12013 - . 13076) (RESETOPENFILES 13078 . 13431) (BCOMPL1A 13433 . 19446) (BCOMPL2 19448 . 26263) (BCOMPL3 -26265 . 27614) (BLOCK%: 27616 . 28248) (BRECOMPILE 28250 . 43239) (BRECOMPILE1 43241 . 49093) ( -BRECOMPILE2 49095 . 49897) (BRECOMPILE3 49899 . 51275) (BLOCKCOMPILE 51277 . 53137) (BLOCKCOMPILE1 -53139 . 58224) (COMPSET 58226 . 60989) (COMPSETREAD 60991 . 62302) (COMPSETY 62304 . 62428) (COMPSETF -62430 . 62596) (RCOMP3 62598 . 64305) (TCOMPL 64307 . 64606) (RECOMPILE 64608 . 64691) (RECOMP? 64693 - . 65153) (COMPILE 65155 . 67144) (COMPILE1 67146 . 67734) (COMPILE1A 67736 . 69383) ( -SHOULD-BE-DWIMIFIED? 69385 . 70074) (COMPILE.FILECHECK 70076 . 70222) (COMPEM 70224 . 70948) (GETCFILE - 70950 . 72681) (SPECVARS 72683 . 73238) (LOCALVARS 73240 . 73814) (GLOBALVARS 73816 . 74018)) (76481 -77430 (COMPILEMODE 76491 . 77428))))) + (FILEMAP (NIL (3708 73744 (BCOMPL 3718 . 5368) (BCOMPL.BODY 5370 . 11949) (PRINT-COMPILE-HEADER 11951 + . 13014) (RESETOPENFILES 13016 . 13369) (BCOMPL1A 13371 . 19384) (BCOMPL2 19386 . 26201) (BCOMPL3 +26203 . 27552) (BLOCK%: 27554 . 28186) (BRECOMPILE 28188 . 43177) (BRECOMPILE1 43179 . 49031) ( +BRECOMPILE2 49033 . 49835) (BRECOMPILE3 49837 . 51213) (BLOCKCOMPILE 51215 . 53075) (BLOCKCOMPILE1 +53077 . 58162) (COMPSET 58164 . 60861) (COMPSETREAD 60863 . 62174) (COMPSETY 62176 . 62300) (COMPSETF +62302 . 62468) (RCOMP3 62470 . 64177) (TCOMPL 64179 . 64478) (RECOMPILE 64480 . 64563) (RECOMP? 64565 + . 65025) (COMPILE 65027 . 67016) (COMPILE1 67018 . 67606) (COMPILE1A 67608 . 69255) ( +SHOULD-BE-DWIMIFIED? 69257 . 69946) (COMPEM 69948 . 70672) (GETCFILE 70674 . 72405) (SPECVARS 72407 . +72962) (LOCALVARS 72964 . 73538) (GLOBALVARS 73540 . 73742)) (76094 77043 (COMPILEMODE 76104 . 77041)) +))) STOP diff --git a/sources/COMPILE.LCOM b/sources/COMPILE.LCOM index b8258da8..7bcb18dd 100644 Binary files a/sources/COMPILE.LCOM and b/sources/COMPILE.LCOM differ diff --git a/sources/FONTPROFILE b/sources/FONTPROFILE index 5c73f082..91fba126 100644 --- a/sources/FONTPROFILE +++ b/sources/FONTPROFILE @@ -1,19 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "13-Apr-2023 08:40:30" {DSK}larry>il>medley>sources>FONTPROFILE.;2 35652 +(FILECREATED "23-Jul-2023 20:42:48" {WMEDLEY}FONTPROFILE.;4 34903 - :EDIT-BY "lmm" + :EDIT-BY rmk - :CHANGES-TO (ALISTS (FONTDEFS HUGE) - (FONTDEFS BIG) - (FONTDEFS MEDIUM) - (FONTDEFS STANDARD) - (FONTDEFS BIGGER) - (FONTDEFS NS) - (FONTDEFS BIGGERNS)) - (VARS FONTPROFILECOMS) + :CHANGES-TO (FNS FONTSET) - :PREVIOUS-DATE " 6-Sep-2021 19:11:32" {DSK}larry>il>medley>sources>FONTPROFILE.;1) + :PREVIOUS-DATE "13-Apr-2023 08:40:30" {WMEDLEY}FONTPROFILE.;3) (PRETTYCOMPRINT FONTPROFILECOMS) @@ -459,7 +452,9 @@ (DEFINEQ (FONTSET - [LAMBDA (NAME CHANGE-WINDOWS?) (* ; "Edited 23-Jun-88 10:46 by jds") + [LAMBDA (NAME CHANGE-WINDOWS?) (* ; "Edited 23-Jul-2023 20:42 by rmk") + (* ; "Edited 23-Jun-88 10:46 by jds") + (DECLARE (SPECVARS NAME)) (COND [NAME (LET @@ -470,10 +465,10 @@ (* ;; "Looks up NAME on FONTSLST and sets apropriate parameters. entries are added to fontslst by FONTNAME.") (for X in FONTVARS when (AND (CL:SYMBOLP (CAR X)) - (NEQ (CAR X) - '*) - (NEQ (CAR X) - (CADR X))) do (SETTOPVAL (CAR X))) + (NEQ (CAR X) + '*) + (NEQ (CAR X) + (CADR X))) do (SETTOPVAL (CAR X))) [MAPC (CDR TEM) (FUNCTION (LAMBDA (X) (/SETTOPVAL (CAR X) @@ -481,60 +476,57 @@ [PROG (BASICCLASSES) (for X in FONTPROFILE do (PROG (SEEN (NAME (CAR X)) - (FONTS X)) - LP [COND - ((MEMB (CAR FONTS) - SEEN) - (ERROR "Circular font profile specification" X)) - (T (push SEEN (CAR FONTS] - [SETQ FONTS (CDR (COND - ((OR (NULL (CADR FONTS)) - (LISTP (CADR FONTS))) + (FONTS X)) + LP [COND + ((MEMB (CAR FONTS) + SEEN) + (ERROR "Circular font profile specification" X)) + (T (push SEEN (CAR FONTS] + [SETQ FONTS (CDR (COND + ((OR (NULL (CADR FONTS)) + (LISTP (CADR FONTS))) (*) (* ; - "This skips over the now-defunct NIL or list-of-escape sequence") - (CDR FONTS)) - (T FONTS] - (COND - ((OR (NLISTP FONTS) - (LITATOM (CAR FONTS)))(* ; - "Indirect thru another's font spec") - (AND (SETQ FONTS (ASSOC (SELECTQ (CAR (LISTP FONTS)) - ((NIL DEFAULTFONT) + "This skips over the now-defunct NIL or list-of-escape sequence") + (CDR FONTS)) + (T FONTS] + (COND + ((OR (NLISTP FONTS) + (LITATOM (CAR FONTS))) (* ; "Indirect thru another's font spec") + (AND (SETQ FONTS (ASSOC (SELECTQ (CAR (LISTP FONTS)) + ((NIL DEFAULTFONT) (* ; - "Don't let DEFAULTFONT loop thru itself") - (AND (NOT (MEMB 'DEFAULTFONT SEEN - )) - 'DEFAULTFONT)) - (CAR FONTS)) - FONTPROFILE)) - (GO LP))) - (T [push BASICCLASSES (SETQ FONTS (FONTCLASS NAME FONTS - 'DISPLAY] + "Don't let DEFAULTFONT loop thru itself") + (AND (NOT (MEMB 'DEFAULTFONT SEEN)) + 'DEFAULTFONT)) + (CAR FONTS)) + FONTPROFILE)) + (GO LP))) + (T [push BASICCLASSES (SETQ FONTS (FONTCLASS NAME FONTS 'DISPLAY] (* ; - "Now we have a font class datastructure") - )) - (AND NAME (/SETTOPVAL NAME FONTS)) + "Now we have a font class datastructure") + )) + (AND NAME (/SETTOPVAL NAME FONTS)) - (* ;; "NIL for the class-name means just establish the font-correspondences but don't connect them up with a pretty class name.") + (* ;; "NIL for the class-name means just establish the font-correspondences but don't connect them up with a pretty class name.") - )) + )) (AND BASICCLASSES (FONTMAPARRAY BASICCLASSES 'DISPLAY] [for X in FONTVARS when (NEQ (CAR X) - '*) + '*) do (COND - ((LISTP (CAR X)) - (EVAL (CAR X))) - [(CADDR X) - (SET (CAR X) - (FONTCREATE (OR (GETTOPVAL (CAR X)) - (EVAL (CADR X)) - DEFAULTFONT) - NIL NIL NIL 'DISPLAY] - (T (OR (GETTOPVAL (CAR X)) - (AND (CADR X) - (SET (CAR X) - (EVAL (CADR X] + ((LISTP (CAR X)) + (EVAL (CAR X))) + [(CADDR X) + (SET (CAR X) + (FONTCREATE (OR (GETTOPVAL (CAR X)) + (EVAL (CADR X)) + DEFAULTFONT) + NIL NIL NIL 'DISPLAY] + (T (OR (GETTOPVAL (CAR X)) + (AND (CADR X) + (SET (CAR X) + (EVAL (CADR X] (CL:WHEN CHANGE-WINDOWS? (CL:WHEN (NEQ OLDDEFAULT (FONTCREATE DEFAULTFONT NIL NIL NIL 'DISPLAY)) (for X in (OPENWINDOWS) when (EQ OLDDEFAULT (DSPFONT NIL X)) @@ -543,25 +535,25 @@ (SETQ MaxValueLeftMargin (ITIMES 35 (STRINGWIDTH 'A DEFAULTFONT))) (MAPC CACHEDMENUS 'SET) [for W in (OPENWINDOWS) do [COND - [(OR (EQ (WINDOWPROP W 'RESHAPEFN) - 'DONT) - (WINDOWPROP W 'MAINWINDOW] - (T - (* ;; - "don't reshape if can't or if this window is attached to another.") + [(OR (EQ (WINDOWPROP W 'RESHAPEFN) + 'DONT) + (WINDOWPROP W 'MAINWINDOW] + (T + (* ;; + "don't reshape if can't or if this window is attached to another.") - (SHAPEW W (WINDOWREGION W] - (COND - ((AND (NEQ (WINDOWPROP W 'WINDOWENTRYFN) - (FUNCTION \TEDIT.PROCIDLEFN)) - (WINDOWPROP W 'REPAINTFN)) - (REDISPLAYW W]) + (SHAPEW W (WINDOWREGION W] + (COND + ((AND (NEQ (WINDOWPROP W 'WINDOWENTRYFN) + (FUNCTION \TEDIT.PROCIDLEFN)) + (WINDOWPROP W 'REPAINTFN)) + (REDISPLAYW W]) (* ;; "Set the new font profile name, and return the old one, so he can restore later.") (PROG1 FONTNAME (SETQ FONTNAME NAME] (T (* ; - "He passed in NIL, so return font profile name in effect.") + "He passed in NIL, so return font profile name in effect.") FONTNAME]) (FONTPROFILE @@ -700,6 +692,6 @@ (SETSEPR '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26) 1 FILERDTBL) (DECLARE%: DONTCOPY - (FILEMAP (NIL (21780 33364 (FONTSET 21790 . 28131) (FONTPROFILE 28133 . 30482) (FONTPROFILE.ADDDEVICE -30484 . 33362)) (33600 35499 (FONTMAPARRAY 33610 . 35497))))) + (FILEMAP (NIL (21437 32615 (FONTSET 21447 . 27382) (FONTPROFILE 27384 . 29733) (FONTPROFILE.ADDDEVICE +29735 . 32613)) (32851 34750 (FONTMAPARRAY 32861 . 34748))))) STOP diff --git a/sources/FONTPROFILE.LCOM b/sources/FONTPROFILE.LCOM index 5281a522..c9d4f666 100644 Binary files a/sources/FONTPROFILE.LCOM and b/sources/FONTPROFILE.LCOM differ diff --git a/sources/HARDCOPY b/sources/HARDCOPY index f252f932..de950709 100644 --- a/sources/HARDCOPY +++ b/sources/HARDCOPY @@ -1,10 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "18-Oct-2022 18:47:42" {DSK}larry>ilisp>medley>sources>HARDCOPY.;2 103854 +(FILECREATED "24-Sep-2023 15:25:20" {WMEDLEY}HARDCOPY.;13 105614 - :CHANGES-TO (FNS HARDCOPYIMAGEW.TOPRINTER) + :EDIT-BY rmk - :PREVIOUS-DATE "20-Jul-2022 17:14:14" {DSK}larry>ilisp>medley>sources>HARDCOPY.;1) + :CHANGES-TO (FNS CONVERT.FILE.TO.TYPE.FOR.PRINTER) + + :PREVIOUS-DATE "14-Sep-2023 22:58:42" {WMEDLEY}HARDCOPY.;12) (* ; " @@ -46,7 +48,7 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (INITVARS (TEXTDEFAULTTABS (LIST 20320)) (TEXTDEFAULTPAGEREGION (CREATEREGION 2794 1905 18415 24765))) (* ; - "TEXTDEFAULTTABS Hack, mica equivalent of 8 inches") + "TEXTDEFAULTTABS Hack, mica equivalent of 8 inches. NOT USED ANYWHERE") (GLOBALVARS TEXTDEFAULTTABS TEXTDEFAULTPAGEREGION) (FNS TEXTTOIMAGEFILE COPY.TEXT.TO.IMAGE)) (COMS (FNS \BLTSHADE.GENERICPRINTER) @@ -62,7 +64,9 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. \HDCPYDSPPRINTCHAR \SLOWHDCPYBLTCHAR \CHANGECHARSET.HDCPYDISPLAY) [DECLARE%: DONTCOPY DOEVAL@COMPILE (EXPORT (CONSTANTS (MICASPERPT (FQUOTIENT 2540 72)) (IHALFMICASPERPT 17) - (IMICASPERPT 35] + (IMICASPERPT 35) + (DEFAULTTAB 36] + (* ; "screen-points: 1/2 inch") (DECLARE%: DONTCOPY DOEVAL@COMPILE (EXPORT (FUNCTIONS \MICASTOPTS))) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (\HDCPYDISPLAYINIT] [COMS (* ; @@ -168,20 +172,24 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (DEFINEQ (MakeMenuOfPrinters - [LAMBDA (MENUTITLE) (* ; "Edited 29-May-93 14:18 by rmk:") - (* ; "Edited 11-Jul-90 13:35 by jds") + [LAMBDA (MENUTITLE) (* ; "Edited 22-Jun-2023 17:30 by rmk") + (* ; "Edited 29-May-93 14:18 by rmk:") + (* ; "Edited 11-Jul-90 13:35 by jds") (DECLARE (GLOBALVARS DEFAULTPRINTINGHOST)) (CREATE MENU ITEMS _ (APPEND (FOR P INSIDE DEFAULTPRINTINGHOST COLLECT (LIST (COND - ((LISTP P) - (IF (CADDR P) - THEN (CONCAT (CADR P) - " " - (CADDR P)) - ELSE (CADR P))) - (T P)) - (KWOTE P))) + ((LISTP P) + (IF (CADDR P) + THEN (CONCAT (CADR P) + " " + (CADDR P)) + ELSE (CADR P))) + (T (CL:IF (OR (NULL P) + (ZEROP (NCHARS P))) + "(Default printer)" + P))) + (KWOTE P))) (LIST (LIST "Other..." (KWOTE 'OTHER) "You will be prompted for a printer"))) TITLE _ MENUTITLE @@ -357,8 +365,31 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. ) (CONVERT.FILE.TO.TYPE.FOR.PRINTER -(LAMBDA (FILE FILETYPE PRINTERTYPE HEADING PRINTOPTIONS) (* ; "Edited 29-Dec-88 15:39 by jds") (* ;; "Convert FILE to the kind of hardcopy file (Interpress, Press, 4045HQ, etc) appropriate to PRINTERTYPE.") (SETQ FILETYPE (OR FILETYPE (QUOTE TEXT))) (PROG ((SCRATCH (CLOSEF (OPENFILE (PRINTER.SCRATCH.FILE FILE PRINTERTYPE) (QUOTE OUTPUT) (QUOTE NEW))))) (* ; "Doing the open & close gets us a guaranteed version number, so that all files are truly unique.") (APPLY* (OR (LISTGET (PRINTERPROP PRINTERTYPE (QUOTE CONVERSION)) FILETYPE) (for CANPRINT in (PRINTERPROP PRINTERTYPE (QUOTE CANPRINT)) bind CONVERTER when (SETQ CONVERTER (LISTGET (PRINTFILEPROP CANPRINT (QUOTE CONVERSION)) FILETYPE)) do (RETURN CONVERTER)) (ERROR (CONCAT "Can't convert a " FILETYPE " for a " PRINTERTYPE " printer") (FULLNAME FILE))) FILE SCRATCH (LISTGET PRINTOPTIONS (QUOTE FONTS)) HEADING NIL PRINTOPTIONS) (RESETSAVE NIL (LIST (FUNCTION (LAMBDA (SCRATCH) (CLOSEF? SCRATCH) (DELFILE SCRATCH))) SCRATCH)) (RETURN SCRATCH))) -) + [LAMBDA (FILE FILETYPE PRINTERTYPE HEADING PRINTOPTIONS) (* ; "Edited 24-Sep-2023 15:25 by rmk") + (* ; "Edited 14-Sep-2023 22:58 by rmk") + (* ; "Edited 29-Dec-88 15:39 by jds") + + (* ;; "Convert FILE to the kind of hardcopy file (Interpress, Press, 4045HQ, etc) appropriate to PRINTERTYPE.") + + (SETQ FILETYPE (OR FILETYPE 'TEXT)) + (PROG [(SCRATCH (CLOSEF (OPENSTREAM (PRINTER.SCRATCH.FILE FILE PRINTERTYPE) + 'OUTPUT + 'NEW] (* ; + "Doing the open & close gets us a guaranteed version number, so that all files are truly unique.") + (APPLY* (OR (LISTGET (PRINTERPROP PRINTERTYPE 'CONVERSION) + FILETYPE) + (for CANPRINT in (PRINTERPROP PRINTERTYPE 'CANPRINT) bind CONVERTER + when (SETQ CONVERTER (LISTGET (PRINTFILEPROP CANPRINT 'CONVERSION) + FILETYPE)) do (RETURN CONVERTER)) + (ERROR (CONCAT "Can't convert a " FILETYPE " for a " PRINTERTYPE " printer") + (FULLNAME FILE))) + FILE SCRATCH (LISTGET PRINTOPTIONS 'FONTS) + HEADING NIL PRINTOPTIONS) + (RESETSAVE NIL (LIST [FUNCTION (LAMBDA (SCRATCH) + (CLOSEF? SCRATCH) + (DELFILE SCRATCH] + SCRATCH)) + (RETURN SCRATCH]) (EMPRESS (LAMBDA (FILE %#COPIES HOST HEADING %#SIDES PRINTOPTIONS) (* ; "Edited 26-Aug-87 14:17 by Snow") (SEND.FILE.TO.PRINTER FILE HOST (NCONC (COND (HEADING (LIST (QUOTE HEADING) HEADING))) (COND (%#COPIES (LIST (QUOTE %#COPIES) %#COPIES))) (COND (%#SIDES (LIST (QUOTE %#SIDES) %#SIDES))) PRINTOPTIONS))) @@ -686,7 +717,7 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. -(* ; "TEXTDEFAULTTABS Hack, mica equivalent of 8 inches") +(* ; "TEXTDEFAULTTABS Hack, mica equivalent of 8 inches. NOT USED ANYWHERE") (DECLARE%: DOEVAL@COMPILE DONTCOPY @@ -729,7 +760,8 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (CLOSEF IMAGESTREAM])]) (COPY.TEXT.TO.IMAGE - [LAMBDA (INFILE IMAGESTREAM FONTS TABS) (* ; "Edited 20-Jul-2022 17:14 by rmk") + [LAMBDA (INFILE IMAGESTREAM FONTS TABS) (* ; "Edited 3-Mar-2023 23:46 by rmk") + (* ; "Edited 20-Jul-2022 17:14 by rmk") (* ; "Edited 8-Oct-2021 22:23 by rmk:") (* ; "Edited 10-Apr-95 21:23 by rmk:") @@ -741,7 +773,7 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (FONTARRAY (FONTMAPARRAY FONTS)) (MAXFONT (ARRAYSIZE FONTARRAY)) (INSTRM (GETSTREAM INFILE 'INPUT)) - DEFAULTTAB C FC (EOSP (GETFILEINFO INSTRM 'ENDOFSTREAMOP] + DEFTAB C FC (EOSP (GETFILEINFO INSTRM 'ENDOFSTREAMOP] (* ;;  "RMK: EOS function changed to NILL from ZERO. 0 in low-order bits is OK in UNICODE, when we switch") @@ -775,17 +807,19 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (\OUTCHAR IMAGESTREAM (CHARCODE ^T)) (RETURN)) - (* ;; "TEXTDEFAULTTABS is a hack, since it depends on the units of the stream. Should really be a property of the stream or imagetype, or defined in terms of standard scale") + (* ;; "DEFAULTTAB is now a constant defined here as 36 = 1/2 inch. Maybe that should be scaled by the stream's scale factor vis a vis points, not related to the current font. If you are tabbing for alignment, you wouldn't want it to be ragged based on what font one line is in compare to another. TEXTDEFAULTTAB is a hack that should be removed.") [SETQ FC (IF TABS THEN (OR (CAR (NTH TABS FC)) (ERROR "Undefined absolute tab number" FC)) - ELSE (TIMES FC (OR DEFAULTTAB - (SETQ DEFAULTTAB - (TIMES 8 (CHARWIDTH (CHARCODE SPACE) - (FONTCREATE (ELT FONTARRAY 1) - NIL NIL NIL IMAGESTREAM] + ELSE (TIMES FC (OR DEFTAB (SETQ DEFTAB + (TIMES 8 + (CHARWIDTH (CHARCODE SPACE) + (FONTCREATE (ELT FONTARRAY + 1) + NIL NIL NIL + IMAGESTREAM] (DSPXPOSITION FC IMAGESTREAM)) (NIL (\OUTCHAR IMAGESTREAM (CHARCODE ^F)) (* ; "EOS after ^F") @@ -912,15 +946,23 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (RPAQQ IMICASPERPT 35) +(RPAQQ DEFAULTTAB 36) + (CONSTANTS (MICASPERPT (FQUOTIENT 2540 72)) (IHALFMICASPERPT 17) - (IMICASPERPT 35)) + (IMICASPERPT 35) + (DEFAULTTAB 36)) ) (* "END EXPORTED DEFINITIONS") ) + + + +(* ; "screen-points: 1/2 inch") + (DECLARE%: DONTCOPY DOEVAL@COMPILE (* "FOLLOWING DEFINITIONS EXPORTED") (DEFMACRO \MICASTOPTS (MICAS) @@ -1083,40 +1125,40 @@ Copyright (c) 1984-1993, 1999, 2018, 2021-2022 by Venue & Xerox Corporation. (PUTPROPS HARDCOPY COPYRIGHT ("Venue & Xerox Corporation" 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1999 2018 2021 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (6168 10934 (HARDCOPY.SOMEHOW 6178 . 7536) (HARDCOPYIMAGEW 7538 . 7690) ( -HARDCOPYIMAGEW.TOFILE 7692 . 8000) (HARDCOPYIMAGEW.TOPRINTER 8002 . 9249) (HARDCOPYREGION.TOFILE 9251 - . 9549) (HARDCOPYREGION.TOPRINTER 9551 . 10173) (COPY.WINDOW.TO.BITMAP 10175 . 10932)) (11006 21556 ( -MakeMenuOfPrinters 11016 . 12241) (PRINTERS.WHENSELECTEDFN 12243 . 13985) (MakeMenuOfImageTypes 13987 - . 14505) (GetNewPrinterFromUser 14507 . 14935) (PopUpWindowAndGetAtom 14937 . 16322) ( -PopUpWindowAndGetList 16324 . 17890) (NewPrinter 17892 . 18840) (GetPrinterName 18842 . 19122) ( -GetImageFile 19124 . 21411) (FetchDefaultPrinter 21413 . 21554)) (21591 22129 ( -ExtensionForPrintFileType 21601 . 21794) (PRINTFILETYPE.FROM.EXTENSION 21796 . 22127)) (22184 38568 ( -DEFAULTPRINTER 22194 . 22354) (CAN.PRINT.DIRECTLY 22356 . 22512) (CONVERT.FILE.TO.TYPE.FOR.PRINTER -22514 . 23558) (EMPRESS 23560 . 23873) (HARDCOPYW 23875 . 26835) (LISTFILES1 26837 . 27010) ( -PRINTER.BITMAPFILE 27012 . 27259) (PRINTER.BITMAPSCALE 27261 . 27526) (PRINTER.SCRATCH.FILE 27528 . -27651) (PRINTERPROP 27653 . 27836) (PRINTERSTATUS 27838 . 28027) (PRINTERTYPE 28029 . 30338) ( -PRINTERNAME 30340 . 30642) (PRINTFILEPROP 30644 . 30835) (PRINTFILETYPE 30837 . 32781) ( -\EXPECTED.FILE.TYPE 32783 . 33565) (SEND.FILE.TO.PRINTER 33567 . 38566)) (38569 43551 (PRINTERDEVICE -38579 . 43549)) (44366 52124 (TEXTTOIMAGEFILE 44376 . 46566) (COPY.TEXT.TO.IMAGE 46568 . 52122)) ( -52125 53260 (\BLTSHADE.GENERICPRINTER 52135 . 53258)) (53388 72140 (MAKEHARDCOPYSTREAM 53398 . 54402) -(UNMAKEHARDCOPYSTREAM 54404 . 55088) (HARDCOPYSTREAMTYPE 55090 . 55369) (\CHARWIDTH.HDCPYDISPLAY 55371 - . 55802) (\DSPFONT.HDCPYDISPLAY 55804 . 57209) (\DSPRIGHTMARGIN.HDCPYDISPLAY 57211 . 57788) ( -\DSPXPOSITION.HDCPYDISPLAY 57790 . 58051) (\DSPYPOSITION.HDCPYDISPLAY 58053 . 58314) ( -\STRINGWIDTH.HDCPYDISPLAY 58316 . 58823) (\STRINGWIDTH.HCPYDISPLAYAUX 58825 . 61157) (\HDCPYBLTCHAR -61159 . 63694) (\HDCPYDISPLAY.FIX.XPOS 63696 . 64116) (\HDCPYDISPLAY.FIX.YPOS 64118 . 64538) ( -\HDCPYDISPLAYINIT 64540 . 65317) (\HDCPYDSPPRINTCHAR 65319 . 67479) (\SLOWHDCPYBLTCHAR 67481 . 70984) -(\CHANGECHARSET.HDCPYDISPLAY 70986 . 72138)) (72550 72691 (\MICASTOPTS 72550 . 72691)) (72862 103159 ( -MAKEHARDCOPYMODESTREAM 72872 . 74781) (UNMAKEHARDCOPYMODESTREAM 74783 . 75861) (\BLTSHADE.HCPYMODE -75863 . 76310) (\BITBLT.HCPYMODE 76312 . 76934) (\BRUSHCONVERT.HCPYMODE 76936 . 77173) ( -\CHANGECHARSET.HCPYMODE 77175 . 78942) (\DASHINGCONVERT.HCPYMODE 78944 . 79207) (\CHARWIDTH.HCPYMODE -79209 . 79496) (\DRAWLINE.HCPYMODE 79498 . 79810) (\DRAWCURVE.HCPYMODE 79812 . 80241) ( -\DRAWCIRCLE.HCPYMODE 80243 . 80638) (\DRAWELLIPSE.HCPYMODE 80640 . 81152) (\DSPFONT.HCPYMODE 81154 . -82310) (\DSPLEFTMARGIN.HCPYMODE 82312 . 82896) (\DSPLINEFEED.HCPYMODE 82898 . 83308) ( -\DSPRIGHTMARGIN.HCPYMODE 83310 . 83939) (\DSPSPACEFACTOR.HCPYMODE 83941 . 84462) ( -\DSPXPOSITION.HCPYMODE 84464 . 85045) (\DSPYPOSITION.HCPYMODE 85047 . 85452) (\MOVETO.HCPYMODE 85454 - . 85606) (\FONTCREATE.HCPYMODE.PRESS 85608 . 86620) (\CREATECHARSET.HCPYMODE.PRESS 86622 . 87593) ( -\FONTCREATE.HCPYMODE.INTERPRESS 87595 . 88629) (\CREATECHARSET.HCPYMODE.INTERPRESS 88631 . 89619) ( -\STRINGWIDTH.HCPYMODE 89621 . 90055) (\HCPYMODEBLTCHAR 90057 . 93026) (\HCPYMODEDISPLAYINIT 93028 . -95959) (\HCPYMODEDSPPRINTCHAR 95961 . 98142) (\SLOWHCPYMODEBLTCHAR 98144 . 101658) (\SFFixY.HCPYMODE -101660 . 103157))))) + (FILEMAP (NIL (6336 11102 (HARDCOPY.SOMEHOW 6346 . 7704) (HARDCOPYIMAGEW 7706 . 7858) ( +HARDCOPYIMAGEW.TOFILE 7860 . 8168) (HARDCOPYIMAGEW.TOPRINTER 8170 . 9417) (HARDCOPYREGION.TOFILE 9419 + . 9717) (HARDCOPYREGION.TOPRINTER 9719 . 10341) (COPY.WINDOW.TO.BITMAP 10343 . 11100)) (11174 22031 ( +MakeMenuOfPrinters 11184 . 12716) (PRINTERS.WHENSELECTEDFN 12718 . 14460) (MakeMenuOfImageTypes 14462 + . 14980) (GetNewPrinterFromUser 14982 . 15410) (PopUpWindowAndGetAtom 15412 . 16797) ( +PopUpWindowAndGetList 16799 . 18365) (NewPrinter 18367 . 19315) (GetPrinterName 19317 . 19597) ( +GetImageFile 19599 . 21886) (FetchDefaultPrinter 21888 . 22029)) (22066 22604 ( +ExtensionForPrintFileType 22076 . 22269) (PRINTFILETYPE.FROM.EXTENSION 22271 . 22602)) (22659 39736 ( +DEFAULTPRINTER 22669 . 22829) (CAN.PRINT.DIRECTLY 22831 . 22987) (CONVERT.FILE.TO.TYPE.FOR.PRINTER +22989 . 24726) (EMPRESS 24728 . 25041) (HARDCOPYW 25043 . 28003) (LISTFILES1 28005 . 28178) ( +PRINTER.BITMAPFILE 28180 . 28427) (PRINTER.BITMAPSCALE 28429 . 28694) (PRINTER.SCRATCH.FILE 28696 . +28819) (PRINTERPROP 28821 . 29004) (PRINTERSTATUS 29006 . 29195) (PRINTERTYPE 29197 . 31506) ( +PRINTERNAME 31508 . 31810) (PRINTFILEPROP 31812 . 32003) (PRINTFILETYPE 32005 . 33949) ( +\EXPECTED.FILE.TYPE 33951 . 34733) (SEND.FILE.TO.PRINTER 34735 . 39734)) (39737 44719 (PRINTERDEVICE +39747 . 44717)) (45554 53793 (TEXTTOIMAGEFILE 45564 . 47754) (COPY.TEXT.TO.IMAGE 47756 . 53791)) ( +53794 54929 (\BLTSHADE.GENERICPRINTER 53804 . 54927)) (55057 73809 (MAKEHARDCOPYSTREAM 55067 . 56071) +(UNMAKEHARDCOPYSTREAM 56073 . 56757) (HARDCOPYSTREAMTYPE 56759 . 57038) (\CHARWIDTH.HDCPYDISPLAY 57040 + . 57471) (\DSPFONT.HDCPYDISPLAY 57473 . 58878) (\DSPRIGHTMARGIN.HDCPYDISPLAY 58880 . 59457) ( +\DSPXPOSITION.HDCPYDISPLAY 59459 . 59720) (\DSPYPOSITION.HDCPYDISPLAY 59722 . 59983) ( +\STRINGWIDTH.HDCPYDISPLAY 59985 . 60492) (\STRINGWIDTH.HCPYDISPLAYAUX 60494 . 62826) (\HDCPYBLTCHAR +62828 . 65363) (\HDCPYDISPLAY.FIX.XPOS 65365 . 65785) (\HDCPYDISPLAY.FIX.YPOS 65787 . 66207) ( +\HDCPYDISPLAYINIT 66209 . 66986) (\HDCPYDSPPRINTCHAR 66988 . 69148) (\SLOWHDCPYBLTCHAR 69150 . 72653) +(\CHANGECHARSET.HDCPYDISPLAY 72655 . 73807)) (74310 74451 (\MICASTOPTS 74310 . 74451)) (74622 104919 ( +MAKEHARDCOPYMODESTREAM 74632 . 76541) (UNMAKEHARDCOPYMODESTREAM 76543 . 77621) (\BLTSHADE.HCPYMODE +77623 . 78070) (\BITBLT.HCPYMODE 78072 . 78694) (\BRUSHCONVERT.HCPYMODE 78696 . 78933) ( +\CHANGECHARSET.HCPYMODE 78935 . 80702) (\DASHINGCONVERT.HCPYMODE 80704 . 80967) (\CHARWIDTH.HCPYMODE +80969 . 81256) (\DRAWLINE.HCPYMODE 81258 . 81570) (\DRAWCURVE.HCPYMODE 81572 . 82001) ( +\DRAWCIRCLE.HCPYMODE 82003 . 82398) (\DRAWELLIPSE.HCPYMODE 82400 . 82912) (\DSPFONT.HCPYMODE 82914 . +84070) (\DSPLEFTMARGIN.HCPYMODE 84072 . 84656) (\DSPLINEFEED.HCPYMODE 84658 . 85068) ( +\DSPRIGHTMARGIN.HCPYMODE 85070 . 85699) (\DSPSPACEFACTOR.HCPYMODE 85701 . 86222) ( +\DSPXPOSITION.HCPYMODE 86224 . 86805) (\DSPYPOSITION.HCPYMODE 86807 . 87212) (\MOVETO.HCPYMODE 87214 + . 87366) (\FONTCREATE.HCPYMODE.PRESS 87368 . 88380) (\CREATECHARSET.HCPYMODE.PRESS 88382 . 89353) ( +\FONTCREATE.HCPYMODE.INTERPRESS 89355 . 90389) (\CREATECHARSET.HCPYMODE.INTERPRESS 90391 . 91379) ( +\STRINGWIDTH.HCPYMODE 91381 . 91815) (\HCPYMODEBLTCHAR 91817 . 94786) (\HCPYMODEDISPLAYINIT 94788 . +97719) (\HCPYMODEDSPPRINTCHAR 97721 . 99902) (\SLOWHCPYMODEBLTCHAR 99904 . 103418) (\SFFixY.HCPYMODE +103420 . 104917))))) STOP diff --git a/sources/HARDCOPY.LCOM b/sources/HARDCOPY.LCOM index fa59fbbe..b77be8b8 100644 Binary files a/sources/HARDCOPY.LCOM and b/sources/HARDCOPY.LCOM differ diff --git a/sources/HPRINT b/sources/HPRINT index 80eef590..a2a83474 100644 --- a/sources/HPRINT +++ b/sources/HPRINT @@ -1,11 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 3-Aug-2022 21:31:57" {DSK}larry>medley>sources>HPRINT.;3 58021 +(FILECREATED "31-Jul-2023 13:33:10" {WMEDLEY}HPRINT.;5 57926 - :CHANGES-TO (VARS HPRINTCOMS) - (FNS HPRINT) + :EDIT-BY rmk - :PREVIOUS-DATE "17-Oct-2021 13:54:11" {DSK}larry>medley>sources>HPRINT.;1) + :CHANGES-TO (FNS EQUALALL) + + :PREVIOUS-DATE " 3-Aug-2022 21:31:57" {WMEDLEY}HPRINT.;2) (* ; " @@ -901,8 +902,8 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2022 by Venue & Xerox Corporation (DEFINEQ (EQUALALL - [LAMBDA (X Y) (* ; - "Edited 26-Apr-2021 14:34 by rmk:") + [LAMBDA (X Y) (* ; "Edited 31-Jul-2023 13:31 by rmk") + (* ; "Edited 26-Apr-2021 14:34 by rmk:") (OR (EQ X Y) (PROG ((TY (TYPENAME Y)) TEM) @@ -925,7 +926,7 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2022 by Venue & Xerox Corporation (ARRAYSIZE Y)) (for I from (ARRAYORIG X) as J to TEM always (EQUALALL (ELT X I) - (ELT Y I]) + (ELT Y I]) ((ONED-ARRAY TWOD-ARRAY GENERAL-ARRAY) (* ; "RMK: Added CL arrays") [AND (EQUAL (CL:ARRAY-DIMENSIONS X) @@ -939,14 +940,12 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2022 by Venue & Xerox Corporation (EQP (CL:FILL-POINTER X) (CL:FILL-POINTER Y))) (NOT (CL:ARRAY-HAS-FILL-POINTER-P Y))) - (FOR I FROM 0 TO (SUB1 (CL:ARRAY-TOTAL-SIZE - X)) + (FOR I FROM 0 TO (SUB1 (CL:ARRAY-TOTAL-SIZE X)) ALWAYS (EQUALALL (XCL:ROW-MAJOR-AREF X I) - (XCL:ROW-MAJOR-AREF Y I]) + (XCL:ROW-MAJOR-AREF Y I]) (HARRAYP (EQUALHASH X Y)) - (READTABLEP (for I from 0 to 127 - always (EQUALALL (GETSYNTAX I X) - (GETSYNTAX I Y)))) + (READTABLEP (for I from 0 to 127 always (EQUALALL (GETSYNTAX I X) + (GETSYNTAX I Y)))) (TERMTABLEP [AND (EQ (GETCONTROL X) (GETCONTROL Y)) (EQ (GETRAISE X) @@ -965,18 +964,19 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2022 by Venue & Xerox Corporation Y] (for I from 0 to 31 always (EQ (ECHOCONTROL I NIL X) - (ECHOCONTROL I NIL Y))) + (ECHOCONTROL I NIL Y))) (EVERY ORIGDELETECONTROL (FUNCTION (LAMBDA (Z) (EQUAL (DELETECONTROL (CAR Z) NIL X) (DELETECONTROL (CAR Z) NIL Y]) + ((BITMAP BIGBM) + (BITMAPEQUAL X Y)) (OR (EQP X Y) (AND (SETQ TY (GETDESCRIPTORS TY)) - (for FIELD in TY always (EQUALALL - (FETCHFIELD FIELD X) - (FETCHFIELD FIELD Y]) + (for FIELD in TY always (EQUALALL (FETCHFIELD FIELD X) + (FETCHFIELD FIELD Y]) (EQUALHASH [LAMBDA (AR1 AR2) @@ -1118,14 +1118,14 @@ Copyright (c) 1982-1988, 1990-1991, 1993-1994, 2022 by Venue & Xerox Corporation (PUTPROPS HPRINT COPYRIGHT ("Venue & Xerox Corporation" 1982 1983 1984 1985 1986 1987 1988 1990 1991 1993 1994 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (3694 6232 (MAKEHVPRETTYCOMS 3704 . 4991) (READVARS 4993 . 5559) (HPRINT0 5561 . 6230)) -(6234 6567 (READVARS-FROM-STRINGS 6234 . 6567)) (6569 6956 (READVARS-FROM-STREAM 6569 . 6956)) (6957 -8885 (READVAR-FROM-STRING 6967 . 7373) (READVARS-FROM-STRING 7375 . 7611) (HPRINT-TO-STRING 7613 . -7819) (HPRINT-TO-STRINGS 7821 . 8883)) (9696 38289 (HPRINT 9706 . 11697) (HPRINT1 11699 . 23201) ( -HPRINTEND 23203 . 24239) (RPTPRINT 24241 . 24479) (RPTEND 24481 . 24640) (RPTPUT 24642 . 25140) ( -HPRINTSP 25142 . 25206) (HPERR 25208 . 25305) (HVFWDCDREAD 25307 . 25686) (HVBAKREAD 25688 . 33733) ( -HVREADCHECKGETFN 33735 . 35134) (HVREADEND 35136 . 35488) (HVRPTREAD 35490 . 36016) (HVFWDREAD 36018 - . 36872) (HREAD 36874 . 37196) (HPINITRDTBL 37198 . 38032) (HVREADERR 38034 . 38147) (HPRINSP 38149 - . 38287)) (38290 47172 (COPYALL 38300 . 42203) (\COPYDATATYPE 42205 . 42894) (HCOPYALL 42896 . 43206) - (HCOPYALL1 43208 . 47170)) (47173 54520 (EQUALALL 47183 . 52841) (EQUALHASH 52843 . 54518))))) + (FILEMAP (NIL (3652 6190 (MAKEHVPRETTYCOMS 3662 . 4949) (READVARS 4951 . 5517) (HPRINT0 5519 . 6188)) +(6192 6525 (READVARS-FROM-STRINGS 6192 . 6525)) (6527 6914 (READVARS-FROM-STREAM 6527 . 6914)) (6915 +8843 (READVAR-FROM-STRING 6925 . 7331) (READVARS-FROM-STRING 7333 . 7569) (HPRINT-TO-STRING 7571 . +7777) (HPRINT-TO-STRINGS 7779 . 8841)) (9654 38247 (HPRINT 9664 . 11655) (HPRINT1 11657 . 23159) ( +HPRINTEND 23161 . 24197) (RPTPRINT 24199 . 24437) (RPTEND 24439 . 24598) (RPTPUT 24600 . 25098) ( +HPRINTSP 25100 . 25164) (HPERR 25166 . 25263) (HVFWDCDREAD 25265 . 25644) (HVBAKREAD 25646 . 33691) ( +HVREADCHECKGETFN 33693 . 35092) (HVREADEND 35094 . 35446) (HVRPTREAD 35448 . 35974) (HVFWDREAD 35976 + . 36830) (HREAD 36832 . 37154) (HPINITRDTBL 37156 . 37990) (HVREADERR 37992 . 38105) (HPRINSP 38107 + . 38245)) (38248 47130 (COPYALL 38258 . 42161) (\COPYDATATYPE 42163 . 42852) (HCOPYALL 42854 . 43164) + (HCOPYALL1 43166 . 47128)) (47131 54425 (EQUALALL 47141 . 52746) (EQUALHASH 52748 . 54423))))) STOP diff --git a/sources/HPRINT.LCOM b/sources/HPRINT.LCOM index 24b13d5b..56f075ff 100644 Binary files a/sources/HPRINT.LCOM and b/sources/HPRINT.LCOM differ diff --git a/sources/LLDISPLAY b/sources/LLDISPLAY index dc0b0564..634f7a05 100644 --- a/sources/LLDISPLAY +++ b/sources/LLDISPLAY @@ -1,17 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 9-Jul-2022 12:08:02"  -{DSK}kaplan>local>medley3.5>working-medley>sources>LLDISPLAY.;16 269372 +(FILECREATED "31-Jul-2023 14:50:58" {WMEDLEY}LLDISPLAY.;19 270570 - :CHANGES-TO (FNS \COMMON.DSPCREATE) + :EDIT-BY rmk - :PREVIOUS-DATE " 8-Jul-2022 23:44:51" -{DSK}kaplan>local>medley3.5>working-medley>sources>LLDISPLAY.;13) + :CHANGES-TO (FNS BITMAPEQUAL) + :PREVIOUS-DATE "31-Jul-2023 14:45:32" {WMEDLEY}LLDISPLAY.;18) -(* ; " -Copyright (c) 1981-1990, 1993-1994, 2021 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT LLDISPLAYCOMS) @@ -33,8 +29,8 @@ Copyright (c) 1981-1990, 1993-1994, 2021 by Venue & Xerox Corporation. (DECLARE%: DONTEVAL@LOAD DOCOPY (VARS (CursorBitMap (\CreateCursorBitMap] [COMS (* ; "bitmap functions.") (FNS BITBLT BLTSHADE \BITBLTSUB \GETPILOTBBTSCRATCHBM BITMAPCOPY BITMAPCREATE BITMAPBIT - BLTCHAR \BLTCHAR \MEDW.BLTCHAR \CHANGECHARSET.DISPLAY \INDICATESTRING \SLOWBLTCHAR - TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP + BITMAPEQUAL BLTCHAR \BLTCHAR \MEDW.BLTCHAR \CHANGECHARSET.DISPLAY \INDICATESTRING + \SLOWBLTCHAR TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP \INSUREBITSPERPIXEL MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) (FUNCTIONS FINISH-READING-BITMAP) @@ -1022,6 +1018,29 @@ Copyright (c) 1981-1990, 1993-1994, 2021 by Venue & Xerox Corporation.  "anything outside the clipping region returns 0.") 0]) +(BITMAPEQUAL + [LAMBDA (BM1 BM2) (* ; "Edited 31-Jul-2023 14:50 by rmk") + + (* ;; "T if BM1 and BM2 are both bitmaps of the same shape and contents. The numeric fields are all SMALLP's") + + (if (AND (type? BITMAP BM1) + (type? BITMAP BM2)) + then (CL:WHEN (AND (EQ (ffetch (BITMAP BITMAPWIDTH) of BM1) + (ffetch (BITMAP BITMAPWIDTH) of BM2)) + (EQ (ffetch (BITMAP BITMAPHEIGHT) of BM1) + (ffetch (BITMAP BITMAPHEIGHT) of BM2)) + (EQ (ffetch (BITMAP BITMAPRASTERWIDTH) of BM1) + (ffetch (BITMAP BITMAPRASTERWIDTH) of BM2)) + (EQ (ffetch (BITMAP BITMAPBITSPERPIXEL) of BM1) + (ffetch (BITMAP BITMAPBITSPERPIXEL) of BM2))) + (for I (BASE1 _ (ffetch (BITMAP BITMAPBASE) of BM1)) + (BASE2 _ (ffetch (BITMAP BITMAPBASE) of BM2)) from 0 + to (SUB1 (ITIMES (ffetch (BITMAP BITMAPRASTERWIDTH) of BM1) + (ffetch (BITMAP BITMAPHEIGHT) of BM1))) + always (EQ (\GETBASE BASE1 I) + (\GETBASE BASE2 I)))) + else (BIGBITMAPEQUAL BM1 BM2]) + (BLTCHAR [LAMBDA (CHARCODE DISPLAYSTREAM) (* rmk%: " 4-Apr-85 11:45") (* ; "user entry --- seldom used") @@ -4553,46 +4572,44 @@ Copyright (c) 1981-1990, 1993-1994, 2021 by Venue & Xerox Corporation. (ADDTOVAR LAMA ) ) -(PUTPROPS LLDISPLAY COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 -1989 1990 1993 1994 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (20598 23266 (\FBITMAPBIT 20608 . 21068) (\FBITMAPBIT.UFN 21070 . 22089) ( -\NEWPAGE.DISPLAY 22091 . 22226) (INITBITMASKS 22228 . 23264)) (25191 25700 (\CreateCursorBitMap 25201 - . 25698)) (25817 84905 (BITBLT 25827 . 36217) (BLTSHADE 36219 . 36997) (\BITBLTSUB 36999 . 47134) ( -\GETPILOTBBTSCRATCHBM 47136 . 47751) (BITMAPCOPY 47753 . 48329) (BITMAPCREATE 48331 . 49891) ( -BITMAPBIT 49893 . 58280) (BLTCHAR 58282 . 58898) (\BLTCHAR 58900 . 59402) (\MEDW.BLTCHAR 59404 . 64282 -) (\CHANGECHARSET.DISPLAY 64284 . 67242) (\INDICATESTRING 67244 . 68440) (\SLOWBLTCHAR 68442 . 75538) -(TEXTUREP 75540 . 75810) (INVERT.TEXTURE 75812 . 76086) (INVERT.TEXTURE.BITMAP 76088 . 77623) ( -BITMAPWIDTH 77625 . 77997) (READBITMAP 77999 . 80509) (\INSUREBITSPERPIXEL 80511 . 80806) ( -MAXIMUMCOLOR 80808 . 80949) (OPPOSITECOLOR 80951 . 81130) (MAXIMUMSHADE 81132 . 81343) (OPPOSITESHADE -81345 . 81524) (\MEDW.BITBLT 81526 . 84903)) (84907 90093 (FINISH-READING-BITMAP 84907 . 90093)) ( -91215 91696 (BITMAPBIT.EXPANDER 91225 . 91694)) (91697 140231 (\BITBLT.DISPLAY 91707 . 114946) ( -\BITBLT.BITMAP 114948 . 124047) (\BITBLT.MERGE 124049 . 126302) (\BLTSHADE.DISPLAY 126304 . 133404) ( -\BLTSHADE.BITMAP 133406 . 140229)) (140232 149552 (\BITBLT.BITMAP.SLOW 140242 . 149550)) (149553 -165934 (\PUNT.BLTSHADE.BITMAP 149563 . 156659) (\PUNT.BITBLT.BITMAP 156661 . 165932)) (165935 169375 ( -\SCALEDBITBLT.DISPLAY 165945 . 167578) (\BACKCOLOR.DISPLAY 167580 . 169373)) (173230 175503 ( -DISPLAYSTREAMP 173240 . 173848) (DSPSOURCETYPE 173850 . 174859) (DSPXOFFSET 174861 . 175180) ( -DSPYOFFSET 175182 . 175501)) (175504 189699 (DSPDESTINATION 175514 . 178617) (DSPTEXTURE 178619 . -178781) (\DISPLAYSTREAMINCRXPOSITION 178783 . 179070) (\SFFixDestination 179072 . 180250) ( -\SFFixClippingRegion 180252 . 182424) (\SFFixFont 182426 . 183476) (\SFFIXLINELENGTH 183478 . 184974) -(\UPDATE-SYNONYM-STREAM-LINELENGTH-FIELD 184976 . 186789) (\SFFixY 186791 . 189697)) (189700 193547 ( -\SIMPLE.DSPCREATE 189710 . 190260) (\COMMON.DSPCREATE 190262 . 193545)) (193648 195842 (\MEDW.XOFFSET -193658 . 194799) (\MEDW.YOFFSET 194801 . 195840)) (195843 203769 (\DSPCLIPPINGREGION.DISPLAY 195853 . -196599) (\DSPFONT.DISPLAY 196601 . 198971) (\DISPLAY.PILOTBITBLT 198973 . 199122) ( -\DSPLINEFEED.DISPLAY 199124 . 199695) (\DSPLEFTMARGIN.DISPLAY 199697 . 200428) (\DSPOPERATION.DISPLAY -200430 . 201454) (\DSPRIGHTMARGIN.DISPLAY 201456 . 202301) (\DSPXPOSITION.DISPLAY 202303 . 203160) ( -\DSPYPOSITION.DISPLAY 203162 . 203767)) (207957 212993 (TTYDISPLAYSTREAM 207967 . 212991)) (213296 -214326 (DSPSCROLL 213306 . 214006) (PAGEHEIGHT 214008 . 214324)) (214371 217393 (\DSPRESET.DISPLAY -214381 . 217391)) (217429 217952 (\MAYBE-DRIBBLE-CHAR 217429 . 217952)) (217953 238591 (\DSPPRINTCHAR -217963 . 225801) (\DSPPRINTCR/LF 225803 . 238589)) (238592 239184 (\TTYBACKGROUND 238602 . 239182)) ( -239185 242472 (DSPBACKUP 239195 . 242470)) (242656 242912 (COLORDISPLAYP 242666 . 242910)) (242913 -244984 (DISPLAYBEFOREEXIT 242923 . 243749) (DISPLAYAFTERENTRY 243751 . 244982)) (245356 249888 ( -\DSPCLIPTRANSFORMX 245366 . 245955) (\DSPCLIPTRANSFORMY 245957 . 246682) (\DSPTRANSFORMREGION 246684 - . 247216) (\DSPUNTRANSFORMY 247218 . 247478) (\DSPUNTRANSFORMX 247480 . 247740) ( -\OFFSETCLIPPINGREGION 247742 . 249886)) (251202 253789 (UPDATESCREENDIMENSIONS 251212 . 251841) ( -\CreateScreenBitMap 251843 . 253787)) (254348 267507 (\CoerceToDisplayDevice 254358 . 254771) ( -\CREATEDISPLAY 254773 . 256613) (DISPLAYSTREAMINIT 256615 . 259759) (\STARTDISPLAY 259761 . 262672) ( -\MOVE.WINDOWS.ONTO.SCREEN 262674 . 264866) (\UPDATE.PBT.RASTERWIDTHS 264868 . 266650) (\STOPDISPLAY -266652 . 267144) (\DEFINEDISPLAYINFO 267146 . 267505)) (268115 268876 (INITIALIZEDISPLAYSTREAMS 268125 - . 268874))))) + (FILEMAP (NIL (20459 23127 (\FBITMAPBIT 20469 . 20929) (\FBITMAPBIT.UFN 20931 . 21950) ( +\NEWPAGE.DISPLAY 21952 . 22087) (INITBITMASKS 22089 . 23125)) (25052 25561 (\CreateCursorBitMap 25062 + . 25559)) (25678 86230 (BITBLT 25688 . 36078) (BLTSHADE 36080 . 36858) (\BITBLTSUB 36860 . 46995) ( +\GETPILOTBBTSCRATCHBM 46997 . 47612) (BITMAPCOPY 47614 . 48190) (BITMAPCREATE 48192 . 49752) ( +BITMAPBIT 49754 . 58141) (BITMAPEQUAL 58143 . 59605) (BLTCHAR 59607 . 60223) (\BLTCHAR 60225 . 60727) +(\MEDW.BLTCHAR 60729 . 65607) (\CHANGECHARSET.DISPLAY 65609 . 68567) (\INDICATESTRING 68569 . 69765) ( +\SLOWBLTCHAR 69767 . 76863) (TEXTUREP 76865 . 77135) (INVERT.TEXTURE 77137 . 77411) ( +INVERT.TEXTURE.BITMAP 77413 . 78948) (BITMAPWIDTH 78950 . 79322) (READBITMAP 79324 . 81834) ( +\INSUREBITSPERPIXEL 81836 . 82131) (MAXIMUMCOLOR 82133 . 82274) (OPPOSITECOLOR 82276 . 82455) ( +MAXIMUMSHADE 82457 . 82668) (OPPOSITESHADE 82670 . 82849) (\MEDW.BITBLT 82851 . 86228)) (86232 91418 ( +FINISH-READING-BITMAP 86232 . 91418)) (92540 93021 (BITMAPBIT.EXPANDER 92550 . 93019)) (93022 141556 ( +\BITBLT.DISPLAY 93032 . 116271) (\BITBLT.BITMAP 116273 . 125372) (\BITBLT.MERGE 125374 . 127627) ( +\BLTSHADE.DISPLAY 127629 . 134729) (\BLTSHADE.BITMAP 134731 . 141554)) (141557 150877 ( +\BITBLT.BITMAP.SLOW 141567 . 150875)) (150878 167259 (\PUNT.BLTSHADE.BITMAP 150888 . 157984) ( +\PUNT.BITBLT.BITMAP 157986 . 167257)) (167260 170700 (\SCALEDBITBLT.DISPLAY 167270 . 168903) ( +\BACKCOLOR.DISPLAY 168905 . 170698)) (174555 176828 (DISPLAYSTREAMP 174565 . 175173) (DSPSOURCETYPE +175175 . 176184) (DSPXOFFSET 176186 . 176505) (DSPYOFFSET 176507 . 176826)) (176829 191024 ( +DSPDESTINATION 176839 . 179942) (DSPTEXTURE 179944 . 180106) (\DISPLAYSTREAMINCRXPOSITION 180108 . +180395) (\SFFixDestination 180397 . 181575) (\SFFixClippingRegion 181577 . 183749) (\SFFixFont 183751 + . 184801) (\SFFIXLINELENGTH 184803 . 186299) (\UPDATE-SYNONYM-STREAM-LINELENGTH-FIELD 186301 . 188114 +) (\SFFixY 188116 . 191022)) (191025 194872 (\SIMPLE.DSPCREATE 191035 . 191585) (\COMMON.DSPCREATE +191587 . 194870)) (194973 197167 (\MEDW.XOFFSET 194983 . 196124) (\MEDW.YOFFSET 196126 . 197165)) ( +197168 205094 (\DSPCLIPPINGREGION.DISPLAY 197178 . 197924) (\DSPFONT.DISPLAY 197926 . 200296) ( +\DISPLAY.PILOTBITBLT 200298 . 200447) (\DSPLINEFEED.DISPLAY 200449 . 201020) (\DSPLEFTMARGIN.DISPLAY +201022 . 201753) (\DSPOPERATION.DISPLAY 201755 . 202779) (\DSPRIGHTMARGIN.DISPLAY 202781 . 203626) ( +\DSPXPOSITION.DISPLAY 203628 . 204485) (\DSPYPOSITION.DISPLAY 204487 . 205092)) (209282 214318 ( +TTYDISPLAYSTREAM 209292 . 214316)) (214621 215651 (DSPSCROLL 214631 . 215331) (PAGEHEIGHT 215333 . +215649)) (215696 218718 (\DSPRESET.DISPLAY 215706 . 218716)) (218754 219277 (\MAYBE-DRIBBLE-CHAR +218754 . 219277)) (219278 239916 (\DSPPRINTCHAR 219288 . 227126) (\DSPPRINTCR/LF 227128 . 239914)) ( +239917 240509 (\TTYBACKGROUND 239927 . 240507)) (240510 243797 (DSPBACKUP 240520 . 243795)) (243981 +244237 (COLORDISPLAYP 243991 . 244235)) (244238 246309 (DISPLAYBEFOREEXIT 244248 . 245074) ( +DISPLAYAFTERENTRY 245076 . 246307)) (246681 251213 (\DSPCLIPTRANSFORMX 246691 . 247280) ( +\DSPCLIPTRANSFORMY 247282 . 248007) (\DSPTRANSFORMREGION 248009 . 248541) (\DSPUNTRANSFORMY 248543 . +248803) (\DSPUNTRANSFORMX 248805 . 249065) (\OFFSETCLIPPINGREGION 249067 . 251211)) (252527 255114 ( +UPDATESCREENDIMENSIONS 252537 . 253166) (\CreateScreenBitMap 253168 . 255112)) (255673 268832 ( +\CoerceToDisplayDevice 255683 . 256096) (\CREATEDISPLAY 256098 . 257938) (DISPLAYSTREAMINIT 257940 . +261084) (\STARTDISPLAY 261086 . 263997) (\MOVE.WINDOWS.ONTO.SCREEN 263999 . 266191) ( +\UPDATE.PBT.RASTERWIDTHS 266193 . 267975) (\STOPDISPLAY 267977 . 268469) (\DEFINEDISPLAYINFO 268471 . +268830)) (269440 270201 (INITIALIZEDISPLAYSTREAMS 269450 . 270199))))) STOP diff --git a/sources/LLDISPLAY.LCOM b/sources/LLDISPLAY.LCOM index 9659fefc..7aba939d 100644 --- a/sources/LLDISPLAY.LCOM +++ b/sources/LLDISPLAY.LCOM @@ -1,12 +1,9 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED " 9-Jul-2022 12:08:03" ("compiled on " -{DSK}kaplan>local>medley3.5>working-medley>sources>LLDISPLAY.;16) " 8-Jul-2022 23:54:51" -"COMPILE-FILEd" in "FULL 8-Jul-2022 ..." dated " 8-Jul-2022 23:54:57") -(FILECREATED " 9-Jul-2022 12:08:02" -{DSK}kaplan>local>medley3.5>working-medley>sources>LLDISPLAY.;16 269372 :CHANGES-TO (FNS -\COMMON.DSPCREATE) :PREVIOUS-DATE " 8-Jul-2022 23:44:51" -{DSK}kaplan>local>medley3.5>working-medley>sources>LLDISPLAY.;13) +(FILECREATED "31-Jul-2023 14:50:58" ("compiled on " {WMEDLEY}LLDISPLAY.;19) +"31-Jul-2023 14:48:17" "COMPILE-FILEd" in "FULL 31-Jul-2023 ..." dated "31-Jul-2023 14:48:24") +(FILECREATED "31-Jul-2023 14:50:58" {WMEDLEY}LLDISPLAY.;19 270570 :EDIT-BY rmk :CHANGES-TO ( +FNS BITMAPEQUAL) :PREVIOUS-DATE "31-Jul-2023 14:45:32" {WMEDLEY}LLDISPLAY.;18) (RPAQQ LLDISPLAYCOMS ((DECLARE%: DONTCOPY (EXPORT (RECORDS PILOTBBT \DISPLAYDATA DISPLAYSTATE DISPLAYINFO) (MACROS \GETDISPLAYDATA))) (* ; "User-visible records are on ADISPLAY --- must be init'ed here") (INITRECORDS BITMAP PILOTBBT REGION @@ -16,12 +13,12 @@ OPTIMIZERS \FBITMAPBIT) (EXPORT (DECLARE%: DONTCOPY (MACROS \BITMASK \4BITMASK \ WORDMASK 65535)))) (DECLARE%: DONTEVAL@LOAD DOCOPY (P (INITBITMASKS)))) (COMS (* ; "init cursor") (FNS \CreateCursorBitMap) (DECLARE%: DONTEVAL@LOAD DOCOPY (VARS (CursorBitMap (\CreateCursorBitMap))))) ( COMS (* ; "bitmap functions.") (FNS BITBLT BLTSHADE \BITBLTSUB \GETPILOTBBTSCRATCHBM BITMAPCOPY -BITMAPCREATE BITMAPBIT BLTCHAR \BLTCHAR \MEDW.BLTCHAR \CHANGECHARSET.DISPLAY \INDICATESTRING -\SLOWBLTCHAR TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP \INSUREBITSPERPIXEL -MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) (FUNCTIONS FINISH-READING-BITMAP) -(CONSTANTS (MINIMUMCOLOR 0) (MINIMUMSHADE 0)) (P (MOVD (QUOTE BITMAPBIT) (QUOTE \BITMAPBIT))) ( -DECLARE%: DONTCOPY (EXPORT (MACROS \INVALIDATEDISPLAYCACHE))) (OPTIMIZERS BITMAPBIT BITMAPP) (FNS -BITMAPBIT.EXPANDER) (FNS \BITBLT.DISPLAY \BITBLT.BITMAP \BITBLT.MERGE \BLTSHADE.DISPLAY +BITMAPCREATE BITMAPBIT BITMAPEQUAL BLTCHAR \BLTCHAR \MEDW.BLTCHAR \CHANGECHARSET.DISPLAY +\INDICATESTRING \SLOWBLTCHAR TEXTUREP INVERT.TEXTURE INVERT.TEXTURE.BITMAP BITMAPWIDTH READBITMAP +\INSUREBITSPERPIXEL MAXIMUMCOLOR OPPOSITECOLOR MAXIMUMSHADE OPPOSITESHADE \MEDW.BITBLT) (FUNCTIONS +FINISH-READING-BITMAP) (CONSTANTS (MINIMUMCOLOR 0) (MINIMUMSHADE 0)) (P (MOVD (QUOTE BITMAPBIT) (QUOTE + \BITMAPBIT))) (DECLARE%: DONTCOPY (EXPORT (MACROS \INVALIDATEDISPLAYCACHE))) (OPTIMIZERS BITMAPBIT +BITMAPP) (FNS BITMAPBIT.EXPANDER) (FNS \BITBLT.DISPLAY \BITBLT.BITMAP \BITBLT.MERGE \BLTSHADE.DISPLAY \BLTSHADE.BITMAP) (FNS (* ;; "For SunLoadup") \BITBLT.BITMAP.SLOW) (FNS (* ;; " punt case for C funcs.bitblt_bitmap,bitshade.bitmap") \PUNT.BLTSHADE.BITMAP \PUNT.BITBLT.BITMAP) ( FNS (* ;; "from SUMEX-AIM") \SCALEDBITBLT.DISPLAY \BACKCOLOR.DISPLAY) (DECLARE%: DONTCOPY (CONSTANTS ( @@ -123,18 +120,18 @@ NIL $l dk () (RPAQ CursorBitMap (\CreateCursorBitMap)) BITBLT :D8 -(L (11 CLIPPINGREGION 10 TEXTURE 9 OPERATION 8 SOURCETYPE 7 HEIGHT 6 WIDTH 5 DESTINATIONBOTTOM 4 DESTINATIONLEFT 3 DESTINATION 2 SOURCEBOTTOM 1 SOURCELEFT 0 SOURCE) F 19 \SOFTCURSORUPP F 20 \CURSORDESTINATION F 21 \SCREENBITMAPS)  DjbEjb +(L (11 CLIPPINGREGION 10 TEXTURE 9 OPERATION 8 SOURCETYPE 7 HEIGHT 6 WIDTH 5 DESTINATIONBOTTOM 4 DESTINATIONLEFT 3 DESTINATION 2 SOURCEBOTTOM 1 SOURCELEFT 0 SOURCE) F 19 \SOFTCURSORP F 20 \SOFTCURSORUPP F 21 \CURSORDESTINATION F 22 \SCREENBITMAPS)  DjbEjb GgNCdGCDEFGGG gh H.GHDEFGGGlI@@d]AjbBjb@ABF3@b G@b@BٽdMM@AټdLɿLgh 0XAH bBH -bHAHbH"dNNBHbH$_dOOFNH#Jb G%H%KbGH6bFj Gj4hH%K_dOֿOH#J_dO񲭿OCdɿ@ h__`8W&h@gh -W(_`_`j@gh _`hO -W*O IABCDEFGGGGGJK OX`ODIABCDEFGGGGGJK gh _@C@ C @dC -Ŀh__ _"`8W&h@gh -W(_"`_ `j@gh _`hO -W*O IABFG +bHAHbH"dNNBHbH$_dOOFNH#Jb G%H%KbGH6bFj Gj4hH%K_dOֿOH#J_dO񲭿OCdƿ@ h__W&8W(h@gh +W*_`_`j@gh _`hO +W,O IABCDEFGGGGGJK OU`OAIABCDEFGGGGGJK gh _@C@ C @dC +h__ _"W&8W(h@gh +W*_"`_ `j@gh _`hO +W,O IABFG _jdFGgg -O"`O OjdODEFGGGGG @ O._$IABODEFGGGGGJKlO$h(881 TOTOPW 874 BKBITBLT 838 \SOFTCURSORUPCURRENT 829 BKBITBLT 806 BITMAPCREATE 794 \TOTOPWDS 783 DSPDESTINATION 765 \GETSTREAM 752 \SOFTCURSORDOWN 721 DSPDESTINATION 716 \GETSTREAM 679 WOVERLAPP 667 WINDOWP 657 WINDOWP 642 \GETSTREAM 630 \BITBLT.BITMAP 591 \SOFTCURSORUPCURRENT 578 \BITBLT.BITMAP 552 \TOTOPWDS 541 DSPDESTINATION 523 \GETSTREAM 510 \SOFTCURSORDOWN 479 DSPDESTINATION 474 \GETSTREAM 440 WINDOWP 214 \GETSTREAM 61 \GETSTREAM 49 \BLTSHADE.BITMAP) -(896 IMAGEOPS 889 STREAM 844 \EM.DISPINTERRUPT 823 REPLACE 818 INPUT 772 \TOPWDS 759 OUTPUT 743 \EM.DISPINTERRUPT 733 \EM.DISPINTERRUPT 710 OUTPUT 697 \SOFTCURSORP 636 OUTPUT 597 \EM.DISPINTERRUPT 530 \TOPWDS 517 OUTPUT 501 \EM.DISPINTERRUPT 491 \EM.DISPINTERRUPT 468 OUTPUT 455 \SOFTCURSORP 429 BITMAP 404 \DISPLAYDATA 380 \DISPLAYDATA 345 \DISPLAYDATA 328 \DISPLAYDATA 305 \DISPLAYDATA 294 \DISPLAYDATA 277 \DISPLAYDATA 266 \DISPLAYDATA 256 \DISPLAYDATA 226 \DISPLAYDATA 219 STREAM 208 OUTPUT 189 BITMAP 169 BITMAP 155 BITMAP 140 BITMAP 110 BITMAP 77 IMAGEOPS 70 STREAM 55 OUTPUT 28 BITMAP 18 TEXTURE) +O"`O OjdODEFGGGGG @ O._$IABODEFGGGGGJKlO$h(875 TOTOPW 868 BKBITBLT 832 \SOFTCURSORUPCURRENT 823 BKBITBLT 800 BITMAPCREATE 788 \TOTOPWDS 777 DSPDESTINATION 759 \GETSTREAM 746 \SOFTCURSORDOWN 715 DSPDESTINATION 710 \GETSTREAM 676 WOVERLAPP 664 WINDOWP 654 WINDOWP 639 \GETSTREAM 627 \BITBLT.BITMAP 588 \SOFTCURSORUPCURRENT 575 \BITBLT.BITMAP 549 \TOTOPWDS 538 DSPDESTINATION 520 \GETSTREAM 507 \SOFTCURSORDOWN 476 DSPDESTINATION 471 \GETSTREAM 440 WINDOWP 214 \GETSTREAM 61 \GETSTREAM 49 \BLTSHADE.BITMAP) +(890 IMAGEOPS 883 STREAM 838 \EM.DISPINTERRUPT 817 REPLACE 812 INPUT 766 \TOPWDS 753 OUTPUT 737 \EM.DISPINTERRUPT 727 \EM.DISPINTERRUPT 704 OUTPUT 633 OUTPUT 594 \EM.DISPINTERRUPT 527 \TOPWDS 514 OUTPUT 498 \EM.DISPINTERRUPT 488 \EM.DISPINTERRUPT 465 OUTPUT 429 BITMAP 404 \DISPLAYDATA 380 \DISPLAYDATA 345 \DISPLAYDATA 328 \DISPLAYDATA 305 \DISPLAYDATA 294 \DISPLAYDATA 277 \DISPLAYDATA 266 \DISPLAYDATA 256 \DISPLAYDATA 226 \DISPLAYDATA 219 STREAM 208 OUTPUT 189 BITMAP 169 BITMAP 155 BITMAP 140 BITMAP 110 BITMAP 77 IMAGEOPS 70 STREAM 55 OUTPUT 28 BITMAP 18 TEXTURE) () BLTSHADE :D8 (L (7 CLIPPINGREGION 6 OPERATION 5 HEIGHT 4 WIDTH 3 DESTINATIONBOTTOM 2 DESTINATIONLEFT 1 DESTINATION 0 TEXTURE)) [Ad@ABjCjDEFG gh H.@HBjCjDEFdH @@ -171,7 +168,7 @@ BITMAPCREATE :D8 NIL ( 102 "bits in BITMAP -- too big" 88 131066) BITMAPBIT :D8 -(P 15 SOFTCURSORUP P 14 DISPINTERRUPT P 13 DD P 12 TY P 11 TX P 6 bitmapbase P 5 oldword P 4 HEIGHT P 3 OLDVALUE P 2 WORDX P 1 BITX P 0 NBITS I 3 NEWVALUE I 2 Y I 1 X I 0 BITMAP F 16 \SOFTCURSORUPP F 17 \CURSORDESTINATION F 18 \SCREENBITMAPS)  +(P 15 SOFTCURSORUP P 14 DISPINTERRUPT P 13 DD P 12 TY P 11 TX P 6 bitmapbase P 5 oldword P 4 HEIGHT P 3 OLDVALUE P 2 WORDX P 1 BITX P 0 NBITS I 3 NEWVALUE I 2 Y I 1 X I 0 BITMAP F 16 \SOFTCURSORP F 17 \SOFTCURSORUPP F 18 \CURSORDESTINATION F 19 \SCREENBITMAPS)  @+@XjA A@jBB@\Hk[Cdj@ABkLk@h8@ABlLk@h8@ABlLk@h8@@Bk@^CjCC@ C HdkcAZNJ]`Al__Ol OYC MIj jjNJMImNJMIklmAlYdZNJ]d`Al__Ol O[CNJMKCllAl @@ -180,27 +177,32 @@ BITMAPBIT :D8 [CNAC KoH 0 @gh b0_AO _BO -_Od `-W h@ -W"_`_`j@`h@ -W$@ OOOC_O`OO(733 \SOFTCURSORUPCURRENT 705 \TOTOPWDS 695 DSPDESTINATION 678 \SOFTCURSORDOWN 647 DSPDESTINATION 613 \DSPCLIPTRANSFORMY 603 \DSPCLIPTRANSFORMX 579 \GETSTREAM 563 ERROR 550 \PUTBASE24 539 \GETBASE24 435 LRSH 415 LLSH 382 \GETBASEFIXP 275 \GETBASEFIXP 220 \ILLEGAL.ARG 212 MAXIMUMCOLOR) -(739 \EM.DISPINTERRUPT 713 \DISPLAYDATA 685 \TOPWDS 669 \EM.DISPINTERRUPT 659 \EM.DISPINTERRUPT 634 \SOFTCURSORP 593 \DISPLAYDATA 586 STREAM 573 OUTPUT 375 ARRAYP 366 ARRAYP 352 4BITMASKARRAY 268 ARRAYP 259 ARRAYP 245 BITMASKARRAY 205 BITMAP 186 BITMAP 174 BITMAP 166 BITMAP 154 BITMAP 139 BITMAP 127 BITMAP 112 BITMAP 98 BITMAP 84 BITMAP 57 BITMAP 35 BITMAP 18 BITMAP 8 BITMAP) +_Od W -W" h@ +W$_`_`j@`h@ +W&@ OOOC_O`OO(730 \SOFTCURSORUPCURRENT 702 \TOTOPWDS 692 DSPDESTINATION 675 \SOFTCURSORDOWN 644 DSPDESTINATION 613 \DSPCLIPTRANSFORMY 603 \DSPCLIPTRANSFORMX 579 \GETSTREAM 563 ERROR 550 \PUTBASE24 539 \GETBASE24 435 LRSH 415 LLSH 382 \GETBASEFIXP 275 \GETBASEFIXP 220 \ILLEGAL.ARG 212 MAXIMUMCOLOR) +(736 \EM.DISPINTERRUPT 710 \DISPLAYDATA 682 \TOPWDS 666 \EM.DISPINTERRUPT 656 \EM.DISPINTERRUPT 593 \DISPLAYDATA 586 STREAM 573 OUTPUT 375 ARRAYP 366 ARRAYP 352 4BITMASKARRAY 268 ARRAYP 259 ARRAYP 245 BITMASKARRAY 205 BITMAP 186 BITMAP 174 BITMAP 166 BITMAP 154 BITMAP 139 BITMAP 127 BITMAP 112 BITMAP 98 BITMAP 84 BITMAP 57 BITMAP 35 BITMAP 18 BITMAP 8 BITMAP) ( 557 "unknown bits per pixel size.") +BITMAPEQUAL :D8 +(P 3 BASE2 P 2 BASE1 P 1 I I 1 BM2 I 0 BM1) k@\AT@AJ@AA@A8@A/@@kj@AIHJIKIhIkYi@A +(104 BIGBITMAPEQUAL) +(13 BITMAP 5 BITMAP) +() BLTCHAR :D8 (I 1 DISPLAYSTREAM I 0 CHARCODE) 2@dj@@@ Adgh 0 (47 \BLTCHAR 30 \GETSTREAM 17 \ILLEGAL.ARG) (42 \DISPLAYDATA 35 STREAM 24 OUTPUT) () \BLTCHAR :D8 -(P 0 A0448 I 2 DISPLAYDATA I 1 DISPLAYSTREAM I 0 CHARCODE) (Agh b.Z@ABlH(11 \GETSTREAM) +(P 0 A0229 I 2 DISPLAYDATA I 1 DISPLAYSTREAM I 0 CHARCODE) (Agh b.Z@ABlH(11 \GETSTREAM) (25 IMAGEOPS 18 STREAM 5 OUTPUT) () \MEDW.BLTCHAR :D8 -(L (2 DISPLAYDATA 1 DISPLAYSTREAM 0 CHARCODE) F 7 \SOFTCURSORUPP F 8 \CURSORDESTINATION F 9 \SCREENBITMAPS) p@l\Bd>@@ +(L (2 DISPLAYDATA 1 DISPLAYSTREAM 0 CHARCODE) F 7 \SOFTCURSORP F 8 \SOFTCURSORUPP F 9 \CURSORDESTINATION F 10 \SCREENBITMAPS)  p@l\Bd>@@ B@A B[B0LYBKBl A -BKBLBKHػIHYB#XHKB"XKHIJB*X jh]`*W hA -W^``jA`hA -WA HJHIJHBLJKHjvN`Mih(255 \SOFTCURSORUPCURRENT 216 \TOTOPWDS 206 DSPDESTINATION 189 \SOFTCURSORDOWN 161 DSPDESTINATION 68 \DSPPRINTCR/LF 35 \SLOWBLTCHAR 23 \CHANGECHARSET.DISPLAY) -(261 \EM.DISPINTERRUPT 196 \TOPWDS 180 \EM.DISPINTERRUPT 172 \EM.DISPINTERRUPT 148 \SOFTCURSORP 132 PILOTBBT) +BKBLBKHػIHYB#XHKB"XKHIJB*X j}h]W*W hA +W^``jA`hA +WA HJHIJHBLJKHjvN`Mih(250 \SOFTCURSORUPCURRENT 211 \TOTOPWDS 201 DSPDESTINATION 184 \SOFTCURSORDOWN 156 DSPDESTINATION 68 \DSPPRINTCR/LF 35 \SLOWBLTCHAR 23 \CHANGECHARSET.DISPLAY) +(256 \EM.DISPINTERRUPT 191 \TOPWDS 175 \EM.DISPINTERRUPT 167 \EM.DISPINTERRUPT 132 PILOTBBT) () \CHANGECHARSET.DISPLAY :D8 (P 4 \INTERRUPTABLE P 2 BM P 1 CSINFO P 0 PBT I 1 CHARSET I 0 DISPLAYDATA) @*@ A A@ h "@I@I@I0@A>IHJn@'I @@ -218,17 +220,17 @@ BLTCHAR :D8 (75 ^ 52 %# 16 SI::RESETUNWIND) ( 81 "" 58 "") \SLOWBLTCHAR :D8 -(P 16 CSINFO P 15 HEIGHTMOVED P 14 YPOS P 13 SOFTCURSORUP P 12 DISPINTERRUPT P 11 SOURCEBIT P 10 WIDTH P 9 DESTBIT P 8 PILOTBBT P 7 CURX P 6 RIGHT P 5 LEFT P 4 NEWX P 2 DD P 1 CHAR8CODE P 0 ROTATION I 1 DISPLAYSTREAM I 0 CHARCODE F 17 \SOFTCURSORUPP F 18 \CURSORDESTINATION F 19 \SCREENBITMAPS) N@@lYA0Zd Xdj J_JI\Jl A -J_JIؼJLOJ_J"dOOJ#LJػdKKJ*_NMO jM_NM_JIMO_JdkadlO_O_O_DdlO_O_O_$llO_lO_lO_ `-W" hA -W$_`_`jA`hA -W&A OOOOOOOjvO`O0J_JI_J @ @J h _ HdlZ;AOO +(P 16 CSINFO P 15 HEIGHTMOVED P 14 YPOS P 13 SOFTCURSORUP P 12 DISPINTERRUPT P 11 SOURCEBIT P 10 WIDTH P 9 DESTBIT P 8 PILOTBBT P 7 CURX P 6 RIGHT P 5 LEFT P 4 NEWX P 2 DD P 1 CHAR8CODE P 0 ROTATION I 1 DISPLAYSTREAM I 0 CHARCODE F 17 \SOFTCURSORP F 18 \SOFTCURSORUPP F 19 \CURSORDESTINATION F 20 \SCREENBITMAPS) K@@lYA0Zd Xdj~ J_JI\Jl A +J_JIؼJLOJ_J"dOOJ#LJػdKKJ*_NM O jM_NM_JIMO_JdkadlO_O_O_DdlO_O_O_$llO_lO_lO_ W"-W$ hA +W&_`_`jA`hA +W(A OOOOOOOjvO`O0J_JI_J @ @J h _ HdlZ;AOO O jJIAJO kOO O O Hn8AOO O jJIAJO JO -O O o h(586 ERROR 575 BKBITBLT 533 \DSPYPOSITION.DISPLAY 514 BKBITBLT 471 \DSPYPOSITION.DISPLAY 449 \CREATECHARSET 390 \SOFTCURSORUPCURRENT 355 \TOTOPWDS 345 DSPDESTINATION 328 \SOFTCURSORDOWN 297 DSPDESTINATION 275 SHOULDNT 55 \DSPPRINTCR/LF) -(396 \EM.DISPINTERRUPT 335 \TOPWDS 319 \EM.DISPINTERRUPT 309 \EM.DISPINTERRUPT 284 \SOFTCURSORP 111 \DISPLAYDATA 83 \DISPLAYDATA) -( 581 "Not implemented to rotate by other than 0, 90 or 270") +O O o h(583 ERROR 572 BKBITBLT 530 \DSPYPOSITION.DISPLAY 511 BKBITBLT 468 \DSPYPOSITION.DISPLAY 446 \CREATECHARSET 387 \SOFTCURSORUPCURRENT 352 \TOTOPWDS 342 DSPDESTINATION 325 \SOFTCURSORDOWN 294 DSPDESTINATION 275 SHOULDNT 55 \DSPPRINTCR/LF) +(393 \EM.DISPINTERRUPT 332 \TOPWDS 316 \EM.DISPINTERRUPT 306 \EM.DISPINTERRUPT 111 \DISPLAYDATA 83 \DISPLAYDATA) +( 578 "Not implemented to rotate by other than 0, 90 or 270") TEXTUREP :D8 (I 0 OBJECT) @d3 @k@NIL (18 BITMAP 10 BITMAP) @@ -276,7 +278,7 @@ OPPOSITESHADE :D8 NIL () \MEDW.BITBLT :D8 -(P 9 A0451 P 8 A0450 P 7 SOURCEBOTTOMTRANSFORMED P 6 SOURCELEFTTRANSFORMED P 3 SRCWIN P 2 A0449 P 1 DD P 0 DSTWIN I 11 CLIPPINGREGION I 10 TEXTURE I 9 OPERATION I 8 SOURCETYPE I 7 HEIGHT I 6 WIDTH I 5 DESTINATIONBOTTOM I 4 DESTINATIONLEFT I 3 DESTINATION I 2 SOURCEBOTTOM I 1 SOURCELEFT I 0 SOURCE F 10 \SCREENBITMAPS)  +(P 9 A0232 P 8 A0231 P 7 SOURCEBOTTOMTRANSFORMED P 6 SOURCELEFTTRANSFORMED P 3 SRCWIN P 2 A0230 P 1 DD P 0 DSTWIN I 11 CLIPPINGREGION I 10 TEXTURE I 9 OPERATION I 8 SOURCETYPE I 7 HEIGHT I 6 WIDTH I 5 DESTINATIONBOTTOM I 4 DESTINATIONLEFT I 3 DESTINATION I 2 SOURCEBOTTOM I 1 SOURCELEFT I 0 SOURCE F 10 \SCREENBITMAPS)   @ C o @Z@WCi Cgh 0H2HH2@ABCDEFGGGGGABlJCC@i !@gh 0AIصABIصBK2J_K2INOCDEFGGGGGNI"dLLOI$dMMlO@ @@ -315,28 +317,28 @@ BITMAPBIT.EXPANDER :D8 NIL ( 32 (OPCODES MISC4 6)) \BITBLT.DISPLAY :D8 -(L (11 CLIPPINGREGION 10 TEXTURE 9 OPERATION 8 SOURCETYPE 7 HEIGHT 6 WIDTH 5 DESTINATIONBOTTOM 4 DESTINATIONLEFT 3 DESTINATION 2 SOURCEBOTTOM 1 SOURCELEFT 0 SOURCEBITMAP) F 48 \SCREENBITMAPS F 49 \SOFTCURSORUPP F 50 \CURSORDESTINATION) 0 @d[AjbBjbABF3@b G@b@BٽdMM@AټdLɿLgh 0X@AH +(L (11 CLIPPINGREGION 10 TEXTURE 9 OPERATION 8 SOURCETYPE 7 HEIGHT 6 WIDTH 5 DESTINATIONBOTTOM 4 DESTINATIONLEFT 3 DESTINATION 2 SOURCEBOTTOM 1 SOURCELEFT 0 SOURCEBITMAP) F 48 \SCREENBITMAPS F 49 \SOFTCURSORP F 50 \SOFTCURSORUPP F 51 \CURSORDESTINATION) x0 @d[AjbBjbABF3@b G@b@BٽdMM@AټdLɿLgh 0X@AH bBH -bHbAHbH"dNNBHbH$_dOOFNH#Jb G%H%KbGH6bFj Gj4hH%K_dOֿOH#J_dO񲭿OCdɿI h__`8Wbh@gh -Wd_`_`j@gh _`hO -W`O @ABCDEFGGGGGJK O`O@ABCDEFGGGGGJK gh _IdC I&Id C IdC -I .C .h__ _"`8WbhIgh -Wd_"`_ `jIgh _`hO +bHbAHbH"dNNBHbH$_dOOFNH#Jb G%H%KbGH6bFj Gj4hH%K_dOֿOH#J_dO񲭿OCdƿI h__Wb8Wdh@gh +Wf_`_`j@gh _`hO +W`O @ABCDEFGGGGGJK O`Oz@ABCDEFGGGGGJK gh _IdC I#Id C IdC +I .C .h__ _"Wb8WdhIgh +Wf_"`_ `jIgh _`hO W`O @ABFG _jdFGgg O"`O OjdODEFGGGGG I IhI hO -)O0_J_LO`hO +)O0_J_LO`hO W`O DOJbEOJb -OJ"_BOJ$_FOJ#_HOJ%_DGnOBGOJ_(dO(O(_BOFGOJ_*dO*O*_FOHO(G_$dO$O$_HODO*G_&dO&O&_DOL_N@_PON2OPk@jON ON ONk@ON -bDdOBOB_BEdOFOF_FFDFdOHOH_HGEGdODOD_DDA_>EB_@JOBO>_,dO,O,djj_BKOFO@_.dO.O.djj_F@OHO>_0dO0O0JF_2dO2O2_H@ODO@_4dO4O4KG_6dO6O6_DOHOBODOFGOJbON _RGdg~GdONkG bGORJGd3 OROR<G`ld +OJ"_BOJ$_FOJ#_HOJ%_DGnOBGOJ_(dO(O(_BOFGOJ_*dO*O*_FOHO(G_$dO$O$_HODO*G_&dO&O&_DOL_N@_PON2OPk@jON ON ONk@ON +bDdOBOB_BEdOFOF_FFDFdOHOH_HGEGdODOD_DDA_>EB_@JOBO>_,dO,O,djj_BKOFO@_.dO.O.djj_F@OHO>_0dO0O0JF_2dO2O2_H@ODO@_4dO4O4KG_6dO6O6_DOHOBODOFGOJbON _RGdg~GdONkG bGORJGd3 OROR<G`ld  ONkGON G bONdk)GON -gONdkG bONkONOB_BONOH_HONO>_>h_8_:`.Wb hO -Wd_:`_8`jO`hO -W`O `/ODOF_TOHOB_VOLODO@_XOBO>_Z@OD_\OB_^`OV`OT Gg"`@O^O\OLOZOXOVOTGG `@O^O\OLOZOXOTGGG O:`O8.O._<@ABODEFGGGGGJKlO<h(1859 \SOFTCURSORUPCURRENT 1850 \BITBLTSUB 1818 \BITBLT.MERGE 1683 \TOTOPWDS 1672 DSPDESTINATION 1653 \SOFTCURSORDOWN 1622 DSPDESTINATION 1564 INSURE.B&W.TEXTURE 1540 COLORTEXTUREFROMCOLOR# 1520 \ILLEGAL.ARG 1512 COLORNUMBERP 1496 INVERT.TEXTURE.BITMAP 1486 BITMAPCREATE 1438 INSURE.B&W.TEXTURE 1404 MAXIMUMSHADE 1171 UNCOLORIZEBITMAP 1166 COLORMAP 1148 COLORIZEBITMAP 1141 MAXIMUMCOLOR 915 \TOTOPWDS 904 DSPDESTINATION 857 DSPDESTINATION 849 DSPDESTINATION 838 TOTOPW 831 BKBITBLT 795 \SOFTCURSORUPCURRENT 786 BKBITBLT 763 BITMAPCREATE 751 \TOTOPWDS 740 DSPDESTINATION 722 \GETSTREAM 709 \SOFTCURSORDOWN 678 DSPDESTINATION 673 \GETSTREAM 627 \INSUREWINDOW 612 \INSUREWINDOW 601 WOVERLAPP 589 WINDOWP 578 WFROMDS 564 WINDOWP 549 \GETSTREAM 537 \BITBLT.BITMAP 498 \SOFTCURSORUPCURRENT 485 \BITBLT.BITMAP 459 \TOTOPWDS 448 DSPDESTINATION 430 \GETSTREAM 417 \SOFTCURSORDOWN 386 DSPDESTINATION 381 \GETSTREAM 347 WINDOWP 117 \GETSTREAM) -(1887 IMAGEOPS 1880 STREAM 1865 \EM.DISPINTERRUPT 1825 \SYSPILOTBBT 1793 \SYSPILOTBBT 1785 MERGE 1773 PILOTBBT 1768 \SYSPILOTBBT 1758 PILOTBBT 1753 \SYSPILOTBBT 1735 BITMAP 1710 BITMAP 1661 \TOPWDS 1644 \EM.DISPINTERRUPT 1634 \EM.DISPINTERRUPT 1608 \SOFTCURSORP 1547 TEXTURE 1491 \BBSCRATCHTEXTURE 1476 \BBSCRATCHTEXTURE 1467 BITMAP 1415 MERGE 1111 BITMAP 1038 \DISPLAYDATA 1008 \DISPLAYDATA 987 \DISPLAYDATA 975 \DISPLAYDATA 963 \DISPLAYDATA 951 \DISPLAYDATA 938 \DISPLAYDATA 924 \DISPLAYDATA 893 \TOPWDS 881 \DISPLAYDATA 872 STREAM 801 \EM.DISPINTERRUPT 780 REPLACE 775 INPUT 729 \TOPWDS 716 OUTPUT 700 \EM.DISPINTERRUPT 690 \EM.DISPINTERRUPT 667 OUTPUT 654 \SOFTCURSORP 634 STREAM 619 STREAM 543 OUTPUT 504 \EM.DISPINTERRUPT 437 \TOPWDS 424 OUTPUT 408 \EM.DISPINTERRUPT 398 \EM.DISPINTERRUPT 375 OUTPUT 362 \SOFTCURSORP 336 BITMAP 311 \DISPLAYDATA 287 \DISPLAYDATA 252 \DISPLAYDATA 235 \DISPLAYDATA 212 \DISPLAYDATA 201 \DISPLAYDATA 184 \DISPLAYDATA 173 \DISPLAYDATA 161 \DISPLAYDATA 129 \DISPLAYDATA 122 STREAM 111 OUTPUT 92 BITMAP 72 BITMAP 58 BITMAP 43 BITMAP 15 BITMAP) +gONdkG bONkONOB_BONOH_HONO>_>h_8_:Wb.Wd hO +Wf_:`_8`jO`hO +W`O `/ODOF_TOHOB_VOLODO@_XOBO>_Z@OD_\OB_^`OV`OT Gg"`@O^O\OLOZOXOVOTGG `@O^O\OLOZOXOTGGG O:`O8.O._<@ABODEFGGGGGJKlO<h(1850 \SOFTCURSORUPCURRENT 1841 \BITBLTSUB 1809 \BITBLT.MERGE 1674 \TOTOPWDS 1663 DSPDESTINATION 1644 \SOFTCURSORDOWN 1613 DSPDESTINATION 1558 INSURE.B&W.TEXTURE 1534 COLORTEXTUREFROMCOLOR# 1514 \ILLEGAL.ARG 1506 COLORNUMBERP 1490 INVERT.TEXTURE.BITMAP 1480 BITMAPCREATE 1432 INSURE.B&W.TEXTURE 1398 MAXIMUMSHADE 1165 UNCOLORIZEBITMAP 1160 COLORMAP 1142 COLORIZEBITMAP 1135 MAXIMUMCOLOR 909 \TOTOPWDS 898 DSPDESTINATION 851 DSPDESTINATION 843 DSPDESTINATION 832 TOTOPW 825 BKBITBLT 789 \SOFTCURSORUPCURRENT 780 BKBITBLT 757 BITMAPCREATE 745 \TOTOPWDS 734 DSPDESTINATION 716 \GETSTREAM 703 \SOFTCURSORDOWN 672 DSPDESTINATION 667 \GETSTREAM 624 \INSUREWINDOW 609 \INSUREWINDOW 598 WOVERLAPP 586 WINDOWP 575 WFROMDS 561 WINDOWP 546 \GETSTREAM 534 \BITBLT.BITMAP 495 \SOFTCURSORUPCURRENT 482 \BITBLT.BITMAP 456 \TOTOPWDS 445 DSPDESTINATION 427 \GETSTREAM 414 \SOFTCURSORDOWN 383 DSPDESTINATION 378 \GETSTREAM 347 WINDOWP 117 \GETSTREAM) +(1878 IMAGEOPS 1871 STREAM 1856 \EM.DISPINTERRUPT 1816 \SYSPILOTBBT 1784 \SYSPILOTBBT 1776 MERGE 1764 PILOTBBT 1759 \SYSPILOTBBT 1749 PILOTBBT 1744 \SYSPILOTBBT 1726 BITMAP 1701 BITMAP 1652 \TOPWDS 1635 \EM.DISPINTERRUPT 1625 \EM.DISPINTERRUPT 1541 TEXTURE 1485 \BBSCRATCHTEXTURE 1470 \BBSCRATCHTEXTURE 1461 BITMAP 1409 MERGE 1105 BITMAP 1032 \DISPLAYDATA 1002 \DISPLAYDATA 981 \DISPLAYDATA 969 \DISPLAYDATA 957 \DISPLAYDATA 945 \DISPLAYDATA 932 \DISPLAYDATA 918 \DISPLAYDATA 887 \TOPWDS 875 \DISPLAYDATA 866 STREAM 795 \EM.DISPINTERRUPT 774 REPLACE 769 INPUT 723 \TOPWDS 710 OUTPUT 694 \EM.DISPINTERRUPT 684 \EM.DISPINTERRUPT 661 OUTPUT 631 STREAM 616 STREAM 540 OUTPUT 501 \EM.DISPINTERRUPT 434 \TOPWDS 421 OUTPUT 405 \EM.DISPINTERRUPT 395 \EM.DISPINTERRUPT 372 OUTPUT 336 BITMAP 311 \DISPLAYDATA 287 \DISPLAYDATA 252 \DISPLAYDATA 235 \DISPLAYDATA 212 \DISPLAYDATA 201 \DISPLAYDATA 184 \DISPLAYDATA 173 \DISPLAYDATA 161 \DISPLAYDATA 129 \DISPLAYDATA 122 STREAM 111 OUTPUT 92 BITMAP 72 BITMAP 58 BITMAP 43 BITMAP 15 BITMAP) () \BITBLT.BITMAP :D8 (L (13 CLIPPEDSOURCEBOTTOM 12 CLIPPEDSOURCELEFT 11 CLIPPINGREGION 10 TEXTURE 9 OPERATION 8 SOURCETYPE 7 HEIGHT 6 WIDTH 5 DESTINATIONBOTTOM 4 DESTINATIONLEFT 3 DESTBITMAP 2 SOURCEBOTTOM 1 SOURCELEFT 0 SOURCEBITMAP) P 18 \INTERRUPTABLE) 0C[C\j]d^@_CZGQMG_dOONG_dOOJGG_dOOKGG_dOODdMMEdNNFDFdJJGEGdKKDAXEBYGdjjMH_dOOGdjjNI_dOO@JH_dOOGF_dOO@KI_ dO O GG_"dO"O"[JMdNhGgWGnK3 Gnn ````H HdI `` +(P 2 \INTERRUPTABLE P 1 W P 0 OLDWINDOWS F 3 \MAINSCREEN F 4 \WINDOWWORLD F 5 \CURSORDESTINATION F 6 WINDOWBACKGROUNDSHADE F 7 \CURSORDESTWIDTH F 8 \CURSORDESTHEIGHT F 9 \CURSORDESTRASTERWIDTH) <````AT> ````H HdI `` ` -ijd``hS;`c -`c`c`c HP` H :`S`S`dI ``h(291 \OPENW1 235 REVERSE 228 CHANGEBACKGROUND 142 SHOWDISPLAY 113 \CreateScreenBitMap 90 \CLOSEW1 76 \MOVE.WINDOWS.ONTO.SCREEN 45 REVERSE 40 OPENWINDOWS 7 UPDATESCREENDIMENSIONS) -(316 \OLDSCREENWIDTH 311 SCREENWIDTH 306 \OLDSCREENHEIGHT 301 SCREENHEIGHT 275 SCREENHEIGHT 270 SCREEN 261 SCREENWIDTH 256 SCREEN 247 ScreenBitMap 242 SCREEN 223 WINDOWBACKGROUNDSHADE 211 BITMAP 206 ScreenBitMap 199 SCREENHEIGHT 192 SCREENWIDTH 185 ScreenBitMap 177 WHOLESCREEN 172 WHOLEDISPLAY 162 SCREENHEIGHT 157 SCREENWIDTH 149 \DisplayStarted 135 BITMAP 130 ScreenBitMap 123 BITMAP 118 ScreenBitMap 108 SCREENHEIGHT 103 SCREENWIDTH 68 SCREENHEIGHT 63 \OLDSCREENHEIGHT 56 SCREENWIDTH 51 \OLDSCREENWIDTH 29 \OLDSCREENHEIGHT 24 SCREENHEIGHT 17 \OLDSCREENWIDTH 12 SCREENWIDTH) +ijd``hS7`c +`c`c`cHLV H :`S`S`dI ``h(287 \OPENW1 231 REVERSE 224 CHANGEBACKGROUND 142 SHOWDISPLAY 113 \CreateScreenBitMap 90 \CLOSEW1 76 \MOVE.WINDOWS.ONTO.SCREEN 45 REVERSE 40 OPENWINDOWS 7 UPDATESCREENDIMENSIONS) +(312 \OLDSCREENWIDTH 307 SCREENWIDTH 302 \OLDSCREENHEIGHT 297 SCREENHEIGHT 271 SCREENHEIGHT 266 SCREEN 257 SCREENWIDTH 252 SCREEN 243 ScreenBitMap 238 SCREEN 211 BITMAP 206 ScreenBitMap 199 SCREENHEIGHT 192 SCREENWIDTH 185 ScreenBitMap 177 WHOLESCREEN 172 WHOLEDISPLAY 162 SCREENHEIGHT 157 SCREENWIDTH 149 \DisplayStarted 135 BITMAP 130 ScreenBitMap 123 BITMAP 118 ScreenBitMap 108 SCREENHEIGHT 103 SCREENWIDTH 68 SCREENHEIGHT 63 \OLDSCREENHEIGHT 56 SCREENWIDTH 51 \OLDSCREENWIDTH 29 \OLDSCREENHEIGHT 24 SCREENHEIGHT 17 \OLDSCREENWIDTH 12 SCREENWIDTH) () \MOVE.WINDOWS.ONTO.SCREEN :D8 (P 4 REG P 3 YFACTOR P 2 XFACTOR P 1 W I 0 WINDOWS) @H+h&```Z``[@HAhYLLm`LLm`IiHXYd \Ii @@ -794,6 +796,4 @@ hdg cgkPh (INITIALIZEDISPLAYSTREAMS) (DISPLAYSTREAMINIT 1000) (PUTPROPS LLDISPLAY FILETYPE COMPILE-FILE) -(PUTPROPS LLDISPLAY COPYRIGHT ("Venue & Xerox Corporation" 1981 1982 1983 1984 1985 1986 1987 1988 -1989 1990 1993 1994 2021)) NIL diff --git a/sources/MEDLEYDIR b/sources/MEDLEYDIR index 33de3b4a..226dc83b 100644 --- a/sources/MEDLEYDIR +++ b/sources/MEDLEYDIR @@ -1,11 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "17-Jul-2023 16:13:10" {DSK}frank>il>medley>gmedley>sources>MEDLEYDIR.;2 9970 +(FILECREATED "19-Jul-2023 08:57:43" {WMEDLEY}MEDLEYDIR.;22 10362 - :CHANGES-TO (VARS MEDLEY-INIT-VARS) + :EDIT-BY rmk - :PREVIOUS-DATE "22-Apr-2023 11:53:53" {DSK}frank>il>medley>gmedley>sources>MEDLEYDIR.;1 -) + :CHANGES-TO (FNS MEDLEYDIR) + + :PREVIOUS-DATE "17-Jul-2023 16:13:10" {WMEDLEY}MEDLEYDIR.;21) (PRETTYCOMPRINT MEDLEYDIRCOMS) @@ -95,16 +96,22 @@ NIL]) (MEDLEYDIR - [LAMBDA (DIRNAME FILENAME OUTPUT NOERROR) (* ; "Edited 18-Oct-2022 17:49 by lmm") + [LAMBDA (DIRNAME FILENAME OUTPUT NOERROR) (* ; "Edited 29-Jun-2023 22:48 by rmk") + (* ; "Edited 18-Oct-2022 17:49 by lmm") (* ; "Edited 5-Mar-2022 12:43 by larry") (* ; "Edited 2-Dec-2021 20:23 by kaplan") + + (* ;; "RMK: MEDLEYDIR defaults to DSK") + (COND ((NULL DIRNAME) (if (OR (NOT (BOUNDP 'MEDLEYDIR)) (NOT MEDLEYDIR)) - then (OR (SETQ MEDLEYDIR (DIRECTORYNAME (OR (UNIX-GETENV "MEDLEYDIR") - T))) - (DIRECTORYNAME T)) + then [SETQ MEDLEYDIR (DIRECTORYNAME (if (SETQ MEDLEYDIR (UNIX-GETENV "MEDLEYDIR")) + then (DIRECTORYNAME (PACKFILENAME 'BODY MEDLEYDIR + 'HOST + 'DSK)) + else (DIRECTORYNAME T] elseif (STRPOS "/" MEDLEYDIR) then (SETQ MEDLEYDIR (DIRECTORYNAME MEDLEYDIR)) else MEDLEYDIR)) @@ -199,6 +206,6 @@ (ADDTOVAR GLOBALVARS MEDLEYDIR MEDLEY-INIT-VARS \SAVE.MEDLEYDIR DIRECTORIES) ) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1469 7896 (MEDLEY-INIT-VARS 1479 . 4957) (MEDLEYDIR 4959 . 6914) (MEDLEYSUBSTDIR 6916 - . 7894))))) + (FILEMAP (NIL (1432 8288 (MEDLEY-INIT-VARS 1442 . 4920) (MEDLEYDIR 4922 . 7306) (MEDLEYSUBSTDIR 7308 + . 8286))))) STOP diff --git a/sources/MEDLEYDIR.LCOM b/sources/MEDLEYDIR.LCOM index 89fb6db2..b857b1da 100644 Binary files a/sources/MEDLEYDIR.LCOM and b/sources/MEDLEYDIR.LCOM differ diff --git a/sources/PRINTFN b/sources/PRINTFN index e4671857..c64455f8 100644 --- a/sources/PRINTFN +++ b/sources/PRINTFN @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "19-Jun-2022 00:02:19"  -{DSK}kaplan>Local>medley3.5>working-medley>sources>PRINTFN.;34 13484 +(FILECREATED "14-Sep-2023 22:53:09" {WMEDLEY}PRINTFN.;35 13520 - :CHANGES-TO (FNS PFCOPYBYTES) + :EDIT-BY rmk - :PREVIOUS-DATE "15-Mar-2022 00:20:04" -{DSK}kaplan>Local>medley3.5>working-medley>sources>PRINTFN.;33) + :CHANGES-TO (FNS PF) + + :PREVIOUS-DATE "19-Jun-2022 00:02:19" {WMEDLEY}PRINTFN.;34) (* ; " @@ -31,50 +31,51 @@ Copyright (c) 1986-1987, 1990, 1999, 2018, 2021 by Venue & Xerox Corporation. (DEFINEQ (PF - [NLAMBDA FN (* ; "Edited 4-Apr-2018 11:13 by rmk:") + [NLAMBDA FN (* ; "Edited 14-Sep-2023 22:52 by rmk") + (* ; "Edited 4-Apr-2018 11:13 by rmk:") - (* ;; "RMK; Fixed to skip compiled files, also to use FUNCTIONS as well as FNS. That might not help, if FUNCTIONS are not included in the filemap.") + (* ;; "RMK; Fixed to skip compiled files, also to use FUNCTIONS as well as FNS. That might not help, if FUNCTIONS are not included in the filemap.") - (* ;; "Print from files known to masterscope database before looking at whereis database. Note, however, that it also prefers the masterscope database to incore files") + (* ;; "Print from files known to masterscope database before looking at whereis database. Note, however, that it also prefers the masterscope database to incore files") - (* ;; "If FN is NIL, prints the function named by LASTWORD") + (* ;; "If FN is NIL, prints the function named by LASTWORD") - (* ;; "If FN is a list, then extra args are interpreted as:") + (* ;; "If FN is a list, then extra args are interpreted as:") - (* ;; " OUTPUT FILE") + (* ;; " OUTPUT FILE") - (* ;; "...") + (* ;; "...") (RESETLST (PROG (OUT OTHERARGS IFILES) - (SETQ FN (NLAMBDA.ARGS FN)) (* ; "Grab the args as a list") + (SETQ FN (NLAMBDA.ARGS FN)) (* ; "Grab the args as a list") [COND - ((LISTP FN) (* ; - "If it's a list, take the first element as the function name.") + ((LISTP FN) (* ; + "If it's a list, take the first element as the function name.") (SETQ OTHERARGS (CDR FN)) (SETQ FN (CAR FN] (COND - (FN (* ; "FN name specified; use it.") + (FN (* ; "FN name specified; use it.") (SETQ LASTWORD FN)) - (T (* ; "Not specified, use LASTWORD") + (T (* ; "Not specified, use LASTWORD") (SETQ FN LASTWORD))) [SETQ IFILES (OR (CAR OTHERARGS) (APPEND (WHEREIS FN 'FNS T) (WHEREIS FN 'FUNCTIONS T] [RESETSAVE (OUTPUT (COND - ((CADR OTHERARGS) (* ; - "An output file was specified; if not open for output, open it.") + ((CADR OTHERARGS) (* ; + "An output file was specified; if not open for output, open it.") (OR (OPENP (CADR OTHERARGS) 'OUTPUT) (WINDOWP (CADR OTHERARGS)) - (PROGN [RESETSAVE (SETQ OUT (OPENFILE (CADR OTHERARGS) + (PROGN [RESETSAVE (SETQ OUT (OPENSTREAM (CADR OTHERARGS) 'OUTPUT)) '(PROGN (CLOSEF? OLDVALUE] OUT))) - (T (* ; "otherwise, use primary output.") - T] (* ; "skip compiled files") + (T (* ; "otherwise, use primary output.") + T] (* ; "skip compiled files") (FOR FILE INSIDE IFILES UNLESS (MEMB (FILENAMEFIELD FILE 'EXTENSION) - *COMPILED-EXTENSIONS*) + *COMPILED-EXTENSIONS*) DO (PRINTFN FN FILE))))]) (PF* @@ -288,6 +289,6 @@ Copyright (c) 1986-1987, 1990, 1999, 2018, 2021 by Venue & Xerox Corporation. ) (PUTPROPS PRINTFN COPYRIGHT ("Venue & Xerox Corporation" 1986 1987 1990 1999 2018 2021)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1115 11618 (PF 1125 . 3820) (PF* 3822 . 4116) (PRINTFN 4118 . 4688) (PRINTFNDEF 4690 . -5873) (FINDFNDEF 5875 . 7247) (PFCOPYBYTES 7249 . 11368) (DISPLAYP 11370 . 11616))))) + (FILEMAP (NIL (1044 11654 (PF 1054 . 3856) (PF* 3858 . 4152) (PRINTFN 4154 . 4724) (PRINTFNDEF 4726 . +5909) (FINDFNDEF 5911 . 7283) (PFCOPYBYTES 7285 . 11404) (DISPLAYP 11406 . 11652))))) STOP diff --git a/sources/PRINTFN.LCOM b/sources/PRINTFN.LCOM index 50686fc3..cde90dd3 100644 Binary files a/sources/PRINTFN.LCOM and b/sources/PRINTFN.LCOM differ diff --git a/sources/UFS b/sources/UFS index 9097604b..a7455a02 100644 --- a/sources/UFS +++ b/sources/UFS @@ -1,14 +1,13 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "29-Mar-2022 11:29:33" {DSK}kaplan>Local>medley3.5>my-medley>sources>UFS.;32 78036 +(FILECREATED "16-Sep-2023 09:22:55" {DSK}briggs>Projects>medley>sources>UFS.;2 78813 - :PREVIOUS-DATE "28-Mar-2022 22:09:43" -{DSK}kaplan>Local>medley3.5>my-medley>sources>UFS.;31) + :EDIT-BY "briggs" + :CHANGES-TO (FNS \UFSCloseFile) + + :PREVIOUS-DATE "29-Mar-2022 11:29:33" {DSK}briggs>Projects>medley>sources>UFS.;1) -(* ; " -Copyright (c) 1988-1995, 2000, 2021-2022 by Venue & Xerox Corporation. -") (PRETTYCOMPRINT UFSCOMS) @@ -291,8 +290,38 @@ Copyright (c) 1988-1995, 2000, 2021-2022 by Venue & Xerox Corporation. ) (\UFSCloseFile -(LAMBDA (STREAMFILE) (* ; "Edited 30-Mar-90 10:39 by nm") (* ; "return stream") (* ;;; "Closes the specified stream.") (* * WITH.MONITOR \UFStopMonitor) (* ;;; "Write out and dispense with buffers for this stream.") (\CLEARMAP STREAMFILE) (PROG ((DEVICE (fetch (STREAM DEVICE) of STREAMFILE)) (CDATE 0) (ERRNO (CREATECELL \FIXP)) (UNIXNAME (fetch (UFSSTREAM UNIXNAME) of STREAMFILE))) (if (NULL UNIXNAME) then (* ; "Already closed! Somebody's trying to close us twice.") (RETURN NIL)) (if (DIRTYABLE STREAMFILE) then (* ; "Open for output") (FDEVOP (QUOTE TRUNCATEFILE) DEVICE STREAMFILE) (SETQ CDATE (fetch (UFSSTREAM CDATE) of STREAMFILE))) (RETURN (if (\UFSCloseFile-C UNIXNAME (fetch (UFSSTREAM FILEID) of STREAMFILE) CDATE ERRNO) then (replace (UFSSTREAM FILEID) of STREAMFILE with NIL) (replace (UFSSTREAM CDATE) of STREAMFILE with NIL) (* ; "Clear open-file state") STREAMFILE else (\UFSError (fetch (STREAM FULLFILENAME) of STREAMFILE) ERRNO))))) -) + [LAMBDA (STREAMFILE) (* ; "Edited 16-Sep-2023 09:21 by briggs") + (* ; "Edited 30-Mar-90 10:39 by nm") + (* ; "return stream") + +(* ;;; "Closes the specified stream.") + + (* * WITH.MONITOR \UFStopMonitor) + +(* ;;; "Write out and dispense with buffers for this stream.") + + (\CLEARMAP STREAMFILE) + (PROG ((DEVICE (fetch (STREAM DEVICE) of STREAMFILE)) + (CDATE 0) + (ERRNO (CREATECELL \FIXP)) + (UNIXNAME (fetch (UFSSTREAM UNIXNAME) of STREAMFILE))) + (if (OR (NULL UNIXNAME) + (NULL (fetch (STREAM ACCESS) of STREAMFILE))) + then (* ; + "Already closed! Somebody's trying to close us twice.") + (RETURN NIL)) + (if (DIRTYABLE STREAMFILE) + then (* ; "Open for output") + (FDEVOP 'TRUNCATEFILE DEVICE STREAMFILE) + (SETQ CDATE (fetch (UFSSTREAM CDATE) of STREAMFILE))) + (RETURN (if (\UFSCloseFile-C UNIXNAME (fetch (UFSSTREAM FILEID) of STREAMFILE) + CDATE ERRNO) + then (replace (UFSSTREAM FILEID) of STREAMFILE with NIL) + (replace (UFSSTREAM CDATE) of STREAMFILE with NIL) + (* ; "Clear open-file state") + STREAMFILE + else (\UFSError (fetch (STREAM FULLFILENAME) of STREAMFILE) + ERRNO]) (\UFSGetFileName (LAMBDA (FILENAME RECOG DEV) (* ; "Edited 24-Feb-89 16:20 by bvm") (* ;; "Recognize filename, return full name") (\UFS.FULLNAME (\UFS.RECOGNIZE.FILE FILENAME RECOG DEV) DEV T)) @@ -1126,26 +1155,24 @@ update the map") (SETQ PAGES (RESTOREMAP STREAM))) (DELETED (* ; "the file disap (ADDTOVAR LAMA ) ) -(PUTPROPS UFS COPYRIGHT ("Venue & Xerox Corporation" 1988 1989 1990 1991 1992 1993 1994 1995 2000 2021 - 2022)) (DECLARE%: DONTCOPY - (FILEMAP (NIL (8950 10503 (\UFSCreateDevice 8960 . 9325) (\UFS.CREATE.DEVICE 9327 . 10183) ( -\UFSOpenDevice 10185 . 10362) (\UFSCloseDevice 10364 . 10501)) (14766 50339 (\UFSOpenFile 14776 . -18070) (\UFS.OPENP 18072 . 18569) (\UFS.RECOGNIZE.FILE 18571 . 19324) (\UFS.DIRECTORY.NAME 19326 . -20069) (\UFSCloseFile 20071 . 21047) (\UFSGetFileName 21049 . 21248) (\UFSDeleteFile 21250 . 21790) ( -\UFSRenameFile 21792 . 22957) (\UFSReadPages 22959 . 24094) (\UFSWritePages 24096 . 25316) ( -\UFSTruncateFile 25318 . 26815) (\UFSDirectoryNameP 26817 . 27871) (\UFSEventFn 27873 . 28535) ( -\UFSGetFileInfo 28537 . 30819) (\UFS.CREATE.PROPS 30821 . 31174) (\UFSSetFileInfo 31176 . 32405) ( -\UFSGenerateFiles 32407 . 39287) (\UFS.NEXTFILEFN 39289 . 46927) (\UFS.FILEINFOFN 46929 . 48378) ( -\UFS.VALID.PROPP 48380 . 48672) (\UFS.REGISTER.GFS 48674 . 48929) (\UFS.UNREGISTER.GFS 48931 . 49514) -(\UFS.ABORT.DIRECTORY 49516 . 49864) (\UFS.ABORT.CL-DIRECTORY 49866 . 50153) (\UFS.CLEANUP.GFS.TABLE -50155 . 50337)) (50374 57058 (\UFSMakeUnixFormatName 50384 . 51405) (\UFSParseNameString 51407 . 51781 -) (\UFSParse-Directory 51783 . 52324) (\UFS.PARSE.BODY 52326 . 52871) (\UFS.ADJUST.HOST 52873 . 53032) - (\UFS.FULLNAME 53034 . 54242) (\UFS.ADD.HOST.FIELD 54244 . 54604) (\UFS.REMOVE.HOST.FIELD 54606 . -56276) (\UFS.HANDLE.RELATIVEDIRECTORY 56278 . 57056)) (57874 58487 (CHDIR 57884 . 58485)) (58559 59545 - (\DEVICEFILE.EOSERROR 58569 . 59543)) (59618 60855 (\UNVISIBLE.PAGED.REVALIDATEFILELST 59628 . 60473) - (\UNVISIBLE.FLUSH.OPEN.STREAMS 60475 . 60853)) (60888 62514 (\UFSError 60898 . 62512)) (62558 64973 ( -\UFSGetFileType 62568 . 63169) (\UFSSetFileType 63171 . 63768) (\UFSeol 63770 . 64971)) (73620 74744 ( -\UFSGetPrintFileType 73630 . 74042) (\UFSGetFileTypeConfirm 74044 . 74492) (\UFSPrintTypeMenu 74494 . -74742)) (74774 77612 (\UFStoOtherCopyMess 74784 . 76462) (\UFStoOtherRenameMess 76464 . 77610))))) + (FILEMAP (NIL (8909 10462 (\UFSCreateDevice 8919 . 9284) (\UFS.CREATE.DEVICE 9286 . 10142) ( +\UFSOpenDevice 10144 . 10321) (\UFSCloseDevice 10323 . 10460)) (14725 51227 (\UFSOpenFile 14735 . +18029) (\UFS.OPENP 18031 . 18528) (\UFS.RECOGNIZE.FILE 18530 . 19283) (\UFS.DIRECTORY.NAME 19285 . +20028) (\UFSCloseFile 20030 . 21935) (\UFSGetFileName 21937 . 22136) (\UFSDeleteFile 22138 . 22678) ( +\UFSRenameFile 22680 . 23845) (\UFSReadPages 23847 . 24982) (\UFSWritePages 24984 . 26204) ( +\UFSTruncateFile 26206 . 27703) (\UFSDirectoryNameP 27705 . 28759) (\UFSEventFn 28761 . 29423) ( +\UFSGetFileInfo 29425 . 31707) (\UFS.CREATE.PROPS 31709 . 32062) (\UFSSetFileInfo 32064 . 33293) ( +\UFSGenerateFiles 33295 . 40175) (\UFS.NEXTFILEFN 40177 . 47815) (\UFS.FILEINFOFN 47817 . 49266) ( +\UFS.VALID.PROPP 49268 . 49560) (\UFS.REGISTER.GFS 49562 . 49817) (\UFS.UNREGISTER.GFS 49819 . 50402) +(\UFS.ABORT.DIRECTORY 50404 . 50752) (\UFS.ABORT.CL-DIRECTORY 50754 . 51041) (\UFS.CLEANUP.GFS.TABLE +51043 . 51225)) (51262 57946 (\UFSMakeUnixFormatName 51272 . 52293) (\UFSParseNameString 52295 . 52669 +) (\UFSParse-Directory 52671 . 53212) (\UFS.PARSE.BODY 53214 . 53759) (\UFS.ADJUST.HOST 53761 . 53920) + (\UFS.FULLNAME 53922 . 55130) (\UFS.ADD.HOST.FIELD 55132 . 55492) (\UFS.REMOVE.HOST.FIELD 55494 . +57164) (\UFS.HANDLE.RELATIVEDIRECTORY 57166 . 57944)) (58762 59375 (CHDIR 58772 . 59373)) (59447 60433 + (\DEVICEFILE.EOSERROR 59457 . 60431)) (60506 61743 (\UNVISIBLE.PAGED.REVALIDATEFILELST 60516 . 61361) + (\UNVISIBLE.FLUSH.OPEN.STREAMS 61363 . 61741)) (61776 63402 (\UFSError 61786 . 63400)) (63446 65861 ( +\UFSGetFileType 63456 . 64057) (\UFSSetFileType 64059 . 64656) (\UFSeol 64658 . 65859)) (74508 75632 ( +\UFSGetPrintFileType 74518 . 74930) (\UFSGetFileTypeConfirm 74932 . 75380) (\UFSPrintTypeMenu 75382 . +75630)) (75662 78500 (\UFStoOtherCopyMess 75672 . 77350) (\UFStoOtherRenameMess 77352 . 78498))))) STOP diff --git a/sources/UFS.LCOM b/sources/UFS.LCOM index 7b044720..0fe75a9e 100644 Binary files a/sources/UFS.LCOM and b/sources/UFS.LCOM differ