From 15667c2101aa221ee7987ee7219122f6115073ad Mon Sep 17 00:00:00 2001 From: rmkaplan Date: Sun, 28 Dec 2025 21:24:48 -0800 Subject: [PATCH] Fix ShellOpen, add UNIX-TMP-FILE-NAME ShellOpen was calling SLASHIT before calling INFILEP, which would fail on files with spaces in their names. --- library/UNIXUTILS | 79 ++++++++++++++++++++++++---------------- library/UNIXUTILS.DFASL | Bin 7342 -> 7499 bytes 2 files changed, 47 insertions(+), 32 deletions(-) diff --git a/library/UNIXUTILS b/library/UNIXUTILS index 9f9491d9..50e33e1a 100644 --- a/library/UNIXUTILS +++ b/library/UNIXUTILS @@ -1,12 +1,12 @@ (DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10) -(FILECREATED "26-Nov-2025 14:21:13" {WMEDLEY}UNIXUTILS.;35 18084 +(FILECREATED "28-Dec-2025 18:26:10" {WMEDLEY}UNIXUTILS.;43 18632 :EDIT-BY rmk - :CHANGES-TO (VARS UNIXUTILSCOMS) + :CHANGES-TO (FNS ShellOpen) - :PREVIOUS-DATE " 4-Nov-2025 10:11:10" {WMEDLEY}UNIXUTILS.;34) + :PREVIOUS-DATE "27-Dec-2025 21:25:11" {WMEDLEY}UNIXUTILS.;42) (PRETTYCOMPRINT UNIXUTILSCOMS) @@ -21,7 +21,8 @@ (FUNCTIONS ShellCommand ShellWhich) (ADDVARS (MEDLEY-INIT-VARS (ShellBrowser NIL RESET) (ShellOpener NIL RESET))) - (FNS ShellBrowser ShellBrowse ShellOpener ShellOpen PROCESS-COMMAND SLASHIT UNIX-FILE-NAME) + (FNS ShellBrowser ShellBrowse ShellOpener ShellOpen PROCESS-COMMAND SLASHIT UNIX-FILE-NAME + UNIX-TMP-FILE-NAME) (PROPS (UNIXUTILS FILETYPE)))) (DECLARE%: EVAL@COMPILE DONTCOPY @@ -147,7 +148,8 @@ "true"]) (ShellOpen - [LAMBDA (FilenameOrURL) (* ; "Edited 10-Sep-2025 15:29 by rmk") + [LAMBDA (FilenameOrURL) (* ; "Edited 28-Dec-2025 18:26 by rmk") + (* ; "Edited 10-Sep-2025 15:29 by rmk") (* ; "Edited 4-May-2025 11:14 by rmk") (* ;; "Open the file or URL using the generic %"opener%" for this machine via a shell call.") @@ -184,7 +186,11 @@ then (CONCAT "File not found: " FilenameOrURL) elseif (STREQUAL OPENER "true") then (CONCAT "Unable to find a file opener to open: " FilenameOrURL) - else (LET* ((VERSION.SPECIFIED (FILENAMEFIELD FilenameOrURL 'VERSION)) + else (SETQ FilenameOrURL (TRUEFILENAME FilenameOrURL)) + + (* ;; "RMK: UNVERSIONED is in the Lisp space, I removed the SLASHIT there because it adds \ in front of spaces which screws up the following INFILEP.") + + (LET* ((VERSION.SPECIFIED (FILENAMEFIELD FilenameOrURL 'VERSION)) (UNPACKED (UNPACKFILENAME.STRING FULLNAME)) (NEWNAME (CONCAT (LISTGET UNPACKED 'NAME) "~" @@ -197,8 +203,7 @@ (SETQ FN (PACKFILENAME.STRING UNPACKED)) (if (STREQUAL (SUBSTRING FN -1) ".") - then (SETQ FN (SUBSTRING UNIXFILE 1 -2))) - (SETQ FN (SLASHIT FN] + then (SETQ FN (SUBSTRING UNIXFILE 1 -2] (UNVERSIONED.EXISTS (INFILEP (CONCAT "{UNIX}" UNVERSIONED))) (TMPDIR (CONCAT "/tmp/" (RAND 1000 9999))) (TARGETFILE.LISP (PACKFILENAME.STRING 'HOST "{UNIX}" 'DIRECTORY TMPDIR @@ -274,15 +279,15 @@ SLASHED))]) (UNIX-FILE-NAME - [LAMBDA (FILE ACCESS COPY) (* ; "Edited 27-Sep-2025 16:24 by rmk") + [LAMBDA (FILE ACCESS COPY EXTENSION) (* ; "Edited 27-Dec-2025 21:24 by rmk") + (* ; "Edited 26-Dec-2025 10:58 by rmk") + (* ; "Edited 27-Sep-2025 16:24 by rmk") (* ; "Edited 19-Sep-2025 07:29 by rmk") (* ; "Edited 13-Sep-2025 18:37 by rmk") (* ; "Edited 1-Oct-2023 20:52 by rmk") - (* ;; "Forces an extension %"ufn%" if there isn't one already, to avoid the dot/no-dot question") + (* ;; "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 doesn't have the Medley version convention. If FILE does not have a corresponding Unix name (e.g. NODIRCORE), 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.") - (* ;; "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.") - (* ; "Might catch NODIRCORE") (CL:WHEN FILE (SETQ FILE (TRUEFILENAME FILE)) (CL:UNLESS (STREAMP FILE) @@ -299,35 +304,45 @@ (PROGN (* ;; "Catch the streams as well as other devices (CORE, servers)") - [SETQ UNAME (OUTFILEP (CONCAT "{DSK}/tmp/medley-" (CL:IF COPY - (CONCAT (L-CASE COPY) - "-") - "") - (IDATE] + (SETQ UNAME (UNIX-TMP-FILE-NAME (CL:IF COPY + (L-CASE COPY) + "") + EXTENSION)) (CL:WHEN (AND COPY FILE) (RESETLST (CL:WHEN (\GETSTREAM FILE 'INPUT T) (* ; "Hope it's randaccess") [RESETSAVE (GETFILEPTR FILE) `(PROGN (SETFILEPTR ,FILE OLDVALUE]) - - (* ;; "Let DSK pick a new version number, rather than RAND") - (COPYFILE FILE UNAME)))] - (SETQ VERSION (FILENAMEFIELD UNAME 'VERSION)) (* ; "Convert to Unix version. ") - (SETQ UNAME (PACKFILENAME 'VERSION NIL 'BODY UNAME)) - (CL:WHEN (AND VERSION (IGREATERP VERSION 1)) - (SETQ UNAME (CONCAT UNAME ".~" VERSION "~"))) - (SETQ UNAME (SLASHIT UNAME NIL T)) - (CL:IF (EQ (CHARCODE %.) - (NTHCHARCODE UNAME -1)) - (SUBSTRING UNAME 1 -2) - UNAME)))]) + (SLASHIT UNAME NIL T)))]) + +(UNIX-TMP-FILE-NAME + [LAMBDA (NAME EXT HOST) (* ; "Edited 26-Dec-2025 17:37 by rmk") + + (* ;; + "Returns a unique {UNIX}/tmp/ name that includes NAME as a hint and perhaps a useful extension ") + + (* ;; "Let DSK pick a new version, rather than RAND") + + (LET* [[UNAME (OUTFILEP (CONCAT "{DSK}/tmp/medley-" NAME "-" (IDATE] + (VERSION (FILENAMEFIELD UNAME 'VERSION] + (SETQ UNAME (PACKFILENAME 'HOST (OR HOST 'UNIX) + 'VERSION NIL 'BODY UNAME)) + (CL:IF (EQ (CHARCODE %.) + (NTHCHARCODE UNAME -1)) + (SETQ UNAME (SUBSTRING UNAME 1 -2))) + (CL:IF (AND VERSION (IGREATERP VERSION 1)) + (SETQ UNAME (CONCAT UNAME ".~" VERSION "~"))) + (CL:IF EXT + (SETQ UNAME (CONCAT UNAME "." (L-CASE EXT)))) + UNAME]) ) (PUTPROPS UNIXUTILS FILETYPE CL:COMPILE-FILE) (DECLARE%: DONTCOPY - (FILEMAP (NIL (1137 1510 (ShellCommand 1137 . 1510)) (1512 1909 (ShellWhich 1512 . 1909)) (2019 18006 -(ShellBrowser 2029 . 3801) (ShellBrowse 3803 . 4488) (ShellOpener 4490 . 6178) (ShellOpen 6180 . 11659 -) (PROCESS-COMMAND 11661 . 12274) (SLASHIT 12276 . 14731) (UNIX-FILE-NAME 14733 . 18004))))) + (FILEMAP (NIL (1165 1538 (ShellCommand 1165 . 1538)) (1540 1937 (ShellWhich 1540 . 1937)) (2047 18554 +(ShellBrowser 2057 . 3829) (ShellBrowse 3831 . 4516) (ShellOpener 4518 . 6206) (ShellOpen 6208 . 11977 +) (PROCESS-COMMAND 11979 . 12592) (SLASHIT 12594 . 15049) (UNIX-FILE-NAME 15051 . 17651) ( +UNIX-TMP-FILE-NAME 17653 . 18552))))) STOP diff --git a/library/UNIXUTILS.DFASL b/library/UNIXUTILS.DFASL index 96e1669b9f37fa0ae01eba23b9c1f68c725ae4e6..3fb570e959c88e2741d65db1fcfeb531a88e8076 100644 GIT binary patch delta 2589 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 Uf~!N~rd@E|WJHMRipk0U00exP%m4rY