<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=MenuProgram</id>
	<title>MenuProgram - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=MenuProgram"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=MenuProgram&amp;action=history"/>
	<updated>2026-04-28T22:09:30Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=MenuProgram&amp;diff=2054&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=MenuProgram&amp;diff=2054&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:55Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Back to [[BasicSource]]&lt;br /&gt;
&lt;br /&gt;
This is a very simple menu program which allows you to do single key entry.  There are a maximum of 36 options available which you can assign to the number and letter keys.  If there is less that 18 options, it displays a single column in the centre of the page.  If more than 18, it shows two columns.  Documentation is in the program source.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
      PROGRAM MENU&lt;br /&gt;
*&lt;br /&gt;
* Utility program to run a menu system - very simple and short.&lt;br /&gt;
* The code is supplied on an as-is basis as a source-code resource.&lt;br /&gt;
* No representation whatever is made as to the operation of the program.&lt;br /&gt;
*&lt;br /&gt;
* Keith Johnson.&lt;br /&gt;
*&lt;br /&gt;
* Items in the menu file have 37 attributes, any more are ignored&lt;br /&gt;
* The first line is the menu title.  The other 36 are options&lt;br /&gt;
* which can be called by numbers 0-9 and letters A-Z&amp;gt;&lt;br /&gt;
*&lt;br /&gt;
* Each option line consists of X fields using \ as separator&lt;br /&gt;
* so they can be easily edited (or a value mark can be used)&lt;br /&gt;
*&lt;br /&gt;
* The fields are&lt;br /&gt;
* 1: TYPS - &amp;#039;M&amp;#039; for another menu, &amp;#039;T&amp;#039; a title, &amp;#039;C&amp;#039; a command to execute&lt;br /&gt;
* 2: CMDS - The letter or number to select this option (is highlighted)&lt;br /&gt;
* 3: THIS - Display line&lt;br /&gt;
* 4: ACTS - The command to execute or menu to read&lt;br /&gt;
* 5: INPS - &amp;#039;Y&amp;#039; if input is required or help is available&lt;br /&gt;
* 6: PMTS - Prompt used before input requested or a help text&lt;br /&gt;
* 7: HIGH - &amp;#039;Y&amp;#039; if the user requires high security to access this&lt;br /&gt;
*&lt;br /&gt;
* High security is that the users @LOGNAME is held on a file&lt;br /&gt;
* called XXXXXX in line 2 of an item called HIGHSECURITY&lt;br /&gt;
* in a list separated by value marks or backslashes (\).&lt;br /&gt;
* This is actually subverted in the following code - you can&lt;br /&gt;
* roll your own (and I encourage you to do so).&lt;br /&gt;
&lt;br /&gt;
      PROMPT &amp;#039;&amp;#039;&lt;br /&gt;
      GOOD = (1=1)&lt;br /&gt;
      EVIL = NOT(GOOD)&lt;br /&gt;
      ATTM = CHAR(254)&lt;br /&gt;
      VALM = CHAR(253)&lt;br /&gt;
      BELL = STR(CHAR(7),20)&lt;br /&gt;
&lt;br /&gt;
      CLRS = @(-01); CEOL = @(-04)&lt;br /&gt;
      RVON = @(-13); RVOF = @(-14)&lt;br /&gt;
      ULON = @(-15); ULOF = @(-16)&lt;br /&gt;
&lt;br /&gt;
      NEWP = GOOD&lt;br /&gt;
      NAME = &amp;#039;MAIN&amp;#039;&lt;br /&gt;
      MENULIST = &amp;#039;&amp;#039;&lt;br /&gt;
      NUMBMENU = 0&lt;br /&gt;
      OPEN &amp;#039;MENUFILE&amp;#039; TO MENUFILE ELSE STOP 201,&amp;#039;MENUFILE&amp;#039;&lt;br /&gt;
      READ MENU FROM MENUFILE,NAME ELSE&lt;br /&gt;
         STOP &amp;#039;Cannot read &amp;#039;:NAME:&amp;#039; from MENUFILE&amp;#039;&lt;br /&gt;
      END&lt;br /&gt;
&lt;br /&gt;
* These next 4 lines may have to be changed&lt;br /&gt;
      USER = @LOGNAME&lt;br /&gt;
      PORT = @USERNO&lt;br /&gt;
      ACCT = @WHO&lt;br /&gt;
      PATH = @PATH&lt;br /&gt;
&lt;br /&gt;
      USER = OCONV(USER,&amp;#039;MCT&amp;#039;)&lt;br /&gt;
      MAST = OCONV(&amp;#039;XXXXXXX&amp;#039;,&amp;#039;THIGHSECURITY;X;;2&amp;#039;)&lt;br /&gt;
      MAST = OCONV(MAST,&amp;#039;MCT&amp;#039;)&lt;br /&gt;
      CONVERT &amp;#039;\&amp;#039; TO VALM IN MAST&lt;br /&gt;
      CONVERT VALM TO ATTM IN MAST&lt;br /&gt;
*&lt;br /&gt;
* Above is control mechanism, we will now subvert it deliberately.&lt;br /&gt;
      MAST = USER&lt;br /&gt;
*&lt;br /&gt;
&lt;br /&gt;
      LOOP&lt;br /&gt;
         GOSUB SHOW.MENU&lt;br /&gt;
      UNTIL CHOICE = &amp;#039;&amp;#039;&lt;br /&gt;
         IF CHOICE = &amp;#039;M&amp;#039; THEN MENU = THISUN ELSE&lt;br /&gt;
            IF CHOICE = &amp;#039;C&amp;#039; THEN&lt;br /&gt;
               EXECUTE THISUN&lt;br /&gt;
               CRT &amp;#039;Press &amp;lt;ENTER&amp;gt; to return to menu&amp;#039;:;INPUT WAIT:&lt;br /&gt;
               NEWP = GOOD&lt;br /&gt;
            END&lt;br /&gt;
         END&lt;br /&gt;
      REPEAT&lt;br /&gt;
      GOSUB ERASE.SCREEN&lt;br /&gt;
      STOP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
************************************************************************&lt;br /&gt;
* SUBROUTINES&lt;br /&gt;
************************************************************************&lt;br /&gt;
ERASE.SCREEN:&lt;br /&gt;
      FOR AA = SYSTEM(3)-1 TO 0 STEP -1&lt;br /&gt;
         CRT @(00,AA):CEOL:&lt;br /&gt;
      NEXT AA&lt;br /&gt;
      RETURN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SHOW.MENU:&lt;br /&gt;
      IF NEWP THEN&lt;br /&gt;
         CRT CLRS:&lt;br /&gt;
         NEWP = EVIL&lt;br /&gt;
      END ELSE&lt;br /&gt;
         GOSUB ERASE.SCREEN&lt;br /&gt;
      END&lt;br /&gt;
      TITLE = NAME:&amp;#039; MENU&amp;#039;&lt;br /&gt;
      IF MENU&amp;lt;1&amp;gt; NE &amp;#039;&amp;#039;THEN TITLE = MENU&amp;lt;1&amp;gt;&lt;br /&gt;
      TPOS = 40-((LEN(TITLE))/2)&lt;br /&gt;
      TITLE = @(TPOS,00):ULON:TITLE:ULOF&lt;br /&gt;
      TITLE := @(00,00):PATH&lt;br /&gt;
      TITLE := @(00,01):TIMEDATE()&lt;br /&gt;
      TITLE := @(70,00):ACCT&lt;br /&gt;
&lt;br /&gt;
      TITLE := @(70,01):USER:&amp;#039;|&amp;#039;:PORT&lt;br /&gt;
      CRT TITLE&lt;br /&gt;
      LINCNT = DCOUNT(MENU,ATTM)&lt;br /&gt;
      IF LINCNT GT 37 THEN LINCNT = 37&lt;br /&gt;
      NUMB = 0&lt;br /&gt;
      TYPS = &amp;#039;&amp;#039;&lt;br /&gt;
      CMDS = &amp;#039;&amp;#039;&lt;br /&gt;
      THIS = &amp;#039;&amp;#039;&lt;br /&gt;
      ACTS = &amp;#039;&amp;#039;&lt;br /&gt;
      INPS = &amp;#039;&amp;#039;&lt;br /&gt;
      PMTS = &amp;#039;&amp;#039;&lt;br /&gt;
      HIGH = &amp;#039;&amp;#039;&lt;br /&gt;
      XPOS = 1&lt;br /&gt;
      IF LINCNT LE 19 THEN XPOS = 25&lt;br /&gt;
      FOR LIN = 2 TO LINCNT&lt;br /&gt;
         LINE = MENU&amp;lt;LIN&amp;gt;&lt;br /&gt;
         CONVERT &amp;#039;\&amp;#039; TO VALM IN LINE&lt;br /&gt;
         IF LIN GT 19 THEN XPOS = 40&lt;br /&gt;
         YPOS = REM(LIN-2,18) + 3&lt;br /&gt;
         SUPP = EVIL&lt;br /&gt;
         IF LINE&amp;lt;1,7&amp;gt; THEN&lt;br /&gt;
            LOCATE(USER,MAST;MPOS) ELSE SUPP = GOOD&lt;br /&gt;
         END&lt;br /&gt;
         BEGIN CASE&lt;br /&gt;
            CASE TRIM(LINE) = &amp;#039;&amp;#039;&lt;br /&gt;
               NULL&lt;br /&gt;
            CASE LINE&amp;lt;1,1&amp;gt; = &amp;#039;T&amp;#039;&lt;br /&gt;
               CRT @(XPOS,YPOS):&amp;#039;  &amp;#039;:ULON:LINE&amp;lt;1,3&amp;gt;:ULOF:&lt;br /&gt;
            CASE SUPP&lt;br /&gt;
               CRT @(XPOS,YPOS):LINE&amp;lt;1,3&amp;gt;:&lt;br /&gt;
            CASE 1&lt;br /&gt;
               ZPOS = INDEX(OCONV(LINE&amp;lt;1,3&amp;gt;,&amp;#039;MCU&amp;#039;),OCONV(LINE&amp;lt;1,2&amp;gt;,&amp;#039;MCU&amp;#039;),1)&lt;br /&gt;
               IF ZPOS THEN&lt;br /&gt;
                  CRT @(XPOS,YPOS):LINE&amp;lt;1,3&amp;gt;[1,ZPOS-1]:&lt;br /&gt;
                  CRT RVON:LINE&amp;lt;1,3&amp;gt;[ZPOS,1]:&lt;br /&gt;
                  CRT RVOF:LINE&amp;lt;1,3&amp;gt;[ZPOS+1,LEN(LINE&amp;lt;1,3&amp;gt;)-ZPOS]:&lt;br /&gt;
               END ELSE&lt;br /&gt;
                  CRT @(XPOS,YPOS):RVON:LINE&amp;lt;1,2&amp;gt; &amp;#039;L#1&amp;#039;:&lt;br /&gt;
                  CRT RVOF:&amp;#039; &amp;#039;:LINE&amp;lt;1,3&amp;gt;:&lt;br /&gt;
               END&lt;br /&gt;
               NUMB += 1&lt;br /&gt;
               TYPS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,1&amp;gt;&lt;br /&gt;
               CMDS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,2&amp;gt;&lt;br /&gt;
               THIS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,3&amp;gt;&lt;br /&gt;
               ACTS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,4&amp;gt;&lt;br /&gt;
               INPS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,5&amp;gt;&lt;br /&gt;
               PMTS&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,6&amp;gt;&lt;br /&gt;
               HIGH&amp;lt;NUMB&amp;gt; = LINE&amp;lt;1,7&amp;gt;&lt;br /&gt;
         END CASE&lt;br /&gt;
      NEXT LIN&lt;br /&gt;
&lt;br /&gt;
LOOP.INPUT:&lt;br /&gt;
      LOOP&lt;br /&gt;
         CRT @(00,22):CEOL:&amp;#039;Press choice &amp;#039;:&lt;br /&gt;
         IF SYSTEM(11) THEN CRT &amp;#039;&amp;gt;&amp;#039;: ELSE CRT &amp;#039;:&amp;#039;:&lt;br /&gt;
         INPUT REPLY,1:&lt;br /&gt;
         REPLY = OCONV(REPLY,&amp;#039;MCU&amp;#039;)&lt;br /&gt;
         CPOS = 0&lt;br /&gt;
         IF REPLY = &amp;#039;/&amp;#039; OR REPLY = CHAR(27) THEN REPLY = &amp;#039;&amp;#039;&lt;br /&gt;
         IF REPLY = &amp;#039;&amp;#039; THEN&lt;br /&gt;
            IF NUMBMENU THEN&lt;br /&gt;
               NAME = MENULIST&amp;lt;NUMBMENU&amp;gt;&lt;br /&gt;
               READ THISUN FROM MENUFILE, NAME ELSE&lt;br /&gt;
                  STOP &amp;#039;Cannot read &amp;#039;:NAME:&amp;#039; from MENUFILE&amp;#039;&lt;br /&gt;
               END&lt;br /&gt;
               DEL MENULIST&amp;lt;NUMBMENU&amp;gt;&lt;br /&gt;
               NUMBMENU -= 1&lt;br /&gt;
               CHOICE = &amp;#039;M&amp;#039;&lt;br /&gt;
            END ELSE CHOICE = &amp;#039;&amp;#039;&lt;br /&gt;
         END ELSE&lt;br /&gt;
            LOCATE(REPLY,CMDS;CPOS) THEN&lt;br /&gt;
               REPLY = &amp;#039;&amp;#039;&lt;br /&gt;
            END ELSE NULL&lt;br /&gt;
         END&lt;br /&gt;
      UNTIL REPLY = &amp;#039;&amp;#039;&lt;br /&gt;
         CRT BELL:&lt;br /&gt;
      REPEAT&lt;br /&gt;
&lt;br /&gt;
      IF CPOS THEN&lt;br /&gt;
         IF HIGH&amp;lt;CPOS&amp;gt; THEN&lt;br /&gt;
            LOCATE(USER,MAST;MPOS) ELSE RETURN&lt;br /&gt;
         END&lt;br /&gt;
         CHOICE = TYPS&amp;lt;CPOS&amp;gt;&lt;br /&gt;
         DISP = THIS&amp;lt;CPOS&amp;gt;&lt;br /&gt;
         THISUN = ACTS&amp;lt;CPOS&amp;gt;&lt;br /&gt;
         IF CHOICE = &amp;#039;M&amp;#039; THEN&lt;br /&gt;
            READ THISUN FROM MENUFILE, THISUN ELSE&lt;br /&gt;
               CRT BELL:&lt;br /&gt;
               GO LOOP.INPUT&lt;br /&gt;
            END&lt;br /&gt;
            NUMBMENU += 1&lt;br /&gt;
            MENULIST&amp;lt;NUMBMENU&amp;gt; = NAME&lt;br /&gt;
            NAME = ACTS&amp;lt;CPOS&amp;gt;&lt;br /&gt;
         END&lt;br /&gt;
         PRMT = PMTS&amp;lt;CPOS&amp;gt;&lt;br /&gt;
         GOSUB ERASE.SCREEN&lt;br /&gt;
         CRT RVON:OCONV(DISP,&amp;#039;MCU&amp;#039;):RVOF&lt;br /&gt;
         IF INPS&amp;lt;CPOS&amp;gt; = &amp;#039;Y&amp;#039; THEN&lt;br /&gt;
            IF PRMT = &amp;#039;&amp;#039; THEN&lt;br /&gt;
               PRMT = &amp;#039;Input possible - or null to see help&amp;#039;&lt;br /&gt;
            END&lt;br /&gt;
            CRT PRMT&lt;br /&gt;
            CRT THISUN:&amp;#039; &amp;#039;:&lt;br /&gt;
            INPUT BIGUN:&lt;br /&gt;
            BEGIN CASE&lt;br /&gt;
               CASE BIGUN = CHAR(27) OR BIGUN = &amp;#039;/&amp;#039;&lt;br /&gt;
                  CHOICE = &amp;#039;M&amp;#039;&lt;br /&gt;
                  THISUN = MENU&lt;br /&gt;
               CASE BIGUN NE &amp;#039;&amp;#039;&lt;br /&gt;
                  THISUN := &amp;#039; &amp;#039;:BIGUN&lt;br /&gt;
            END CASE&lt;br /&gt;
         END ELSE&lt;br /&gt;
            IF PRMT NE &amp;#039;&amp;#039; THEN CRT PRMT&lt;br /&gt;
         END&lt;br /&gt;
      END&lt;br /&gt;
      RETURN&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>