[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-apl] Yet another editor thingy.
From: |
Xiao-Yong Jin |
Subject: |
Re: [Bug-apl] Yet another editor thingy. |
Date: |
Sun, 29 Jul 2018 20:19:47 -0500 |
EINTR could happen in many situations.
The usual resolution for EINTR is to retry whatever system call that failed
because of EINTR.
Here, we should call fgetc again.
Best,
Xiao-Yong
> On Jul 29, 2018, at 4:10 PM, Chris Moller <address@hidden> wrote:
>
> Hi, Jürgen,
>
> So far as I can tell, after all the testing I can throw at it, my editor
> interface function is ready for the world. Unfortunately, it needs a small
> patch to APL itself:
>
> Index: LineInput.cc
> ===================================================================
> --- LineInput.cc (revision 1054)
> +++ LineInput.cc (working copy)
> @@ -966,6 +966,12 @@
> const int b0 = fgetc(stdin);
> if (b0 == EOF)
> {
> + if (errno == EINTR) {
> + clearerr (stdin);
> + CIN.unsetf( std::ios_base::unitbuf );
> + CERR.unsetf( std::ios_base::unitbuf );
> + return UNI_ASCII_CR;
> + }
> if (got_WINCH)
> {
> got_WINCH = false;
>
> The usual state of APL is blocking on the fgetc, waiting for user keystrokes.
> But my new edif2 function fork()s to open editor windows and when those
> processes are killed they emit SIGCHLD signals which also unblock the fgetc,
> resulting in an invalid unicode being returned. The patch catches these
> signals, clears the error on stdin, and returns a harmless CR. Somehow,
> though, and I don't really understand it, the signals were causing CIN to
> block on echoing to the screen. Unsetting the unitbuf bit fixes this, though
> I don't have any idea why. (I'm unsetting it on CERR too, just in case, but
> I don't know if it's really necessary.)
>
> I've run apl -T and haven't hit any unexpected failures, so I'm pretty sure
> this patch won't break anything, at least under Fedora 28 Linux, kernel
> 4.16.13.
> --Chris
>
> On 20/07/18 15:33, Chris Moller wrote:
>> Hi, Jürgen,
>>
>> On 18/07/18 05:36, Juergen Sauermann wrote:
>>> Hi Chris,
>>>
>>> thank you for contributing this. I have added a link on our community page
>>> http://www.gnu.org/software/apl/Community.html.
>>>
>>> I believe the function would be even more useful it could create or modify
>>> an APL function in a running workspace rather than writing the function to
>>> a file.
>>
>> It already does that--even in the current version, once the editor closes
>> and the system() call that started it returns, the file is read and fixed
>> back into the workspace. (I guess I need to make that clearer in the
>> README.)
>>
>> But version 2.0 takes it even farther--I fork()/exec() to start the editor,
>> along with a fork()-ed inotify waitspin that listens for changes in the
>> working file. When the editor writes to the file, the change is caught and
>> the function is fixed into the workspace, but the editor stays open until
>> you explicitly kill it. The effects of this are that APL keeps running even
>> while the editor is open--you can real-time run the function after every
>> save and see if it's doing the right thing--and you can have any number of
>> editor sessions running simultaneously. (I don't know how useful that will
>> be, but it was easy to make happen...) All this works even now, but
>> somewhere in all these spawned processes I seem to be firing off a wild
>> signal and not catching it so it winds up interrupting the main APL readline
>> loop resulting in either a null input or a spurious ctrl-d. I'm working on
>> that now.
>>
>> --Chris
>>
>>>
>>> /// Jürgen
>>>
>>>
>>> On 07/15/2018 10:47 PM, Chris Moller wrote:
>>>> After battling for decades with the ancient nabla editor, I finally did
>>>> something I should have done years ago and write a simple native function
>>>> that let's you use emacs or vi from inside an APL session. It's not even
>>>> close to Elias Mårtenson's cool emacs APL mode--it's just a quick thing to
>>>> bring up a friendlier editor. It's alpha-level code--if it melts your
>>>> computer, it's not my fault--and there are a few things on the TODO list,
>>>> but I thought I'd put it out there and get some feedback if anyone's
>>>> interested.
>>>>
>>>> Here's the README:
>>>>
>>>> edif is a GNU APL native function that allows the use of external editors
>>>> from within an APL session.
>>>>
>>>> Usage:
>>>>
>>>> edif 'function_name'
>>>>
>>>> This will open an editor, typically vi or emacs, containing the present
>>>> definition of the specified function, or, if the function doesn't exist,
>>>> a boilerplate function header consisting of the function name. After
>>>> saving
>>>> the edited definition and exiting the editor, the function will appear in
>>>> the APL workspace. While the editor is open, APL is suspended.
>>>>
>>>> edif will look for the environment variable EDIF and will use the string
>>>> specified by that variable as the command line to invoke the chosen editor.
>>>> For example:
>>>>
>>>> export EDIF="emacs --geometry=40x20 -background '#ffffcc' -font
>>>> 'DejaVu Sans Mono-10'"
>>>>
>>>> will invoke emacs with a fairly small window, a light yellow background,
>>>> and
>>>> using the DejaVu Sans Mono-10 font. (That's also the default if no EDIF
>>>> variable is found.)
>>>>
>>>> edif has only been tested with emacs and vi.
>>>>
>>>>
>>>> Future work may also allow edif to edit APL variables and operators, but no
>>>> guarantees I'll ever get around to it.
>>>>
>>>> edif may be included in the workspace with:
>>>>
>>>> 'libedif.so' ⎕fx 'edif'
>>>>
>>>>
>>>>
>>>> Implimentation note:
>>>>
>>>> edif works by storing an editable version of the specified function in:
>>>>
>>>> /var/run/user/<uid>/<pid>/<name>.apl
>>>>
>>>> where <uid> is the user's userid, <pid> is the process id of the APL
>>>> session, and <name> is the function name. This allows multiple users
>>>> each to have multiple simultaneous APL sessions with workspaces with
>>>> identical names. No locking is done by edif and I've no idea if APL
>>>> itself has any protection against a writable workspace being open in
>>>> multiple simultaneous sessions, but it opens up the possibility that
>>>> you can hose the workspace. So while, as far as edif is concerned
>>>> you can have multiple simultaneous sessions aimed at the same lib0
>>>> workspace, you probably shouldn't do it.
>>>>
>>>> Also, I've no idea if Windows or any Linux distribution other than
>>>> Fedora has a /var directory, so using this directory may be non-portable.
>>>>
>>>> So far as I can tell, edif doesn't interfere with Elias Mårtenson's
>>>> emacs APL mode, but I haven't thoroughly tested that.
>>>>
>>>>
>>>> It's at https://github.com/ChrisMoller/edif
>>>> (BTW, "edif" is short for "editor interface.")
>>>
>>
>
- [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/15
- Re: [Bug-apl] Yet another editor thingy., Juergen Sauermann, 2018/07/18
- Re: [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/20
- Re: [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/29
- Re: [Bug-apl] Yet another editor thingy.,
Xiao-Yong Jin <=
- Re: [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/29
- Re: [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/30
- Re: [Bug-apl] Yet another editor thingy., Juergen Sauermann, 2018/07/30
- Re: [Bug-apl] Yet another editor thingy., Chris Moller, 2018/07/30