Operating System - OpenVMS
cancel
Showing results for 
Search instead for 
Did you mean: 

How to implement multi-line input recall?

SOLVED
Go to solution
Galen Tackett
Valued Contributor

How to implement multi-line input recall?

There are a number of system utilities, for example SYSMAN and LANCP, that provide the ability to scroll back through multiple lines of previous input.

The last time I checked (which I admit was years ago) the terminal driver itself provided only single line input recall.

I know that you can get 20 line input recall by using SMG$. But I'm guessing that these utilities may do it some other way. Does anyone know how?
14 REPLIES
Uwe Zessin
Honored Contributor

Re: How to implement multi-line input recall?

You could check with ANALYZE/IMAGE whether they are linked against SMGRTL.

$ pipe analyze/image sys$system:lancp.exe | search sys$input smg
global section name: "SMGSHR_001"
5) "SMGSHR"
$
.
Ian Miller.
Honored Contributor

Re: How to implement multi-line input recall?

I use SMG (SMG$CREATE_VIRTUAL_KEYBOARD, and SMG$READ_COMPOSED_LINE) and so does LANCP and SYSMAN.

I do have the source code to a routine which does do reading a command from the terminal and handing command line recall. I don't know the original author and its written in C.
____________________
Purely Personal Opinion
Galen Tackett
Valued Contributor

Re: How to implement multi-line input recall?

Uwe,

Thanks for your suggestion. For some reason I hadn't thought of that, though it's obvious now. But before I could try it I also read Ian's reply that made it unnecessary.

Ian,

Can you attach the code to which you refer to a reply here? If you'd rather not (since you don't know the author) we can probably arrange some other way of exchanging the details.

Way back when SMG$ was new (boy, how long ago was that??) I did quite a bit of programming with it. I can't claim to remember much now but I'm sure it would come back quickly.

Meanwhile, time allowing, I'll do some experimenting.
Uwe Zessin
Honored Contributor

Re: How to implement multi-line input recall?

If my memory hasn't degraded too much, SMG was introduced in VAX/VMS V4.4. I had put some efford to change an order of manuals to the current version, so I am fairly sure.
.
Ian Miller.
Honored Contributor

Re: How to implement multi-line input recall?

here is the code. I don't recall where I originally got it.

If you need reminding of SMG$ then my other utilities use SMG$ routines for command line recall.
____________________
Purely Personal Opinion
Galen Tackett
Valued Contributor

Re: How to implement multi-line input recall?

Ian,

My thanks. :)

I do have some of your utilities and will take a look at how they do this.

Galen
John Gillings
Honored Contributor
Solution

Re: How to implement multi-line input recall?

Galen,

Don't forget, you can use just the input side of SMG, without using any of the output functions.

I've attached a very simple program in Pascal which uses SMG$READ_COMPOSED_LINE. It also demonstrates that you can specify more than 20 lines of recall when you create the virtual keyboard.

>But I'm guessing that these utilities
>may do it some other way.

Since a good programmer is a lazy plagurist, and one of the objectives of OpenVMS is user interface consistency, I'd be hoping that everyone uses SMG for this task.

If you want to find out exactly what routines they're calling, and how, use my FAKE_RTL procedure to build a FAKE_SMGSHR and trace the arguments.

A quick check of SYSMAN shows SMG$CREATE_VIRTUAL_KEYBOARD, SMG#CREATE_KEY_TABLE and SMG$READ_COMPOSED_LINE.

(Also interesting to note that the SYSMAN programmer uses the sneaky trick of passing the string descriptor for the input line as the "RESULTANT-LENGTH" argument)
A crucible of informative mistakes
John Abbott_2
Esteemed Contributor

Re: How to implement multi-line input recall?

Slightly off subject but thought it worth posting. From DCL, $inquire p1 "" allowes recall using up arrow, but $read/prompt="" sys$command p1 doesn't (you can only recall last input). I logged this with Mr DCL (Guy), who is treating this as a bug and hopes to fix it in v8.3

John.
Don't do what Donny Dont does
Galen Tackett
Valued Contributor

Re: How to implement multi-line input recall?

John G.,

Thanks very much for our excellent suggestions and sample code, and also for FAKE_RTL. I've skimmed your journal article and found it very interesting but haven't read it thoroughly. I hope to try out this technique some time.

John A.,

I first noticed that difference between $ READ and $ INQUIRE long ago when command line recall was still pretty new. I always assumed it was just meant to be that way, so it's nice to hear that the DCL Guy :-) is treating it as a bug.

The original version of VMSLICENSE.COM used INQUIRE instead of READ. This was handy when entering multiple similar licenses. You could just up-arrow to whatever field changed between such licenses (often just the authorization and checksum), edit them, and hit for all the others (since they defaulted to the last value entered in that field.)

Later VMSLICENSE.COM was changed to use READ (among other changes) and multi line recall stopped working. I quickly made a modified version of the new procedure that still used INQUIRE. But that was long ago in another life...

Galen
Jess Goodman
Esteemed Contributor

Re: How to implement multi-line input recall?

I don't see how you can call the command line recall difference between INQUIRE and READ SYS$COMMAND a bug. Yes they're different, but they've always worked that way (since command recall was added).

Some command procedures I write use READ to input lots of individual parameters and I don't want them filling up my command recall buffer. On the other hand I use INQUIRE a few places where I want command recall to work, like in a procedure to execute commands on a remote node vis DECnet.

There is one behavior of INQUIRE I detest though. It's not a bug either, but it is a bug magnet! There is no way with INQUIRE to differentiate between empty input and end-of-file - they both set the symbol name to the null string. Could we get /END=label added to INQUIRE?

Also I hate it when some innocent little bit of DCL code using INQUIRE that was originally written for interactive use but is then incorrectly submitted as a batch job gets into an infinite loop without so much as an error message:

$reprompt:
$ inquire string "Prompt"
$ if (string .eqs. "") then goto reprompt
$ show symbol string
$ exit

On the other hand READ SYS$COMMAND even with /END=, when run from a batch job will actually read the next line of DCL ($ and all) in the command procedure as input. That DCL line won't execute. Now that's just wrong!
I have one, but it's personal.
Galen Tackett
Valued Contributor

Re: How to implement multi-line input recall?

Jess,

> I don't see how you can call the command line recall difference between
> INQUIRE and READ SYS$COMMAND a bug.

Ah, but Mr. DCL Guy himself apparently called it a bug before I merely echoed him, as you'll see in the reply just before the one where I used the word myself. :-)

I just thought that the story about the change in VMSLICENSE.COM might be an interesting historical note.

However I have a strange idea of what's interesting. As an acquaintance long ago put it, perhaps echoing someone famous:

"Everything must be interesting, because if there were something which weren't, that alone would make it interesting."

(I believe I first heard this back around 1977 from an older denizen of the Cal State University, Hayward Computing Lab who was named Leo. He was a campus math/CS wiz who had what may have been a German accent. Also his hair was generally in disarray, but that's all the resemblance that he bore to A. Einstein.)

Regards,

Galen
Joseph Huber_1
Honored Contributor

Re: How to implement multi-line input recall?

The mother of programs using smg$read_composed_line was written 1988 by Hunter Goatley in Vax Macro as
HG$GET_INPUT.MAR as a replacement for LIB$GET_INPUT.
I kept it in http://wwwvms.mppmu.mpg.de/vmssig/src/mar/hg$get_input.mar

And for those not believing Vax macro will work beyond Alpha, here is a version in C:
http://wwwvms.mppmu.mpg.de/~huber/util/hg$get_input.c

Servus,
http://www.mpp.mpg.de/~huber
John Abbott_2
Esteemed Contributor

Re: How to implement multi-line input recall?

Jess, the best thing you can do is email dcl@hp.com your thoughts.

I've always recieved a reply from Guy that's had some thought put into it! You never know, what you ask might just get added !!

Kind Regards,
John.
Don't do what Donny Dont does
Galen Tackett
Valued Contributor

Re: How to implement multi-line input recall?

Thanks to all for your help here. Ian's sample code showed me just how easy this was to do with SMG$READ_COMPOSED_LINE.