From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/base/unknown/src/command handler | 239 ++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 system/base/unknown/src/command handler (limited to 'system/base/unknown/src/command handler') diff --git a/system/base/unknown/src/command handler b/system/base/unknown/src/command handler new file mode 100644 index 0000000..3e06280 --- /dev/null +++ b/system/base/unknown/src/command handler @@ -0,0 +1,239 @@ + +PACKET command handler DEFINES (* Autor: J.Liedtke *) + (* Stand: 29.02.82 *) + command handler , + do command , + command error , + set command : + + +LET esc = ""27"" , + esc k = ""27"k" , + cr lf = ""4""13""10"" , + command pre = ""4""13" " , + command post = ""13""10" " , + + tag type = 1 , + texttype = 4 , + eof type = 7 ; + + +TEXT VAR command line := "" , + previous command line := "" , + symbol , + procedure , + pattern , + error note := "" ; + +INT VAR symbol type , + allowed type := 0 ; + + +PROC set command (TEXT CONST command, INT CONST type) : + + param position (0) ; + command line := command ; + allowed type := type + +ENDPROC set command ; + +PROC do command : + + do (command line) + +ENDPROC do command ; + + +PROC command handler ( TEXT CONST command list, + INT VAR command index, number of params, + TEXT VAR param 1, param 2, + TEXT CONST command text ) : + +prepare and get command ; +command handler (command list,command index,number of params,param1,param2). + +prepare and get command : + set line nr (0) ; + error protocoll ; + get command from console . + +error protocoll : + IF is error + THEN put error ; + clear error + ELSE command line := "" ; + FI . + +get command from console : + INT VAR x, y; + out (crlf) ; + get cursor (x, y) ; + cursor (x, y) ; + REP + out (command pre) ; + out (command text) ; + out (command post) ; + editget command + UNTIL command line <> "" PER ; + param position (LENGTH command line) ; + out (command post) . + +editget command : + feldaudit ("") ; + feldlernmodus (FALSE) ; + REP + feldtabulator ("") ; + feldseparator (esc) ; + editget (command line) ; + ignore halt errors during editget ; + IF feldzeichen = esc k + THEN command line := previous command line + ELSE previous command line := command line ; + LEAVE editget command + FI + PER . + +ignore halt errors during editget : + IF is error + THEN clear error + FI . + +ENDPROC command handler ; + +PROC command handler ( TEXT CONST command list, + INT VAR command index, number of params, + TEXT VAR param 1, param 2) : + + scan (command line) ; + next symbol ; + IF pos (command list, symbol) > 0 + THEN procedure name ; + parameter list pack option ; + nothing else in command line ; + decode command + ELSE impossible command + FI . + +procedure name : + IF symbol type = tag type OR symbol = "?" + THEN procedure := symbol ; + next symbol + ELSE error ("incorrect procedure name") + FI . + +parameter list pack option : + number of params := 0 ; + param 1 := "" ; + param 2 := "" ; + IF symbol = "(" + THEN next symbol ; + parameter list ; + IF symbol <> ")" + THEN error (") expected") + FI + ELIF symbol type <> eof type + THEN error ("( expected") + FI . + +parameter list : + parameter (param 1, number of params) ; + IF symbol = "," + THEN next symbol ; + parameter (param 2, number of params) ; + FI ; + IF symbol <> ")" + THEN error (") expected") + FI . + +nothing else in command line : + next symbol ; + IF symbol <> "" + THEN error ("command too complex") + FI . + +decode command : + command index := index (command list, procedure, number of params) . + +impossible command : + command index := 0 . + +ENDPROC command handler ; + +PROC parameter (TEXT VAR param, INT VAR number of params) : + + IF symbol type = text type OR symbol type = allowed type + THEN param := symbol ; + number of params INCR 1 ; + next symbol + ELSE error ("parameter is no text denoter ("" missing!)") + FI + +ENDPROC parameter ; + +INT PROC index (TEXT CONST list, procedure, INT CONST params) : + + pattern := procedure ; + pattern CAT ":" ; + INT CONST index pos := pos (list, pattern) ; + IF procedure name found + THEN get colon pos ; + get dot pos ; + get end pos ; + get command index ; + get param index ; + IF param index >= 0 + THEN command index + param index + ELSE - command index + FI + ELSE 0 + FI . + +procedure name found : + index pos > 0 AND (list SUB index pos - 1) <= "9" . + +get param index : + INT CONST param index := + pos (list, text (params), dot pos, end pos) - dot pos - 1 . + +get command index : + INT CONST command index := + int ( subtext (list, colon pos + 1, dot pos - 1) ) . + +get colon pos : + INT CONST colon pos := pos (list, ":", index pos) . + +get dot pos : + INT CONST dot pos := pos (list, ".", index pos) . + +get end pos : + INT CONST end pos := dot pos + 4 . + +ENDPROC index ; + +PROC error (TEXT CONST message) : + + error note := message ; + scan ("") ; + procedure := "-" + +ENDPROC error ; + +PROC command error : + + disable stop ; + IF error note <> "" + THEN errorstop (error note) ; + error note := "" + FI ; + enable stop + +ENDPROC command error ; + + +PROC next symbol : + + next symbol (symbol, symbol type) + +ENDPROC next symbol ; + +iNDPACKET command handler ; -- cgit v1.2.3