diff --git a/mystic/HISTORY.txt b/mystic/HISTORY.txt index c9a57d2..b5fe5b2 100644 --- a/mystic/HISTORY.txt +++ b/mystic/HISTORY.txt @@ -4089,3 +4089,7 @@ Upgrade option. + Added CARDINAL (Unsigned 32-bit Integer) type to MPL + + + MPLC and MIDE now calculate the error position in the file (line and + column) after the error has occured. This takes a little bit of time + but it ensures that the column/line error position is accurate. diff --git a/mystic/default.txt b/mystic/default.txt index cd72350..1146776 100644 --- a/mystic/default.txt +++ b/mystic/default.txt @@ -14,7 +14,7 @@ # Note: the DF MCI code can also be used to display files in place of # prompts. -000 |DFpreuser |CR|01[|10þ|01] |09Enter your user name: +000 |DFpreuser |CR|01[|10þ|01] |09Enter your user name: |XX ; Log in as new user prompt 001 |CR|12Create an account with this BBS? |11 ; User's password @@ -22,17 +22,17 @@ ; User login: Invalid PW 003 |CR|12Invalid password. ; Displayed IMMEDATELY when a user connects if the password is set -004 |CRSystem Password: +004 |CRSystem Password: |XX ; New user password prompt -005 |CRNew User Password: +005 |CRNew User Password: |XX ; New user login: first and last name prompt -006 |01[|10þ|01] |09Enter your full REAL name -> +006 |01[|10þ|01] |09Enter your full REAL name -> |XX ; Displayed if user doesn't enter a two word name. 007 |CR|12Please enter your first AND last name!|CR ; Displayed if user enters a new user name that already exists. 008 |CR|12User already exists.|CR ; New user login: Enter your handle/alias prompt -009 |01[|10þ|01] |09Enter your alias/handle -> +009 |01[|10þ|01] |09Enter your alias/handle -> |XX ; New user login: Enter your address prompt 010 |CR|03Enter your street address.|CR|09: ; New user login: Enter your city/state @@ -44,21 +44,21 @@ ; New user login: Enter your data phone number 014 |CR|03Enter your data phone number:|CR|09: ; New user login: Enter your birthdate. -015 |01[|10þ|01] |09Enter your birthdate |01[|10|UF|01]|09 -> +015 |01[|10þ|01] |09Enter your birthdate |01[|10|UF|01]|09 -> |XX ; New user login: Gender (M)ale, (F)emale -016 |01[|10þ|01] |09Are you |01[|10M|01]|09ale or |01[|10F|01]|09emale -> +016 |01[|10þ|01] |09Are you |01[|10M|01]|09ale or |01[|10F|01]|09emale -> |XX ; New user login: Password prompt -017 |DFprepass |CR|01[|10þ|01] |09Password -> +017 |DFprepass |CR|01[|10þ|01] |09Password -> |XX ; Displayed if user enters a password shorter than 4 chars. 018 |CR|12Password must be at least 4 characters long!|DE|DE|DE ; New user login: PW verification prompt -019 |01[|10þ|01] |09Again -> +019 |01[|10þ|01] |09Again -> |XX ; New user login: Passwords do not match 020 |CR|12Passwords do not match!|DE|DE|DE ; New user login: Saving/creating new user account 021 |CR|01[|10þ|01] |09Saving new account information|01... ; System pause prompt -022 !go-pawz +022 |15þ|07þ|08þ|09|17Ý|15 Pause |09Þ|16|08þ|07þ|15þ ; Chat call - reason for chat 023 |CR|14Why do you wish to chat with the Sysop?|CR|09: ; Paging Sysop text @@ -80,7 +80,7 @@ ; User list footer &1 = Total # of users listed 031 |09|$D73Ä|CR |01[|10þ|01] |09Users: |07|$R46|&1 |PA ; User list search string -032 |CR|01[|10þ|01] |09Enter Search String |01(|07Enter|01/|07All|01)|09: +032 |CR|01[|10þ|01] |09Enter Search String |01(|07Enter|01/|07All|01)|09: |XX ; File base list header 033 |CL|09Ú|$D77Ä|01¿|CR|09³|17 ± |15File Base Listing|$L56|FG |01|16³|CR|09À|01|$D77ÄÙ|CR |10A|02rea |10F|02ile |10B|02ase |10N|02ame |10A|02rea |10F|02ile |10B|02ase |10N|02ame|CR |09|$D77Ä ; File base listing format: @@ -89,7 +89,7 @@ ; File upload testing FAILED text 035 Failed ; File base listing prompt. -036 |09|$D77Ä|CR |01[|10þ|01] |09Select file base |01[|10?|01/|10List|01]|09: +036 |09|$D77Ä|CR |01[|10þ|01] |09Select file base |01[|10?|01/|10List|01]|09: |XX ; Displayed if there are no available file bases 037 |CR|12There are no available file bases ; Displayed if user hasn't selected a file base @@ -126,7 +126,7 @@ ; Displayed if batch queue is empty 052 |CL |15There are no files in your batch queue ; &1 = number of files in batch queue -053 |CR |09Delete which |01(|071|01-|07|&1|01)|09: +053 |CR |09Delete which |01(|071|01-|07|&1|01)|09: |XX ; Batch removed from queue &1 = Filename &2 = Size 054 |CR|15|&1 |08(|07|&2 bytes|15|08) |07removed from queue. ; File upload PASSED text @@ -149,8 +149,8 @@ 063 |CR|12Cannot download files in local mode!|DE|DE|DE 064 |01[|10þ|01] |09Search all file groups? |11 065 |CR|12Start your transfer now. -066 UNUSED -067 UNUSED +066 |CR|14File area "|FB" is password protected.|CR|09Password: |XX +067 |CR|12Access denied. 068 |CR|12You do not have access to upload here! 069 |CR|12Illegal filename.|DE|DE|DE 070 |CR|14Searching for duplicate files ... @@ -192,7 +192,7 @@ ; &1 = base number &2 = base name &3 = scan base? (Yes or No) 093 |07|$R04|&1|15|$R03|&3 |07|$R29|&2 094 |CR|12There are no available message bases! -095 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: +095 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX ; For strings 096 - 099: &1 = message base name 096 |CR |11|&1 will NOT be scanned in QWK packets!|CR 097 |CR |11|&1 will be scanned in QWK packets!|CR @@ -202,9 +202,9 @@ ; Message base format list: ; &1 = base number &2 = base name &3 = total messages 101 |15|$L05|&1 |07|$R32|&2 -102 |09|$D77Ä |CR |09Select Message Base |01[|10?|01/|10List|01]|09: -103 UNUSED -104 UNUSED +102 |09|$D77Ä |CR |09Select Message Base |01[|10?|01/|10List|01]|09: |XX +103 |CR|14Message area "|MB" is password protected.|CR|09Password: |XX +104 Access denied. 105 |CR|12You don't have access to post here! 106 |CR|12Use the full screen editor? |11 107 |01[|10þ|01] |09Saving Message|01... @@ -219,13 +219,13 @@ ; E-mail reader prompt 115 |CR|09(A)gain, (P)revious, (N)ext, (R)eply, (D)elete, (J)ump, (Q)uit? ; Message read prompt. &1 = Current Msg # &2 = Total Messages -116 !to-prmpt MESSAGE +116 |CR (|&1 of |&2) Reading Messages (?/Help): |XX 117 |CR|12Delete this mail? |11 118 |CR|15End of messages. ; Post message TO: -119 |CR|09To: +119 |CR|09To: |XX ; post message SUBJ: -120 |CR|09Subject: +120 |CR|09Subject: |XX ; Files still in batch. &1 = # of files 121 |CR|BE|14There are |15|&1 |14file(s) in your batch queue.|CR|12Download them now? |11 122 |09Saved @@ -255,7 +255,7 @@ ; Who's online list format: ; &1 = node number &2 = user name &3 = action &4 = location ; &5 = baud rate &6 = gender &7 = age &8 = available? -139 |07|$R02|&1 |15|$R14|&2|$R30|07|&3 +139 |07|$R05|&1 |15|$R26|&2 |12|&3 ; Who's online list footer 140 |09|$D77Ä|CR |PA ; Last 10 callers list header @@ -265,23 +265,23 @@ ; &6 = Baud &8 = Address &9 = Usernote &0 = Email &A-&C = Optional 1-3 142 |15|$R27|&1 |07|$R25|&3 |$L04|&2 |&4 |&5 ; Last 10 callers footer -143 |09|$D77Ä|CR|PA +143 |09 |$D77Ä|CR|PA ; Message from another node: ; &1 = Message from &2 = Node user is logged in to. -144 |CR|14Message from |&1 on node |&2:|10 +144 |CL|09|17 ° |15Message from |14|&1 |15on node |14|&2|[K|03|16|CR ; Message from another node footer -145 |CR|09NodeMsg: (R)eply or (ENTER/Continue): |15 -146 |CR|09Send message to which node |01[|10?|01/|10List|01]|09: +145 |CR|09Node Message: |01[|10R|01]|09eply or |01[|10ENTER|01/|10Continue|01]|09: |15 +146 |CR|09Send message to which node |01[|10?|01/|10List|01]|09: |XX 147 |CR|12No one is logged in on that node! ; Send message to node prompt: ; &1 = receiver's name &2 = receiver's node number 148 |CR|07Enter messsage for |15|&1 |07on node |15|&2|07: 149 |CR|12You don't have access to this menu!|CR|CR|PA -150 |CR|09Enter Menu Password: -151 |CR|09Enter your current password: +150 |CR|09Enter Menu Password: |XX +151 |CR|09Enter your current password: |XX 152 |CR|11(|031|08) |09MM/DD/YY|CR|11(|032|08) |09DD/MM/YY|CR|11(|033|08) |09YY/DD/MM|CR|CRDate Format |08-> |07 ; &1 = def. page length -153 |CR|01[|10þ|01] |09Screen Pause Length |01[|10Enter|01/|10|&1|01]: +153 |CR|01[|10þ|01] |09Screen Pause Length |01[|10Enter|01/|10|&1|01]: |XX 154 |CR|11(|030|08) |09Ascii (No Color)|CR|11(|031|08) |09Ansi (Color)|CR|CR|09Graphics Mode |08-> |07 ; User name search ; &1 = User's Name @@ -289,8 +289,8 @@ 156 |CR|15User not found.|DE|DE|DE 157 |CR|12You've reached your calls per day limit. Call back tomorrow!|CR|CR|PA 158 |CR|15No quote data available... -159 |CR|09Enter first line to quote: -160 |09Enter last line to quote : +159 |CR|09Enter first line to quote: |XX +160 |09Enter last line to quote : |XX ; Email reply: not valid user. &1=username 161 |CR|11|&1 is not a valid user on this system. ; &1 = maximum length of each line &2 = maximum number of lines @@ -300,7 +300,7 @@ ; Line editor "backing up to line". &1 = new line number 165 |15Backing up to line |&1.|03 ; Line editor "command" prompt. -166 |CR|09Command |01[|10?|01/|10Help|01]|09: +166 |CR|09Command |01[|10?|01/|10Help|01]|09: |XX ; Line editor "command" prompt help 167 |CR|03(|11A|03)bort Message (|11C|03)ontinue Message (|11U|03)pload Message|CR(|11Q|03)uote Message (|11S|03)ave Message (|11H|03)elp|CR(|11T|03)itle Change 168 |CR|12Abort message? |11 @@ -308,9 +308,9 @@ ; Archive list format: ; &1 = archive number &2 = archive name &3 = archive extension 170 |15|$R02|&1 |10|$R22|&2 |11|&3 -171 |09|$D30Ä|CR|01[|10þ|01] |09Select Archive #: -172 |CR|09Deposit how many minutes |01[|100|01-|10|TL|01]|09: -173 |CR|09Withdraw how many minutes |01[|100|01-|10|TB|01]|09: +171 |09|$D30Ä|CR|01[|10þ|01] |09Select Archive #: |XX +172 |CR|09Deposit how many minutes |01[|100|01-|10|TL|01]|09: |XX +173 |CR|09Withdraw how many minutes |01[|100|01-|10|TB|01]|09: |XX ; Message group list header 174 |CL|CR|$D13 |09Ú|$D54Ä|01¿|CR|$D13 |09³|17 ± |15Message Groups|$D37 |16|01³|CR|$D13 |09À|01|$D54ÄÙ|CR|$D14 |10#|02# |10M|02essage |10G|02roup |10N|02ame|07|$D24 |02A|10reas|CR|$D14 |09|$D54Ä ; Message group list format @@ -318,7 +318,7 @@ 175 |$D14 |07|$R04|&1 |15|$R41|&2 |12|&3 176 |CR|12There are no available message groups. ; Message group list prompt -177 |$D14 |09|$D54Ä|CR|$D14 |01[|10þ|01] |09Select Message Group |01[|10Enter|01/|101|01]|09: +177 |$D14 |09|$D54Ä|CR|$D14 |01[|10þ|01] |09Select Message Group |01[|10Enter|01/|101|01]|09: |XX 178 |CR|12Send E-mail to the Sysop? |11 ; 179-180 are System broadcast messages header/footer ; &1 = User who sent system broadcast @@ -333,7 +333,7 @@ ; &1 = language number &2 = language description 183 |15|$R03|&1|14|&2 ; Language select footer -184 |CR|09Select language: +184 |CR|09Select language: |XX ; Language file does not exist 185 |CR|12Language file does not exist. ; Displayed if user's language does not exist. @@ -368,7 +368,7 @@ ; &1 = File base number &2 = File base name &3 = Scan? (Yes or No) 201 |07|$R04|&1|15|$R03|&3 |07|$R29|&2 ; Select scanned file bases prompt -202 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: +202 |09|$D77Ä|CR |09Selection |01[|10##|01]|09, |01[|10##|01-|10##|01]|09, |01[|10?|01/|10List|01]|09, or |01[|10Q|01]|09uit: |XX ; &1 = File base name 203 |CR |11|&1 will NOT be scanned in new file scan!|CR ; &1 = File base name @@ -376,7 +376,7 @@ ; Displayed if file already exists when user trys to upload. 205 File already exists. ; Displayed before running uploads processor -206 |12þ |03Testing file for errors : +206 |12þ |03Testing file for errors : |XX ; File description input line. &1 = Line number 207 |09: ; Default file description if none entered/found. @@ -391,7 +391,7 @@ ; Lightbar file list: Access to file denied. 212 |12File is not available.|PN ; Read Message personal prompt. &1 = Current Msg # &2 = Total Messages -213 !to-prmpt MESSAGE +213 |CR|09[|&1 of |&2] Reading Messages (?/Help): |XX ; File group list header 214 |CL|CR|$D13 |09Ú|$D54Ä|01¿|CR|$D13 |09³|17 ± |15File Groups|$D40 |16|01³|CR|$D13 |09À|01|$D54ÄÙ|CR|$D14 |10#|02# |10F|02ile |10G|02roup |10N|02ame|07|$D29 |02A|10reas|CR|$D14 |09|$D54Ä ; File group list format @@ -400,7 +400,7 @@ ; Displayed if there are no available file groups 216 |CR|12There are no available file groups. ; File group list prompt -217 |$D14 |09|$D54Ä|CR|$D14 |01[|10þ|01] |09Select File Group |01[|10Enter|01/|101|01]|09: +217 |$D14 |09|$D54Ä|CR|$D14 |01[|10þ|01] |09Select File Group |01[|10Enter|01/|101|01]|09: |XX ; nodechat private text: &1 = user name 218 |02<|10|&1 |02private|02> |07 ; Displayed when creating a new files list @@ -458,14 +458,14 @@ ; There are no voting questions. 243 |12Sorry, there are no voting questions. ; Voting booth prompt &1 = Total number of questions -244 |08|$D79Ä|CR|09Vote on which question (1-|&1, or Enter/Quit): +244 |08|$D79Ä|CR|09Vote on which question (1-|&1, or Enter/Quit): |XX ; Voting on question header &1 = Question 245 |CL|08|$D79Ä|CR|14Question: (* = Current Vote)|CR|12|&1|CR|08|$D79Ä ; Voting on question list format ; &1 = Answer # &2 = Answer text &3 = Current Answer? 246 |12|&3 |09(|10|$R02|&1|09) |03|&2 ; Voting prompt -247 |08|$D79Ä|CR|09Vote for which answer (Enter/Quit): +247 |08|$D79Ä|CR|09Vote for which answer (Enter/Quit): |XX ; See voting results? 248 |CR|12See results? |11 ; Vote Result Header @@ -480,13 +480,13 @@ ; text 252 ; Enter your answer prompt -253 |CR|09Enter your response: +253 |CR|09Enter your response: |XX 254 |CR|14This is a forced question. You must answer it to continue.|CR|CR|PA -255 |CR|09Enter new file scan date |01[|10|UF|01]|09: +255 |CR|09Enter new file scan date |01[|10|UF|01]|09: |XX 256 |CR|12Set this date for all file bases? |11 ; &1 = Date of the updated new scan. 257 |CR|07New scan date set to [|15|&1|07].|DE|DE|DE -258 |CRDetecting terminal emulation: +258 |CRDetecting terminal emulation: |XX 259 |TE detected. ; Short BBS list header 260 |CR|07Õ|08Í[ |15B|07BS |15N|07ame |08]Í|07ÍÍÍÍÍÍÍÍÍÍÍ|08Í[ |15T|07ype |08]|07Í|08Í[ |15A|07ddress |08/ |15P|07hone |08]Í|07ÍÍÍÍÍÍÍ|08Í[ |15S|07oftware |08]Í|07¸ @@ -495,7 +495,7 @@ 261 |08³ |14|$R25|&1 |09|$R06|&2 |10|$R30|&3 |12|$R10|&4 |08³ ; Short BBS list footer 262 |07ÔÍ|08ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ|07Í; -263 |08|$D79Ä|CR|09Results for which question? (Enter/Quit): +263 |08|$D79Ä|CR|09Results for which question? (Enter/Quit): |XX ; Extended BBS list header 264 |CR|14Extended BBS listing: ; Extended BBS list information @@ -505,7 +505,7 @@ ; verify bbs? 266 |CR|12Verify that this BBS is still online? |11 ; Extended BBS list prompt -267 |CR|09(Enter) to Continue, (D)elete, (V)erify, or (Q)uit? +267 |CR|09(Enter) to Continue, (D)elete, (V)erify, or (Q)uit? |XX ; Who's Online: blank listing. |&1 = Node number 268 |07|$R05|&1 Waiting for connection ; Matrix login: Create a BBS account? @@ -515,39 +515,39 @@ ; Matrix login: Your account is not validated. 271 |CR|14Sorry, your account has not been validated.|CR|CR|PA ; Matrix login: Enter matrix password -272 |CR|14Enter matrix password: +272 |CR|14Enter matrix password: |XX ; Matrix login: Enter account name prompt -273 |CR|03Account name |09: +273 |CR|03Account name |09: |XX ; Matrix login: enter account password prompt -274 |CR|03Account password|09: +274 |CR|03Account password|09: |XX ; Add question to voting booth question 275 |CR|12Add a question to the voting booth? |11 ; Maximum of 20 voting questions text 276 |CR|14Sorry, there is a maximum of 20 voting questions. ; Enter new question -277 |CL|03Enter new question (Enter/Quit)|CR|09: +277 |CR|03Enter new question (Enter/Quit)|CR|09: ; Enter choices now. Max 15. 278 |CR|10Enter choices now. There are a maximum of 15 choices for each question.|CREnter a blank line when done.|CR ; Choice #. &1 = Choice number -279 |09Choice #|&1: +279 |09Choice #|&1: |XX ; Allow users to add answers? 280 |CR|12Allow users to add their own answers? |11 ; Save this question? 281 |CR|12Save this voting question? |11 ; Move message to where? -282 |CR|09Move to which base (?/List): +282 |CR|09Move to which base (?/List): |XX ; Add BBS list: enter phone number -283 |03Enter BBS phone number: +283 |03Enter BBS phone number: |XX ; Add BBS list: enter BBS name -284 |03Enter BBS Name : +284 |03Enter BBS Name : |XX ; Add BBS list: enter BBS location -285 |03Enter Location of BBS : +285 |03Enter Location of BBS : |XX ; Add BBS list: enter sysop name -286 |03Enter Sysop Name : +286 |03Enter Sysop Name : |XX ; Add BBS list: enter max baud rate -287 |03Enter Max Baud Rate : +287 |03Enter Max Baud Rate : |XX ; Add BBS list: enter BBS software -288 |03Enter BBS Software : +288 |03Enter BBS Software : |XX ; File base is mandatory 289 |CR |11|FB is marked as mandatory scanning.|CR ; Save this BBS entry @@ -555,19 +555,19 @@ ; There are no entries in BBS list. 291 |CR|12There are no entries in the BBS list. ; BBS list: enter text to search for -292 |CR|09Enter search text or (ENTER) for All: +292 |CR|09Enter search text or (ENTER) for All: |XX ; Matrix login: Invalid PW 293 |CR|12Invalid password. 294 |CR|12Delete this BBS from the list? |11 295 |CR|12You did not add this BBS entry. ; editing message display -296 |CL|14Message Editor|CR|CR|03A. To : |&1|CRB. Subj : |&2|CR|CR|09Command: (!) Edit text, (Q)uit: +296 |CL|14Message Editor|CR|CR|03A. To : |&1|CRB. Subj : |&2|CR|CR|09Command: (!) Edit text, (Q)uit: |XX ; editing message to -297 |CR|09To: +297 |CR|09To: |XX ; editing message net address -298 |CR|09Enter destination address: +298 |CR|09Enter destination address: |XX ; editing message subject -299 |CR|09Subject: +299 |CR|09Subject: |XX ; editing message save changes 300 |CR|12Save changes to message? |11 ; delete autosig? @@ -585,7 +585,7 @@ 308 |CR|12Invisible login? |11 309 |CR|12Sorry, this user name is not acceptable. ; Message search: search text input -310 |CR|03Enter text to search for: +310 |CR|03Enter text to search for: |XX ; Message search completed 311 |CL|15Message search completed.|DE|DE|DE ; Lightbar file list: DL limit is exceeded. @@ -594,9 +594,10 @@ 313 |12Your download ratio would be exceeded.|PN ; Lightbar file list: Batch queue is full. 314 |12Your batch queue is full.|PN +; UNUSED 315 UNUSED ; Lightbar Y/N: YES text -316 |08++(|23|00 yes |16|08/ |07no |08)++ +316 |09|17 Y|15es |09|16 N|15o |16 ; Lightbar Y/N: NO text 317 |09 Y|15es |09|17 N|15o |16 ; Moving message. &1=base name @@ -619,7 +620,7 @@ 328 |CR|14Sysop has shelled to DOS. Please wait. 329 |14Sysop has returned from DOS. Thank you. ; Add to BBS list: telnet -330 |03Enter Telnet Address : +330 |03Enter Telnet Address : |XX ; Start at message index in email? (lightbar msg reader) 331 |CR|12Start at e-mail message index? |11 ; Teleconference user list @@ -634,14 +635,14 @@ ; One Liners list format. &1 = Text &2 = Poster Name &3 = Initials 337 |07 |$R61|&1 |$L15|&2 ; Reading forward prompt &1 = Total messages in base -338 |CR|03Begin reading at (|111|03-|11|&1|03)|12: +338 |CR|03Begin reading at (|111|03-|11|&1|03)|12: |XX ; Lightbar file list prompt (SYSOP) 339 |01(|07Space|01) |09Flag |01(|07E|01) |09Edit |01(|07N|01) |09Next |01(|07V|01) |09View |01(|07ESC|01) |09Quit |01(|07?|01) |09Help ; Lightbar file list uploaders name &1 = user name &3 = downloads 340 |$D34 |07+ Uploader: |&1 ; Line editor quote mode: &1 = line number &2 = line text 341 |10|&1|02: |11|$R74|&2 -342 |CR|09Enter destination address: +342 |CR|09Enter destination address: |XX ; Upload file name prompt 343 |CR|09File Name|CR: ; Download file name prompt @@ -671,19 +672,19 @@ ; FS editor "abort msg" 356 |CR|12Abort message? |11 ; file list tagging prompt -357 |CR|01[|10þ|01] |09Add which file number to batch |01(|07Enter|01/|07Quit|01)|09: +357 |CR|01[|10þ|01] |09Add which file number to batch |01(|07Enter|01/|07Quit|01)|09: |XX ; file list view prompt -358 |CR|01[|10þ|01] |09View contents of which file number |01(|07Enter|01/|07Quit|01)|09: +358 |CR|01[|10þ|01] |09View contents of which file number |01(|07Enter|01/|07Quit|01)|09: |XX ; Protocol List Header 359 |CR|14Available Protocols:|CR ; NodeMsg reply &1=from &2=node# 360 |CR|07Sending reply to |15|&1 |07on node |15|&2|07: ; Add BBS list connection type -361 |CR|09Accessible by (D)ialup, (T)elnet, (B)oth: +361 |CR|09Accessible by (D)ialup, (T)elnet, (B)oth: |XX ; Add BBS: BBS already exists 362 |CR|12BBS already exists in list! ; Msg xport: local export path -363 |CR|09Enter full path/filename to export to: +363 |CR|09Enter full path/filename to export to: |XX ; info edit: address 364 |CR|03Enter your street address.|CR|09: ; info edit: city/state @@ -697,11 +698,11 @@ ; info edit: bday 369 |CR|03Enter your date of birth (|UF):|CR|09: ; info edit: gender -370 |CR|09Are you (M)ale or (F)emale? +370 |CR|09Are you (M)ale or (F)emale? |XX ; info edit: date format 371 |CR|11(|031|08) |09MM/DD/YY|CR|11(|032|08) |09DD/MM/YY|CR|11(|033|08) |09YY/DD/MM|CR|CRDate Format |08-> |07 ; info edit: screen length &1 = def page size -372 |CR|09Screen Pause Length (Enter/|&1): +372 |CR|09Screen Pause Length (Enter/|&1): |XX ; info edit: editor type 373 |CR|11(|030|08) |14Line Editor|CR|11(|031|08) |14Full Screen Editor|CR|11(|032|08) |14Ask|CR|CR|15E|10d|02itor |15T|10y|02pe|15: |15 ; info edit: file list type @@ -711,13 +712,13 @@ ; Processing uploads 376 |CR|14Processing uploads ...|CR ; BLIND dupe search -377 |12þ |03Searching for duplicate files : +377 |12þ |03Searching for duplicate files : |XX ; BLIND dupe found 378 Dupe found. ; BLIND no dupe found 379 None. ; importing file_id.diz -380 |12þ |03Importing file description : +380 |12þ |03Importing file description : |XX ; file_id found 381 Found. ; no file_id @@ -733,11 +734,11 @@ ; Mass mail prompt 387 |CL|09Send mass mail by|09:|CR|CR|11(|031|08) |09ACS level|CR|11(|032|08)|09 List of users|CR|11(|033|08)|09 All users|CR|11(|03Q|08)|09 Quit|CR|CRCommand |08-> |07 ; Mass mail ACS prompt -388 |CREnter ACS level: +388 |CREnter ACS level: |XX ; Mass mail name info 389 |CR|11Enter user name, or search string.|CREnter a blank line to end.|CR ; Mass mail name prompt &1 = # of users in list -390 |CR|11|&1 |03users in list. Enter user name: +390 |CR|11|&1 |03users in list. Enter user name: |XX ; Mass mail name list 391 |CR|09User mailing list:|CR ; Mass mail name format &1 = name @@ -749,7 +750,7 @@ ; Node unavilable 395 |CR|14Sorry, this user is marked as unavailable. ; Msg search prompt -396 |CR|03Enter search string: +396 |CR|03Enter search string: |XX ; Info edit: Msg Read type 397 |CR|11(|030|08) |14Normal |15: |10View messages page by page|CR|11(|031|08) |14LightBar |15: |10Scroll message lists with arrow keys|CR|CR|15S|10ele|02ct |15T|10yp|02e: |15 ; New user: Msg Read type @@ -766,15 +767,15 @@ ; Ansi msg read: delete msg 402 |CR|12Delete this mail? ; Ansi msg read: jump to msg: &1 = cur msg num &2 = high msg num -403 |CR|09Jump to which message? (1-|&2): +403 |CR|09Jump to which message? (1-|&2): |XX ; Ansi msg read: scan toggle &1 = message base name 404 |CR|11|&1 will NOT be scanned in new message scan! 405 |CR|11|&1 will be scanned in new message scan! 406 |CR|11|MB is marked as mandatory reading! ; Reply msg To: standard -407 |CR|09To: +407 |CR|09To: |XX ; Reply msg To: lightbar -408 |CR|09To: +408 |CR|09To: |XX ; User edit: Hotkeys 409 |CR|12Use hot-key input? ; New user: Hotkeys @@ -787,7 +788,7 @@ ; ansi msg read: local export 415 Export to filepath/filename|CR: ; mass email subj: prompt -416 |CR|09Subject: +416 |CR|09Subject: |XX ; General Invalid PW 417 |CR|12Invalid password. ; INFO EDIT: Do not match @@ -834,7 +835,7 @@ ; post on msg base (lightbar reader) 438 |CR|12Post a message? ; new user: enter email address -439 |01[|10þ|01] |09Enter your e-mail address -> +439 |01[|10þ|01] |09Enter your e-mail address -> |XX ; info edit: enter email address 440 |CR|09Enter E-mail address|CR: ; new user: enter user note @@ -842,23 +843,23 @@ ; info edit: enter user note 442 |CR|09Enter your desired user note|CR: ; new user: option 1 -443 |01[|10þ|01] |09How did you hear of this BBS -> +443 |01[|10þ|01] |09How did you hear of this BBS -> |XX ; info edit: option 1 -444 |CR|09Enter optional field 1: +444 |CR|09Enter optional field 1: |XX ; new user: option 2 -445 |CR|09Enter optional field 2: +445 |CR|09Enter optional field 2: |XX ; info edit: option 2 -446 |CR|09Enter optional field 2: +446 |CR|09Enter optional field 2: |XX ; new user: option 3 -447 |CR|09Enter optional field 3: +447 |CR|09Enter optional field 3: |XX ; info edit: option 3 -448 |CR|09Enter optional field 3: +448 |CR|09Enter optional field 3: |XX ; file new scan setting footer 449 ; private post (email) TO: -450 |CR|09To: +450 |CR|09To: |XX ; reply msg SUBJ -451 |CR|09Subject: +451 |CR|09Subject: |XX ; standard quote header 452 |15Quote mode: Select a range of text to quote|CR 453 |09|$D77Ä|CR|PA @@ -881,14 +882,13 @@ ; filename greater than 70 chars prompt 461 |CR|12File of this name already exists.|CR|CR|09Enter new file name (max 70 chars)|CR: ; line editor edit subject -462 |CR|09Enter new subject: +462 |CR|09Enter new subject: |XX ; FS editor edit subject -463 |CR|09Enter new subject: +463 |CR|09Enter new subject: |XX ; msgtext quote header &1=date &2=from &3=initials 464 On |&1, |&2 said the following... ; new email node msg: &1=from &2=subj 465 You've just received new e-mail from |&1. - ; ansi gallery: Ansi is required to use this prompt 466 |CRSorry, this gallery requires ANSI graphics|CR|CR|PA ; ansi gallery: Deselected file in list (bar OFF) @@ -908,7 +908,7 @@ ; &6=sauce group &7=filetime 470 |[X02|15|17 |$R49|&1 |12|$D15 |XX ; ansi gallery: Current path update prompt (when switching directories) -; set to blank to not display a path +; set to blank to not display a path (automatically excludes the root) ; &1 = current path &2 = # of files in path 471 |[X08|[Y05|15|16|$R70|&1 ; ansi gallery: Percent bar update (when redrawing page) @@ -921,7 +921,7 @@ ; ansi gallery: Command prompt for ! (only download for now) 474 |CR|12Download |&1? |XX ; Password inquiry prompt -475 |CR|12Send an e-mail about your forgetten password? |XX +475 |CR|12Send a password inquiry message to the SysOp? |XX ; Displayed when account expired down to a security level > 0 476 |CR|14Your account has expired. Downgrading security to |XS. ; Displayed when account expired down to level 0 (delete) @@ -941,4 +941,4 @@ ; User2User chat mode ended 484 |CL|09|17 ° |15Chat mode end.|$X79 |16|DE|DE ; User2User accept chat page request? &1=user &2=Node -485 |CL|15|&1 is requesting private user chat. Accept? |11 \ No newline at end of file +485 |CL|15|&1 is requesting private user chat. Accept? |11 diff --git a/mystic/mide.pas b/mystic/mide.pas index 6b4ff26..34da8c9 100644 --- a/mystic/mide.pas +++ b/mystic/mide.pas @@ -58,7 +58,7 @@ Const colEditBorder = 25; { 31 } colEditHeader = 31; { 31 } - colEditStatus = 19; { 19 } + colEditStatus = 9 + 1 * 16; colEditPosBar = 9 + 1 * 16; Type diff --git a/mystic/mpl_common.pas b/mystic/mpl_common.pas index 69abc11..32b4070 100644 --- a/mystic/mpl_common.pas +++ b/mystic/mpl_common.pas @@ -22,7 +22,7 @@ End; Function Char2VarType (C: Char) : TIdentTypes; Begin - Case UpCase(c) of + Case UpCase(C) of 'S' : Result := iString; 'C' : Result := iChar; 'B' : Result := iByte; diff --git a/mystic/mpl_compile.pas b/mystic/mpl_compile.pas index 475e6ea..96147ab 100644 --- a/mystic/mpl_compile.pas +++ b/mystic/mpl_compile.pas @@ -2,14 +2,6 @@ Unit MPL_Compile; {$I M_OPS.PAS} -// OKAY SO iRECORD HAS DATAPTR ALLOCATED TO ITS FULL SIZE. -// WHEN A RECORD VARIABLE (iRECORD) is DEFINED, EACH VAR -// IS CREATED WITH A POINTER TO iRECORD.DATAPTR[OFFSET] -// IRECORD THEN CAN BE REFERENCED AS EXPECTED. -// ALSO NEED TO FIGURE OUT SIZEOF TOO - -// REMOVE VARTYPE2CHAR ETC AND USE ORDINAL - Interface Uses @@ -47,22 +39,15 @@ Type TParserUpdateProc = Procedure (Mode: TParserUpdateInfo); TParserSourceFile = Record - DataFile : TCharFile; - ColCur : Byte; - ColLast : Byte; - ColSaved : Byte; - LineCur : Word; - LineSaved : Word; - Position : LongInt; - PosSaved : LongInt; - Size : LongInt; - ColLastSaved : Byte; - SavedInfo : TParserUpdateInfo; + DataFile : TCharFile; + Position : LongInt; + PosSaved : LongInt; + Size : LongInt; + SavedInfo : TParserUpdateInfo; End; TParserVarInfoRec = Record Ident : Array[1..mplMaxVarDeclare] of String[mplMaxIdentLen]; - Prefix : String[mplMaxIdentLen]; vType : TIdentTypes; ArrDem : Byte; ArrStart : Array[1..mplMaxArrayDem] of LongInt; @@ -71,14 +56,16 @@ Type StrLen : Byte; VarSize : LongInt; DataSize : LongInt; + RecID : Word; End; PRecordRec = ^TRecordRec; TRecordRec = Record Ident : String[mplMaxIdentLen]; + RecID : Word; Fields : Array[1..mplMaxRecFields] of TParserVarInfoRec; NumFields : Word; -// RecSize : Word; + DataSize : LongInt; End; PConstRec = ^TConstRec; @@ -106,6 +93,7 @@ Type CurRecNum : Word; CurConstNum : Word; CurVarID : Word; + CurRecID : Word; UsesUSER : Boolean; UsesCFG : Boolean; UsesMBASE : Boolean; @@ -136,7 +124,7 @@ Type // CODE PROCESSING Function GetDataSize (Info: TParserVarInfoRec) : LongInt; Procedure CreateVariable (Var Info: TParserVarInfoRec); - Procedure ParseVariableInfo (Param: Boolean; IsRec: Boolean; Var Info: TParserVarInfoRec); + Function ParseVariableInfo (Param: Boolean; IsRec: Boolean; Var Info: TParserVarInfoRec) : LongInt; Procedure ParseIdent; Procedure ParseBlock (VarStart: Word; OneLine, CheckBlock, IsRepeat: Boolean); @@ -144,9 +132,10 @@ Type Procedure ParseVarString; Procedure ParseVarFile; Procedure ParseVarBoolean; - Procedure ParseVarChar; //combine with string? + Procedure ParseVarChar; Procedure ParseVariable (VT: TIdentTypes); Procedure ParseArray (VN: Word); + Function ParseElement (VN: Word; TypeCheck: Boolean; VT: TIdentTypes) : TIdentTypes; Procedure DefineRecordType; Procedure DefineVariable; @@ -196,6 +185,7 @@ Begin Ch := #0; IdentStr := ''; CurVarID := 0; + CurRecID := 0; CurFile := 0; CurVarNum := 0; CurGotoNum := 0; @@ -271,10 +261,23 @@ Begin UpdateInfo.ErrorType := ErrNum; UpdateInfo.ErrorText := GetErrorMessage(Str); - UpdateInfo.ErrorLine := InFile[CurFile].LineCur; - UpdateInfo.ErrorCol := InFile[CurFile].ColCur; + UpdateInfo.ErrorLine := 1; + UpdateInfo.ErrorCol := 0; - If UpdateInfo.ErrorLine < 1 Then UpdateInfo.ErrorLine := 1; + InFile[CurFile].DataFile.Seek(0); + + While Not InFile[CurFile].DataFile.EOF And (InFile[CurFile].DataFile.FilePos < InFile[CurFile].Position) Do Begin + Case InFile[CurFile].DataFile.Read of + #10 : Begin + Inc (UpdateInfo.ErrorLine); + UpdateInfo.ErrorCol := 0; + End; + #09, + #13 : ; + Else + Inc (UpdateInfo.ErrorCol); + End; + End; End; Function TParserEngine.CurFilePos : LongInt; @@ -358,6 +361,9 @@ Begin If CurRecNum = 0 Then Exit; Repeat + writeln('rec ident: ', recdata[count]^.ident); + writeln('str: ', str); + If strUpper(RecData[Count]^.Ident) = Str Then Begin Result := Count; Exit; @@ -400,7 +406,6 @@ Begin UpdateInfo.Percent := Percent; UpdateInfo.FilePosition := InFile[CurFile].Position; UpdateInfo.FileSize := InFile[CurFile].Size; - UpdateInfo.FileLine := InFile[CurFile].LineCur; End; UpdateProc(UpdateInfo); @@ -414,9 +419,8 @@ Begin If Not InFile[CurFile].DataFile.Eof Then Begin Ch := InFile[CurFile].DataFile.Read; - Inc (InFile[CurFile].Position); - If Not (Ch in [#10, #13]) Then Inc(InFile[CurFile].ColCur); + Inc (InFile[CurFile].Position); End Else If InFile[CurFile].DataFile.Eof and (CurFile > 1) Then Begin CloseSourceFile; @@ -434,42 +438,15 @@ Begin With InFile[CurFile] Do Begin If Position <= 1 Then Exit; - Dec (Position); - Dec (ColCur); + Dec (Position); DataFile.Seek (DataFile.FilePos - 1); - - If ColCur < 1 Then Begin - ColCur := ColLast; - ColLast := 1; - - Dec (LineCur); - End; End; End; Function TParserEngine.IsEndOfLine : Boolean; Begin - Result := False; - - Case Ch of - #10, - #13 : Begin - With InFile[CurFile] Do Begin - Inc (LineCur); - - ColLast := ColCur; - ColCur := 1; - Result := True; - End; - - If Ch = #13 Then Begin - GetChar; - - If Not (Ch in [#10]) Then PrevChar; - End; - End; - End; + Result := Ch in [#10, #13]; End; Procedure TParserEngine.NextChar; @@ -496,10 +473,9 @@ Begin While Not UpdateInfo.ErrorType <> 0 Do Begin Case Ch of - // SKIP CR/LF... - #10, - #13 : IsEndOfLine; // SKIP WHITESPACE + #10, + #13, #09, #32, #59 : {ignore}; @@ -519,8 +495,6 @@ Begin '*' : Repeat GetChar; - IsEndOfLine; - Case Ch of '*' : Begin GetChar; @@ -584,6 +558,7 @@ Begin End; 1 : Begin BlockCount := 1; + Repeat GetChar; @@ -685,7 +660,7 @@ Begin If UpdateInfo.ErrorType <> 0 Then Exit; - While (UpdateInfo.ErrorType = 0) And ((Ch in ChIdent2) or (Ch = '.')) Do Begin + While (UpdateInfo.ErrorType = 0) And (Ch in ChIdent2) Do Begin IdentStr := IdentStr + Ch; GetChar; End; @@ -707,20 +682,14 @@ End; Procedure TParserEngine.SavePosition; Begin With InFile[CurFile] Do Begin - ColSaved := ColCur; - LineSaved := LineCur; - PosSaved := DataFile.FilePos + 1; - ColLastSaved := ColLast; + PosSaved := DataFile.FilePos + 1; End; End; Procedure TParserEngine.LoadPosition; Begin With InFile[CurFile] Do Begin - ColCur := ColSaved; - LineCur := LineSaved; Position := PosSaved; - ColLast := ColLastSaved; DataFile.Seek (Position - 1); End; @@ -743,8 +712,10 @@ Var Begin If VarData[VN]^.ArrPos > 0 Then Begin GetStr(tkw[wOpenArray], True, False); - For X := 1 to VarData[vn]^.ArrPos Do Begin + + For X := 1 to VarData[VN]^.ArrPos Do Begin ParseVarNumber; + If X < VarData[VN]^.ArrPos Then GetStr(tkw[wArrSep], True, False) Else @@ -753,6 +724,65 @@ Begin End; End; +Function TParserEngine.ParseElement (VN: Word; TypeCheck: Boolean; VT: TIdentTypes) : TIdentTypes; +Var + Element : String; + RecNum : Word; + Count : Word; + Found : Boolean; + Offset : LongInt; + X : Word; +Begin + Result := VarData[VN]^.vType; + + If Result <> iRecord Then Exit; + + NextChar; + + If Ch <> '.' Then Begin + PrevChar; + Exit; + End; + + GetIdent(False); + + Element := strUpper(IdentStr); + Offset := 0; + + For Count := 1 to RecData[VarData[VN]^.RecID]^.NumFields Do Begin + If strUpper(RecData[VarData[VN]^.RecID]^.Fields[Count].Ident[1]) = Element Then Begin + Found := True; + Result := RecData[VarData[VN]^.RecID]^.Fields[Count].vType; + + //VarType + //Offset + //Size + + If RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem > 0 Then Begin + GetStr(tkw[wOpenArray], True, False); + + For X := 1 to RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem Do Begin + ParseVarNumber; + + If X < RecData[VarData[VN]^.RecID]^.Fields[Count].ArrDem Then + GetStr(tkw[wArrSep], True, False) + Else + GetStr(tkw[wCloseArray], True, False); + End; + End; + +// writeln('creating ', recdata[vardata[vn]^.recid]^.fields[count].varsize, ' at ', offset); + + Break; + End; + + Inc (Offset, RecData[VarData[VN]^.RecID]^.Fields[Count].VarSize); + End; + + If Not Found Then + Error (mpsUnknownIdent, ''); +End; + Procedure TParserEngine.NewNumberCrap; var IsDecimal : Boolean; @@ -853,6 +883,7 @@ begin If GetIdent(False) Then Begin VarNum := FindConst(IdentStr); + If VarNum > 0 Then Begin If Not (ConstData[VarNum]^.vType in vNums) Then Error (mpsTypeMismatch, ''); @@ -864,7 +895,7 @@ begin If VarNum = 0 Then Error (mpsUnknownIdent, IdentStr) Else - If Not (VarData[VarNum]^.vType in vNums) Then + If Not (VarData[VarNum]^.vType in vNums) And (VarData[VarNum]^.vType <> iRecord) Then Error (mpsTypeMismatch, ''); If UpdateInfo.ErrorType <> 0 Then Exit; @@ -872,9 +903,10 @@ begin If VarData[VarNum]^.Proc Then ExecuteProcedure (VarNum, True) Else Begin - OutString (Char(opVariable)); - OutWord (VarData[VarNum]^.VarID); - ParseArray (VarNum); + OutString (Char(opVariable)); + OutWord (VarData[VarNum]^.VarID); + ParseArray (VarNum); + ParseElement (VarNum, True, iLongInt); End; End; End Else @@ -973,16 +1005,16 @@ Begin If Not (ConstData[VarNum]^.vType in vStrings) Then Error (mpsTypeMismatch, ''); - OutString(Char(opOpenString)); - OutString(ConstData[VarNum]^.Data[0]); - OutString(ConstData[VarNum]^.Data); + OutString (Char(opOpenString)); + OutString (ConstData[VarNum]^.Data[0]); + OutString (ConstData[VarNum]^.Data); End Else Begin VarNum := FindVariable(IdentStr); If VarNum = 0 Then Error (mpsUnknownIdent, IdentStr) Else - If Not (VarData[VarNum]^.vType in vStrings) Then + If Not (VarData[VarNum]^.vType in vStrings) And (VarData[VarNum]^.vType <> iRecord) Then Error (mpsTypeMismatch, ''); If UpdateInfo.ErrorType <> 0 Then Exit; @@ -990,9 +1022,10 @@ Begin If VarData[VarNum]^.Proc Then ExecuteProcedure(VarNum, True) Else Begin - OutString (Char(opVariable)); - OutWord (VarData[VarNum]^.VarID); - ParseArray (VarNum); + OutString (Char(opVariable)); + OutWord (VarData[VarNum]^.VarID); + ParseArray (VarNum); + ParseElement (VarNum, True, iChar); End; End; @@ -1112,7 +1145,7 @@ Begin If VarNum = 0 Then Error (mpsUnknownIdent, IdentStr) Else - If Not (VarData[VarNum]^.vType in vStrings) Then + If Not (VarData[VarNum]^.vType in vStrings) And (VarData[VarNum]^.vType <> iRecord) Then Error (mpsTypeMismatch, ''); If UpdateInfo.ErrorType <> 0 Then Exit; @@ -1120,9 +1153,10 @@ Begin If VarData[VarNum]^.Proc Then ExecuteProcedure(VarNum, True) Else Begin - OutString (Char(opVariable)); - OutWord (VarData[VarNum]^.VarID); - ParseArray (VarNum); + OutString (Char(opVariable)); + OutWord (VarData[VarNum]^.VarID); + ParseArray (VarNum); + ParseElement (VarNum, True, iString); End; End; @@ -1215,15 +1249,16 @@ Begin If VarNum = 0 Then Error (mpsUnknownIdent, IdentStr) Else - If VarData[VarNum]^.vType <> iBool Then + If (VarData[VarNum]^.vType <> iBool) And (VarData[VarNum]^.vType <> iRecord) Then Error (mpsTypeMismatch, '') Else If VarData[VarNum]^.Proc Then ExecuteProcedure(VarNum, True) Else Begin - OutString (Char(opVariable)); - OutWord (VarData[VarNum]^.VarID); - ParseArray (VarNum); + OutString (Char(opVariable)); + OutWord (VarData[VarNum]^.VarID); + ParseArray (VarNum); + ParseElement (VarNum, True, iBool); End; End; End; @@ -1455,7 +1490,7 @@ Begin Result := DimSize; End; -Procedure TParserEngine.ParseVariableInfo (Param: Boolean; IsRec: Boolean; Var Info: TParserVarInfoRec); +Function TParserEngine.ParseVariableInfo (Param: Boolean; IsRec: Boolean; Var Info: TParserVarInfoRec) : LongInt; Function ParseNum : LongInt; Var @@ -1547,41 +1582,41 @@ Procedure TParserEngine.ParseVariableInfo (Param: Boolean; IsRec: Boolean; Var I If IsRec Then Error(mpsSyntaxError, 'Cannot define file in record'); Info.vType := iFile; End Else Begin - Count := FindRecord(IdentStr); + Info.RecID := FindRecord(IdentStr); - If Count = 0 Then + If Info.RecID = 0 Then Error(mpsUnknownIdent, IdentStr) Else If IsRec Then Error(mpsSyntaxError, 'Cannot define record in record') Else Begin - Info.vType := iRecord; - Info.Prefix := Info.Ident[1] + '.'; - Info.StrLen := Count; - - // this crap needs to go? + Info.vType := iRecord; End; End; - If Not Param Then - If Info.vType = iString Then - If GetStr(tkw[wOpenStrSize], False, False) Then Begin - Info.StrLen := ParseNum; - GetStr(tkw[wCloseStrSize], True, False); - End Else - Info.StrLen := 255; + Case Info.vType of + iString : Begin + Info.StrLen := 255; - If Info.vType <> iRecord Then Begin - If Info.vType = iString Then - Info.VarSize := Info.StrLen + 1 - Else - Info.VarSize := GetVarSize(Info.vType); + If Not Param Then + If GetStr(tkw[wOpenStrSize], False, False) Then Begin + Info.StrLen := ParseNum; + GetStr(tkw[wCloseStrSize], True, False); + End; - If Info.ArrDem > 0 Then - Info.VarSize := GetDataSize(Info); - - If Info.VarSize > mplMaxDataSize Then - Error (mpsDataTooBig, ''); + Info.VarSize := Info.StrLen + 1; + End; + iRecord : Info.VarSize := RecData[Info.RecID]^.DataSize; + Else + Info.VarSize := GetVarSize(Info.vType); End; + + If Info.ArrDem > 0 Then + Info.VarSize := GetDataSize(Info); + + If Info.VarSize > mplMaxDataSize Then + Error (mpsDataTooBig, ''); + +// writeln('parsed variable of size: ' , info.varsize); End; Begin @@ -1743,46 +1778,10 @@ End; Procedure TParserEngine.DefineVariable; Var - Info : TParserVarInfoRec; - BaseRec : TParserVarInfoRec; - Count : LongInt; + Info : TParserVarInfoRec; Begin - ParseVariableInfo(False, False, Info); - - If Info.vType = iRecord Then Begin - OutString (Char(opTypeRec)); - OutWord (RecData[Info.StrLen]^.NumFields); - - BaseRec := Info; - - BaseRec.VarSize := 0; - BaseRec.ArrDem := Info.ArrDem; - BaseRec.ArrStart := Info.ArrStart; - BaseRec.ArrEnd := Info.ArrEnd; - BaseRec.Prefix := ''; - BaseRec.NumVars := 1; - BaseRec.StrLen := 0; - - For Count := 1 to RecData[Info.StrLen]^.NumFields Do - Inc (BaseRec.VarSize, RecData[Info.StrLen]^.Fields[Count].VarSize); - - If BaseRec.VarSize > mplMaxDataSize Then Begin - Error (mpsDataTooBig, ''); - Exit; - End; - - BaseRec.DataSize := GetDataSize(BaseRec); - - OutWord (BaseRec.DataSize); - - CreateVariable(BaseRec); - - For Count := 1 to RecData[Info.StrLen]^.NumFields Do Begin - RecData[Info.StrLen]^.Fields[Count].Prefix := Info.Prefix; - CreateVariable(RecData[Info.StrLen]^.Fields[Count]); - End; - End Else - CreateVariable(Info); + ParseVariableInfo (False, False, Info); + CreateVariable (Info); End; Procedure TParserEngine.CreateVariable (Var Info: TParserVarInfoRec); @@ -1795,6 +1794,11 @@ Begin If (Info.vType = iString) and (Info.StrLen > 0) Then OutString(Char(opStrSize) + Char(opOpenNum) + strI2S(Info.StrLen) + Char(opCloseNum)); + If Info.vType = iRecord Then Begin + OutString (Char(opTypeRec)); + OutWord (Info.DataSize); + End; + If Info.ArrDem = 0 Then OutString(Char(opVarNormal)) Else Begin @@ -1817,10 +1821,11 @@ Begin OutWord (CurVarID); Inc (CurVarID); - Ident := Info.Prefix + Info.Ident[Count]; + Ident := Info.Ident[Count]; vType := Info.vType; Proc := False; ArrPos := Info.ArrDem; + RecID := Info.RecID; NumParams := 0; FillChar(Params, SizeOf(Params), 0); @@ -1838,10 +1843,9 @@ Begin End; Procedure TParserEngine.DefineRecordType; -// get rid of this crap kludge and do records the right way... Var - Ident : String; - Info : TParserVarInfoRec; + Ident : String; + Info : TParserVarInfoRec; Begin GetIdent(False); @@ -1862,6 +1866,10 @@ Begin RecData[CurRecNum]^.Ident := Ident; RecData[CurRecNum]^.NumFields := 0; + RecData[CurRecNum]^.DataSize := 0; + RecData[CurRecNum]^.RecID := CurRecID; + + Inc (CurRecID); Repeat Inc (RecData[CurRecNum]^.NumFields); @@ -1869,12 +1877,34 @@ Begin If RecData[CurRecNum]^.NumFields > mplMaxRecFields Then Error (mpsTooManyFields, ''); - // need to check that datasize does not go over the max - - ParseVariableInfo(False, True, Info); // if record fail if file type? + ParseVariableInfo(False, True, Info); RecData[CurRecNum]^.Fields[RecData[CurRecNum]^.NumFields] := Info; + + Inc (RecData[CurRecNum]^.DataSize, Info.VarSize); Until (UpdateInfo.ErrorType <> 0) or GetStr(tkw[wBlockClose], False, tkwType = 1); + + If RecData[CurRecNum]^.DataSize > mplMaxDataSize Then + Error (mpsDataTooBig, ''); +(* + OutString (Char(opTypeRec)); + OutWord (RecData[CurRecNum]^.RecID); + OutWord (RecData[CurRecNum]^.NumFields); + OutWord (RecData[CUrRecNum]^.DataSize); +*) +// what would we need: +// 1. vartype (byte) +// 2. offset (Word) +// 3. size (word) + + // output record define OP + // output record ID + // output record variable types STRING needs size and how do we do array? + // output record size? + + // ALSO need to output on createvariable for RECORD type + // need to add both to interpreter engine + // need to change interpreter to address vars by data pointer always? End; Procedure TParserEngine.DefineProc; @@ -1994,6 +2024,8 @@ Begin Else Error (mpsUnknownIdent, IdentStr); + // need to support records here + VarChar := VarType2Char(VarType); VarData[ProcVar]^.vType := VarType; @@ -2036,9 +2068,9 @@ Begin If (VarData[RV]^.vType <> Char2VarType(VarData[VN]^.Params[Count])) And (VarData[VN]^.Params[Count] <> '*') Then Error (mpsTypeMismatch, ''); -// OutString (Char(opVariable)); // i dont think we need this - OutWord (VarData[RV]^.VarID); - ParseArray (RV); + OutWord (VarData[RV]^.VarID); + ParseArray (RV); + ParseElement (RV, VarData[VN]^.Params[Count] <> '*', VarData[RV]^.vType); // if = '*' and type iString then...do the string index End Else Begin @@ -2074,13 +2106,15 @@ Begin VC := FindVariable(IdentStr); - If Not (VarData[VC]^.vType in vNums) Then Error(mpsNumExpected, ''); + If Not (VarData[VC]^.vType in vNums) And (VarData[VC]^.vType <> iRecord) Then + Error(mpsNumExpected, ''); If UpdateInfo.ErrorType <> 0 Then Exit; - OutWord (VarData[VC]^.VarID); - ParseArray (VC); - GetStr (tkw[wSetVar], True, False); + OutWord (VarData[VC]^.VarID); + ParseArray (VC); + ParseElement (VC, True, iLongInt); + GetStr (tkw[wSetVar], True, False); If UpdateInfo.ErrorType <> 0 Then Exit; @@ -2432,8 +2466,8 @@ Begin If Not VarData[vn]^.InProc Then Exit; If GetStr(tkw[wSetVar], False, False) Then Begin - OutString (Char(opSetVar)); - OutWord (VarData[VN]^.VarID); + OutString (Char(opSetVar)); + OutWord (VarData[VN]^.VarID); ParseVariable (VarData[VN]^.vType); SetProcResult := True; @@ -2443,6 +2477,7 @@ End; Procedure TParserEngine.ParseIdent; Var VarNum : LongInt; + VT : TIdentTypes; Begin PrevChar; GetIdent(False); @@ -2468,14 +2503,17 @@ Begin If VarData[VarNum]^.Proc Then Begin If Not SetProcResult(VarNum) Then ExecuteProcedure(VarNum, False); End Else Begin - OutString (Char(opSetVar)); - OutWord (VarData[VarNum]^.VarID); - ParseArray (VarNum); + OutString (Char(opSetVar)); + OutWord (VarData[VarNum]^.VarID); + ParseArray (VarNum); + VT := ParseElement (VarNum, False, iNone); + + //will need to pull vartype from parse array here GetChar; -// should this only happen with a string? - If Ch = tkw[wOpenArray] Then Begin + // prob shoud be iString check here. also need to + If (Ch = tkw[wOpenArray]) Then Begin OutString(Char(opStrArray)); ParseVarNumber; // check here to make sure is <= string length? @@ -2485,7 +2523,7 @@ Begin If Not GetStr(tkw[wSetVar], True, False) Then Exit; - ParseVariable(VarData[VarNum]^.vType); + ParseVariable(VT); End; End; End; @@ -2623,10 +2661,12 @@ Begin Dispose (GotoData[Count]); End; + CurGotoNum := SavedGoto; For Count := CurRecNum DownTo SavedRec + 1 Do Dispose (RecData[Count]); + CurRecNum := SavedRec; For Count := CurConstNum DownTo SavedConst + 1 Do @@ -2651,10 +2691,6 @@ Begin FillChar (InFile[CurFile], SizeOf(InFile[CurFile]), 0); - InFile[CurFile].LineCur := 1; - InFile[CurFile].LineSaved := 1; - InFile[CurFile].ColCur := 0; - InFile[CurFile].ColSaved := 0; InFile[CurFile].Position := 1; InFile[CurFile].PosSaved := 1; InFile[CurFile].Size := 1; diff --git a/mystic/mpl_execute.pas b/mystic/mpl_execute.pas index 56900ad..c3647a2 100644 --- a/mystic/mpl_execute.pas +++ b/mystic/mpl_execute.pas @@ -48,8 +48,8 @@ Type {$ENDIF} Function GetErrorMsg : String; - Procedure Error (Err: Byte; Str: String); - Procedure MoveToPos (Num: LongInt); + Procedure Error (Err: Byte; Str: String); + Procedure MoveToPos (Num: LongInt); Procedure SkipBlock; Function CurFilePos : LongInt; Procedure NextChar; @@ -70,9 +70,9 @@ Type Procedure SetNumber (VN: Word; R: Real; Var A: TArrayInfo); Procedure SetVariable (VarNum: Word); - Function DefineVariable (DataStart: Pointer; RecSize: Word) : LongInt; + Function DefineVariable : LongInt; Procedure DefineProcedure; - Procedure DefineRecord; + //Procedure DefineRecordType; Procedure StatementRepeatUntil; Function StatementIfThenElse : Byte; @@ -147,7 +147,7 @@ Begin // ProcPos : LongInt; // Data : PStack; // ArrPos : Byte; -// ArrDim : TArrayInfo; +// ArrDims : TArrayInfo; End; {$ENDIF} @@ -934,12 +934,13 @@ Begin End; End; -Function TInterpEngine.DefineVariable (DataStart: Pointer; RecSize: Word) : LongInt; +Function TInterpEngine.DefineVariable : LongInt; Var VarType : TIdentTypes; NumVars : Word; SavedVar : Word; StrSize : Word; + RecSize : Word; Count : Word; ArrayPos : Word; ArrayData : TArrayInfo; @@ -962,6 +963,14 @@ Begin NextChar; End; + If Ch = Char(opTypeRec) Then Begin + NextWord; + + RecSize := W; + + NextChar; + End; + If Ch = Char(opArrDef) Then Begin NextWord; @@ -1011,15 +1020,10 @@ Begin Result := DataSize; - If DataStart = NIL Then Begin - GetMem (Data, DataSize); - FillChar (Data^, DataSize, 0); + GetMem (Data, DataSize); + FillChar (Data^, DataSize, 0); - Kill := True; - End Else Begin - Data := DataStart; - Kill := False; - End; + Kill := True; End; End; @@ -2024,37 +2028,10 @@ Begin PrevChar; End; -Procedure TInterpEngine.DefineRecord; -Var - Count : LongInt; - RecSize : LongInt; -Begin - NextWord; - - Inc (CurRecNum); - New (RecData[CurRecNum]); - - // Holds ID info for all variables in this record - - RecData[CurRecNum]^.RecStart := CurVarNum + 2; {+1 is base} - RecData[CurRecNum]^.NumFields := W; - - NextWord; - - RecSize := W; - - NextChar; // opVarDeclare - - DefineVariable (NIL, RecSize); // Base record identifier - - RecSize := 1; - - For Count := 1 to RecData[CurRecNum]^.NumFields Do Begin - NextChar; // opVarDeclare - - Inc (RecSize, DefineVariable(@TStack(VarData[RecData[CurRecNum]^.RecStart - 1]^.Data^)[RecSize], 0)); - End; -End; +//Procedure TInterpEngine.DefineRecordType; +//Begin +//asdf +//End; Function TInterpEngine.ExecuteBlock (StartVar, StartRec: Word) : Byte; Var @@ -2085,7 +2062,7 @@ Begin Self.ExecuteBlock(CurVarNum, CurRecNum); End; {1} opBlockClose : Break; -{2} opVarDeclare : DefineVariable (NIL, 0); +{2} opVarDeclare : DefineVariable; {12} opSetVar : Begin NextWord; SetVariable(FindVariable(W)); @@ -2116,7 +2093,7 @@ Begin Break; End; End; -{52} opTypeRec : DefineRecord; +//{52} opTypeRec : DefineRecordType; {53} opBreak : Begin MoveToPos (BlockStart + BlockSize); Result := 1; diff --git a/mystic/mpl_types.pas b/mystic/mpl_types.pas index e3d4544..1848fde 100644 --- a/mystic/mpl_types.pas +++ b/mystic/mpl_types.pas @@ -230,9 +230,20 @@ Const Type {$IFNDEF MPLPARSER} - PStack = ^TStack; - TStack = Array[1..mplMaxDataSize] of Byte; - TArrayInfo = Array[1..mplMaxArrayDem] of Word; + PStack = ^TStack; + TStack = Array[1..mplMaxDataSize] of Byte; + TArrayInfo = Array[1..mplMaxArrayDem] of Word; + TRecordInfo = Record + vType : Byte; + Offset : Word; + DataSize : Word; + End; + //TVarInfo = Record + // AInfo : Array[1..mplMaxArrayDem] of Word; + // RInfo : Word; + // End; + // Basically, an ArrayInfo will have an appended Offset for DataPtr + // if it is a record and probably some sort of record element ID (* // MEMORY SAVING... could be 28 bytes per var?!?! @@ -265,11 +276,17 @@ Type ArrDim : TArrayInfo; End; + TRecordElement = Record + ESize : Word; + Offset : Word; + End; + PRecordRec = ^TRecordRec; TRecordRec = Record -// RecID : Word; needed when Record variable type is added - RecStart : Word; - NumFields : Word; + RecID : Word; + Fields : Word; + DataSize : Word; + Element : Array[1..mplMaxRecFields] of TRecordElement; End; VarDataRec = Array[1..mplMaxVars] of PVarRec; @@ -285,6 +302,7 @@ Type InProc : Boolean; Proc : Boolean; ArrPos : Byte; + RecID : Word; End; PGotoRec = ^TGotoRec;