COMPILATION LISTING OF SEGMENT rdm_message_mark_mgr_ Compiled by: Multics PL/I Compiler, Release 33e, of October 6, 1992 Compiled at: CGI Compiled on: 2000-04-18_1127.23_Tue_mdt Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) BULL HN Information Systems Inc., 1989 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 6* * * 7* * Copyright (c) 1972 by Massachusetts Institute of * 8* * Technology and Honeywell Information Systems, Inc. * 9* * * 10* *********************************************************** */ 11 12 13 14 /****^ HISTORY COMMENTS: 15* 1) change(86-01-09,Herbst), approve(86-03-25,MCR7367), 16* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 17* Changed to process the keywords "seen", "unseen", and "new". 18* 2) change(86-03-04,Herbst), approve(86-03-25,MCR7367), 19* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 20* Added keywords (first last previous next)_(seen unseen). 21* 3) change(86-03-05,Herbst), approve(86-03-25,MCR7367), 22* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 23* Added entry points first_request, last_request, all_request, 24* current_request, seen_request, new_request, etc. Also brought 25* over other requests from obsolete rdm_active_requests_. 26* 4) change(86-03-07,Herbst), approve(86-03-25,MCR7367), 27* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 28* Replaced emf_et_$empty_range with emf_et_$no_messages_selected. 29* 5) change(86-04-01,Herbst), approve(86-04-01,MCR7367), 30* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 31* Moved bulk of message spec requests to rdm_msg_requests. 32* 6) change(86-04-04,Herbst), approve(86-04-04,MCR7367), 33* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 34* Fixed unitialized code bug processing "new" keyword when no new messages 35* and the last message is an interactive one. 36* 7) change(86-04-28,Herbst), approve(86-04-28,MCR7367), 37* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 38* Deleted unused declarations. 39* 8) change(86-08-06,Margolin), approve(86-08-06,MCR7508), 40* audit(86-08-27,Blair), install(86-08-29,MR12.0-1142): 41* Pass the error code up to the calling program when no messages are 42* selected. Fixes error_list #500 (TRs 20435 20438). Also, now it 43* doesn't set P_code if entered via the do_request entrypoint. 44* 9) change(89-04-07,Lee), approve(89-05-10,MCR8104), 45* audit(89-07-18,LZimmerman), install(89-10-02,MR12.3-1079): 46* phx19099, phx15783, Mail 457 - added parameter P_msg_type to 47* "mark_current_message" entry so that usage of "-odl" for the current 48* message can be caught - the current message should never be a deleted 49* message; reformatting. 50* END HISTORY COMMENTS */ 51 52 53 /* format: off */ 54 55 /* read_mail Message Mark Management -- responsible for manipulating the marked and marked_as_original message chains and 56* for processing message specifiers (ie: parsing a specifier and then marking those messages which it selects) */ 57 58 /* Created: 31 December 1979 by W. Olin Sibert out of parse_msg_spec_, construct_msg_spec_, and rdm_msg_spec_ */ 59 /* Modified: 1 June 1980 by G. Palter to add entries to manipulate the "reply" chain */ 60 /* Modified: 17 December 1982 by G. Palter to fix the following errors on the mail_system error list: 61* #0260, #0382, #0383: Use of binary operators (:+-&|) without a first operand are not diagnosed as invalid; 62* #0300: The logical operators (&|) do not work */ 63 /* Modified: September 1983 by G. Palter to rename to rdm_message_mark_mgr_, rename the check_msg_spec entrypoint to 64* validate_message_specifier, rename the clear entrypoint to clear_marked_messages, make validate_message_specifier 65* only check syntax, and convert to the new mail system interface */ 66 67 /* format: on,style4,delnl,insnl,ifthenstmt,ifthen */ 68 69 70 rdm_message_mark_mgr_: 71 procedure (); 72 73 return; /* not an entrypoint */ 74 75 76 /* Parameters */ 77 78 dcl (P_rdm_invocation_ptr, P_sci_ptr) pointer parameter; 79 80 dcl P_msg_spec_ptr pointer parameter; /* -> message_specifier to parse and (maybe) process */ 81 dcl P_msg_spec_lth fixed binary (21) parameter; /* ... length of said specifier */ 82 83 dcl P_msg_type fixed binary parameter; /* types of messages to select: all, delete, non-deleted */ 84 85 dcl P_flags bit (*) parameter; 86 87 dcl P_keyword_number fixed binary parameter; 88 dcl P_reverse_sw bit (1) aligned parameter; 89 90 dcl P_code fixed binary (35) parameter; 91 92 93 /* Local copies of parameters */ 94 95 dcl msg_spec_str character (msg_spec_lth) unaligned based (msg_spec_str_ptr); 96 dcl msg_spec_lth fixed binary (21); 97 dcl msg_spec_str_ptr pointer; 98 99 dcl msg_type fixed binary; 100 dcl code fixed binary (35); 101 102 /* Information for requests/active requests */ 103 104 dcl request_entry_sw bit (1) aligned init ("0"b); 105 106 /* The individual tokens comprising a message specifier */ 107 108 dcl 1 token aligned based (tp), 109 2 type fixed binary, /* number, keyword, all, regexp, etc. */ 110 2 value fixed binary (35), /* numeric value if a number */ 111 2 operator fixed binary, /* type of operation for arithmetic and logical operators */ 112 2 str_ptr pointer, /* -> regular expression */ 113 2 str_lth fixed binary (21); /* ... length of the regular expression */ 114 115 dcl 1 token_array (32) aligned like token automatic; /* the actual tokens */ 116 117 dcl tp pointer; 118 dcl (n_tokens, max_tokens) fixed binary; 119 120 121 /* The internal representation of a message_specifier */ 122 123 dcl 1 msg_spec aligned based (msg_spec_ptr), 124 2 range_info, 125 3 first fixed binary, /* # of first message in range */ 126 3 last fixed binary, /* # of last message in range */ 127 3 single_message bit (1) aligned, /* ON => a single message is selected */ 128 2 switches, 129 3 seen_only_sw bit (1) unaligned, /* ON => processing "seen" keyword */ 130 3 unseen_only_sw bit (1) unaligned, /* ON => processing "unseen" keyword */ 131 3 pad bit (34) unaligned, 132 2 string_info, 133 3 search_start fixed binary, /* index in typed-chain of first msg to search for regexp */ 134 3 search_direction fixed binary, /* direction to perform the search */ 135 3 all_matches bit (1) aligned, /* ON => select all messages that match */ 136 3 strings (msg_spec_n_strings), /* the regular expressions to match */ 137 4 regexp_ptr pointer, /* ... reserved */ 138 4 str_ptr pointer, /* ... -> the regular expression */ 139 4 str_len fixed binary (21), /* ... length of the regular expression */ 140 4 complement bit (1) aligned, /* ... ON => complement the sense of this regexp */ 141 4 operator fixed binary; /* ... logical operator between this and previous regexps */ 142 143 dcl msg_spec_ptr pointer; 144 dcl msg_spec_n_strings fixed binary; 145 146 /* format: off */ 147 dcl (SEARCH_FORWARD initial (1), /* ascending order */ 148 SEARCH_BACKWARD initial (2), /* descending order */ 149 DONT_SEARCH initial (3), /* don't */ 150 SEARCH_SEEN initial (4), /* only seen messages */ 151 SEARCH_UNSEEN initial (5)) /* only unseen messages */ 152 fixed binary static options (constant); 153 /* format: on */ 154 155 156 /* Remaining declarations */ 157 158 dcl (first_msg_number, last_msg_number, current_msg_number, prev_msg_number, next_msg_number) fixed binary; 159 dcl (first_msg_idx, last_msg_idx, current_msg_idx, prev_msg_idx, next_msg_idx, message_idx) fixed binary; 160 161 dcl (keyword_count, number_count, range_count, regexp_count) fixed binary; 162 163 dcl (report_errors_sw, reset_marked_as_original, reverse) bit (1) aligned initial ("0"b); 164 165 dcl NULL_STRING character (1) static options (constant) initial (" "); 166 167 dcl REGEXP_DELIM character (1) static options (constant) initial ("/"); 168 dcl REGEXP_CONCEAL character (2) static options (constant) initial ("\c"); 169 170 dcl DIGITS character (10) static options (constant) initial ("0123456789"); 171 dcl LETTERS character (54) static options (constant) initial ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._"); 172 173 /* format: off */ 174 dcl (UC_ALPHA initial ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 175 LC_ALPHA initial ("abcdefghijklmnopqrstuvwxyz")) 176 character (26) static options (constant); 177 178 dcl (emf_et_$msg_spec_bad_expr, emf_et_$msg_spec_bad_keyword, emf_et_$msg_spec_bad_number, 179 emf_et_$msg_spec_bad_oper, emf_et_$msg_spec_bad_range, emf_et_$msg_spec_bad_regexp, emf_et_$msg_spec_invalid, 180 emf_et_$msg_spec_missing_delim, emf_et_$msg_spec_mixed, emf_et_$msg_spec_null, emf_et_$msg_spec_too_complex, 181 emf_et_$no_current_message, emf_et_$no_matching_messages, emf_et_$no_messages_selected, 182 emf_et_$no_messages, emf_et_$no_next_message, 183 emf_et_$no_previous_message, emf_et_$no_such_message, error_table_$nomatch) 184 fixed binary (35) external; 185 186 /* format: on */ 187 188 dcl cu_$grow_stack_frame entry (fixed binary (19), pointer, fixed binary (35)); 189 dcl rdm_mailbox_interface_$read_message entry (pointer, fixed binary, pointer, fixed binary (35)); 190 dcl rdm_search_utils_$search_message_with_regexp entry (pointer, fixed binary, pointer, fixed binary (21)) 191 returns (bit (1) aligned); 192 dcl search_file_$silent 193 entry (pointer, fixed binary (21), fixed binary (21), pointer, fixed binary (21), fixed binary (21), 194 fixed binary (21), fixed binary (21), fixed binary (35)); 195 dcl ssu_$abort_line entry () options (variable); 196 197 dcl (addr, addrel, currentsize, fixed, hbound, index, length) builtin; 198 dcl (min, null, substr, translate, unspec, verify) builtin; 199 200 /* format: off */ 201 202 /* Defined token types */ 203 204 dcl (FIRST_TYPE initial (1), /* first token (a placeholder) */ 205 NUMBER_TYPE initial (2), /* a number */ 206 KEYWORD_TYPE initial (3), /* a keyword other than "all" */ 207 ALL_KEYWORD_TYPE initial (4), /* the keyword "all" */ 208 REGEXP_TYPE initial (5), /* a regular expression */ 209 RANGE_OPERATOR_TYPE initial (6), /* the range delimiter (:) */ 210 NUMBER_OPERATOR_TYPE initial (7), /* an aritmetic operator (+ -) */ 211 REGEXP_OPERATOR_TYPE initial (8), /* a logical connector (& |) */ 212 COMPLEMENT_OPERATOR_TYPE initial (9), /* logical complement (^) */ 213 LAST_TYPE initial (10)) /* last token (a placeholder) */ 214 fixed binary static options (constant); 215 216 217 /* Defined operator types */ 218 219 dcl (NO_OPERATOR initial (-1), /* no operator */ 220 COLON_OPERATOR initial (1), /* range delimiter */ 221 PLUS_OPERATOR initial (2), /* addition (numeric) */ 222 MINUS_OPERATOR initial (3), /* subtraction (numeric) */ 223 AND_OPERATOR initial (4), /* logical and */ 224 OR_OPERATOR initial (5), /* logical or */ 225 COMPLEMENT_OPERATOR initial (6)) /* logical complement */ 226 fixed binary static options (constant); 227 228 dcl OPERATORS character (6) static options (constant) initial (":+-&|^"); 229 230 dcl OPERATOR_TYPES (6) fixed binary static options (constant) initial ( 231 6 /* : */, 7 /* + */, 7 /* - */, 232 8 /* & */, 8 /* | */, 9 /* ^ */); 233 234 235 /* Syntax table: defines the valid syntax of a message_specifier by defining which tokens can appear sequentially within 236* the specifier */ 237 238 dcl SYNTAX_TABLE (10, 10) fixed binary static options (constant) initial ( 239 240 /* FIRST NUM KWD "all" REGXP ":" "+-" "|&" "^" LAST */ 241 /* FIRST */ 99, 000, 000, 000, 000, 7, 2, 2, 000, 1, 242 /* NUM */ 99, 99, 6, 2, 4, 000, 000, 4, 2, 000, 243 /* KEYWORD */ 99, 2, 99, 99, 000, 000, 000, 4, 000, 000, 244 /* "all" */ 99, 2, 99, 99, 000, 7, 3, 3, 000, 000, 245 /* REGEXP */ 99, 4, 5, 5, 5, 4, 4, 000, 3, 000, 246 /* ":" */ 99, 000, 000, 7, 4, 7, 7, 7, 7, 7, 247 /* "+-" */ 99, 000, 000, 3, 4, 7, 2, 4, 4, 2, 248 /* "&|" */ 99, 4, 5, 5, 000, 7, 4, 2, 000, 2, 249 /* "^" */ 99, 4, 5, 5, 000, 7, 4, 2, 2, 2, 250 /* LAST */ 99, 99, 99, 99, 99, 99, 99, 99, 99, 99); 251 252 dcl (VALID_STATE initial (0), /* these tokens may be consecutive */ 253 EMPTY_MSG_SPEC_STATE initial (1), /* empty message_specifier */ 254 BAD_EXPR_STATE initial (2), /* syntax error in an expression */ 255 BAD_OPER_STATE initial (3), /* invalid use of an operator */ 256 MIXED_EXPR_STATE initial (4), /* mixed ranges and regular expressions */ 257 BAD_REGEXP_STATE initial (5), /* invalid position for a regular expression */ 258 INVALID_SPEC_STATE initial (6), /* invalid syntax */ 259 BAD_RANGE_STATE initial (7), /* invalid syntax in a range */ 260 CANT_HAPPEN_STATE initial (99)) /* can't happen, but */ 261 fixed binary static options (constant); 262 /* format: on */ 263 264 /* Mark all messages specified by the supplied message_specifier */ 265 266 mark_messages: 267 entry (P_rdm_invocation_ptr, P_msg_spec_ptr, P_msg_spec_lth, P_msg_type, P_flags, P_code); 268 269 rdm_invocation_ptr = P_rdm_invocation_ptr; 270 271 msg_spec_str_ptr = P_msg_spec_ptr; 272 msg_spec_lth = P_msg_spec_lth; 273 msg_type = P_msg_type; 274 275 report_errors_sw = "1"b; 276 277 call parse_string (); 278 279 call make_msg_spec (); 280 281 call mark_messages (); 282 283 P_code = 0; 284 285 return; 286 287 288 289 /* Validates the syntax of a message_specifier */ 290 291 validate_message_specifier: 292 entry (P_rdm_invocation_ptr, P_msg_spec_ptr, P_msg_spec_lth, P_msg_type, P_flags, P_code); 293 294 rdm_invocation_ptr = P_rdm_invocation_ptr; 295 296 msg_spec_str_ptr = P_msg_spec_ptr; 297 msg_spec_lth = P_msg_spec_lth; 298 msg_type = P_msg_type; 299 P_code = 0; 300 301 report_errors_sw = "0"b; 302 303 call parse_string (); 304 305 return; 306 307 /* Clear the chain of marked messages */ 308 309 clear_marked_messages: 310 entry (P_rdm_invocation_ptr); 311 312 rdm_invocation_ptr = P_rdm_invocation_ptr; 313 314 marked_chain.n_messages = 0; /* it's so simple with the new structure */ 315 316 return; 317 318 319 320 /* Mark the current message: used by requests which default to the current message */ 321 322 mark_current_message: 323 entry (P_rdm_invocation_ptr, P_msg_type); 324 325 rdm_invocation_ptr = P_rdm_invocation_ptr; 326 327 /* phx19099 RL - check that current message is not treated as a deleted message */ 328 if P_msg_type = ONLY_DELETED_MESSAGES then 329 if rdm_invocation.current_message = 0 then 330 call ssu_$abort_line (rdm_invocation.sci_ptr, emf_et_$no_current_message); 331 else call ssu_$abort_line (rdm_invocation.sci_ptr, (0), "Message ^d is not a deleted message.", 332 rdm_invocation.current_message); 333 334 if rdm_invocation.current_message = 0 then /* no current message ... */ 335 if undeleted_chain.n_messages > 0 then /* ... but there are still undeleted messages */ 336 call ssu_$abort_line (rdm_invocation.sci_ptr, emf_et_$no_current_message); 337 else call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "There are no non-deleted messages."); 338 339 marked_chain.n_messages = 1; /* will be just one message in the chain */ 340 marked_chain.messages (1) = rdm_invocation.current_message; 341 342 return; 343 344 345 346 /* Mark all messages: used by requests which operate on all messages by default (eg: list) */ 347 348 mark_all_messages: 349 entry (P_rdm_invocation_ptr, P_msg_type); 350 351 rdm_invocation_ptr = P_rdm_invocation_ptr; 352 353 msg_type = P_msg_type; 354 if msg_type = ALL_MESSAGES then message_chain_ptr = rdm_invocation.message_chains.all; 355 else if msg_type = NON_DELETED_MESSAGES then message_chain_ptr = rdm_invocation.message_chains.undeleted; 356 else /*** if msg_type = ONLY_DELETED_MESSAGES then */ 357 message_chain_ptr = rdm_invocation.message_chains.deleted; 358 359 if message_chain.n_messages = 0 then /* no messages of the given type left */ 360 call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "There are no^[^; non-deleted^; deleted^] messages.", 361 msg_type); 362 363 marked_chain.n_messages = message_chain.n_messages; 364 365 do message_idx = 1 to message_chain.n_messages; /* copy the chain to the marked chain */ 366 marked_chain.messages (message_idx) = message_chain.messages (message_idx); 367 end; 368 369 return; 370 371 /* Marks each message on the current marked chain as an "original" request: This entry is called by the "reply" and 372* "forward" requests to indicate to other requests possibly invoked by send_mail or the forward sub-subsystem which 373* messages are the "current" messages */ 374 375 mark_original_messages: 376 entry (P_rdm_invocation_ptr); 377 378 rdm_invocation_ptr = P_rdm_invocation_ptr; 379 380 marked_as_original_chain.n_messages = marked_chain.n_messages; 381 382 do message_idx = 1 to marked_chain.n_messages; 383 marked_as_original_chain.messages (message_idx) = marked_chain.messages (message_idx); 384 end; 385 386 return; 387 388 389 390 /* Clears the messages marked as original messages: This entry is called by the "reply" and "forward" requests upon 391* completion to (1) clear the current marked chain (which might not be what the request had marked itself) and 392* (2) recreate the marked chain as those messages explicitly marked by the earlier call to mark_original_messages above 393**/ 394 395 clear_original_messages: 396 entry (P_rdm_invocation_ptr); 397 398 rdm_invocation_ptr = P_rdm_invocation_ptr; 399 400 call clear_marked_messages (rdm_invocation_ptr); 401 reset_marked_as_original = "1"b; /* throw out the old original chain */ 402 403 go to REMARK_ORIGINAL_MESSAGES; 404 405 406 407 /* Remark the messages marked as the original messages by "reply" or "forward": This entry is called by a send_mail 408* request or a forward sub-request to construct the message chain which the "reply" or "forward" request, respectively, 409* was invoked to process */ 410 411 remark_original_messages: 412 entry (P_rdm_invocation_ptr); 413 414 rdm_invocation_ptr = P_rdm_invocation_ptr; 415 416 reset_marked_as_original = "0"b; /* not yet done with this chain */ 417 418 419 REMARK_ORIGINAL_MESSAGES: 420 do message_idx = 1 to marked_as_original_chain.n_messages; 421 call add_message_to_marked_chain (marked_as_original_chain.messages (message_idx)); 422 end; 423 424 if reset_marked_as_original then marked_as_original_chain.n_messages = 0; 425 426 return; 427 428 /* Entry point called by rdm_msg_requests_ to mark messages for certain requests */ 429 430 do_request: 431 entry (P_sci_ptr, P_rdm_invocation_ptr, P_keyword_number, P_msg_type, P_reverse_sw); 432 433 request_entry_sw = "1"b; 434 regexp_count = 0; 435 max_tokens = hbound (token_array, 1); 436 n_tokens = 0; 437 call get_token (FIRST_TYPE); 438 if P_keyword_number = ALL_KEYWORD | P_keyword_number = SEEN_KEYWORD | P_keyword_number = UNSEEN_KEYWORD 439 | P_keyword_number = NEW_KEYWORD then 440 call get_token (ALL_KEYWORD_TYPE); 441 else call get_token (KEYWORD_TYPE); 442 token.str_ptr, msg_spec_str_ptr = addrel (addr (KEYWORDS (P_keyword_number, 1)), 1); 443 token.str_lth, msg_spec_lth = length (KEYWORDS (P_keyword_number, 1)); 444 token.value = P_keyword_number; 445 call get_token (LAST_TYPE); 446 447 rdm_invocation_ptr = P_rdm_invocation_ptr; 448 msg_type = P_msg_type; 449 reverse = P_reverse_sw; 450 451 call make_msg_spec (); 452 call mark_messages (); 453 return; 454 455 /* Parses the string which is a message_specifier into tokens and validates its syntax */ 456 457 parse_string: 458 procedure (); 459 460 dcl ntp pointer; 461 dcl keyword character (32) varying; 462 dcl char1 character (1) aligned; 463 dcl (number_value, code) fixed binary (35); 464 dcl (idx, jdx, i1, i2) fixed binary (21); 465 dcl (token_idx, operator_idx) fixed binary; 466 467 max_tokens = hbound (token_array, 1); 468 469 n_tokens = 0; /* start out with no tokens, of course */ 470 call get_token (FIRST_TYPE); /* dummy token at the beginning */ 471 472 idx = 1; /* index of character to begin current token */ 473 474 do while (idx <= msg_spec_lth); 475 char1 = substr (msg_spec_str, idx, 1); 476 477 if index (OPERATORS, char1) ^= 0 then do; 478 operator_idx = index (OPERATORS, char1); 479 call get_token (OPERATOR_TYPES (operator_idx)); 480 token.operator = operator_idx; 481 idx = idx + 1; 482 end; 483 484 else if index (DIGITS, char1) ^= 0 then do; /* the beginning of a number */ 485 jdx = verify (substr (msg_spec_str, idx), DIGITS); 486 if jdx = 0 then /* j is the length of the putative number */ 487 jdx = msg_spec_lth - idx + 1; 488 else jdx = jdx - 1; 489 490 if jdx > 6 then call abort_parse (emf_et_$msg_spec_bad_number); 491 492 number_value = fixed (substr (msg_spec_str, idx, jdx)); 493 call get_token (NUMBER_TYPE); 494 token.value = number_value; 495 idx = idx + jdx; /* move on to the next keyword */ 496 end; 497 498 else if index (LETTERS, char1) ^= 0 then do; /* test for a keyword */ 499 jdx = verify (substr (msg_spec_str, idx), LETTERS); 500 if jdx = 0 then /* j is the length of the possible keyword */ 501 jdx = msg_spec_lth - idx + 1; 502 else jdx = jdx - 1; 503 504 keyword = substr (msg_spec_str, idx, min (32, jdx)); 505 /* get a value for comparison */ 506 keyword = translate (keyword, LC_ALPHA, UC_ALPHA); 507 /* make it case independent */ 508 do i1 = 1 to hbound (KEYWORDS, 1); /* loop through the possible keywords */ 509 if keyword = KEYWORDS (i1, 1) then go to GOOD_KEYWORD; 510 /* it's the long form already */ 511 do i2 = 2 to hbound (KEYWORDS, 2); /* loop through the possible short forrms */ 512 if keyword = KEYWORDS (i1, i2) then do; 513 /* found one */ 514 keyword = KEYWORDS (i1, 1); 515 /* convert to the long form */ 516 go to GOOD_KEYWORD; 517 end; 518 end; 519 end; /* of keyword testing loop */ 520 521 call abort_parse (emf_et_$msg_spec_bad_keyword); 522 523 GOOD_KEYWORD: 524 if keyword = "all" | keyword = "seen" | keyword = "unseen" | keyword = "new" then 525 call get_token (ALL_KEYWORD_TYPE); 526 else call get_token (KEYWORD_TYPE); 527 token.value = i1; /* numeric index of keyword */ 528 idx = idx + jdx; /* move past it to the next token */ 529 end; 530 531 else if char1 = REGEXP_DELIM then do; /* process regular expression now */ 532 i1 = idx + 1; /* loop index for search for second delim */ 533 REGEXP_LOOP: 534 if i1 > msg_spec_lth then do; /* we've run out of string! */ 535 call abort_parse (emf_et_$msg_spec_missing_delim); 536 end; 537 538 jdx = index (substr (msg_spec_str, i1), REGEXP_DELIM); 539 /* look for next one */ 540 if jdx = 0 then /* didn't find it */ 541 call abort_parse (emf_et_$msg_spec_missing_delim); 542 543 if jdx > 3 then /* look for a concealed delim if there's room */ 544 if substr (msg_spec_str, i1 + jdx - 3, 2) = REGEXP_CONCEAL then do; 545 i1 = i1 + jdx; /* bump the index past it */ 546 go to REGEXP_LOOP; /* and look again */ 547 end; 548 549 call get_token (REGEXP_TYPE); 550 token.str_ptr = addr (substr (msg_spec_str, idx + 1, 1)); 551 /* the regexp, without the slash */ 552 token.str_lth = ((i1 + jdx) - idx) - 2; /* length of regexp */ 553 554 idx = idx + ((i1 + jdx) - idx); /* skip the regexp and delims */ 555 556 call search_file_$silent (token.str_ptr, 1, token.str_lth, addr (NULL_STRING), 1, 0, (0), (0), code); 557 if code = error_table_$nomatch then /* can only get this far if the string's syntax is OK */ 558 code = 0; 559 if code ^= 0 then call abort_parse (code); 560 end; 561 562 else call abort_parse (emf_et_$msg_spec_invalid); 563 /* evil character found */ 564 end; /* of token generating loop */ 565 566 call get_token (LAST_TYPE); 567 568 569 /* Validate the syntax of the tokens comprising this message_specifier */ 570 571 regexp_count, number_count, range_count, keyword_count = 0; 572 573 do token_idx = 1 to n_tokens - 1; 574 tp = addr (token_array (token_idx)); 575 ntp = addr (token_array (token_idx + 1)); 576 577 idx = SYNTAX_TABLE (token.type, ntp -> token.type); 578 /* is this a legal pair? */ 579 if idx ^= VALID_STATE then do; /* no, it's illegal */ 580 if idx = EMPTY_MSG_SPEC_STATE then code = emf_et_$msg_spec_null; 581 else if idx = BAD_EXPR_STATE then code = emf_et_$msg_spec_bad_expr; 582 else if idx = BAD_OPER_STATE then code = emf_et_$msg_spec_bad_oper; 583 else if idx = MIXED_EXPR_STATE then code = emf_et_$msg_spec_mixed; 584 else if idx = BAD_REGEXP_STATE then code = emf_et_$msg_spec_bad_regexp; 585 else if idx = BAD_RANGE_STATE then code = emf_et_$msg_spec_bad_range; 586 else code = emf_et_$msg_spec_invalid; 587 588 call abort_parse (code); /* some error detected here */ 589 end; 590 591 if token.type = NUMBER_TYPE then number_count = number_count + 1; 592 593 else if token.type = REGEXP_TYPE then regexp_count = regexp_count + 1; 594 595 else if token.type = KEYWORD_TYPE then keyword_count = keyword_count + 1; 596 597 else if token.type = RANGE_OPERATOR_TYPE then/* just check for range */ 598 range_count = range_count + 1; 599 600 end; /* of syntax checking loop through tokens */ 601 602 if regexp_count ^= 0 then do; 603 if number_count > 0 then /* no numbers allowed */ 604 call abort_parse (emf_et_$msg_spec_mixed); 605 else if keyword_count > 1 then /* only one keyword allowed in a regexp-type specifier */ 606 call abort_parse (emf_et_$msg_spec_invalid); 607 end; 608 609 if range_count > 1 then /* only one range per specifier */ 610 call abort_parse (emf_et_$msg_spec_invalid); 611 612 return; 613 614 end parse_string; 615 616 get_token: 617 procedure (p_type); 618 619 dcl p_type fixed binary parameter; 620 621 if n_tokens >= max_tokens then call abort_parse (emf_et_$msg_spec_too_complex); 622 623 n_tokens = n_tokens + 1; 624 tp = addr (token_array (n_tokens)); 625 626 unspec (token) = ""b; 627 token.str_ptr = null (); 628 token.type = p_type; 629 630 return; 631 632 end get_token; 633 634 /* Constructs the msg_spec structure which defines the semantics of a message_specifier */ 635 636 make_msg_spec: 637 procedure () /* options (quick) */; 638 639 dcl (low_range_found, high_range_found) bit (1) aligned; 640 dcl (keyword_msg_number, low_range, high_range, code) fixed binary (35); 641 dcl (token_idx, regexp_idx, prev_operator, bad_msg_number, keyword_msg_idx) fixed binary; 642 643 if msg_type = ALL_MESSAGES then message_chain_ptr = rdm_invocation.message_chains.all; 644 else if msg_type = NON_DELETED_MESSAGES then message_chain_ptr = rdm_invocation.message_chains.undeleted; 645 else /*** if msg_type = ONLY_DELETED_MESSAGES then */ 646 message_chain_ptr = rdm_invocation.message_chains.deleted; 647 648 call get_message_numbers_and_indices (); /* need pointers to the relevant messages */ 649 650 msg_spec_n_strings = regexp_count; 651 call cu_$grow_stack_frame (currentsize (msg_spec), msg_spec_ptr, code); 652 if code ^= 0 then call abort_parse (emf_et_$msg_spec_too_complex); 653 654 unspec (msg_spec) = ""b; 655 msg_spec.first, msg_spec.last = -1; 656 msg_spec.search_start = 0; 657 msg_spec.search_direction = DONT_SEARCH; 658 659 regexp_idx = 1; /* it will be used as a subscript when installing regexps */ 660 low_range_found, high_range_found = "0"b; 661 prev_operator = NO_OPERATOR; 662 663 do token_idx = 2 to n_tokens - 1; /* loop through the real tokens */ 664 tp = addr (token_array (token_idx)); 665 666 if token.type = NUMBER_TYPE then do; /* either a start or an end */ 667 low_range_found = "1"b; /* remember we found a number */ 668 669 if ^high_range_found then /* must be part of lower bound */ 670 call apply_number_operator (prev_operator, low_range, token.value); 671 else call apply_number_operator (prev_operator, high_range, token.value); 672 673 prev_operator = NO_OPERATOR; /* forget about operators 'till we see another one */ 674 end; 675 676 else if token.type = RANGE_OPERATOR_TYPE then do; 677 if ^high_range_found then do; /* indicate that a range has been started */ 678 prev_operator = NO_OPERATOR; 679 high_range_found = "1"b; 680 end; 681 682 else call abort_parse (emf_et_$msg_spec_bad_range); 683 end; /* of case for range operator */ 684 685 else if token.type = REGEXP_OPERATOR_TYPE then msg_spec.operator (regexp_idx) = token.operator; 686 687 else if token.type = NUMBER_OPERATOR_TYPE | token.type = COMPLEMENT_OPERATOR_TYPE then 688 prev_operator = token.operator; 689 690 else if token.type = KEYWORD_TYPE then do; /* process possible keywords */ 691 if token.value = FIRST_KEYWORD then do; 692 if first_msg_number = 0 then call no_message (emf_et_$no_messages); 693 keyword_msg_number = first_msg_number; 694 keyword_msg_idx = first_msg_idx; /* in case we have to start a search */ 695 msg_spec.search_direction = SEARCH_FORWARD; 696 end; 697 698 else if token.value = LAST_KEYWORD then do; 699 if last_msg_number = 0 then call no_message (emf_et_$no_messages); 700 keyword_msg_number = last_msg_number; 701 keyword_msg_idx = last_msg_idx; 702 msg_spec.search_direction = SEARCH_BACKWARD; 703 end; 704 705 else if token.value = CURRENT_KEYWORD then do; 706 if current_msg_number = 0 then call no_message (emf_et_$no_current_message); 707 keyword_msg_number = current_msg_number; 708 keyword_msg_idx = current_msg_idx; 709 msg_spec.search_direction = DONT_SEARCH; 710 end; 711 712 else if token.value = NEXT_KEYWORD then do; 713 if next_msg_number = 0 then call no_message (emf_et_$no_next_message); 714 keyword_msg_number = next_msg_number; 715 keyword_msg_idx = next_msg_idx; 716 msg_spec.search_direction = SEARCH_FORWARD; 717 end; 718 719 else if token.value = PREVIOUS_KEYWORD then do; 720 if prev_msg_number = 0 then call no_message (emf_et_$no_previous_message); 721 keyword_msg_number = prev_msg_number; 722 keyword_msg_idx = prev_msg_idx; 723 msg_spec.search_direction = SEARCH_BACKWARD; 724 end; 725 726 else if token.value = FIRST_SEEN_KEYWORD then 727 call search_message (first_msg_idx, SEARCH_FORWARD, SEARCH_SEEN); 728 729 else if token.value = FIRST_UNSEEN_KEYWORD then 730 call search_message (first_msg_idx, SEARCH_FORWARD, SEARCH_UNSEEN); 731 732 else if token.value = LAST_SEEN_KEYWORD then 733 call search_message (last_msg_idx, SEARCH_BACKWARD, SEARCH_SEEN); 734 735 else if token.value = LAST_UNSEEN_KEYWORD then 736 call search_message (last_msg_idx, SEARCH_BACKWARD, SEARCH_UNSEEN); 737 738 else if token.value = PREVIOUS_SEEN_KEYWORD then 739 call search_message (current_msg_idx - 1, SEARCH_BACKWARD, SEARCH_SEEN); 740 741 else if token.value = PREVIOUS_UNSEEN_KEYWORD then 742 call search_message (current_msg_idx - 1, SEARCH_BACKWARD, SEARCH_UNSEEN); 743 744 else if token.value = NEXT_SEEN_KEYWORD then 745 call search_message (current_msg_idx + 1, SEARCH_FORWARD, SEARCH_SEEN); 746 747 else if token.value = NEXT_UNSEEN_KEYWORD then 748 call search_message (current_msg_idx + 1, SEARCH_FORWARD, SEARCH_UNSEEN); 749 750 else call abort_parse (emf_et_$msg_spec_bad_keyword); 751 /* shouldn't ever happen, since */ 752 /* we've now gotten through all the possible keywords */ 753 754 if msg_spec_n_strings > 0 then /* this means the keyword is a "string" keyword */ 755 msg_spec.search_start = keyword_msg_idx; 756 757 else do; /* otherwise, it's a number */ 758 if ^high_range_found then do; 759 call apply_number_operator (prev_operator, low_range, keyword_msg_number); 760 low_range_found = "1"b; /* so we won't make the mistake later */ 761 prev_operator = NO_OPERATOR; 762 end; 763 764 else call apply_number_operator (prev_operator, high_range, keyword_msg_number); 765 end; /* of case for a "number", as opposed to a "string" keyword */ 766 end; /* of case for keyword (other than "all") */ 767 768 else if token.type = ALL_KEYWORD_TYPE then do; 769 if (first_msg_number = 0) | (last_msg_number = 0) then call no_message (emf_et_$no_messages); 770 771 if token.value = NEW_KEYWORD then do; 772 low_range_found = "0"b; 773 prev_msg_idx = 0; 774 do message_idx = message_chain.n_messages by -1 to 1 while (^low_range_found); 775 call rdm_mailbox_interface_$read_message (rdm_invocation_ptr, 776 message_chain.messages (message_idx), message_ptr, code); 777 if code ^= 0 | message.flags.seen then do; 778 low_range_found = "1"b; 779 if prev_msg_idx = 0 then 780 call no_message (emf_et_$no_messages_selected); 781 else low_range = message_chain.messages (prev_msg_idx); 782 end; 783 prev_msg_idx = message_idx; 784 end; 785 if ^low_range_found then low_range = first_msg_number; 786 end; 787 else low_range = first_msg_number; 788 high_range = last_msg_number; 789 low_range_found, high_range_found = "1"b; 790 791 if token.value = SEEN_KEYWORD then msg_spec.seen_only_sw = "1"b; 792 else if token.value = UNSEEN_KEYWORD then msg_spec.unseen_only_sw = "1"b; 793 else if msg_spec_n_strings > 0 then do; /* "all" is a special case for this */ 794 msg_spec.search_start = first_msg_idx; 795 msg_spec.search_direction = SEARCH_FORWARD; 796 msg_spec.all_matches = "1"b; 797 end; 798 end; /* of case for "all" */ 799 800 else if token.type = REGEXP_TYPE then do; 801 msg_spec.str_ptr (regexp_idx) = token.str_ptr; 802 msg_spec.str_len (regexp_idx) = token.str_lth; 803 if prev_operator = COMPLEMENT_OPERATOR then msg_spec.complement (regexp_idx) = "1"b; 804 regexp_idx = regexp_idx + 1; 805 prev_operator = NO_OPERATOR; /* compliment applies to exactly one regexp */ 806 end; 807 end; /* of token processing loop */ 808 809 810 if (first_msg_number = 0) | (last_msg_number = 0) then call no_message (emf_et_$no_messages); 811 /* there's not much that can be done */ 812 813 if ^low_range_found then do; 814 if msg_spec_n_strings = 0 then do; 815 if current_msg_number = 0 then call no_message (emf_et_$no_current_message); 816 high_range, low_range = current_msg_number; 817 end; 818 819 else do; /* default to 'all' for strings */ 820 low_range = first_msg_number; 821 high_range = last_msg_number; 822 high_range_found = "1"b; 823 end; 824 825 low_range_found = "1"b; 826 end; 827 828 if ^high_range_found then do; /* check for validity */ 829 high_range = low_range; 830 msg_spec.single_message = "1"b; /* indicate that a single message was asked for */ 831 end; 832 833 if (high_range <= 0) | (low_range <= 0) | (low_range > high_range) then 834 call abort_parse (emf_et_$msg_spec_bad_range); 835 836 bad_msg_number = -1; /* check ranges against absolute message boundaries */ 837 if high_range > all_chain.messages (all_chain.n_messages) then bad_msg_number = high_range; 838 if low_range < all_chain.messages (1) then bad_msg_number = low_range; 839 if bad_msg_number ^= -1 then /* this code is only reached with report_errors_sw OFF */ 840 call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "There is no message ^d.", bad_msg_number); 841 842 843 if msg_spec.search_direction = DONT_SEARCH then do; 844 if msg_spec_n_strings > 0 then msg_spec.all_matches = "1"b; 845 msg_spec.search_direction = SEARCH_FORWARD; 846 end; 847 848 msg_spec.first = low_range; 849 msg_spec.last = high_range; 850 851 return; 852 853 /* Internal to make_msg_spec: sets the values of the current, first, last, previous, and next message numbers along with 854* their indices in the type-specific message chain */ 855 856 get_message_numbers_and_indices: 857 procedure (); 858 859 dcl idx fixed binary; 860 861 if message_chain.n_messages = 0 then /* first and last are undefined */ 862 first_msg_number, first_msg_idx, last_msg_number, last_msg_idx = 0; 863 else do; /* they're defined ... */ 864 first_msg_number = message_chain.messages (1); 865 first_msg_idx = 1; 866 last_msg_number = message_chain.messages (message_chain.n_messages); 867 last_msg_idx = message_chain.n_messages; 868 end; 869 870 current_msg_number = rdm_invocation.current_message; 871 if current_msg_number = 0 then /* no current message */ 872 current_msg_idx = 0; 873 else do; /* check if it's in this type-specific chain */ 874 current_msg_idx = 0; 875 do idx = 1 to message_chain.n_messages while (current_msg_idx = 0); 876 if message_chain.messages (idx) = current_msg_number then current_msg_idx = idx; 877 end; 878 end; 879 880 if current_msg_number = 0 then /* no current message: previous and next are undefined */ 881 prev_msg_number, prev_msg_idx, next_msg_number, next_msg_idx = 0; 882 else do; /* find them in the chain ... */ 883 /*** ... previous is last message before the current message */ 884 prev_msg_number, prev_msg_idx = 0; 885 do idx = message_chain.n_messages to 1 by -1 while (prev_msg_idx = 0); 886 if message_chain.messages (idx) < current_msg_number then do; 887 prev_msg_number = message_chain.messages (idx); 888 prev_msg_idx = idx; 889 end; 890 end; 891 /*** ... next is first message after the current mesage */ 892 next_msg_number, next_msg_idx = 0; 893 do idx = 1 to message_chain.n_messages while (next_msg_idx = 0); 894 if message_chain.messages (idx) > current_msg_number then do; 895 next_msg_number = message_chain.messages (idx); 896 next_msg_idx = idx; 897 end; 898 end; 899 end; 900 901 return; 902 903 end get_message_numbers_and_indices; 904 905 /* Internal to make_msg_spec: applies a numeric operator (+ -) */ 906 907 apply_number_operator: 908 procedure (p_operator, p_operand_1, p_operand_2); 909 910 dcl p_operator fixed binary parameter; 911 dcl p_operand_1 fixed binary (35) parameter; 912 dcl p_operand_2 fixed binary (35) parameter; 913 914 if p_operator = NO_OPERATOR then p_operand_1 = p_operand_2; 915 916 else if p_operator = MINUS_OPERATOR then p_operand_1 = p_operand_1 - p_operand_2; 917 918 else if p_operator = PLUS_OPERATOR then p_operand_1 = p_operand_1 + p_operand_2; 919 920 return; 921 922 end apply_number_operator; 923 924 /* Internal to make_msg_spec: searches for first_seen, etc. */ 925 926 search_message: 927 proc (P_start_message_idx, P_search_direction, P_seen_unseen); 928 929 dcl (P_start_message_idx, P_search_direction, P_seen_unseen, increment, message_idx) fixed bin; 930 931 if P_search_direction = SEARCH_FORWARD then 932 increment = 1; 933 else increment = -1; 934 935 do message_idx = P_start_message_idx by increment 936 while (message_idx >= 1 & message_idx <= message_chain.n_messages); 937 938 call rdm_mailbox_interface_$read_message (rdm_invocation_ptr, message_chain.messages (message_idx), 939 message_ptr, code); 940 if code ^= 0 then call abort_parse (emf_et_$no_such_message); 941 if message.flags.seen = (P_seen_unseen = SEARCH_SEEN) then do; 942 keyword_msg_number = message_chain.messages (message_idx); 943 keyword_msg_idx = message_idx; 944 msg_spec.search_direction = DONT_SEARCH; 945 return; 946 end; 947 end; 948 call no_message (emf_et_$no_such_message); 949 950 end search_message; 951 952 end make_msg_spec; 953 954 /* Marks the messages which are selected by the message_specifier: Messages are only marked once even if selected by 955* several message_specifiers so that they will always be processed in the order specified */ 956 957 mark_messages: 958 procedure (); 959 960 dcl (continue_searching, ms_matched, this_matched) bit (1) aligned; 961 dcl (first_message_idx, next_message_idx, message_idx, message_number, match_count, idx) fixed binary; 962 963 if msg_spec.search_start > 0 then do; /* a keyword preceded the strings */ 964 search_direction = msg_spec.search_direction; 965 first_message_idx = msg_spec.search_start; 966 end; 967 else do; /* otherwise, do it for "all" */ 968 search_direction = SEARCH_FORWARD; 969 first_message_idx = 1; 970 end; 971 972 match_count = 0; /* to keep track of matches */ 973 974 do message_idx = first_message_idx repeat (next_message_idx) 975 while ((message_idx > 0) & (message_idx <= message_chain.n_messages)); 976 977 if search_direction = SEARCH_FORWARD then next_message_idx = message_idx + 1; 978 else if search_direction = SEARCH_BACKWARD then next_message_idx = message_idx - 1; 979 else next_message_idx = 0; 980 981 message_number = message_chain.messages (message_idx); 982 983 if (message_number >= msg_spec.first) & (message_number <= msg_spec.last) then do; 984 /* the message number is within range ... */ 985 continue_searching = "1"b; 986 ms_matched = "1"b; 987 988 do idx = 1 to msg_spec_n_strings while (continue_searching); 989 this_matched = 990 rdm_search_utils_$search_message_with_regexp (rdm_invocation_ptr, message_number, 991 msg_spec.str_ptr (idx), msg_spec.str_len (idx)); 992 if msg_spec.complement (idx) then this_matched = ^this_matched; 993 994 if msg_spec.operator (idx) = OR_OPERATOR then ms_matched = ms_matched | this_matched; 995 else if msg_spec.operator (idx) = AND_OPERATOR then do; 996 ms_matched = ms_matched & this_matched; 997 continue_searching = ms_matched; 998 end; /* search more only if necessary */ 999 else ms_matched = this_matched; /* no operator specified, presumably */ 1000 end; 1001 1002 if msg_spec.seen_only_sw | msg_spec.unseen_only_sw then do; 1003 call rdm_mailbox_interface_$read_message (rdm_invocation_ptr, message_number, message_ptr, code); 1004 if code ^= 0 then call abort_parse (code); 1005 if message.flags.seen ^= msg_spec.seen_only_sw then ms_matched = "0"b; 1006 end; 1007 1008 if ms_matched then do; /* we won */ 1009 match_count = match_count + 1; 1010 call add_message_to_marked_chain (message_number); 1011 if ^msg_spec.all_matches & (msg_spec_n_strings > 0) then next_message_idx = 0; 1012 end; /* ...stop on first match unless "all" was used */ 1013 end; 1014 end; 1015 1016 if match_count = 0 & ^request_entry_sw then do; /* no match */ 1017 if report_errors_sw & msg_spec.single_message then 1018 if msg_type = ONLY_DELETED_MESSAGES then/* complain about a missing message */ 1019 call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "Message ^d is not a deleted message.", 1020 msg_spec.first); 1021 else if msg_type = NON_DELETED_MESSAGES then 1022 call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "Message ^d has already been deleted.", 1023 msg_spec.first); 1024 else call ssu_$abort_line (rdm_invocation.sci_ptr, 0, "There is no message ^d.", msg_spec.first); 1025 1026 else if msg_spec.single_message then call abort_parse (emf_et_$no_such_message); 1027 1028 else if msg_spec_n_strings > 0 then call abort_parse (emf_et_$no_matching_messages); 1029 1030 else call abort_parse (emf_et_$no_messages_selected); 1031 end; 1032 1033 return; 1034 1035 end mark_messages; 1036 1037 /* Adds the specified message to the marked chain iff it is not already in the chain */ 1038 1039 add_message_to_marked_chain: 1040 procedure (p_message_number); 1041 1042 dcl p_message_number fixed binary parameter; 1043 dcl idx fixed binary; 1044 1045 do idx = 1 to marked_chain.n_messages; 1046 if marked_chain.messages (idx) = p_message_number then return; 1047 end; 1048 1049 marked_chain.n_messages, idx = marked_chain.n_messages + 1; 1050 1051 marked_chain.messages (idx) = p_message_number; 1052 1053 return; 1054 1055 end add_message_to_marked_chain; 1056 1057 /* Routine to return from message spec processing if there are no messages 1058* of the specified type. If the caller is a keyword active request it will 1059* return the null string or 0 as appropriate. */ 1060 1061 no_message: 1062 procedure (p_code); 1063 1064 dcl p_code fixed bin (35) parameter; 1065 1066 if ^request_entry_sw then P_code = p_code; /* do_request has no code parameter */ 1067 go to ERROR_RETURN_FROM_VALIDATE_MESSAGE_SPECIFIER; 1068 1069 end no_message; 1070 1071 /* Aborts processing of the message_specifier and optionally prints an error message */ 1072 1073 abort_parse: 1074 procedure (p_code); 1075 1076 dcl p_code fixed bin (35) parameter; 1077 dcl message character (64) varying; 1078 dcl type_str character (32) varying; 1079 1080 if report_errors_sw then do; 1081 if msg_type = NON_DELETED_MESSAGES then type_str = " non-deleted"; 1082 else if msg_type = ONLY_DELETED_MESSAGES then type_str = " deleted"; 1083 else type_str = ""; 1084 1085 if p_code = emf_et_$no_previous_message then message = "There is no previous^a message. ""^a"""; 1086 else if p_code = emf_et_$no_next_message then message = "There is no next^a message. ""^a"""; 1087 else if p_code = emf_et_$no_messages then message = "There are no^a messages. ""^a"""; 1088 else if p_code = emf_et_$no_messages_selected then message = "No^a messages selected. ""^a"""; 1089 else if p_code = emf_et_$no_matching_messages then message = "No matching^a messages. ""^a"""; 1090 else message = ""; 1091 1092 if length (message) > 0 then 1093 call ssu_$abort_line (rdm_invocation.sci_ptr, 0, message, type_str, msg_spec_str); 1094 else call ssu_$abort_line (rdm_invocation.sci_ptr, p_code, """^a""", msg_spec_str); 1095 end; 1096 1097 else do; 1098 if ^request_entry_sw then /* do_request has no code parameter */ 1099 P_code = p_code; /* copy it to the main procedure error code */ 1100 go to ERROR_RETURN_FROM_VALIDATE_MESSAGE_SPECIFIER; 1101 end; 1102 1103 end abort_parse; 1104 1105 ERROR_RETURN_FROM_VALIDATE_MESSAGE_SPECIFIER: 1106 return; 1107 1 1 /* BEGIN INCLUDE FILE ... mlsys_mailbox.incl.pl1 */ 1 2 /* Created: April 1983 by G. Palter */ 1 3 1 4 /* Definition of a mailbox as used by the Multics Mail System */ 1 5 1 6 dcl 1 mailbox aligned based (mailbox_ptr), 1 7 2 version character (8) unaligned, 1 8 2 reserved bit (144), /* for exclusive use of the mail system */ 1 9 2 mailbox_address pointer, /* mail system address of this mailbox */ 1 10 2 mailbox_dirname character (168) unaligned, /* directory containing this mailbox */ 1 11 2 mailbox_ename character (32) unaligned, /* entry name of this mailbox (includes ".mbx") */ 1 12 2 mailbox_type fixed binary, /* type of mailbox (see below) */ 1 13 2 mode bit (36), /* user's effective extended access to this mailbox */ 1 14 2 flags, 1 15 3 salvaged bit (1) unaligned, /* ON => this mailbox has been salvaged since last open */ 1 16 3 reserved bit (35) unaligned, /* for exclusive use of the mail system */ 1 17 2 message_selection_mode fixed binary, /* types of messages read: all/ordinary/interactive */ 1 18 2 sender_selection_mode fixed binary, /* whose messages were read: all/own/not-own */ 1 19 2 message_reading_level fixed binary, /* how much of each message read: keys/messages */ 1 20 2 n_messages fixed binary, /* total # of messages in this mailbox structure */ 1 21 2 n_ordinary_messages fixed binary, /* ... # of ordinary messages here */ 1 22 2 n_interactive_messages fixed binary, /* ... # of interactive messages here */ 1 23 2 n_deleted_messages fixed binary, /* ... # of messages here marked for later deletion */ 1 24 2 messages (mailbox_n_messages refer (mailbox.n_messages)), 1 25 3 key bit (72), /* unique key to read this message if not already read */ 1 26 3 message_ptr pointer; /* -> the message structure */ 1 27 1 28 dcl MAILBOX_VERSION_2 character (8) static options (constant) initial ("mlsmbx02"); 1 29 1 30 dcl mailbox_ptr pointer; 1 31 1 32 dcl mailbox_n_messages fixed binary; /* for exclusive use of the mail system */ 1 33 1 34 1 35 /* Types of mailboxes distinguished by the mail system */ 1 36 1 37 dcl (USER_DEFAULT_MAILBOX initial (1), /* the user's default mailbox for receiving mail */ 1 38 USER_LOGBOX initial (2), /* the user's logbox */ 1 39 SAVEBOX initial (3), /* a savebox */ 1 40 OTHER_MAILBOX initial (4)) /* any other type of mailbox */ 1 41 fixed binary static options (constant); 1 42 1 43 /* END INCLUDE FILE ... mlsys_mailbox.incl.pl1 */ 1108 1109 2 1 /* BEGIN INCLUDE FILE ... mlsys_message.incl.pl1 */ 2 2 2 3 2 4 /****^ HISTORY COMMENTS: 2 5* 1) change(85-12-19,Herbst), approve(86-03-25,MCR7367), 2 6* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 2 7* Added seen switch to message. 2 8* END HISTORY COMMENTS */ 2 9 2 10 2 11 /* Created: June 1983 by G. Palter */ 2 12 2 13 /* Definition of a message as used by the Multics Mail System */ 2 14 2 15 dcl 1 message aligned based (message_ptr), 2 16 2 version character (8) unaligned, 2 17 2 reserved bit (144), /* for exclusive use of the mail system */ 2 18 2 n_reply_references fixed binary, /* # of messages for which this is a reply */ 2 19 2 n_user_fields fixed binary, /* # of non-standard header fields in this message */ 2 20 2 n_redistributions fixed binary, /* # of times this message has been forwarded */ 2 21 2 n_body_sections fixed binary, /* # of sections in the body */ 2 22 2 flags, 2 23 3 interactive bit (1) unaligned, /* ON => this is an interactive message */ 2 24 3 can_be_deleted bit (1) unaligned, /* ON => the user can delete this message if desired */ 2 25 3 marked_for_deletion bit (1) unaligned, /* ON => message will be deleted when mailbox is closed */ 2 26 3 must_be_acknowledged bit (1) unaligned, /* ON => an ACK should be generated when message is read */ 2 27 3 seen bit (1) unaligned, /* ON => user has printed message at least once */ 2 28 3 reserved bit (31) unaligned, /* for use by the mail system */ 2 29 2 pad bit (36), 2 30 2 envelope like message_envelope, /* who/when/how the message was mailed & delivered */ 2 31 2 header, 2 32 3 message_id bit (72), /* ID of this message (same value for all copies) */ 2 33 3 access_class bit (72), /* AIM access class of this message */ 2 34 3 date_time_created fixed binary (71), /* date/time this message was composed */ 2 35 3 from pointer, /* -> address list of author(s) of the message */ 2 36 3 reply_to pointer, /* -> address list of recipients for reply (if not authors) */ 2 37 3 to pointer, /* -> address list of primary recipients */ 2 38 3 cc pointer, /* -> address list of secondary recipients */ 2 39 3 bcc pointer, /* -> address list of blind recipients */ 2 40 3 subject like message_text_field, /* subject of the message */ 2 41 3 reply_references pointer, /* -> list of messages for which this message is a reply */ 2 42 3 user_fields_list pointer, /* -> list of user-defined fields in this message */ 2 43 2 redistributions_list pointer, /* -> redistributions list for this message */ 2 44 2 body, 2 45 3 total_lines fixed binary (21), /* total # of lines in the body or -1 if indeterminate */ 2 46 3 pad bit (36), 2 47 3 body_sections (message_n_body_sections refer (message.n_body_sections)) like message_body_section; 2 48 2 49 dcl MESSAGE_VERSION_2 character (8) static options (constant) initial ("mlsmsg02"); 2 50 2 51 dcl message_subject character (message.header.subject.text_lth) unaligned based (message.header.subject.text_ptr); 2 52 2 53 dcl message_ptr pointer; 2 54 2 55 dcl (message_n_body_sections, message_trace_n_relays, message_n_redistributions, message_n_user_fields, 2 56 message_references_list_n_references) 2 57 fixed binary; /* for exclusive use of the mail system */ 2 58 2 59 /* Definition of a message envelope: describes when, by whom, and by what route the message was mailed */ 2 60 2 61 dcl 1 message_envelope aligned based (message_envelope_ptr), 2 62 2 date_time_mailed fixed binary (71), /* date/time this message was entered into the mail system */ 2 63 2 sender pointer, /* -> address of entity that mailed the message */ 2 64 2 trace pointer, /* -> message_trace describing how it got here */ 2 65 2 date_time_delivered fixed binary (71), /* date/time this message was delivered */ 2 66 2 delivered_by pointer, /* -> address of entity that delivered the message */ 2 67 2 acknowledge_to pointer; /* -> address of entity to receive ACK when message is read */ 2 68 2 69 dcl message_envelope_ptr pointer; 2 70 2 71 2 72 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the message envelope */ 2 73 2 74 dcl 1 message_envelope_parameter aligned based (message_envelope_parameter_ptr), 2 75 2 pad pointer, /* forces even word alignment */ 2 76 2 version character (8) unaligned, 2 77 2 envelope like message_envelope; 2 78 2 79 dcl MESSAGE_ENVELOPE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsenv02"); 2 80 2 81 dcl message_envelope_parameter_ptr pointer; 2 82 2 83 2 84 /* Definition of a message trace: describes the route and each relay operation by which a message was passed through the 2 85* networks to reach this recipient */ 2 86 2 87 dcl 1 message_trace aligned based (message_trace_ptr), 2 88 2 version character (8) unaligned, 2 89 2 reserved bit (144), /* ... exclusively for use by the mail system */ 2 90 2 implicit_route pointer, /* -> an address_route which defines the route it took */ 2 91 2 pad bit (36), 2 92 2 n_relays fixed binary, /* # of relay operations required to reach this site */ 2 93 2 relays (message_trace_n_relays refer (message_trace.n_relays)), 2 94 3 date_time_relayed fixed binary (71), /* ... when this relay operation took place */ 2 95 3 sending_host character (256) varying, /* ... the host which relayed the message */ 2 96 3 receiving_host character (256) varying, /* ... the host which received it */ 2 97 3 communications_media character (32) unaligned, /* ... medium over which relay took place (ARPA, Tymnet) */ 2 98 3 communications_protocol character (32) unaligned,/* ... low-level protocol used (TCP, X.25) */ 2 99 3 mail_protocol character (32) unaligned, /* ... mailer protocol used (SMTP, NBS) */ 2 100 3 relay_id bit (72), /* ... unique ID assigned by receiving system or ""b */ 2 101 3 relay_recipient pointer; /* ... -> address of recipient as given by sending system */ 2 102 2 103 dcl MESSAGE_TRACE_VERSION_2 character (8) static options (constant) initial ("mlstrc02"); 2 104 2 105 dcl message_trace_ptr pointer; 2 106 2 107 /* Definition of a message's redistributions list */ 2 108 2 109 dcl 1 message_redistributions_list aligned based (message.redistributions_list), 2 110 2 version character (8) unaligned, 2 111 2 reserved bit (144), /* ... exclusively for use by the mail system */ 2 112 2 pad bit (36), 2 113 2 n_redistributions fixed binary, /* # of redistributions */ 2 114 2 redistributions (message_n_redistributions refer (message_redistributions_list.n_redistributions)) 2 115 like message_redistribution; /* the redistributions: oldest first */ 2 116 2 117 dcl MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsrl002"); 2 118 2 119 2 120 /* Definition of a single redistribution (forwarding) of a message */ 2 121 2 122 dcl 1 message_redistribution aligned based (message_redistribution_ptr), 2 123 2 envelope like message_envelope, 2 124 2 header, 2 125 3 message_id bit (72), /* ID of this redistribution (same for all copies) */ 2 126 3 date_time_created fixed binary (71), /* date/time when this redistribution was made */ 2 127 3 from pointer, /* -> address list of authors of this redistribution */ 2 128 3 to pointer, /* -> address list of recipients of the redistribution */ 2 129 3 comment like message_text_field; /* optional comment associated with the redistribution */ 2 130 2 131 dcl message_redistribution_comment character (message_redistribution.comment.text_lth) unaligned 2 132 based (message_redistribution.comment.text_ptr); 2 133 2 134 dcl message_redistribution_ptr pointer; 2 135 2 136 2 137 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the redistributions of a message */ 2 138 2 139 dcl 1 message_redistribution_parameter aligned based (message_redistribution_parameter_ptr), 2 140 2 pad pointer, /* forces even word alignment */ 2 141 2 version character (8) unaligned, 2 142 2 redistribution like message_redistribution; 2 143 2 144 dcl MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsdist2"); 2 145 2 146 dcl message_redistribution_parameter_ptr pointer; 2 147 2 148 /* Definition of the list of user-defined fields in a message */ 2 149 2 150 dcl 1 message_user_fields_list aligned based (message.user_fields_list), 2 151 2 version character (8) unaligned, 2 152 2 reserved bit (144), /* ... exclusively for use by the mail system */ 2 153 2 pad bit (36), 2 154 2 n_user_fields fixed binary, /* # of user-defined fields in the message */ 2 155 2 user_fields (message_n_user_fields refer (message_user_fields_list.n_user_fields)) 2 156 like message_user_field; /* the actual user-defined fields */ 2 157 2 158 dcl MESSAGE_USER_FIELDS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsufl02"); 2 159 2 160 2 161 /* Definition of a user defined message header field */ 2 162 2 163 dcl 1 message_user_field aligned based (message_user_field_ptr), 2 164 2 header, 2 165 3 field_id bit (36) aligned, /* identifies the purpose of this field */ 2 166 3 field_type fixed binary, /* type of data contained in this field */ 2 167 2 field_type_variable bit (144); /* the actual data (see below) */ 2 168 2 169 dcl message_user_field_ptr pointer; 2 170 2 171 2 172 /* Defined types of user defined fields */ 2 173 2 174 dcl (MESSAGE_TEXT_USER_FIELD initial (1), /* content of the field is a text string */ 2 175 MESSAGE_ADDRESS_LIST_USER_FIELD initial (2), /* content of the field is an address list */ 2 176 MESSAGE_DATE_USER_FIELD initial (3), /* content of the field is a date/time */ 2 177 MESSAGE_INTEGER_USER_FIELD initial (4)) /* content of the filed is a fixed binary value */ 2 178 fixed binary static options (constant); 2 179 2 180 2 181 /* Structures used to access the data for the different types of user defined fields */ 2 182 2 183 dcl 1 message_text_user_field aligned based (message_user_field_ptr), 2 184 2 header like message_user_field.header, 2 185 2 text like message_text_field; /* the message text */ 2 186 2 187 dcl message_text_user_field_text character (message_text_user_field.text.text_lth) unaligned 2 188 based (message_text_user_field.text.text_ptr); 2 189 2 190 dcl 1 message_address_list_user_field aligned based (message_user_field_ptr), 2 191 2 header like message_user_field.header, 2 192 2 address_list_ptr pointer, /* -> the address list */ 2 193 2 pad bit (72); 2 194 2 195 dcl 1 message_date_user_field aligned based (message_user_field_ptr), 2 196 2 header like message_user_field.header, 2 197 2 date_time fixed binary (71), /* the clock reading */ 2 198 2 pad bit (72); 2 199 2 200 dcl 1 message_integer_user_field aligned based (message_user_field_ptr), 2 201 2 header like message_user_field.header, 2 202 2 value fixed binary (35), /* the integer value */ 2 203 2 pad bit (108); 2 204 2 205 2 206 /* Structure used in calls to mail_system_ entrypoints which manipulate the user-defined fields of a message */ 2 207 2 208 dcl 1 message_user_field_parameter aligned based (message_user_field_parameter_ptr), 2 209 2 pad pointer, /* forces even word alignment */ 2 210 2 version character (8) unaligned, 2 211 2 user_field like message_user_field; 2 212 2 213 dcl MESSAGE_USER_FIELD_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsudf02"); 2 214 2 215 dcl message_user_field_parameter_ptr pointer; 2 216 2 217 /* Definition of a list of message references used as the value of message header fields (eg: In-Reply-To) */ 2 218 2 219 dcl 1 message_references_list aligned based (message_references_list_ptr), 2 220 2 version character (8) unaligned, 2 221 2 reserved bit (144), /* ... exclusively for use by the mail system */ 2 222 2 pad bit (36), 2 223 2 n_references fixed binary, /* # of references in this list */ 2 224 2 references (message_references_list_n_references refer (message_references_list.n_references)) 2 225 like message_reference; /* the references themselves */ 2 226 2 227 dcl MESSAGE_REFERENCES_LIST_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 2 228 2 229 dcl message_references_list_ptr pointer; 2 230 2 231 2 232 /* Definition of a reference to another message */ 2 233 2 234 dcl 1 message_reference aligned based (message_reference_ptr), 2 235 2 message_id bit (72), /* ID of the other message */ 2 236 2 date_time_created fixed binary (71), /* date/time the other message was created */ 2 237 2 from pointer, /* -> address list of authors of the other message */ 2 238 2 subject like message_text_field; /* subject of the other message */ 2 239 2 240 dcl message_reference_subject character (message_reference.subject.text_lth) unaligned 2 241 based (message_reference.subject.text_ptr); 2 242 2 243 dcl message_reference_ptr pointer; 2 244 2 245 2 246 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate message references */ 2 247 2 248 dcl 1 message_reference_parameter aligned based (message_reference_parameter_ptr), 2 249 2 pad pointer, /* forces even word alignment */ 2 250 2 version character (8) unaligned, 2 251 2 reference like message_reference; 2 252 2 253 dcl MESSAGE_REFERENCE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 2 254 2 255 dcl message_reference_parameter_ptr pointer; 2 256 2 257 2 258 /* Definition of a text field in a message (Subject, Comment, or a user defined field) */ 2 259 2 260 dcl 1 message_text_field aligned based (message_text_field_ptr), 2 261 2 text_ptr pointer, /* -> the actual text */ 2 262 2 text_lth fixed binary (21), /* length of said text */ 2 263 2 flags, 2 264 3 multiline_text bit (1) unaligned, /* ON => the text of this field may span multiple lines; 2 265* OFF => the text will always be a single line */ 2 266 3 reserved bit (35) unaligned; /* for exclusive use of the mail system */ 2 267 2 268 dcl message_text_field_text character (message_text_field.text_lth) unaligned based (message_text_field.text_ptr); 2 269 2 270 dcl message_text_field_ptr pointer; 2 271 2 272 /* Definition of a section of the body of a message */ 2 273 2 274 dcl 1 message_body_section aligned based (message_body_section_ptr), 2 275 2 header, 2 276 3 section_type fixed binary, /* type of "text" stored in this section */ 2 277 3 section_n_lines fixed binary (21), /* # of lines in this section or -1 if indeterminate */ 2 278 2 section_type_variable bit (144); /* the actual data (see below) */ 2 279 2 280 dcl message_body_section_ptr pointer; 2 281 2 282 2 283 /* Defined types of message body sections */ 2 284 2 285 dcl (MESSAGE_PREFORMATTED_BODY_SECTION initial (1), /* text formatted by the authors/sender */ 2 286 MESSAGE_BIT_STRING_BODY_SECTION initial (2)) /* arbitrary bit string */ 2 287 fixed binary static options (constant); 2 288 2 289 2 290 /* Structures used to access the data for the different types of message body sections */ 2 291 2 292 dcl 1 message_preformatted_body_section aligned based (message_body_section_ptr), 2 293 2 header like message_body_section.header, 2 294 2 text_ptr pointer, /* -> the text */ 2 295 2 text_lth fixed binary (21), /* length of said text in characters */ 2 296 2 reserved bit (36); /* for exclusive use of the mail system */ 2 297 2 298 dcl message_preformatted_body_section_text character (message_preformatted_body_section.text_lth) unaligned 2 299 based (message_preformatted_body_section.text_ptr); 2 300 2 301 dcl 1 message_bit_string_body_section aligned based (message_body_section_ptr), 2 302 2 header like message_body_section.header, 2 303 2 bit_string_ptr pointer, /* -> the bit string */ 2 304 2 bit_string_lth fixed binary (24), /* length of said bit string in bits (obviously) */ 2 305 2 reserved bit (36); /* for exclusive use of the mail system */ 2 306 2 307 dcl message_bit_string_body_section_bit_string bit (message_bit_string_body_section.bit_string_lth) unaligned 2 308 based (message_bit_string_body_section.bit_string_ptr); 2 309 2 310 2 311 /* Structure used in calls to mail_system_ entrypoints which manipulate the sections of a message's body */ 2 312 2 313 dcl 1 message_body_section_parameter aligned based (message_body_section_parameter_ptr), 2 314 2 pad pointer, /* forces even word alignment */ 2 315 2 version character (8) unaligned, 2 316 2 section like message_body_section; 2 317 2 318 dcl MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsmbs02"); 2 319 2 320 dcl message_body_section_parameter_ptr pointer; 2 321 2 322 /* END INCLUDE FILE ... mlsys_message.incl.pl1 */ 1110 1111 3 1 /* BEGIN INCLUDE FILE ... rdm_invocation.incl.pl1 */ 3 2 /* Created: September 1983 by G. Palter from portions of emf_info.incl.pl1 */ 3 3 3 4 /* Definition of a single invocation of read_mail */ 3 5 3 6 dcl 1 rdm_invocation aligned based (rdm_invocation_ptr), 3 7 2 type character (8), /* defines this structure as a read_mail invocation */ 3 8 2 sci_ptr pointer, /* -> subsystem utilities invocation data */ 3 9 2 area_ptr pointer, /* -> area to be used by the subsystem */ 3 10 3 11 2 mailbox_info, 3 12 3 mailbox_ptr pointer, /* -> mailbox structure being examined by this invocation */ 3 13 3 message_list_ptr pointer, /* -> list of read_mail specific information retained for each 3 14* message (eg: the "processed" flag) */ 3 15 3 message_chains, /*the various message chains ... */ 3 16 4 all pointer, /* ... all unexpunged messages */ 3 17 4 undeleted pointer, /* ... all undeleted messages */ 3 18 4 deleted pointer, /* ... all deleted messages */ 3 19 4 marked pointer, /* ... messages to be processed by the current request */ 3 20 4 marked_as_original pointer, /* ... messages being processed by a reply/forward request */ 3 21 3 mailbox_name character (168) varying, /* name of the mailbox (your mailbox/logbox/pathname) */ 3 22 3 23 2 current_message fixed binary, /* index of the current message; 0 => no current message */ 3 24 3 25 2 last_search_buffer, /* describes the buffer where read_mail constructs the ... */ 3 26 3 buffer_ptr pointer, /* ... the printed representation of messages in order ... */ 3 27 3 buffer_used fixed binary (21), /* ... to speed up regular expression searching */ 3 28 3 29 2 global_options, /* command line options affecting all of read_mail ... */ 3 30 3 flags, 3 31 4 acknowledge bit (1) unaligned, /* ... ON => acknowledge messages after printing */ 3 32 4 brief bit (1) unaligned, /* ... ON => shorten some messages and omit others */ 3 33 4 debug_mode bit (1) unaligned, /* ... ON => enable debugging features */ 3 34 4 pad bit (33) unaligned, 3 35 3 36 2 print_options, /* command line options affecting the print request ... */ 3 37 3 formatting_mode fixed binary, /* ... output mode for the message header, etc. */ 3 38 3 39 2 reply_options, /* command line options affecting the reply request ... */ 3 40 3 line_length fixed binary, /* ... line length to be used by send_mail for filling */ 3 41 3 indentation fixed binary, /* ... amount to indent original text when included */ 3 42 3 flags, 3 43 4 include_original bit (1) unaligned, /* ... ON => include original message text in the reply */ 3 44 4 include_authors bit (1) unaligned, /* ... ON => include original authors as recipients */ 3 45 4 include_recipients bit (1) unaligned, /* ... ON => include original recipients as recipients */ 3 46 4 include_self bit (2) unaligned, /* ... ON => include this user as a recipient of the reply if 3 47* selected by include_authors/include_recipients */ 3 48 4 fill_control bit (2) unaligned, /* ... controls message filling by send_mail */ 3 49 4 pad bit (29) unaligned; 3 50 3 51 dcl RDM_INVOCATION character (8) static options (constant) initial ("rdm_0009"); 3 52 3 53 dcl rdm_invocation_ptr pointer; 3 54 3 55 dcl rdm_area area based (rdm_invocation.area_ptr); 3 56 3 57 3 58 /* Defined settings for reply_options.include_self */ 3 59 3 60 dcl (DEFAULT_INCLUDE_SELF initial ("00"b), /* neither -include_self nor -no_include_self given */ 3 61 NO_INCLUDE_SELF initial ("01"b), /* -no_include_self explicitly given */ 3 62 INCLUDE_SELF initial ("10"b)) /* -include_self explicitly given */ 3 63 bit (2) aligned static options (constant); 3 64 3 65 /* END INCLUDE FILE ... rdm_invocation.incl.pl1 */ 1112 1113 4 1 /* BEGIN INCLUDE FILE ... rdm_message_list.incl.pl1 */ 4 2 /* Created: September 1983 by G. Palter */ 4 3 4 4 /* Definition of per-message data maintained by read_mail: This list is maintined in parallel to the mailbox structure by 4 5* read_mail's interface to the mail_system_ mailbox manager (rdm_mailbox_interface_). It serves two purposes: 4 6* (1) It provides a place to store read_mail-specific per-message data (ie: the processed flag). 4 7* (2) It provides the ability to provide arbitrary mappings between read_mail message numbers and the actual indeces 4 8* within the mailbox structure. This mapping allows read_mail to preserve its message numbers for an invocation 4 9* even if messages are expunged which causes them to disappear from the mailbox structure (NB: the "expunge" 4 10* request is not yet implemented). This mapping also allows read_mail to present the messages in the mailbox to 4 11* the user in a different order than they actually appear in the mailbox (eg: sorted by date/time created) */ 4 12 4 13 dcl 1 message_list aligned based (rdm_invocation.message_list_ptr), 4 14 2 n_messages fixed binary, /* # of messages known to read_mail at present */ 4 15 2 pad bit (36), 4 16 2 messages (message_list_n_messages refer (message_list.n_messages)), 4 17 3 message_idx fixed binary, /* index of this message in the mailbox structure */ 4 18 3 flags, 4 19 4 processed bit (1) unaligned, /* ON => this message may be deleted without query */ 4 20 4 pad bit (35) unaligned, 4 21 3 search_text, /* describes copy of messages used for regexp searches */ 4 22 4 search_text_ptr pointer, /* ... -> the saved printed represetnation */ 4 23 4 search_text_lth fixed binary (21); /* ... length of said representation in characters */ 4 24 4 25 dcl message_list_n_messages fixed binary; 4 26 4 27 /* END INCLUDE FILE ... rdm_message_list.incl.pl1 */ 1114 1115 5 1 /* BEGIN INCLUDE FILE: rdm_msg_spec_keywords.incl.pl1 */ 5 2 5 3 5 4 /****^ HISTORY COMMENTS: 5 5* 1) change(86-04-01,Herbst), approve(86-04-01,MCR7367), 5 6* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 5 7* New file. 5 8* END HISTORY COMMENTS */ 5 9 5 10 /* These constants are used by rdm_msg_requests_ and rdm_message_mark_mgr_ to identify requests and msg specs */ 5 11 5 12 dcl KEYWORDS (17, 3) character (16) varying static options (constant) initial ( 5 13 "all", "a", "", 5 14 "first", "f", "", 5 15 "last", "l", "", 5 16 "previous", "p", "", 5 17 "next", "n", "", 5 18 "current", "c", ".", 5 19 "seen", "", "", 5 20 "unseen", "", "", 5 21 "new", "", "", 5 22 "first_seen", "fs", "", 5 23 "first_unseen", "fu", "", 5 24 "last_seen", "", "", 5 25 "last_unseen", "lu", "", 5 26 "previous_seen", "ps", "", 5 27 "previous_unseen", "pu", "", 5 28 "next_seen", "ns", "", 5 29 "next_unseen", "nu", ""); 5 30 5 31 dcl (ALL_KEYWORD initial (1), /* used in processing specifiers */ 5 32 FIRST_KEYWORD initial (2), 5 33 LAST_KEYWORD initial (3), 5 34 PREVIOUS_KEYWORD initial (4), 5 35 NEXT_KEYWORD initial (5), 5 36 CURRENT_KEYWORD initial (6), 5 37 SEEN_KEYWORD initial (7), 5 38 UNSEEN_KEYWORD initial (8), 5 39 NEW_KEYWORD initial (9), 5 40 FIRST_SEEN_KEYWORD initial (10), 5 41 FIRST_UNSEEN_KEYWORD initial (11), 5 42 LAST_SEEN_KEYWORD initial (12), 5 43 LAST_UNSEEN_KEYWORD initial (13), 5 44 PREVIOUS_SEEN_KEYWORD initial (14), 5 45 PREVIOUS_UNSEEN_KEYWORD initial (15), 5 46 NEXT_SEEN_KEYWORD initial (16), 5 47 NEXT_UNSEEN_KEYWORD initial (17)) 5 48 fixed binary static options (constant); 5 49 5 50 /* END INCLUDE FILE: rdm_msg_spec_keywords.incl.pl1 */ 1116 1117 6 1 /* BEGIN INCLUDE FILE ... rdm_message_chains.incl.pl1 */ 6 2 /* Created: September 1983 by G. Palter */ 6 3 6 4 6 5 /* Definition of a read_mail message chain */ 6 6 6 7 dcl 1 message_chain aligned based (message_chain_ptr), 6 8 2 n_messages fixed binary, /* # of messages in the chain */ 6 9 2 messages (message_list.n_messages) fixed binary; /* read_mail message numbers of the messages in the chain */ 6 10 6 11 dcl message_chain_ptr pointer; 6 12 6 13 6 14 /* Message chains maintained by read_mail's interface to the mail_system_ mailbox manager (rdm_mailbox_interface_) -- 6 15* (1) The first chain is a list of all messages in the mailbox which have not yet been expunged and consists of all 6 16* messages whether or not they have been marked for deletion. 6 17* (2) The second chain is a list of all messages in the mailbox which have not been marked for later deletion. 6 18* (3) The third chain is a list of all messages which have been marked for later deletion. 6 19* The message specifier parser uses one of these three chains as the basis for selecting the messages to be processed by 6 20* a request based on the use of "-include_deleted", "-only_non_deleted", or "-only_deleted", respectively; in this way, 6 21* the amount of code in the parser which must distinguish between these three types of selections is minimized */ 6 22 6 23 dcl 1 all_chain aligned based (rdm_invocation.message_chains.all) like message_chain; 6 24 dcl 1 undeleted_chain aligned based (rdm_invocation.message_chains.undeleted) like message_chain; 6 25 dcl 1 deleted_chain aligned based (rdm_invocation.message_chains.deleted) like message_chain; 6 26 6 27 6 28 /* The marked chain is the list of messages that are to be processed by the current request */ 6 29 6 30 dcl 1 marked_chain aligned based (rdm_invocation.message_chains.marked) like message_chain; 6 31 6 32 6 33 /* The marked as original chain is the list of messages that are being processed by a reply or forward request: This 6 34* chain is used to define the default set of messages to be processed by the various send_mail "original" requests and 6 35* forward "original" sub-requests */ 6 36 6 37 dcl 1 marked_as_original_chain aligned based (rdm_invocation.message_chains.marked_as_original) like message_chain; 6 38 6 39 6 40 /* Definition of the acceptable message selection criteria */ 6 41 6 42 dcl (ALL_MESSAGES initial (1), /* all messages: -include_deleted */ 6 43 NON_DELETED_MESSAGES initial (2), /* only undeleted messages: -only_non_deleted (default) */ 6 44 ONLY_DELETED_MESSAGES initial (3)) /* only deleted messages: -only_deleted */ 6 45 fixed binary static options (constant); 6 46 6 47 /* END INCLUDE FILE ... rdm_message_chains.incl.pl1 */ 1118 1119 1120 end rdm_message_mark_mgr_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 04/18/00 1127.2 rdm_message_mark_mgr_.pl1 >udd>sm>ds>w>ml>rdm_message_mark_mgr_.pl1 1108 1 10/27/83 2204.2 mlsys_mailbox.incl.pl1 >ldd>incl>mlsys_mailbox.incl.pl1 1110 2 05/22/86 1325.8 mlsys_message.incl.pl1 >ldd>incl>mlsys_message.incl.pl1 1112 3 10/27/83 2204.3 rdm_invocation.incl.pl1 >ldd>incl>rdm_invocation.incl.pl1 1114 4 10/27/83 2204.3 rdm_message_list.incl.pl1 >ldd>incl>rdm_message_list.incl.pl1 1116 5 05/22/86 1325.8 rdm_msg_spec_keywords.incl.pl1 >ldd>incl>rdm_msg_spec_keywords.incl.pl1 1118 6 10/27/83 2204.3 rdm_message_chains.incl.pl1 >ldd>incl>rdm_message_chains.incl.pl1 NAMES DECLARED IN THIS COMPILATION. IDENTIFIER OFFSET LOC STORAGE CLASS DATA TYPE ATTRIBUTES AND REFERENCES (* indicates a set context) NAMES DECLARED BY DECLARE STATEMENT. ALL_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 438 ALL_KEYWORD_TYPE constant fixed bin(17,0) initial dcl 204 set ref 438* 523* 768 ALL_MESSAGES constant fixed bin(17,0) initial dcl 6-42 ref 354 643 AND_OPERATOR constant fixed bin(17,0) initial dcl 219 ref 995 BAD_EXPR_STATE constant fixed bin(17,0) initial dcl 252 ref 581 BAD_OPER_STATE constant fixed bin(17,0) initial dcl 252 ref 582 BAD_RANGE_STATE constant fixed bin(17,0) initial dcl 252 ref 585 BAD_REGEXP_STATE constant fixed bin(17,0) initial dcl 252 ref 584 COMPLEMENT_OPERATOR constant fixed bin(17,0) initial dcl 219 ref 803 COMPLEMENT_OPERATOR_TYPE constant fixed bin(17,0) initial dcl 204 ref 687 CURRENT_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 705 DIGITS 000610 constant char(10) initial packed unaligned dcl 170 ref 484 485 DONT_SEARCH constant fixed bin(17,0) initial dcl 147 ref 657 709 843 944 EMPTY_MSG_SPEC_STATE constant fixed bin(17,0) initial dcl 252 ref 580 FIRST_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 691 FIRST_SEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 726 FIRST_TYPE constant fixed bin(17,0) initial dcl 204 set ref 437* 470* FIRST_UNSEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 729 KEYWORDS 000000 constant varying char(16) initial array dcl 5-12 set ref 442 443 508 509 511 512 514 KEYWORD_TYPE constant fixed bin(17,0) initial dcl 204 set ref 441* 526* 595 690 LAST_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 698 LAST_SEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 732 LAST_TYPE constant fixed bin(17,0) initial dcl 204 set ref 445* 566* LAST_UNSEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 735 LC_ALPHA 000554 constant char(26) initial packed unaligned dcl 174 ref 506 LETTERS 000572 constant char(54) initial packed unaligned dcl 171 ref 498 499 MINUS_OPERATOR constant fixed bin(17,0) initial dcl 219 ref 916 MIXED_EXPR_STATE constant fixed bin(17,0) initial dcl 252 ref 583 NEW_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 438 771 NEXT_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 712 NEXT_SEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 744 NEXT_UNSEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 747 NON_DELETED_MESSAGES constant fixed bin(17,0) initial dcl 6-42 ref 355 644 1021 1081 NO_OPERATOR 006116 constant fixed bin(17,0) initial dcl 219 ref 661 673 678 761 805 914 NULL_STRING 000613 constant char(1) initial packed unaligned dcl 165 set ref 556 556 NUMBER_OPERATOR_TYPE constant fixed bin(17,0) initial dcl 204 ref 687 NUMBER_TYPE constant fixed bin(17,0) initial dcl 204 set ref 493* 591 666 ONLY_DELETED_MESSAGES constant fixed bin(17,0) initial dcl 6-42 ref 328 1017 1082 OPERATORS 000552 constant char(6) initial packed unaligned dcl 228 ref 477 478 OPERATOR_TYPES 000543 constant fixed bin(17,0) initial array dcl 230 set ref 479* OR_OPERATOR constant fixed bin(17,0) initial dcl 219 ref 994 PLUS_OPERATOR constant fixed bin(17,0) initial dcl 219 ref 918 PREVIOUS_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 719 PREVIOUS_SEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 738 PREVIOUS_UNSEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 741 P_code parameter fixed bin(35,0) dcl 90 set ref 266 283* 291 299* 1066* 1098* P_flags parameter bit packed unaligned dcl 85 ref 266 291 P_keyword_number parameter fixed bin(17,0) dcl 87 ref 430 438 438 438 438 442 443 444 P_msg_spec_lth parameter fixed bin(21,0) dcl 81 ref 266 272 291 297 P_msg_spec_ptr parameter pointer dcl 80 ref 266 271 291 296 P_msg_type parameter fixed bin(17,0) dcl 83 ref 266 273 291 298 322 328 348 353 430 448 P_rdm_invocation_ptr parameter pointer dcl 78 ref 266 269 291 294 309 312 322 325 348 351 375 378 395 398 411 414 430 447 P_reverse_sw parameter bit(1) dcl 88 ref 430 449 P_sci_ptr parameter pointer dcl 78 ref 430 P_search_direction parameter fixed bin(17,0) dcl 929 ref 926 931 P_seen_unseen parameter fixed bin(17,0) dcl 929 ref 926 941 P_start_message_idx parameter fixed bin(17,0) dcl 929 ref 926 935 RANGE_OPERATOR_TYPE constant fixed bin(17,0) initial dcl 204 ref 597 676 REGEXP_CONCEAL 006117 constant char(2) initial packed unaligned dcl 168 ref 543 REGEXP_DELIM constant char(1) initial packed unaligned dcl 167 ref 531 538 REGEXP_OPERATOR_TYPE constant fixed bin(17,0) initial dcl 204 ref 685 REGEXP_TYPE constant fixed bin(17,0) initial dcl 204 set ref 549* 593 800 SEARCH_BACKWARD constant fixed bin(17,0) initial dcl 147 set ref 702 723 732* 735* 738* 741* 978 SEARCH_FORWARD constant fixed bin(17,0) initial dcl 147 set ref 695 716 726* 729* 744* 747* 795 845 931 968 977 SEARCH_SEEN constant fixed bin(17,0) initial dcl 147 set ref 726* 732* 738* 744* 941 SEARCH_UNSEEN constant fixed bin(17,0) initial dcl 147 set ref 729* 735* 741* 747* SEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 438 791 SYNTAX_TABLE 000377 constant fixed bin(17,0) initial array dcl 238 ref 577 UC_ALPHA 000563 constant char(26) initial packed unaligned dcl 174 ref 506 UNSEEN_KEYWORD constant fixed bin(17,0) initial dcl 5-31 ref 438 792 VALID_STATE constant fixed bin(17,0) initial dcl 252 ref 579 addr builtin function dcl 197 ref 442 550 556 556 574 575 624 664 addrel builtin function dcl 197 ref 442 all 12 based pointer level 4 dcl 3-6 ref 354 643 837 837 838 all_chain based structure level 1 dcl 6-23 all_matches 6 based bit(1) level 3 dcl 123 set ref 796* 844* 1011 bad_msg_number 000641 automatic fixed bin(17,0) dcl 641 set ref 836* 837* 838* 839 839* char1 000601 automatic char(1) dcl 462 set ref 475* 477 478 484 498 531 code 000603 automatic fixed bin(35,0) dcl 463 in procedure "parse_string" set ref 556* 557 557* 559 559* 580* 581* 582* 583* 584* 585* 586* 588* code 000105 automatic fixed bin(35,0) dcl 100 in procedure "rdm_message_mark_mgr_" set ref 1003* 1004 1004* code 000635 automatic fixed bin(35,0) dcl 640 in procedure "make_msg_spec" set ref 651* 652 775* 777 938* 940 complement 15 based bit(1) array level 4 dcl 123 set ref 803* 992 continue_searching 000704 automatic bit(1) dcl 960 set ref 985* 988 997* cu_$grow_stack_frame 000056 constant entry external dcl 188 ref 651 current_message 77 based fixed bin(17,0) level 2 dcl 3-6 set ref 328 331* 334 340 870 current_msg_idx 000526 automatic fixed bin(17,0) dcl 159 set ref 708 738 741 744 747 871* 874* 875 876* current_msg_number 000521 automatic fixed bin(17,0) dcl 158 set ref 706 707 815 816 870* 871 876 880 886 894 currentsize builtin function dcl 197 ref 651 651 deleted 16 based pointer level 4 dcl 3-6 ref 356 645 emf_et_$msg_spec_bad_expr 000010 external static fixed bin(35,0) dcl 178 ref 581 emf_et_$msg_spec_bad_keyword 000012 external static fixed bin(35,0) dcl 178 set ref 521* 750* emf_et_$msg_spec_bad_number 000014 external static fixed bin(35,0) dcl 178 set ref 490* emf_et_$msg_spec_bad_oper 000016 external static fixed bin(35,0) dcl 178 ref 582 emf_et_$msg_spec_bad_range 000020 external static fixed bin(35,0) dcl 178 set ref 585 682* 833* emf_et_$msg_spec_bad_regexp 000022 external static fixed bin(35,0) dcl 178 ref 584 emf_et_$msg_spec_invalid 000024 external static fixed bin(35,0) dcl 178 set ref 562* 586 605* 609* emf_et_$msg_spec_missing_delim 000026 external static fixed bin(35,0) dcl 178 set ref 535* 540* emf_et_$msg_spec_mixed 000030 external static fixed bin(35,0) dcl 178 set ref 583 603* emf_et_$msg_spec_null 000032 external static fixed bin(35,0) dcl 178 ref 580 emf_et_$msg_spec_too_complex 000034 external static fixed bin(35,0) dcl 178 set ref 621* 652* emf_et_$no_current_message 000036 external static fixed bin(35,0) dcl 178 set ref 328* 334* 706* 815* emf_et_$no_matching_messages 000040 external static fixed bin(35,0) dcl 178 set ref 1028* 1089 emf_et_$no_messages 000044 external static fixed bin(35,0) dcl 178 set ref 692* 699* 769* 810* 1087 emf_et_$no_messages_selected 000042 external static fixed bin(35,0) dcl 178 set ref 779* 1030* 1088 emf_et_$no_next_message 000046 external static fixed bin(35,0) dcl 178 set ref 713* 1086 emf_et_$no_previous_message 000050 external static fixed bin(35,0) dcl 178 set ref 720* 1085 emf_et_$no_such_message 000052 external static fixed bin(35,0) dcl 178 set ref 940* 948* 1026* error_table_$nomatch 000054 external static fixed bin(35,0) dcl 178 ref 557 first based fixed bin(17,0) level 3 dcl 123 set ref 655* 848* 983 1017* 1021* 1024* first_message_idx 000707 automatic fixed bin(17,0) dcl 961 set ref 965* 969* 974 first_msg_idx 000524 automatic fixed bin(17,0) dcl 159 set ref 694 726* 729* 794 861* 865* first_msg_number 000517 automatic fixed bin(17,0) dcl 158 set ref 692 693 769 785 787 810 820 861* 864* fixed builtin function dcl 197 ref 492 flags 12 based structure level 2 dcl 2-15 hbound builtin function dcl 197 ref 435 467 508 511 header 64 based structure array level 4 in structure "message" dcl 2-15 in procedure "rdm_message_mark_mgr_" header 10 based structure array level 3 in structure "message_user_fields_list" dcl 2-150 in procedure "rdm_message_mark_mgr_" header 4 based structure level 3 in structure "message_user_field_parameter" dcl 2-208 in procedure "rdm_message_mark_mgr_" header based structure level 2 in structure "message_body_section" dcl 2-274 in procedure "rdm_message_mark_mgr_" header 4 based structure level 3 in structure "message_body_section_parameter" dcl 2-313 in procedure "rdm_message_mark_mgr_" header based structure level 2 in structure "message_user_field" dcl 2-163 in procedure "rdm_message_mark_mgr_" high_range 000634 automatic fixed bin(35,0) dcl 640 set ref 671* 764* 788* 816* 821* 829* 833 833 837 837 849 high_range_found 000631 automatic bit(1) dcl 639 set ref 660* 669 677 679* 758 789* 822* 828 i1 000606 automatic fixed bin(21,0) dcl 464 set ref 508* 509 512 514* 527 532* 533 538 543 545* 545 552 554 i2 000607 automatic fixed bin(21,0) dcl 464 set ref 511* 512* idx 000714 automatic fixed bin(17,0) dcl 961 in procedure "mark_messages" set ref 988* 989 989 992 994 995* idx 000724 automatic fixed bin(17,0) dcl 1043 in procedure "add_message_to_marked_chain" set ref 1045* 1046* 1049* 1051 idx 000652 automatic fixed bin(17,0) dcl 859 in procedure "get_message_numbers_and_indices" set ref 875* 876 876* 885* 886 887 888* 893* 894 895 896* idx 000604 automatic fixed bin(21,0) dcl 464 in procedure "parse_string" set ref 472* 474 475 481* 481 485 486 492 495* 495 499 500 504 528* 528 532 550 552 554* 554 554 577* 579 580 581 582 583 584 585 increment 000672 automatic fixed bin(17,0) dcl 929 set ref 931* 933* 935 index builtin function dcl 197 ref 477 478 484 498 538 jdx 000605 automatic fixed bin(21,0) dcl 464 set ref 485* 486 486* 488* 488 490 492 495 499* 500 500* 502* 502 504 528 538* 540 543 543 545 552 554 keyword 000570 automatic varying char(32) dcl 461 set ref 504* 506* 506 509 512 514* 523 523 523 523 keyword_count 000532 automatic fixed bin(17,0) dcl 161 set ref 571* 595* 595 605 keyword_msg_idx 000642 automatic fixed bin(17,0) dcl 641 set ref 694* 701* 708* 715* 722* 754 943* keyword_msg_number 000632 automatic fixed bin(35,0) dcl 640 set ref 693* 700* 707* 714* 721* 759* 764* 942* last 1 based fixed bin(17,0) level 3 dcl 123 set ref 655* 849* 983 last_msg_idx 000525 automatic fixed bin(17,0) dcl 159 set ref 701 732* 735* 861* 867* last_msg_number 000520 automatic fixed bin(17,0) dcl 158 set ref 699 700 769 788 810 821 861* 866* length builtin function dcl 197 ref 443 1092 low_range 000633 automatic fixed bin(35,0) dcl 640 set ref 669* 759* 781* 785* 787* 816* 820* 829 833 833 838 838 848 low_range_found 000630 automatic bit(1) dcl 639 set ref 660* 667* 760* 772* 774 778* 785 789* 813 825* mailbox_info 6 based structure level 2 dcl 3-6 marked 20 based pointer level 4 dcl 3-6 ref 314 339 340 363 366 380 382 383 1045 1046 1049 1049 1051 marked_as_original 22 based pointer level 4 dcl 3-6 ref 380 383 419 421 424 marked_as_original_chain based structure level 1 dcl 6-37 marked_chain based structure level 1 dcl 6-30 match_count 000713 automatic fixed bin(17,0) dcl 961 set ref 972* 1009* 1009 1016 max_tokens 000513 automatic fixed bin(17,0) dcl 118 set ref 435* 467* 621 message based structure level 1 dcl 2-15 in procedure "rdm_message_mark_mgr_" message 000742 automatic varying char(64) dcl 1077 in procedure "abort_parse" set ref 1085* 1086* 1087* 1088* 1089* 1090* 1092 1092* message_body_section based structure level 1 dcl 2-274 message_chain based structure level 1 dcl 6-7 message_chain_ptr 000546 automatic pointer dcl 6-11 set ref 354* 355* 356* 359 363 365 366 643* 644* 645* 774 775 781 861 864 866 866 867 875 876 885 886 887 893 894 895 935 938 942 974 981 message_chains 12 based structure level 3 dcl 3-6 message_envelope based structure level 1 dcl 2-61 message_idx 000711 automatic fixed bin(17,0) dcl 961 in procedure "mark_messages" set ref 974* 974 974* 977 978 981* message_idx 000531 automatic fixed bin(17,0) dcl 159 in procedure "rdm_message_mark_mgr_" set ref 365* 366 366* 382* 383 383* 419* 421* 774* 775 783* message_idx 000673 automatic fixed bin(17,0) dcl 929 in procedure "search_message" set ref 935* 935 935* 938 942 943* message_number 000712 automatic fixed bin(17,0) dcl 961 set ref 981* 983 983 989* 1003* 1010* message_ptr 000542 automatic pointer dcl 2-53 set ref 775* 777 938* 941 1003* 1005 message_redistribution based structure level 1 dcl 2-122 message_reference based structure level 1 dcl 2-234 message_text_field based structure level 1 dcl 2-260 message_user_field based structure level 1 dcl 2-163 messages 1 based fixed bin(17,0) array level 2 in structure "all_chain" dcl 6-23 in procedure "rdm_message_mark_mgr_" ref 837 838 messages 1 based fixed bin(17,0) array level 2 in structure "marked_chain" dcl 6-30 in procedure "rdm_message_mark_mgr_" set ref 340* 366* 383 1046 1051* messages 1 based fixed bin(17,0) array level 2 in structure "message_chain" dcl 6-7 in procedure "rdm_message_mark_mgr_" set ref 366 775* 781 864 866 876 886 887 894 895 938* 942 981 messages 1 based fixed bin(17,0) array level 2 in structure "marked_as_original_chain" dcl 6-37 in procedure "rdm_message_mark_mgr_" set ref 383* 421* min builtin function dcl 198 ref 504 ms_matched 000705 automatic bit(1) dcl 960 set ref 986* 994* 994 996* 996 997 999* 1005* 1008 msg_spec based structure level 1 dcl 123 set ref 651 651 654* msg_spec_lth 000100 automatic fixed bin(21,0) dcl 96 set ref 272* 297* 443* 474 475 485 486 492 499 500 504 533 538 543 550 1092 1092 1094 1094 msg_spec_n_strings 000516 automatic fixed bin(17,0) dcl 144 set ref 650* 651 651 654 754 793 814 844 988 1011 1028 msg_spec_ptr 000514 automatic pointer dcl 143 set ref 651 651 651* 654 655 655 656 657 685 695 702 709 716 723 754 791 792 794 795 796 801 802 803 830 843 844 845 848 849 944 963 964 964 965 968 977 978 983 983 989 989 992 994 995 1002 1002 1005 1011 1017 1017 1021 1024 1026 msg_spec_str based char packed unaligned dcl 95 set ref 475 485 492 499 504 538 543 550 1092* 1094* msg_spec_str_ptr 000102 automatic pointer dcl 97 set ref 271* 296* 442* 475 485 492 499 504 538 543 550 1092 1094 msg_type 000104 automatic fixed bin(17,0) dcl 99 set ref 273* 298* 353* 354 355 359* 448* 643 644 1017 1021 1081 1082 n_messages based fixed bin(17,0) level 2 in structure "all_chain" dcl 6-23 in procedure "rdm_message_mark_mgr_" ref 837 n_messages based fixed bin(17,0) level 2 in structure "marked_chain" dcl 6-30 in procedure "rdm_message_mark_mgr_" set ref 314* 339* 363* 380 382 1045 1049 1049* n_messages based fixed bin(17,0) level 2 in structure "undeleted_chain" dcl 6-24 in procedure "rdm_message_mark_mgr_" ref 334 n_messages based fixed bin(17,0) level 2 in structure "marked_as_original_chain" dcl 6-37 in procedure "rdm_message_mark_mgr_" set ref 380* 419 424* n_messages based fixed bin(17,0) level 2 in structure "message_chain" dcl 6-7 in procedure "rdm_message_mark_mgr_" ref 359 363 365 774 861 866 867 875 885 893 935 974 n_tokens 000512 automatic fixed bin(17,0) dcl 118 set ref 436* 469* 573 621 623* 623 624 663 next_message_idx 000710 automatic fixed bin(17,0) dcl 961 set ref 977* 978* 979* 1011* 1014 next_msg_idx 000530 automatic fixed bin(17,0) dcl 159 set ref 715 880* 892* 893 896* next_msg_number 000523 automatic fixed bin(17,0) dcl 158 set ref 713 714 880* 892* 895* ntp 000566 automatic pointer dcl 460 set ref 575* 577 null builtin function dcl 198 ref 627 number_count 000533 automatic fixed bin(17,0) dcl 161 set ref 571* 591* 591 603 number_value 000602 automatic fixed bin(35,0) dcl 463 set ref 492* 494 operator 2 based fixed bin(17,0) level 2 in structure "token" dcl 108 in procedure "rdm_message_mark_mgr_" set ref 480* 685 687 operator 16 based fixed bin(17,0) array level 4 in structure "msg_spec" dcl 123 in procedure "rdm_message_mark_mgr_" set ref 685* 994 995 operator_idx 000611 automatic fixed bin(17,0) dcl 465 set ref 478* 479 480 p_code parameter fixed bin(35,0) dcl 1064 in procedure "no_message" ref 1061 1066 p_code parameter fixed bin(35,0) dcl 1076 in procedure "abort_parse" set ref 1073 1085 1086 1087 1088 1089 1094* 1098 p_message_number parameter fixed bin(17,0) dcl 1042 ref 1039 1046 1051 p_operand_1 parameter fixed bin(35,0) dcl 911 set ref 907 914* 916* 916 918* 918 p_operand_2 parameter fixed bin(35,0) dcl 912 ref 907 914 916 918 p_operator parameter fixed bin(17,0) dcl 910 ref 907 914 916 918 p_type parameter fixed bin(17,0) dcl 619 ref 616 628 prev_msg_idx 000527 automatic fixed bin(17,0) dcl 159 set ref 722 773* 779 781 783* 880* 884* 885 888* prev_msg_number 000522 automatic fixed bin(17,0) dcl 158 set ref 720 721 880* 884* 887* prev_operator 000640 automatic fixed bin(17,0) dcl 641 set ref 661* 669* 671* 673* 678* 687* 759* 761* 764* 803 805* range_count 000534 automatic fixed bin(17,0) dcl 161 set ref 571* 597* 597 609 range_info based structure level 2 dcl 123 rdm_invocation based structure level 1 dcl 3-6 rdm_invocation_ptr 000544 automatic pointer dcl 3-53 set ref 269* 294* 312* 314 325* 328 328 331 331 334 334 334 337 339 340 340 351* 354 355 356 359 363 366 378* 380 380 382 383 383 398* 400* 414* 419 421 424 447* 643 644 645 775* 837 837 838 839 870 938* 989* 1003* 1017 1021 1024 1045 1046 1049 1049 1051 1092 1094 rdm_mailbox_interface_$read_message 000060 constant entry external dcl 189 ref 775 938 1003 rdm_search_utils_$search_message_with_regexp 000062 constant entry external dcl 190 ref 989 regexp_count 000535 automatic fixed bin(17,0) dcl 161 set ref 434* 571* 593* 593 602 650 regexp_idx 000637 automatic fixed bin(17,0) dcl 641 set ref 659* 685 801 802 803 804* 804 report_errors_sw 000536 automatic bit(1) initial dcl 163 set ref 163* 275* 301* 1017 1080 request_entry_sw 000106 automatic bit(1) initial dcl 104 set ref 104* 433* 1016 1066 1098 reset_marked_as_original 000537 automatic bit(1) initial dcl 163 set ref 163* 401* 416* 424 reverse 000540 automatic bit(1) initial dcl 163 set ref 163* 449* sci_ptr 2 based pointer level 2 dcl 3-6 set ref 328* 331* 334* 337* 359* 839* 1017* 1021* 1024* 1092* 1094* search_direction 5 based fixed bin(17,0) level 3 dcl 123 set ref 657* 695* 702* 709* 716* 723* 795* 843 845* 944* 964* 964 968* 977 978 search_file_$silent 000064 constant entry external dcl 192 ref 556 search_start 4 based fixed bin(17,0) level 3 dcl 123 set ref 656* 754* 794* 963 965 seen 12(04) based bit(1) level 3 packed packed unaligned dcl 2-15 ref 777 941 1005 seen_only_sw 3 based bit(1) level 3 packed packed unaligned dcl 123 set ref 791* 1002 1005 single_message 2 based bit(1) level 3 dcl 123 set ref 830* 1017 1026 ssu_$abort_line 000066 constant entry external dcl 195 ref 328 331 334 337 359 839 1017 1021 1024 1092 1094 str_len 14 based fixed bin(21,0) array level 4 dcl 123 set ref 802* 989* str_lth 6 based fixed bin(21,0) level 2 dcl 108 set ref 443* 552* 556* 802 str_ptr 4 based pointer level 2 in structure "token" dcl 108 in procedure "rdm_message_mark_mgr_" set ref 442* 550* 556* 627* 801 str_ptr 12 based pointer array level 4 in structure "msg_spec" dcl 123 in procedure "rdm_message_mark_mgr_" set ref 801* 989* string_info 4 based structure level 2 dcl 123 strings 10 based structure array level 3 dcl 123 substr builtin function dcl 198 ref 475 485 492 499 504 538 543 550 switches 3 based structure level 2 dcl 123 this_matched 000706 automatic bit(1) dcl 960 set ref 989* 992* 992 994 996 999 token based structure level 1 dcl 108 set ref 626* token_array 000110 automatic structure array level 1 dcl 115 set ref 435 467 574 575 624 664 token_idx 000636 automatic fixed bin(17,0) dcl 641 in procedure "make_msg_spec" set ref 663* 664* token_idx 000610 automatic fixed bin(17,0) dcl 465 in procedure "parse_string" set ref 573* 574 575* tp 000510 automatic pointer dcl 117 set ref 442 443 444 480 494 527 550 552 556 556 574* 577 591 593 595 597 624* 626 627 628 664* 666 669 671 676 685 685 687 687 687 690 691 698 705 712 719 726 729 732 735 738 741 744 747 768 771 791 792 800 801 802 translate builtin function dcl 198 ref 506 type based fixed bin(17,0) level 2 dcl 108 set ref 577 577 591 593 595 597 628* 666 676 685 687 687 690 768 800 type_str 000763 automatic varying char(32) dcl 1078 set ref 1081* 1082* 1083* 1092* undeleted 14 based pointer level 4 dcl 3-6 ref 334 355 644 undeleted_chain based structure level 1 dcl 6-24 unseen_only_sw 3(01) based bit(1) level 3 packed packed unaligned dcl 123 set ref 792* 1002 unspec builtin function dcl 198 set ref 626* 654* value 1 based fixed bin(35,0) level 2 dcl 108 set ref 444* 494* 527* 669* 671* 691 698 705 712 719 726 729 732 735 738 741 744 747 771 791 792 verify builtin function dcl 198 ref 485 499 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. CANT_HAPPEN_STATE internal static fixed bin(17,0) initial dcl 252 COLON_OPERATOR internal static fixed bin(17,0) initial dcl 219 DEFAULT_INCLUDE_SELF internal static bit(2) initial dcl 3-60 INCLUDE_SELF internal static bit(2) initial dcl 3-60 INVALID_SPEC_STATE internal static fixed bin(17,0) initial dcl 252 MAILBOX_VERSION_2 internal static char(8) initial packed unaligned dcl 1-28 MESSAGE_ADDRESS_LIST_USER_FIELD internal static fixed bin(17,0) initial dcl 2-174 MESSAGE_BIT_STRING_BODY_SECTION internal static fixed bin(17,0) initial dcl 2-285 MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 2-318 MESSAGE_DATE_USER_FIELD internal static fixed bin(17,0) initial dcl 2-174 MESSAGE_ENVELOPE_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 2-79 MESSAGE_INTEGER_USER_FIELD internal static fixed bin(17,0) initial dcl 2-174 MESSAGE_PREFORMATTED_BODY_SECTION internal static fixed bin(17,0) initial dcl 2-285 MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 2-117 MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 2-144 MESSAGE_REFERENCES_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 2-227 MESSAGE_REFERENCE_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 2-253 MESSAGE_TEXT_USER_FIELD internal static fixed bin(17,0) initial dcl 2-174 MESSAGE_TRACE_VERSION_2 internal static char(8) initial packed unaligned dcl 2-103 MESSAGE_USER_FIELDS_LIST_VERSION_2 internal static char(8) initial packed unaligned dcl 2-158 MESSAGE_USER_FIELD_PARAMETER_VERSION_2 internal static char(8) initial packed unaligned dcl 2-213 MESSAGE_VERSION_2 internal static char(8) initial packed unaligned dcl 2-49 NO_INCLUDE_SELF internal static bit(2) initial dcl 3-60 OTHER_MAILBOX internal static fixed bin(17,0) initial dcl 1-37 RDM_INVOCATION internal static char(8) initial packed unaligned dcl 3-51 SAVEBOX internal static fixed bin(17,0) initial dcl 1-37 USER_DEFAULT_MAILBOX internal static fixed bin(17,0) initial dcl 1-37 USER_LOGBOX internal static fixed bin(17,0) initial dcl 1-37 deleted_chain based structure level 1 dcl 6-25 mailbox based structure level 1 dcl 1-6 mailbox_n_messages automatic fixed bin(17,0) dcl 1-32 mailbox_ptr automatic pointer dcl 1-30 message_address_list_user_field based structure level 1 dcl 2-190 message_bit_string_body_section based structure level 1 dcl 2-301 message_bit_string_body_section_bit_string based bit packed unaligned dcl 2-307 message_body_section_parameter based structure level 1 dcl 2-313 message_body_section_parameter_ptr automatic pointer dcl 2-320 message_body_section_ptr automatic pointer dcl 2-280 message_date_user_field based structure level 1 dcl 2-195 message_envelope_parameter based structure level 1 dcl 2-74 message_envelope_parameter_ptr automatic pointer dcl 2-81 message_envelope_ptr automatic pointer dcl 2-69 message_integer_user_field based structure level 1 dcl 2-200 message_list based structure level 1 dcl 4-13 message_list_n_messages automatic fixed bin(17,0) dcl 4-25 message_n_body_sections automatic fixed bin(17,0) dcl 2-55 message_n_redistributions automatic fixed bin(17,0) dcl 2-55 message_n_user_fields automatic fixed bin(17,0) dcl 2-55 message_preformatted_body_section based structure level 1 dcl 2-292 message_preformatted_body_section_text based char packed unaligned dcl 2-298 message_redistribution_comment based char packed unaligned dcl 2-131 message_redistribution_parameter based structure level 1 dcl 2-139 message_redistribution_parameter_ptr automatic pointer dcl 2-146 message_redistribution_ptr automatic pointer dcl 2-134 message_redistributions_list based structure level 1 dcl 2-109 message_reference_parameter based structure level 1 dcl 2-248 message_reference_parameter_ptr automatic pointer dcl 2-255 message_reference_ptr automatic pointer dcl 2-243 message_reference_subject based char packed unaligned dcl 2-240 message_references_list based structure level 1 dcl 2-219 message_references_list_n_references automatic fixed bin(17,0) dcl 2-55 message_references_list_ptr automatic pointer dcl 2-229 message_subject based char packed unaligned dcl 2-51 message_text_field_ptr automatic pointer dcl 2-270 message_text_field_text based char packed unaligned dcl 2-268 message_text_user_field based structure level 1 dcl 2-183 message_text_user_field_text based char packed unaligned dcl 2-187 message_trace based structure level 1 dcl 2-87 message_trace_n_relays automatic fixed bin(17,0) dcl 2-55 message_trace_ptr automatic pointer dcl 2-105 message_user_field_parameter based structure level 1 dcl 2-208 message_user_field_parameter_ptr automatic pointer dcl 2-215 message_user_field_ptr automatic pointer dcl 2-169 message_user_fields_list based structure level 1 dcl 2-150 rdm_area based area(1024) dcl 3-55 NAMES DECLARED BY EXPLICIT CONTEXT. ERROR_RETURN_FROM_VALIDATE_MESSAGE_SPECIFIER 001711 constant label dcl 1105 ref 1067 1100 GOOD_KEYWORD 002242 constant label dcl 523 ref 509 516 REGEXP_LOOP 002307 constant label dcl 533 ref 546 REMARK_ORIGINAL_MESSAGES 001554 constant label dcl 419 set ref 403 abort_parse 004727 constant entry internal dcl 1073 ref 490 521 535 540 559 562 588 603 605 609 621 652 682 750 833 940 1004 1026 1028 1030 add_message_to_marked_chain 004663 constant entry internal dcl 1039 ref 421 1010 apply_number_operator 004105 constant entry internal dcl 907 ref 669 671 759 764 clear_marked_messages 001142 constant entry external dcl 309 ref 400 clear_original_messages 001510 constant entry external dcl 395 do_request 001610 constant entry external dcl 430 get_message_numbers_and_indices 003752 constant entry internal dcl 856 ref 648 get_token 002654 constant entry internal dcl 616 ref 437 438 441 445 470 479 493 523 526 549 566 make_msg_spec 002706 constant entry internal dcl 636 ref 279 451 mark_all_messages 001337 constant entry external dcl 348 mark_current_message 001164 constant entry external dcl 322 mark_messages 001031 constant entry external dcl 266 mark_messages 004244 constant entry internal dcl 957 in procedure "rdm_message_mark_mgr_" ref 281 452 mark_original_messages 001452 constant entry external dcl 375 no_message 004717 constant entry internal dcl 1061 ref 692 699 706 713 720 769 779 810 815 948 parse_string 001712 constant entry internal dcl 457 ref 277 303 rdm_message_mark_mgr_ 001014 constant entry external dcl 70 remark_original_messages 001537 constant entry external dcl 411 search_message 004135 constant entry internal dcl 926 ref 726 729 732 735 738 741 744 747 validate_message_specifier 001077 constant entry external dcl 291 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 6604 6674 6120 6614 Length 7310 6120 70 377 464 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME rdm_message_mark_mgr_ 856 external procedure is an external procedure. parse_string internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. get_token internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. make_msg_spec internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. get_message_numbers_and_indices internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. apply_number_operator internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. search_message internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. mark_messages internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. add_message_to_marked_chain internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. no_message internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. abort_parse internal procedure shares stack frame of external procedure rdm_message_mark_mgr_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME rdm_message_mark_mgr_ 000100 msg_spec_lth rdm_message_mark_mgr_ 000102 msg_spec_str_ptr rdm_message_mark_mgr_ 000104 msg_type rdm_message_mark_mgr_ 000105 code rdm_message_mark_mgr_ 000106 request_entry_sw rdm_message_mark_mgr_ 000110 token_array rdm_message_mark_mgr_ 000510 tp rdm_message_mark_mgr_ 000512 n_tokens rdm_message_mark_mgr_ 000513 max_tokens rdm_message_mark_mgr_ 000514 msg_spec_ptr rdm_message_mark_mgr_ 000516 msg_spec_n_strings rdm_message_mark_mgr_ 000517 first_msg_number rdm_message_mark_mgr_ 000520 last_msg_number rdm_message_mark_mgr_ 000521 current_msg_number rdm_message_mark_mgr_ 000522 prev_msg_number rdm_message_mark_mgr_ 000523 next_msg_number rdm_message_mark_mgr_ 000524 first_msg_idx rdm_message_mark_mgr_ 000525 last_msg_idx rdm_message_mark_mgr_ 000526 current_msg_idx rdm_message_mark_mgr_ 000527 prev_msg_idx rdm_message_mark_mgr_ 000530 next_msg_idx rdm_message_mark_mgr_ 000531 message_idx rdm_message_mark_mgr_ 000532 keyword_count rdm_message_mark_mgr_ 000533 number_count rdm_message_mark_mgr_ 000534 range_count rdm_message_mark_mgr_ 000535 regexp_count rdm_message_mark_mgr_ 000536 report_errors_sw rdm_message_mark_mgr_ 000537 reset_marked_as_original rdm_message_mark_mgr_ 000540 reverse rdm_message_mark_mgr_ 000542 message_ptr rdm_message_mark_mgr_ 000544 rdm_invocation_ptr rdm_message_mark_mgr_ 000546 message_chain_ptr rdm_message_mark_mgr_ 000566 ntp parse_string 000570 keyword parse_string 000601 char1 parse_string 000602 number_value parse_string 000603 code parse_string 000604 idx parse_string 000605 jdx parse_string 000606 i1 parse_string 000607 i2 parse_string 000610 token_idx parse_string 000611 operator_idx parse_string 000630 low_range_found make_msg_spec 000631 high_range_found make_msg_spec 000632 keyword_msg_number make_msg_spec 000633 low_range make_msg_spec 000634 high_range make_msg_spec 000635 code make_msg_spec 000636 token_idx make_msg_spec 000637 regexp_idx make_msg_spec 000640 prev_operator make_msg_spec 000641 bad_msg_number make_msg_spec 000642 keyword_msg_idx make_msg_spec 000652 idx get_message_numbers_and_indices 000672 increment search_message 000673 message_idx search_message 000704 continue_searching mark_messages 000705 ms_matched mark_messages 000706 this_matched mark_messages 000707 first_message_idx mark_messages 000710 next_message_idx mark_messages 000711 message_idx mark_messages 000712 message_number mark_messages 000713 match_count mark_messages 000714 idx mark_messages 000724 idx add_message_to_marked_chain 000742 message abort_parse 000763 type_str abort_parse THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_e_as alloc_char_temp call_ext_in call_ext_out_desc call_ext_out return_mac shorten_stack ext_entry ext_entry_desc any_to_any_truncate_ THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. cu_$grow_stack_frame rdm_mailbox_interface_$read_message rdm_search_utils_$search_message_with_regexp search_file_$silent ssu_$abort_line THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. emf_et_$msg_spec_bad_expr emf_et_$msg_spec_bad_keyword emf_et_$msg_spec_bad_number emf_et_$msg_spec_bad_oper emf_et_$msg_spec_bad_range emf_et_$msg_spec_bad_regexp emf_et_$msg_spec_invalid emf_et_$msg_spec_missing_delim emf_et_$msg_spec_mixed emf_et_$msg_spec_null emf_et_$msg_spec_too_complex emf_et_$no_current_message emf_et_$no_matching_messages emf_et_$no_messages emf_et_$no_messages_selected emf_et_$no_next_message emf_et_$no_previous_message emf_et_$no_such_message error_table_$nomatch LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 104 001005 163 001006 70 001013 73 001022 266 001023 269 001052 271 001055 272 001061 273 001063 275 001065 277 001067 279 001070 281 001071 283 001072 285 001074 291 001075 294 001120 296 001123 297 001127 298 001131 299 001133 301 001134 303 001135 305 001136 309 001137 312 001153 314 001156 316 001157 322 001160 325 001177 328 001202 331 001225 334 001256 337 001301 339 001326 340 001331 342 001334 348 001335 351 001352 353 001355 354 001357 355 001364 356 001371 359 001373 363 001426 365 001431 366 001441 367 001445 369 001447 375 001450 378 001463 380 001466 382 001470 383 001477 384 001503 386 001505 395 001506 398 001521 400 001524 401 001532 403 001534 411 001535 414 001550 416 001553 419 001554 421 001565 422 001574 424 001576 426 001602 430 001603 433 001623 434 001625 435 001626 436 001630 437 001631 438 001633 441 001650 442 001652 443 001664 444 001670 445 001672 447 001675 448 001700 449 001702 451 001706 452 001707 453 001710 1105 001711 457 001712 467 001713 469 001715 470 001716 472 001720 474 001722 475 001725 477 001732 478 001744 479 001745 480 001753 481 001756 482 001757 484 001760 485 001771 486 002011 488 002017 490 002021 492 002033 493 002052 494 002054 495 002057 496 002061 498 002062 499 002073 500 002113 502 002121 504 002123 506 002136 508 002154 509 002163 511 002173 512 002201 514 002217 516 002226 518 002227 519 002231 521 002233 523 002242 526 002271 527 002273 528 002276 529 002300 531 002301 532 002304 533 002307 535 002312 538 002321 540 002341 543 002351 545 002363 546 002365 549 002366 550 002370 552 002375 554 002403 556 002405 557 002444 559 002451 560 002455 562 002456 564 002465 566 002466 571 002470 573 002474 574 002505 575 002510 577 002512 579 002517 580 002520 581 002526 582 002534 583 002542 584 002550 585 002556 586 002564 588 002567 591 002571 593 002576 595 002602 597 002606 600 002611 602 002613 603 002615 605 002627 609 002641 612 002653 616 002654 621 002656 623 002670 624 002671 626 002675 627 002700 628 002702 630 002705 636 002706 643 002707 644 002716 645 002724 648 002727 650 002730 651 002732 652 002750 654 002761 655 002773 656 002776 657 002777 659 003001 660 003003 661 003005 663 003007 664 003017 666 003022 667 003025 669 003027 671 003044 673 003056 674 003060 676 003061 677 003063 678 003065 679 003067 680 003071 682 003072 683 003101 685 003102 687 003113 690 003122 691 003124 692 003127 693 003140 694 003142 695 003144 696 003147 698 003150 699 003152 700 003163 701 003165 702 003167 703 003172 705 003173 706 003175 707 003206 708 003210 709 003212 710 003215 712 003216 713 003220 714 003231 715 003233 716 003235 717 003240 719 003241 720 003243 721 003254 722 003256 723 003260 724 003263 726 003264 729 003271 732 003276 735 003303 738 003310 741 003320 744 003330 747 003340 750 003350 754 003357 758 003365 759 003367 760 003371 761 003373 762 003375 764 003376 766 003400 768 003401 769 003403 771 003416 772 003422 773 003423 774 003424 775 003433 777 003450 778 003456 779 003460 781 003472 783 003474 784 003476 785 003501 786 003505 787 003506 788 003510 789 003512 791 003515 792 003525 793 003533 794 003535 795 003540 796 003542 798 003543 800 003544 801 003546 802 003553 803 003557 804 003565 805 003566 807 003570 810 003572 813 003605 814 003607 815 003611 816 003622 817 003625 820 003626 821 003630 822 003632 825 003634 828 003636 829 003640 830 003642 833 003645 836 003662 837 003664 838 003672 839 003677 843 003733 844 003737 845 003743 848 003745 849 003747 851 003751 856 003752 861 003753 864 003762 865 003765 866 003767 867 003772 870 003774 871 003777 874 004002 875 004003 876 004015 877 004023 880 004025 884 004034 885 004036 886 004045 887 004051 888 004052 890 004054 892 004057 893 004061 894 004073 895 004077 896 004100 898 004102 901 004104 907 004105 914 004107 916 004115 918 004126 920 004134 926 004135 931 004137 933 004145 935 004147 938 004157 940 004174 941 004205 942 004220 943 004223 944 004225 945 004230 947 004231 948 004234 950 004243 957 004244 963 004245 964 004250 965 004252 966 004254 968 004255 969 004257 972 004261 974 004262 977 004270 978 004300 979 004306 981 004307 983 004312 985 004316 986 004320 988 004321 989 004333 992 004355 994 004365 995 004374 996 004376 997 004401 998 004403 999 004404 1000 004407 1002 004411 1003 004415 1004 004432 1005 004436 1008 004451 1009 004453 1010 004454 1011 004456 1014 004464 1016 004467 1017 004473 1021 004536 1024 004573 1026 004626 1028 004641 1030 004653 1033 004662 1039 004663 1045 004665 1046 004675 1047 004703 1049 004705 1051 004712 1053 004716 1061 004717 1066 004721 1067 004726 1073 004727 1080 004731 1081 004733 1082 004744 1083 004753 1085 004754 1086 004766 1087 004776 1088 005006 1089 005016 1090 005026 1092 005027 1094 005067 1095 005122 1098 005123 1100 005130 1103 005131 ----------------------------------------------------------- Historical Background This edition of the Multics software materials and documentation is provided and donated to Massachusetts Institute of Technology by Group BULL including BULL HN Information Systems Inc. as a contribution to computer science knowledge. This donation is made also to give evidence of the common contributions of Massachusetts Institute of Technology, Bell Laboratories, General Electric, Honeywell Information Systems Inc., Honeywell BULL Inc., Groupe BULL and BULL HN Information Systems Inc. to the development of this operating system. Multics development was initiated by Massachusetts Institute of Technology Project MAC (1963-1970), renamed the MIT Laboratory for Computer Science and Artificial Intelligence in the mid 1970s, under the leadership of Professor Fernando Jose Corbato. Users consider that Multics provided the best software architecture for managing computer hardware properly and for executing programs. Many subsequent operating systems incorporated Multics principles. Multics was distributed in 1975 to 2000 by Group Bull in Europe , and in the U.S. by Bull HN Information Systems Inc., as successor in interest by change in name only to Honeywell Bull Inc. and Honeywell Information Systems Inc. . ----------------------------------------------------------- Permission to use, copy, modify, and distribute these programs and their documentation for any purpose and without fee is hereby granted,provided that the below copyright notice and historical background appear in all copies and that both the copyright notice and historical background and this permission notice appear in supporting documentation, and that the names of MIT, HIS, BULL or BULL HN not be used in advertising or publicity pertaining to distribution of the programs without specific prior written permission. Copyright 1972 by Massachusetts Institute of Technology and Honeywell Information Systems Inc. Copyright 2006 by BULL HN Information Systems Inc. Copyright 2006 by Bull SAS All Rights Reserved