COMPILATION LISTING OF SEGMENT mlsys_format_ Compiled by: Multics PL/I Compiler, Release 29, of July 28, 1986 Compiled at: Honeywell Bull, Phx. Az., Sys-M Compiled on: 04/26/87 1555.0 mst Sun Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1983 * 4* * * 5* *********************************************************** */ 6 7 8 9 /****^ HISTORY COMMENTS: 10* 1) change(83-07-01,Palter), approve(), audit(), install(): 11* Pre-hcom comments: 12* Created: July 1983 by G. Palter 13* Modified: March 1984 by G. Palter to fix the following mail system errors: 14* #0426 -- when formatting an address comment, if the comment has to be quoted, the formatter leaves off the closing 15* quote character 16* #0434 -- when a message is mailed to a forum, the mail system formats the header using the brief formatting mode. 17* As a result, most of the header fields, including user-defined fields, are omitted from the copy in the forum 18* making replies, etc. difficult 19* #0436 -- if a forum meeting is not found in the "forum" search list, the mail system will treat it as a version 1 20* forum in the working directory 21* 2) change(87-04-09,Lippard), approve(86-11-24,MCR7576), 22* audit(87-04-21,Dickson), install(87-04-26,MR12.1-1026): 23* Modified to use time_names.incl.pl1 instead of time_zones_.incl.pl1. 24* END HISTORY COMMENTS */ 25 26 27 /* format: off */ 28 29 /* Mail System Utilities which convert the internal form of various mail system objects (messages, addresses, etc.) into 30* their printed representations */ 31 32 /* format: on,style4,delnl,insnl,ifthenstmt,ifthen,^indcomtxt */ 33 34 35 mlsys_format_: 36 procedure (); 37 38 return; /* not an entrypoint */ 39 40 41 /* Parameters */ 42 43 dcl P_fieldname character (*) varying parameter; /* name of the field being printed */ 44 45 dcl P_line_length fixed binary parameter; /* line length for folding; -1 => no folding */ 46 47 dcl P_buffer_ptr pointer parameter; /* -> user's output buffer for formatting entries */ 48 dcl P_buffer_size fixed binary (21) parameter; /* size of user's buffer */ 49 dcl P_buffer_used fixed binary (21) parameter; /* amount of said buffer in use at any time (input/output) */ 50 51 dcl P_output_switch pointer parameter; /* -> IOCB on which to print results */ 52 53 dcl P_code fixed binary (35) parameter; 54 55 dcl P_message_ptr pointer parameter; /* *_message, format_message_canonical_form, 56* format_message_for_*, format_canon_redistributed_msg: 57* -> the message to be formatted or printed; 58* *_message_envelope, *_message_header, 59* *_redistributions_list, *_message_body: -> message 60* containing the specified part to be printed/formatted */ 61 62 dcl P_format_message_options_ptr pointer parameter; /* format_message, print_message, 63* format_message_canonical_form: -> options describing how to 64* format the message */ 65 66 dcl P_buffer_size_words fixed binary (19) parameter; /* format_message_for_mailbox, format_canon_redistributed_msg: 67* size of available buffer in words */ 68 dcl P_buffer_used_words fixed binary (19) parameter; /* format_message_for_mailbox, format_canon_redistributed_msg: 69* set to # of words occupied by message text and data 70* structures */ 71 72 dcl P_original_mf_ptr pointer parameter; /* format_canon_redistributed_msg: -> mail_format structure of 73* original message */ 74 dcl P_original_mf_extension_ptr pointer parameter; /* format_canon_redistributed_msg: -> mf_extension strucutre 75* of original message */ 76 77 dcl P_formatting_mode fixed binary parameter; /* *_message_envelope, *_message_header, 78* *_redistributions_list: controls how the specified part 79* will be printed/formatted */ 80 81 dcl P_message_trace_ptr pointer parameter; /* *_message_trace: -> the message trace to format/print */ 82 dcl P_format_redistribution_trace bit (1) aligned parameter; 83 /* *_message_trace: ON => include "Redistributed-" prefix in 84* the trace field names */ 85 86 dcl P_access_class bit (72) aligned parameter; /* *_access_class_field: the access class to format/print */ 87 88 dcl P_address_ptr pointer parameter; /* *_address_field: -> the address to format/print */ 89 90 dcl P_address_list_ptr pointer parameter; /* *_address_list_field: -> address list to format/print */ 91 92 dcl P_date_time fixed binary (71) parameter; /* *_date_time_field: the date/time to format/print */ 93 dcl P_include_dow bit (1) aligned parameter; /* *_date_time_field: ON => include day of week in output */ 94 95 dcl P_message_id bit (72) aligned parameter; /* *_message_id_field: the Message-ID to format/print */ 96 97 dcl P_message_references_list_ptr pointer parameter; /* *_references_list_field: -> the list of references to 98* format/print */ 99 100 dcl P_text character (*) parameter; /* *_text_field: the text to format/print */ 101 dcl P_multiline_text bit (1) aligned parameter; /* *_text_field: ON => format the text as a multiline field */ 102 103 dcl P_message_body_section_parameter_ptr pointer parameter;/* *_body_section: -> the body section to format/print */ 104 105 dcl P_address_string character (*) varying parameter; /* format_address_for_ism: the actual address on the foreign 106* system to which the message will be sent */ 107 dcl P_address_route_ptr pointer parameter; /* format_address_for_ism: -> the route to be used to send the 108* message */ 109 dcl P_user_name character (*) varying parameter; /* format_address_for_ism: set to the "user name" to be 110* supplied to the inter-system mailer */ 111 dcl P_host_name character (*) varying parameter; /* format_address_for_ism: set to the host name to be supplied 112* to the inter-system mailer */ 113 /**** format: indcomtxt */ 114 115 116 /* Local copies of parameters */ 117 118 dcl buffer character (buffer_size) unaligned based (buffer_ptr); 119 dcl buffer_ptr pointer; 120 dcl (buffer_size, buffer_used) fixed binary (21); 121 122 dcl output_switch pointer; 123 124 dcl original_mf_ptr pointer; 125 dcl original_mf_extension_ptr pointer; 126 127 dcl code fixed binary (35); 128 129 130 /* Remaining declarations */ 131 132 dcl printing bit (1) aligned; /* ON => print the results; OFF => returns them to caller */ 133 134 /* format: ^indcomtxt */ 135 dcl 1 ifo aligned, /* internal formatting options */ 136 2 buffer_overflow entry () variable, /* ... procedure to be invoked when output buffer overflows */ 137 2 line_length fixed binary, /* ... line length to use for folding (if enabled) */ 138 2 indentation fixed binary, /* ... continuation lines are indented by this # of spaces */ 139 2 flags aligned, 140 3 rfc822_format bit (1), /* ... ON => use RFC822 formatting rules; OFF => use ours */ 141 3 forum_format bit (1), /* ... ON => formatting for inclusion in a forum */ 142 3 include_local_system_name bit (1), /* ... ON => put local system name on all local addresses */ 143 3 dont_canonicalize_system_names bit (1), /* ... ON => don't convert system names to canonical form */ 144 3 dont_show_logsave bit (1), /* ... ON => don't use {logbox} / {save path} format */ 145 3 wrap bit (1), /* ... ON => fold overly long lines to the requested length */ 146 3 count_lines bit (1), /* ... ON => count the # of lines formatted/printed */ 147 3 include_message_id bit (1), /* ... ON => always include the Message-ID */ 148 3 include_trace bit (1), /* ... ON => always include message/redistribution traces */ 149 3 reverse_redistributions bit (1), /* ... ON => put redistributions before envelope/header and 150* in reverse chronological order (newest first) */ 151 3 use_canonical_fieldnames bit (1), /* ... ON => use canonical names of cc/bcc fields */ 152 3 build_mf_extension bit (1), /* ... ON => construct list of text fragments to be examined 153* by subsequent string searches */ 154 3 include_forum_suffix bit (1); /* ... ON => include suffix of forum meeting when formatting 155* addresses as it will have to be parsed later */ 156 157 dcl 1 mail_format_header aligned like mail_format.header based (mail_format_ptr); 158 dcl mail_format_header_lth fixed binary (21); 159 160 dcl original_mf_text character (original_mf_ptr -> mail_format.text_len) unaligned 161 based (addr (original_mf_ptr -> mail_format.text)); 162 dcl new_mf_extension_ptr pointer; 163 164 dcl last_column_used fixed binary; /* last character of formatted text is in this column */ 165 dcl line_count fixed binary; /* # of lines printed/formatted */ 166 167 dcl local_buffer character (256); /* buffer used by the print_* entrypoints */ 168 169 dcl full_fieldname character (64) varying; 170 171 dcl need_separator bit (1) aligned; 172 173 dcl (idx, jdx) fixed binary; 174 175 /* format: off */ 176 dcl (CANONICAL_BCC_FIELDNAME initial ("Bcc"), 177 CANONICAL_CC_FIELDNAME initial ("Cc"), 178 RESENT_PREFIX initial ("Resent-"), 179 RECIPIENTS_FIELDNAME initial ("Recipients"), 180 COMMENT_FIELDNAME initial ("Comment"), 181 LAST_RESENT_FIELDNAME initial ("Last-Resent"), 182 LAST_REDISTRIBUTED_FIELDNAME initial ("Last-Redistributed")) 183 character (32) varying static options (constant); 184 /* format: on */ 185 186 dcl MAX_MULTILINE_INDENTATION fixed binary static options (constant) initial (15); 187 dcl STANDARD_MULTILINE_INDENTATION fixed binary static options (constant) initial (10); 188 dcl MULTILINE_BLANK_LINE_DESIGNATOR character (2) static options (constant) initial ("--"); 189 190 dcl STACK_EXTENSION fixed binary (18) static options (constant) initial (128); 191 192 dcl FIELDNAME_SUFFIX character (3) static options (constant) initial (": "); 193 194 dcl SPACES character (32) static options (constant) initial ((32)" "); 195 196 dcl SINGLE_WIDTH_CHARACTERS character (95) static options (constant) 197 initial (" !""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"); 198 199 dcl ONE_MINUTE fixed binary (71) static options (constant) initial (60000000); 200 dcl ONE_HOUR fixed binary static options (constant) initial (60); 201 202 /* format: off */ 203 dcl (UPPERCASE initial ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), 204 LOWERCASE initial ("abcdefghijklmnopqrstuvwxyz")) 205 character (26) static options (constant); 206 207 dcl MONTHS (12) character (12) varying static options (constant) initial ( 208 "January", "February", "March", "April", "May", "June", 209 "July", "August", "September", "October", "November", "December"); 210 dcl RFC822_MONTHS (12) character (3) static options (constant) initial ( 211 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 212 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"); 213 214 dcl DAY_OF_WEEKS (7) character (12) varying static options (constant) initial ( 215 "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"); 216 dcl RFC822_DAY_OF_WEEKS (7) character (3) static options (constant) initial ( 217 "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"); 218 219 dcl RFC822_ZONES (35) character (4) static options (constant) initial ( 220 "GMT", "UT", "EST", "EDT", "CST", "CDT", "MST", "MDT", "PST", "PDT", 221 "Z", "A", "B", "C", "D", "E", "F", "G", "H", "I", 222 "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", 223 "U", "V", "W", "X", "Y"); 224 dcl RFC822_ZONE_OFFSETS (35) fixed binary static options (constant) initial ( 225 0, 0, -300, -240, -360, -300, -420, -360, -480, -420, 226 0, -60, -120, -180, -240, -300, -360, -420, -480, -540, 227 -600, -660, -720, 60, 120, 180, 240, 300, 360, 420, 228 480, 540, 600, 660, 720); 229 /* format: on */ 230 231 dcl time_data_$time_delta fixed binary (71) external; 232 233 dcl sys_info$access_class_ceiling bit (72) aligned external; 234 235 dcl iox_$user_output pointer external; 236 237 /* format: off */ 238 dcl (error_table_$bad_subr_arg, error_table_$inconsistent, error_table_$smallarg, error_table_$unimplemented_version, 239 mlsys_et_$foreign_address_too_long, mlsys_et_$not_address_list, mlsys_et_$not_message, mlsys_et_$not_message_trace, 240 mlsys_et_$unknown_body_section_type) 241 fixed binary (35) external; 242 /* format: on */ 243 244 dcl aim_check_$equal entry (bit (72) aligned, bit (72) aligned) returns (bit (1) aligned); 245 dcl convert_authorization_$to_string_short entry (bit (72) aligned, character (*), fixed binary (35)); 246 dcl cu_$grow_stack_frame entry (fixed binary (18), pointer, fixed binary (35)); 247 dcl decode_clock_value_$date_time 248 entry (fixed binary (71), fixed binary, fixed binary, fixed binary, fixed binary, fixed binary, fixed binary, 249 fixed binary (71), fixed binary, character (3), fixed binary (35)); 250 dcl get_authorization_ entry () returns (bit (72) aligned); 251 dcl get_line_length_$switch entry (pointer, fixed binary (35)) returns (fixed binary); 252 dcl ioa_$rsnnl entry () options (variable); 253 dcl iox_$put_chars entry (pointer, pointer, fixed binary (21), fixed binary (35)); 254 dcl mail_system_$compare_addresses entry (pointer, pointer, fixed binary (35)) returns (bit (1) aligned); 255 dcl mail_system_$decode_message_id 256 entry (bit (72) aligned, character (*) varying, character (256) varying, bit (1) aligned, fixed binary (35)); 257 dcl mail_system_$expand_list_address entry (pointer, character (8), pointer, fixed binary (35)); 258 dcl mail_system_$get_address_comment entry (pointer, character (*) varying, fixed binary (35)); 259 dcl mail_system_$get_address_name entry (pointer, character (*) varying, fixed binary (35)); 260 dcl mail_system_$get_address_pathname entry (pointer, character (*), character (*), character (*), fixed binary (35)); 261 dcl mail_system_$get_address_route entry (pointer, character (8), pointer, fixed binary (35)); 262 dcl mail_system_$get_address_string entry (pointer, character (*) varying, fixed binary (35)); 263 dcl mail_system_$get_address_system entry (pointer, character (256) varying, fixed binary (35)); 264 dcl mail_system_$get_address_type entry (pointer, fixed binary, fixed binary (35)); 265 dcl mail_system_$get_named_group_display_flag entry (pointer, bit (1) aligned, fixed binary (35)); 266 dcl mail_system_$get_user_field_name entry (bit (36) aligned, character (*) varying, fixed binary (35)); 267 dcl mlsys_misc_utils_$get_best_address_name entry (pointer, character (*) varying, fixed binary (35)); 268 dcl mlsys_nit_interface_$canonicalize_system_name entry (character (256) varying) returns (character (256) varying); 269 dcl mlsys_nit_interface_$get_local_system_name entry () returns (character (256) varying); 270 dcl mlsys_nit_interface_$is_local_system entry (character (256) varying) returns (bit (1) aligned); 271 dcl pathname_ entry (character (*), character (*)) returns (character (168)); 272 dcl pathname_$component entry (character (*), character (*), character (*)) returns (character (194)); 273 274 dcl (abs, addcharno, addr, addwordno, after, binary, bit, clock, convert, currentsize, divide, hbound, index, lbound, 275 length, ltrim, max, maxlength, min, mod, null, reverse, rtrim, search, size, string, substr, translate, unspec, 276 verify) builtin; 277 278 /* Convert a message into its printed representation */ 279 280 format_message: /* ... into the caller's buffer */ 281 entry (P_message_ptr, P_format_message_options_ptr, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 282 283 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 284 buffer_size = P_buffer_size; 285 buffer_used = P_buffer_used; 286 287 printing = "0"b; 288 output_switch = null (); /* shouldn't get used, but ... */ 289 290 ifo.buffer_overflow = report_smallarg; 291 292 go to FORMAT_MESSAGE_COMMON; 293 294 295 print_message: /* ... and print it on the given output switch */ 296 entry (P_message_ptr, P_format_message_options_ptr, P_output_switch, P_code); 297 298 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 299 buffer_size = length (local_buffer); 300 buffer_used = 0; 301 302 printing = "1"b; /* need to know this when we're done formatting */ 303 output_switch = P_output_switch; 304 if output_switch = null () then output_switch = iox_$user_output; 305 306 ifo.buffer_overflow = print_buffer; 307 308 309 FORMAT_MESSAGE_COMMON: 310 message_ptr = P_message_ptr; 311 format_message_options_ptr = P_format_message_options_ptr; 312 313 if message.version ^= MESSAGE_VERSION_2 then do; 314 P_code = mlsys_et_$not_message; 315 return; 316 end; 317 318 if format_message_options.version ^= FORMAT_MESSAGE_OPTIONS_VERSION_1 then do; 319 P_code = error_table_$unimplemented_version; 320 return; 321 end; 322 323 if (format_message_options.envelope_formatting_mode < NONE_FORMATTING_MODE) 324 | (format_message_options.envelope_formatting_mode > LONG_FORMATTING_MODE) 325 | (format_message_options.envelope_formatting_mode = BRIEF_FORMATTING_MODE) 326 | (format_message_options.header_formatting_mode < NONE_FORMATTING_MODE) 327 | (format_message_options.header_formatting_mode > LONG_FORMATTING_MODE) 328 | (format_message_options.redistributions_list_formatting_mode < NONE_FORMATTING_MODE) 329 | (format_message_options.redistributions_list_formatting_mode > LONG_FORMATTING_MODE) then do; 330 P_code = error_table_$bad_subr_arg; 331 return; 332 end; 333 334 if (format_message_options.envelope_formatting_mode = NONE_FORMATTING_MODE) 335 & (format_message_options.header_formatting_mode = NONE_FORMATTING_MODE) 336 & (format_message_options.redistributions_list_formatting_mode = NONE_FORMATTING_MODE) 337 & ^format_message_options.include_body then do; 338 P_code = error_table_$inconsistent; 339 return; 340 end; 341 342 string (ifo.flags) = ""b; /* standard formatting options */ 343 344 ifo.line_length = format_message_options.line_length; 345 346 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 347 ifo.line_length = get_line_length_$switch (output_switch, (0)); 348 349 if printing & (format_message_options.line_length = 0) then ; 350 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 351 P_code = error_table_$bad_subr_arg; 352 return; 353 end; 354 355 ifo.wrap = (ifo.line_length ^= -1); 356 357 need_separator = 358 (format_message_options.envelope_formatting_mode ^= NONE_FORMATTING_MODE) 359 | (format_message_options.header_formatting_mode ^= NONE_FORMATTING_MODE) 360 | (format_message_options.redistributions_list_formatting_mode ^= NONE_FORMATTING_MODE); 361 362 if format_message_options.envelope_formatting_mode ^= NONE_FORMATTING_MODE then 363 call format_envelope (addr (message.envelope), "0"b, message.date_time_created, message.from, 364 format_message_options.envelope_formatting_mode); 365 366 if format_message_options.header_formatting_mode ^= NONE_FORMATTING_MODE then 367 call format_header (format_message_options.header_formatting_mode); 368 369 if format_message_options.redistributions_list_formatting_mode ^= NONE_FORMATTING_MODE then 370 call format_redistributions_list_internal (format_message_options.redistributions_list_formatting_mode); 371 372 if format_message_options.include_body then do; /* and now the body ... */ 373 if need_separator then call add_to_buffer_fixed (NL); 374 call format_body (); 375 end; 376 377 if printing then /* dump the last part */ 378 call print_buffer (); 379 else P_buffer_used = buffer_used; 380 381 P_code = 0; 382 383 return; 384 385 /* Convert a message into its canonical form: The canonical form of a message is the text used by the mail system when it 386* stores the message in a mailbox */ 387 388 format_message_canonical_form: 389 entry (P_message_ptr, P_format_message_options_ptr, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 390 391 message_ptr = P_message_ptr; 392 if message.version ^= MESSAGE_VERSION_2 then do; /* simple validity check */ 393 P_code = mlsys_et_$not_message; 394 return; 395 end; 396 397 format_message_options_ptr = P_format_message_options_ptr; 398 if format_message_options.version ^= FORMAT_MESSAGE_OPTIONS_VERSION_1 then do; 399 P_code = error_table_$unimplemented_version; 400 return; 401 end; 402 403 if format_message_options.line_length ^= -1 then do; 404 P_code = error_table_$bad_subr_arg; /* canonical form is not allowed to have wrapped fields */ 405 return; 406 end; 407 408 if ((format_message_options.envelope_formatting_mode ^= NONE_FORMATTING_MODE) 409 & (format_message_options.envelope_formatting_mode ^= DEFAULT_FORMATTING_MODE)) 410 | ((format_message_options.header_formatting_mode ^= NONE_FORMATTING_MODE) 411 & (format_message_options.header_formatting_mode ^= DEFAULT_FORMATTING_MODE)) 412 | ((format_message_options.redistributions_list_formatting_mode ^= NONE_FORMATTING_MODE) 413 & (format_message_options.redistributions_list_formatting_mode ^= DEFAULT_FORMATTING_MODE)) then do; 414 P_code = error_table_$bad_subr_arg; 415 return; 416 end; 417 418 if (format_message_options.envelope_formatting_mode = NONE_FORMATTING_MODE) 419 & (format_message_options.header_formatting_mode = NONE_FORMATTING_MODE) 420 & (format_message_options.redistributions_list_formatting_mode = NONE_FORMATTING_MODE) 421 & ^format_message_options.include_body then do; 422 P_code = error_table_$inconsistent; 423 return; 424 end; 425 426 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 427 buffer_size = P_buffer_size; 428 buffer_used = P_buffer_used; 429 430 printing = "0"b; 431 output_switch = null (); /* shouldn't get used, but ... */ 432 433 ifo.buffer_overflow = report_smallarg; 434 435 string (ifo.flags) = ""b; /* standard formatting options, but ... */ 436 ifo.rfc822_format = "0"b; /* ... standard Multics format */ 437 ifo.forum_format = "0"b; /* ... never suppress anything important */ 438 ifo.include_message_id = "1"b; /* ... always include the Message-ID fields */ 439 ifo.include_trace = "1"b; /* ... always include the message/redistribution traces */ 440 ifo.reverse_redistributions = "1"b; /* ... put redistributions list first */ 441 ifo.use_canonical_fieldnames = "1"b; /* ... use the canonical names of the cc/bcc fields */ 442 ifo.include_forum_suffix = "1"b; /* ... need to distinguish forum versions later */ 443 444 ifo.line_length = -1; /* ... don't wrap */ 445 446 need_separator = 447 (format_message_options.envelope_formatting_mode ^= NONE_FORMATTING_MODE) 448 | (format_message_options.header_formatting_mode ^= NONE_FORMATTING_MODE) 449 | (format_message_options.redistributions_list_formatting_mode ^= NONE_FORMATTING_MODE); 450 451 if format_message_options.redistributions_list_formatting_mode ^= NONE_FORMATTING_MODE then 452 call format_redistributions_list_internal (format_message_options.redistributions_list_formatting_mode); 453 454 if format_message_options.envelope_formatting_mode ^= NONE_FORMATTING_MODE then 455 call format_envelope (addr (message.envelope), "0"b, message.date_time_created, message.from, 456 format_message_options.envelope_formatting_mode); 457 458 if format_message_options.header_formatting_mode ^= NONE_FORMATTING_MODE then 459 call format_header (format_message_options.header_formatting_mode); 460 461 if format_message_options.include_body then do; /* and now the body ... */ 462 if need_separator then call add_to_buffer_fixed (NL); 463 call format_body (); 464 end; 465 466 P_buffer_used = buffer_used; /* success */ 467 P_code = 0; 468 469 return; 470 471 /* Convert a message into the appropriate text and data structures for subsequent delivery to a mailbox: The text used is 472* the canonical form as described in message_format.gi.info; the text is then enclosed in a mail_format structure. In 473* addition, a mf_extension structure is placed after the mail_format; the mf_extension identifies the start and length in 474* the text of the message body, subject, any redistribution comments, and any user-defined text fields. This information 475* will be needed in future releases to insure reasonable performance for context searching of the messages in a mailbox 476* */ 477 478 format_message_for_mailbox: 479 entry (P_message_ptr, P_buffer_ptr, P_buffer_size_words, P_buffer_used_words, P_code); 480 481 message_ptr = P_message_ptr; 482 if message.version ^= MESSAGE_VERSION_2 then do; /* a simple validity check */ 483 P_code = mlsys_et_$not_message; 484 return; 485 end; 486 487 mail_format_ptr, buffer_ptr = P_buffer_ptr; 488 489 buffer_size = 4 * P_buffer_size_words; 490 mail_format_header_lth, buffer_used = 4 * currentsize (mail_format_header); 491 line_count = 0; 492 493 printing = "0"b; 494 output_switch = null (); /* shouldn't be used, but ... */ 495 496 ifo.buffer_overflow = report_smallarg; 497 ifo.line_length = -1; /* don't bother wrapping in a mailbox */ 498 499 string (ifo.flags) = ""b; 500 ifo.rfc822_format = "0"b; /* ... standard Multics format */ 501 ifo.forum_format = "0"b; /* ... never suppress anything important */ 502 ifo.dont_show_logsave = "1"b; /* ... don't use {logbox}/{save PATH} form of addresses */ 503 ifo.count_lines = "1"b; /* ... need the line count */ 504 ifo.include_message_id = "1"b; /* ... always include the Message-ID fields */ 505 ifo.include_trace = "1"b; /* ... always include the message/redistribution traces */ 506 ifo.reverse_redistributions = "1"b; /* ... put redistributions list first */ 507 ifo.use_canonical_fieldnames = "1"b; /* ... use the canonical names of the cc/bcc fields */ 508 ifo.build_mf_extension = "1"b; /* ... record location of fields for string search */ 509 ifo.include_forum_suffix = "1"b; /* ... need to distinguish forum versions later */ 510 511 mf_extension_n_text_fragments = 1 /** the body */ 512 + 1 /** the subject */ 513 + message.n_user_fields + message.n_redistributions; 514 call cu_$grow_stack_frame (size (mf_extension), mf_extension_ptr, (0)); 515 mf_extension.n_text_fragments = 0; /* nothing recorded yet */ 516 517 518 /* Create the canonical form of the message */ 519 520 call format_redistributions_list_internal (DEFAULT_FORMATTING_MODE); 521 522 call format_envelope (addr (message.envelope), "0"b, message.date_time_created, message.from, 523 DEFAULT_FORMATTING_MODE); 524 525 call format_header (DEFAULT_FORMATTING_MODE); 526 527 call add_to_buffer_fixed (NL); 528 529 call format_body (); 530 531 mail_format.lines = line_count; 532 mail_format.text_len = buffer_used - mail_format_header_lth; 533 534 535 /* Add the mf_extension to the buffer */ 536 537 if (currentsize (mail_format) + currentsize (mf_extension)) > P_buffer_size_words then call report_smallarg (); 538 539 new_mf_extension_ptr = addwordno (mail_format_ptr, currentsize (mail_format)); 540 new_mf_extension_ptr -> mf_extension.n_text_fragments = mf_extension.n_text_fragments; 541 new_mf_extension_ptr -> mf_extension.text_fragments = mf_extension.text_fragments; 542 543 mf_extension_ptr = new_mf_extension_ptr; /* switch to the one in the buffer */ 544 do idx = 1 to mf_extension.n_text_fragments; 545 mf_extension.text_fragments (idx).start = mf_extension.text_fragments (idx).start - mail_format_header_lth; 546 end; /* compensate for the mail_format.header structure */ 547 548 549 /* Success */ 550 551 P_buffer_used_words = currentsize (mail_format) + currentsize (mf_extension); 552 P_code = 0; 553 554 return; 555 556 /* Convert a message into the appropriate text and data structures for subsequent delivery to a mailbox: used only for 557* canonical in-mailbox messages which are being redistributed. This entrypoint will format the new redistribution, add 558* Delivery-Date and Delivery-By fields, if needed, and then use the canonical text and mf_extension structures of the 559* original message to avoid extra formatting and computation */ 560 561 format_canon_redistributed_msg: 562 entry (P_message_ptr, P_original_mf_ptr, P_original_mf_extension_ptr, P_buffer_ptr, P_buffer_size_words, 563 P_buffer_used_words, P_code); 564 565 message_ptr = P_message_ptr; 566 if message.version ^= MESSAGE_VERSION_2 then do; /* a simple validity check */ 567 P_code = mlsys_et_$not_message; 568 return; 569 end; 570 571 original_mf_ptr = P_original_mf_ptr; 572 original_mf_extension_ptr = P_original_mf_extension_ptr; 573 mail_format_ptr, buffer_ptr = P_buffer_ptr; 574 575 buffer_size = 4 * P_buffer_size_words; 576 mail_format_header_lth, buffer_used = 4 * currentsize (mail_format_header); 577 line_count = 0; 578 579 printing = "0"b; 580 output_switch = null (); /* shouldn't be used, but ... */ 581 582 ifo.buffer_overflow = report_smallarg; 583 ifo.line_length = -1; /* don't bother wrapping in a mailbox */ 584 585 string (ifo.flags) = ""b; 586 ifo.rfc822_format = "0"b; /* ... standard Multics format */ 587 ifo.forum_format = "0"b; /* ... never suppress anything important */ 588 ifo.dont_show_logsave = "1"b; /* ... don't use {logbox}/{save PATH} form of addresses */ 589 ifo.count_lines = "1"b; /* ... need the line count */ 590 ifo.include_message_id = "1"b; /* ... always include the Message-ID fields */ 591 ifo.include_trace = "1"b; /* ... always include the message/redistribution traces */ 592 ifo.reverse_redistributions = "1"b; /* ... put redistributions list first */ 593 ifo.use_canonical_fieldnames = "1"b; /* ... use the canonical names of the cc/bcc fields */ 594 ifo.build_mf_extension = "1"b; /* ... record location of fields for string search */ 595 ifo.include_forum_suffix = "1"b; /* ... need to distinguish forum versions later */ 596 597 mf_extension_n_text_fragments = /* all prior text fragments plus the new redistribution */ 598 original_mf_extension_ptr -> mf_extension.n_text_fragments + 1; 599 call cu_$grow_stack_frame (size (mf_extension), mf_extension_ptr, (0)); 600 mf_extension.n_text_fragments = original_mf_extension_ptr -> mf_extension.n_text_fragments; 601 mf_extension.text_fragments = original_mf_extension_ptr -> mf_extension.text_fragments; 602 603 604 /* Format the new redistribution */ 605 606 message_redistribution_ptr = 607 addr (message_redistributions_list.redistributions (message_redistributions_list.n_redistributions)); 608 call format_redistribution (DEFAULT_FORMATTING_MODE); 609 610 611 /* Add Delivery-Date and Delivery-By fields for the original mailing or previous redistribution if they differ from the 612* Posted-Date and Sender fields, respectively */ 613 614 if message_redistributions_list.n_redistributions > 1 then do; 615 message_redistribution_ptr = /* look at last redistribution actually in the mailbox */ 616 addr (message_redistributions_list 617 .redistributions (message_redistributions_list.n_redistributions - 1)); 618 full_fieldname = REDISTRIBUTED_PREFIX || DATE_TIME_DELIVERED_FIELDNAME; 619 if ^date_time_equal (message_redistribution.date_time_delivered, message_redistribution.date_time_mailed) 620 then 621 call format_date_time_field_internal (full_fieldname, message_redistribution.date_time_delivered, 622 "0"b, "1"b); 623 full_fieldname = REDISTRIBUTED_PREFIX || DELIVERED_BY_FIELDNAME; 624 if message_redistribution.delivered_by ^= null () then 625 call format_address_field_internal (full_fieldname, message_redistribution.delivered_by, "1"b); 626 end; 627 628 else do; /* use the original mailing */ 629 if ^date_time_equal (message.date_time_delivered, message.date_time_mailed) then 630 call format_date_time_field_internal (DATE_TIME_DELIVERED_FIELDNAME, message.date_time_delivered, 631 "0"b, "1"b); 632 if message.delivered_by ^= null () then /* ... guarenteed non-null only if not equal to Sender */ 633 call format_address_field_internal (DELIVERED_BY_FIELDNAME, message.delivered_by, "1"b); 634 end; 635 636 637 /* Relocate the text fragments of the original message to compensate for the text just added above */ 638 639 do idx = 1 to original_mf_extension_ptr -> mf_extension.n_text_fragments; 640 mf_extension.text_fragments (idx).start = mf_extension.text_fragments (idx).start + buffer_used; 641 end; 642 643 644 /* Add the canonical form of the original message */ 645 646 call add_to_buffer_fixed (original_mf_text); 647 648 mail_format.lines = line_count; 649 mail_format.text_len = buffer_used - mail_format_header_lth; 650 651 652 /* Add the mf_extension to the buffer */ 653 654 if (currentsize (mail_format) + currentsize (mf_extension)) > P_buffer_size_words then call report_smallarg (); 655 656 new_mf_extension_ptr = addwordno (mail_format_ptr, currentsize (mail_format)); 657 new_mf_extension_ptr -> mf_extension.n_text_fragments = mf_extension.n_text_fragments; 658 new_mf_extension_ptr -> mf_extension.text_fragments = mf_extension.text_fragments; 659 660 mf_extension_ptr = new_mf_extension_ptr; /* switch to the one in the buffer */ 661 do idx = 1 to mf_extension.n_text_fragments; 662 mf_extension.text_fragments (idx).start = mf_extension.text_fragments (idx).start - mail_format_header_lth; 663 end; /* compensate for the mail_format.header structure */ 664 665 666 /* Success */ 667 668 P_buffer_used_words = currentsize (mail_format) + currentsize (mf_extension); 669 P_code = 0; 670 671 return; 672 673 /* Convert a message into the appropriate text for subsequent delivery to a forum meeting or foreign address */ 674 675 format_message_for_forum: /* ... for delivery to a forum meeting */ 676 entry (P_message_ptr, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 677 678 string (ifo.flags) = ""b; /* setup entry-specific flags ... */ 679 ifo.rfc822_format = "0"b; /* ... standard Multics format */ 680 ifo.forum_format = "1"b; /* ... exclude Date/From if redundant */ 681 ifo.include_message_id, ifo.include_trace = "0"b; /* ... never include Message-ID or message traces */ 682 683 go to FORMAT_MESSAGE_FOR_FORUM_OR_NETWORK; 684 685 686 format_message_for_rfc822_network: /* ... for delivery to a foreign user */ 687 entry (P_message_ptr, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 688 689 string (ifo.flags) = ""b; /* setup entry-specific flags ... */ 690 ifo.rfc822_format = "1"b; /* ... ARPA network standard format */ 691 ifo.forum_format = "0"b; /* ... never suppress anything important */ 692 ifo.include_local_system_name = "1"b; /* ... all addresses must have host names */ 693 ifo.dont_canonicalize_system_names = "1"b; /* ... all system names must be fully qualified */ 694 ifo.include_message_id = "1"b; /* ... always include Mesage-ID fields */ 695 ifo.include_trace = "0"b; /* ... never include message/redistribution traces */ 696 ifo.include_forum_suffix = "1"b; /* ... need to distinguish forum versions later */ 697 698 699 FORMAT_MESSAGE_FOR_FORUM_OR_NETWORK: 700 message_ptr = P_message_ptr; 701 if message.version ^= MESSAGE_VERSION_2 then do; 702 P_code = mlsys_et_$not_message; 703 return; 704 end; 705 706 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 707 buffer_size = P_buffer_size; 708 buffer_used = 0; 709 710 printing = "0"b; 711 output_switch = null (); /* shouldn't get used, but ... */ 712 713 ifo.buffer_overflow = report_smallarg; 714 715 ifo.line_length = 72; /* wrap the header */ 716 ifo.wrap = "1"b; 717 718 ifo.dont_show_logsave = "1"b; /* don't use {logbox}/{save PATH} form of addresses */ 719 720 if ^ifo.forum_format then /* no envelope for forum meetings */ 721 call format_envelope (addr (message.envelope), "0"b, message.date_time_created, message.from, 722 DEFAULT_FORMATTING_MODE); 723 724 call format_header (DEFAULT_FORMATTING_MODE); 725 726 call format_redistributions_list_internal (DEFAULT_FORMATTING_MODE); 727 728 call add_to_buffer_fixed (NL); /* separator before the body */ 729 730 call format_body (); 731 732 P_buffer_used = buffer_used; /* tell the caller what was formatted */ 733 734 P_code = 0; 735 736 return; 737 738 /* Convert the envelope of a given message into its printed representation */ 739 740 format_message_envelope: /* ... into the caller's buffer */ 741 entry (P_message_ptr, P_formatting_mode, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 742 743 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 744 buffer_size = P_buffer_size; 745 buffer_used = P_buffer_used; 746 747 printing = "0"b; 748 output_switch = null (); /* shouldn't get used, but ... */ 749 750 ifo.buffer_overflow = report_smallarg; 751 752 go to FORMAT_MESSAGE_ENVELOPE_COMMON; 753 754 755 print_message_envelope: /* ... and print it on the given output switch */ 756 entry (P_message_ptr, P_formatting_mode, P_line_length, P_output_switch, P_code); 757 758 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 759 buffer_size = length (local_buffer); 760 buffer_used = 0; 761 762 printing = "1"b; /* need to know this when we're done formatting */ 763 output_switch = P_output_switch; 764 if output_switch = null () then output_switch = iox_$user_output; 765 766 ifo.buffer_overflow = print_buffer; 767 768 769 FORMAT_MESSAGE_ENVELOPE_COMMON: 770 message_ptr = P_message_ptr; 771 if message.version ^= MESSAGE_VERSION_2 then do; 772 P_code = mlsys_et_$not_message; 773 return; 774 end; 775 776 if (P_formatting_mode ^= DEFAULT_FORMATTING_MODE) & (P_formatting_mode ^= LONG_FORMATTING_MODE) then do; 777 P_code = error_table_$bad_subr_arg; 778 return; 779 end; 780 781 string (ifo.flags) = ""b; /* standard formatting options */ 782 783 ifo.line_length = P_line_length; 784 785 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 786 ifo.line_length = get_line_length_$switch (output_switch, (0)); 787 788 if printing & (P_line_length = 0) then ; 789 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 790 P_code = error_table_$bad_subr_arg; 791 return; 792 end; 793 794 ifo.wrap = (ifo.line_length ^= -1); 795 796 call format_envelope (addr (message.envelope), "0"b, message.date_time_created, message.from, P_formatting_mode) 797 ; 798 799 if printing then /* dump the last part */ 800 call print_buffer (); 801 else P_buffer_used = buffer_used; 802 803 P_code = 0; 804 805 return; 806 807 /* Convert the header of a given message into its printed representation */ 808 809 format_message_header: /* ... into the caller's buffer */ 810 entry (P_message_ptr, P_formatting_mode, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 811 812 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 813 buffer_size = P_buffer_size; 814 buffer_used = P_buffer_used; 815 816 printing = "0"b; 817 output_switch = null (); /* shouldn't get used, but ... */ 818 819 ifo.buffer_overflow = report_smallarg; 820 821 go to FORMAT_MESSAGE_HEADER_COMMON; 822 823 824 print_message_header: /* ... and print it on the given output switch */ 825 entry (P_message_ptr, P_formatting_mode, P_line_length, P_output_switch, P_code); 826 827 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 828 buffer_size = length (local_buffer); 829 buffer_used = 0; 830 831 printing = "1"b; /* need to know this when we're done formatting */ 832 output_switch = P_output_switch; 833 if output_switch = null () then output_switch = iox_$user_output; 834 835 ifo.buffer_overflow = print_buffer; 836 837 838 FORMAT_MESSAGE_HEADER_COMMON: 839 message_ptr = P_message_ptr; 840 if message.version ^= MESSAGE_VERSION_2 then do; 841 P_code = mlsys_et_$not_message; 842 return; 843 end; 844 845 if (P_formatting_mode < BRIEF_FORMATTING_MODE) | (P_formatting_mode > LONG_FORMATTING_MODE) then do; 846 P_code = error_table_$bad_subr_arg; 847 return; 848 end; 849 850 string (ifo.flags) = ""b; /* standard formatting options */ 851 852 ifo.line_length = P_line_length; 853 854 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 855 ifo.line_length = get_line_length_$switch (output_switch, (0)); 856 857 if printing & (P_line_length = 0) then ; 858 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 859 P_code = error_table_$bad_subr_arg; 860 return; 861 end; 862 863 ifo.wrap = (ifo.line_length ^= -1); 864 865 call format_header (P_formatting_mode); 866 867 if printing then /* dump the last part */ 868 call print_buffer (); 869 else P_buffer_used = buffer_used; 870 871 P_code = 0; 872 873 return; 874 875 /* Convert the redistributions list of a given message into its printed representation */ 876 877 format_redistributions_list: /* ... into the caller's buffer */ 878 entry (P_message_ptr, P_formatting_mode, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 879 880 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 881 buffer_size = P_buffer_size; 882 buffer_used = P_buffer_used; 883 884 printing = "0"b; 885 output_switch = null (); /* shouldn't get used, but ... */ 886 887 ifo.buffer_overflow = report_smallarg; 888 889 go to FORMAT_MESSAGE_REDISTRIBUTIONS_LIST_COMMON; 890 891 892 print_redistributions_list: /* ... and print it on the given output switch */ 893 entry (P_message_ptr, P_formatting_mode, P_line_length, P_output_switch, P_code); 894 895 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 896 buffer_size = length (local_buffer); 897 buffer_used = 0; 898 899 printing = "1"b; /* need to know this when we're done formatting */ 900 output_switch = P_output_switch; 901 if output_switch = null () then output_switch = iox_$user_output; 902 903 ifo.buffer_overflow = print_buffer; 904 905 906 FORMAT_MESSAGE_REDISTRIBUTIONS_LIST_COMMON: 907 message_ptr = P_message_ptr; 908 if message.version ^= MESSAGE_VERSION_2 then do; 909 P_code = mlsys_et_$not_message; 910 return; 911 end; 912 913 if (P_formatting_mode < BRIEF_FORMATTING_MODE) | (P_formatting_mode > LONG_FORMATTING_MODE) then do; 914 P_code = error_table_$bad_subr_arg; 915 return; 916 end; 917 918 string (ifo.flags) = ""b; /* standard formatting options */ 919 920 ifo.line_length = P_line_length; 921 922 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 923 ifo.line_length = get_line_length_$switch (output_switch, (0)); 924 925 if printing & (P_line_length = 0) then ; 926 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 927 P_code = error_table_$bad_subr_arg; 928 return; 929 end; 930 931 ifo.wrap = (ifo.line_length ^= -1); 932 933 call format_redistributions_list_internal (P_formatting_mode); 934 935 if printing then /* dump the last part */ 936 call print_buffer (); 937 else P_buffer_used = buffer_used; 938 939 P_code = 0; 940 941 return; 942 943 /* Convert the body of a given message into its printed representation */ 944 945 format_message_body: /* ... into the caller's buffer */ 946 entry (P_message_ptr, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 947 948 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 949 buffer_size = P_buffer_size; 950 buffer_used = P_buffer_used; 951 952 printing = "0"b; 953 output_switch = null (); /* shouldn't get used, but ... */ 954 955 ifo.buffer_overflow = report_smallarg; 956 957 go to FORMAT_MESSAGE_BODY_COMMON; 958 959 960 print_message_body: /* ... and print it on the given output switch */ 961 entry (P_message_ptr, P_line_length, P_output_switch, P_code); 962 963 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 964 buffer_size = length (local_buffer); 965 buffer_used = 0; 966 967 printing = "1"b; /* need to know this when we're done formatting */ 968 output_switch = P_output_switch; 969 if output_switch = null () then output_switch = iox_$user_output; 970 971 ifo.buffer_overflow = print_buffer; 972 973 974 FORMAT_MESSAGE_BODY_COMMON: 975 message_ptr = P_message_ptr; 976 if message.version ^= MESSAGE_VERSION_2 then do; 977 P_code = mlsys_et_$not_message; 978 return; 979 end; 980 981 string (ifo.flags) = ""b; /* standard formatting options */ 982 983 ifo.line_length = P_line_length; 984 985 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 986 ifo.line_length = get_line_length_$switch (output_switch, (0)); 987 988 if printing & (P_line_length = 0) then ; 989 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 990 P_code = error_table_$bad_subr_arg; 991 return; 992 end; 993 994 ifo.wrap = (ifo.line_length ^= -1); 995 996 call format_body (); 997 998 if printing then /* dump the last part */ 999 call print_buffer (); 1000 else P_buffer_used = buffer_used; 1001 1002 P_code = 0; 1003 1004 return; 1005 1006 /* Convert the given message trace into its printed representation */ 1007 1008 format_message_trace: /* ... into the caller's buffer */ 1009 entry (P_message_trace_ptr, P_format_redistribution_trace, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, 1010 P_code); 1011 1012 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1013 buffer_size = P_buffer_size; 1014 buffer_used = P_buffer_used; 1015 1016 printing = "0"b; 1017 output_switch = null (); /* shouldn't get used, but ... */ 1018 1019 ifo.buffer_overflow = report_smallarg; 1020 1021 go to FORMAT_MESSAGE_TRACE_COMMON; 1022 1023 1024 print_message_trace: /* ... and print it on the given output switch */ 1025 entry (P_message_trace_ptr, P_format_redistribution_trace, P_line_length, P_output_switch, P_code); 1026 1027 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1028 buffer_size = length (local_buffer); 1029 buffer_used = 0; 1030 1031 printing = "1"b; /* need to know this when we're done formatting */ 1032 output_switch = P_output_switch; 1033 if output_switch = null () then output_switch = iox_$user_output; 1034 1035 ifo.buffer_overflow = print_buffer; 1036 1037 1038 FORMAT_MESSAGE_TRACE_COMMON: 1039 message_trace_ptr = P_message_trace_ptr; 1040 if message_trace.version ^= MESSAGE_TRACE_VERSION_2 then do; 1041 P_code = mlsys_et_$not_message_trace; 1042 return; 1043 end; 1044 1045 string (ifo.flags) = ""b; /* standard formatting options */ 1046 1047 ifo.line_length = P_line_length; 1048 1049 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1050 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1051 1052 if printing & (P_line_length = 0) then ; 1053 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1054 P_code = error_table_$bad_subr_arg; 1055 return; 1056 end; 1057 1058 ifo.wrap = (ifo.line_length ^= -1); 1059 1060 call format_trace (message_trace_ptr, P_format_redistribution_trace); 1061 1062 if printing then /* dump the last part */ 1063 call print_buffer (); 1064 else P_buffer_used = buffer_used; 1065 1066 P_code = 0; 1067 1068 return; 1069 1070 /* Convert an AIM access class field into its printed representation */ 1071 1072 format_access_class_field: /* ... into the caller's buffer */ 1073 entry (P_fieldname, P_access_class, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1074 1075 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1076 buffer_size = P_buffer_size; 1077 buffer_used = P_buffer_used; 1078 1079 printing = "0"b; 1080 output_switch = null (); /* shouldn't get used, but ... */ 1081 1082 ifo.buffer_overflow = report_smallarg; 1083 1084 go to FORMAT_ACCESS_CLASS_FIELD_COMMON; 1085 1086 1087 print_access_class_field: /* ... and print it on the given switch */ 1088 entry (P_fieldname, P_access_class, P_line_length, P_output_switch, P_code); 1089 1090 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1091 buffer_size = length (local_buffer); 1092 buffer_used = 0; 1093 1094 printing = "1"b; /* need to know this when we're done formatting */ 1095 output_switch = P_output_switch; 1096 if output_switch = null () then output_switch = iox_$user_output; 1097 1098 ifo.buffer_overflow = print_buffer; 1099 1100 1101 FORMAT_ACCESS_CLASS_FIELD_COMMON: 1102 string (ifo.flags) = ""b; /* standard formatting options */ 1103 1104 ifo.line_length = P_line_length; 1105 1106 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1107 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1108 1109 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1110 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1111 P_code = error_table_$bad_subr_arg; 1112 return; 1113 end; 1114 1115 ifo.wrap = (ifo.line_length ^= -1); 1116 1117 call format_access_class_field_internal (P_fieldname, P_access_class, printing); 1118 1119 if printing then /* make sure the last part gets out to the switch */ 1120 call print_buffer (); 1121 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1122 1123 P_code = 0; /* success */ 1124 1125 return; 1126 1127 1128 1129 /* Actually formats an access class field (called by several entrypoints) */ 1130 1131 format_access_class_field_internal: 1132 procedure (p_fieldname, p_access_class, p_add_trailing_NL); 1133 1134 dcl p_fieldname character (*) varying parameter; 1135 dcl p_access_class bit (72) aligned parameter; 1136 dcl p_add_trailing_NL bit (1) aligned parameter; 1137 1138 last_column_used = 0; /* nothing printed/formatted yet */ 1139 1140 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1141 call add_to_buffer_varying (p_fieldname); 1142 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1143 end; 1144 1145 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1146 1147 call format_access_class (p_access_class); 1148 1149 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1150 1151 return; 1152 1153 end format_access_class_field_internal; 1154 1155 /* Convert an address field into its printed representation */ 1156 1157 format_address_field: /* ... into the caller's buffer */ 1158 entry (P_fieldname, P_address_ptr, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1159 1160 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1161 buffer_size = P_buffer_size; 1162 buffer_used = P_buffer_used; 1163 1164 printing = "0"b; 1165 output_switch = null (); /* shouldn't get used, but ... */ 1166 1167 ifo.buffer_overflow = report_smallarg; 1168 1169 go to FORMAT_ADDRESS_FIELD_COMMON; 1170 1171 1172 print_address_field: /* ... and print it on the given switch */ 1173 entry (P_fieldname, P_address_ptr, P_line_length, P_output_switch, P_code); 1174 1175 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1176 buffer_size = length (local_buffer); 1177 buffer_used = 0; 1178 1179 printing = "1"b; /* need to know this when we're done formatting */ 1180 output_switch = P_output_switch; 1181 if output_switch = null () then output_switch = iox_$user_output; 1182 1183 ifo.buffer_overflow = print_buffer; 1184 1185 1186 FORMAT_ADDRESS_FIELD_COMMON: 1187 call mail_system_$get_address_type (P_address_ptr, (0), code); 1188 if code ^= 0 then do; /* not a valid address */ 1189 P_code = code; 1190 return; 1191 end; 1192 1193 string (ifo.flags) = ""b; /* standard formatting options */ 1194 1195 ifo.line_length = P_line_length; 1196 1197 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1198 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1199 1200 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1201 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1202 P_code = error_table_$bad_subr_arg; 1203 return; 1204 end; 1205 1206 ifo.wrap = (ifo.line_length ^= -1); 1207 1208 call format_address_field_internal (P_fieldname, P_address_ptr, printing); 1209 1210 if printing then /* make sure the last part gets out to the switch */ 1211 call print_buffer (); 1212 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1213 1214 P_code = 0; /* success */ 1215 1216 return; 1217 1218 1219 1220 /* Actually formats an address field (called by several entrypoints) */ 1221 1222 format_address_field_internal: 1223 procedure (p_fieldname, p_address_ptr, p_add_trailing_NL); 1224 1225 dcl p_fieldname character (*) varying parameter; 1226 dcl p_address_ptr pointer parameter; 1227 dcl p_add_trailing_NL bit (1) aligned parameter; 1228 1229 last_column_used = 0; /* nothing printed/formatted yet */ 1230 1231 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1232 call add_to_buffer_varying (p_fieldname); 1233 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1234 end; 1235 1236 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1237 1238 call format_address (p_address_ptr, ""); 1239 1240 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1241 1242 return; 1243 1244 end format_address_field_internal; 1245 1246 /* Convert an address list field into its printed representation */ 1247 1248 format_address_list_field: /* ... into the caller's buffer */ 1249 entry (P_fieldname, P_address_list_ptr, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1250 1251 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1252 buffer_size = P_buffer_size; 1253 buffer_used = P_buffer_used; 1254 1255 printing = "0"b; 1256 output_switch = null (); /* shouldn't get used, but ... */ 1257 1258 ifo.buffer_overflow = report_smallarg; 1259 1260 go to FORMAT_ADDRESS_LIST_FIELD_COMMON; 1261 1262 1263 print_address_list_field: /* ... and print it on the given switch */ 1264 entry (P_fieldname, P_address_list_ptr, P_line_length, P_output_switch, P_code); 1265 1266 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1267 buffer_size = length (local_buffer); 1268 buffer_used = 0; 1269 1270 printing = "1"b; /* need to know this when we're done formatting */ 1271 output_switch = P_output_switch; 1272 if output_switch = null () then output_switch = iox_$user_output; 1273 1274 ifo.buffer_overflow = print_buffer; 1275 1276 1277 FORMAT_ADDRESS_LIST_FIELD_COMMON: 1278 if P_address_list_ptr -> address_list.version ^= ADDRESS_LIST_VERSION_2 then do; 1279 P_code = mlsys_et_$not_address_list; 1280 return; 1281 end; 1282 1283 string (ifo.flags) = ""b; /* standard formatting options */ 1284 1285 ifo.line_length = P_line_length; 1286 1287 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1288 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1289 1290 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1291 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1292 P_code = error_table_$bad_subr_arg; 1293 return; 1294 end; 1295 1296 ifo.wrap = (ifo.line_length ^= -1); 1297 1298 call format_address_list_field_internal (P_fieldname, P_address_list_ptr, printing); 1299 1300 if printing then /* make sure the last part gets out to the switch */ 1301 call print_buffer (); 1302 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1303 1304 P_code = 0; /* success */ 1305 1306 return; 1307 1308 1309 1310 /* Actually formats an address list field (called by several entrypoints) */ 1311 1312 format_address_list_field_internal: 1313 procedure (p_fieldname, p_address_list_ptr, p_add_trailing_NL); 1314 1315 dcl p_fieldname character (*) varying parameter; 1316 dcl p_address_list_ptr pointer parameter; 1317 dcl p_add_trailing_NL bit (1) aligned parameter; 1318 1319 last_column_used = 0; /* nothing printed/formatted yet */ 1320 1321 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1322 call add_to_buffer_varying (p_fieldname); 1323 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1324 end; 1325 1326 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1327 1328 call format_address_list (p_address_list_ptr); 1329 1330 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1331 1332 return; 1333 1334 end format_address_list_field_internal; 1335 1336 /* Convert a date/time field into its printed representation */ 1337 1338 format_date_time_field: /* ... into the caller's buffer */ 1339 entry (P_fieldname, P_date_time, P_include_dow, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1340 1341 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1342 buffer_size = P_buffer_size; 1343 buffer_used = P_buffer_used; 1344 1345 printing = "0"b; 1346 output_switch = null (); /* shouldn't get used, but ... */ 1347 1348 ifo.buffer_overflow = report_smallarg; 1349 1350 go to FORMAT_DATE_TIME_FIELD_COMMON; 1351 1352 1353 print_date_time_field: /* ... and print it on the given switch */ 1354 entry (P_fieldname, P_date_time, P_include_dow, P_line_length, P_output_switch, P_code); 1355 1356 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1357 buffer_size = length (local_buffer); 1358 buffer_used = 0; 1359 1360 printing = "1"b; /* need to know this when we're done formatting */ 1361 output_switch = P_output_switch; 1362 if output_switch = null () then output_switch = iox_$user_output; 1363 1364 ifo.buffer_overflow = print_buffer; 1365 1366 1367 FORMAT_DATE_TIME_FIELD_COMMON: 1368 string (ifo.flags) = ""b; /* standard formatting options */ 1369 1370 ifo.line_length = P_line_length; 1371 1372 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1373 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1374 1375 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1376 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1377 P_code = error_table_$bad_subr_arg; 1378 return; 1379 end; 1380 1381 ifo.wrap = (ifo.line_length ^= -1); 1382 1383 call format_date_time_field_internal (P_fieldname, P_date_time, P_include_dow, printing); 1384 1385 if printing then /* make sure the last part gets out to the switch */ 1386 call print_buffer (); 1387 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1388 1389 P_code = 0; /* success */ 1390 1391 return; 1392 1393 1394 1395 /* Actually formats a date/time field (called by several entrypoints) */ 1396 1397 format_date_time_field_internal: 1398 procedure (p_fieldname, p_date_time, p_include_dow, p_add_trailing_NL); 1399 1400 dcl p_fieldname character (*) varying parameter; 1401 dcl p_date_time fixed binary (71) parameter; 1402 dcl p_include_dow bit (1) aligned parameter; 1403 dcl p_add_trailing_NL bit (1) aligned parameter; 1404 1405 last_column_used = 0; /* nothing printed/formatted yet */ 1406 1407 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1408 call add_to_buffer_varying (p_fieldname); 1409 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1410 end; 1411 1412 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1413 1414 call format_date_time (p_date_time, p_include_dow); 1415 1416 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1417 1418 return; 1419 1420 end format_date_time_field_internal; 1421 1422 /* Convert a Message-ID field into its printed representation */ 1423 1424 format_message_id_field: /* ... into the caller's buffer */ 1425 entry (P_fieldname, P_message_id, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1426 1427 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1428 buffer_size = P_buffer_size; 1429 buffer_used = P_buffer_used; 1430 1431 printing = "0"b; 1432 output_switch = null (); /* shouldn't get used, but ... */ 1433 1434 ifo.buffer_overflow = report_smallarg; 1435 1436 go to FORMAT_MESSAGE_ID_FIELD_COMMON; 1437 1438 1439 print_message_id_field: /* ... and print it on the given switch */ 1440 entry (P_fieldname, P_message_id, P_line_length, P_output_switch, P_code); 1441 1442 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1443 buffer_size = length (local_buffer); 1444 buffer_used = 0; 1445 1446 printing = "1"b; /* need to know this when we're done formatting */ 1447 output_switch = P_output_switch; 1448 if output_switch = null () then output_switch = iox_$user_output; 1449 1450 ifo.buffer_overflow = print_buffer; 1451 1452 1453 FORMAT_MESSAGE_ID_FIELD_COMMON: 1454 string (ifo.flags) = ""b; /* standard formatting options */ 1455 1456 ifo.line_length = P_line_length; 1457 1458 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1459 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1460 1461 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1462 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1463 P_code = error_table_$bad_subr_arg; 1464 return; 1465 end; 1466 1467 ifo.wrap = (ifo.line_length ^= -1); 1468 1469 call format_message_id_field_internal (P_fieldname, P_message_id, printing); 1470 1471 if printing then /* make sure the last part gets out to the switch */ 1472 call print_buffer (); 1473 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1474 1475 P_code = 0; /* success */ 1476 1477 return; 1478 1479 1480 1481 /* Actually formats a Message-ID field (called by several entrypoints) */ 1482 1483 format_message_id_field_internal: 1484 procedure (p_fieldname, p_message_id, p_add_trailing_NL); 1485 1486 dcl p_fieldname character (*) varying parameter; 1487 dcl p_message_id bit (72) aligned parameter; 1488 dcl p_add_trailing_NL bit (1) aligned parameter; 1489 1490 last_column_used = 0; /* nothing printed/formatted yet */ 1491 1492 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1493 call add_to_buffer_varying (p_fieldname); 1494 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1495 end; 1496 1497 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1498 1499 call format_message_id (p_message_id); 1500 1501 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1502 1503 return; 1504 1505 end format_message_id_field_internal; 1506 1507 /* Convert a header/envelope/redistribution field which is a list of message references into its printed representation */ 1508 1509 format_references_list_field: /* ... into the caller's buffer */ 1510 entry (P_fieldname, P_message_references_list_ptr, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code) 1511 ; 1512 1513 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1514 buffer_size = P_buffer_size; 1515 buffer_used = P_buffer_used; 1516 1517 printing = "0"b; 1518 output_switch = null (); /* shouldn't get used, but ... */ 1519 1520 ifo.buffer_overflow = report_smallarg; 1521 1522 go to FORMAT_REFERENCES_LIST_FIELD_COMMON; 1523 1524 1525 print_references_list_field: /* ... and print it on the given switch */ 1526 entry (P_fieldname, P_message_references_list_ptr, P_line_length, P_output_switch, P_code); 1527 1528 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1529 buffer_size = length (local_buffer); 1530 buffer_used = 0; 1531 1532 printing = "1"b; /* need to know this when we're done formatting */ 1533 output_switch = P_output_switch; 1534 if output_switch = null () then output_switch = iox_$user_output; 1535 1536 ifo.buffer_overflow = print_buffer; 1537 1538 1539 FORMAT_REFERENCES_LIST_FIELD_COMMON: 1540 if P_message_references_list_ptr -> message_references_list.version ^= MESSAGE_REFERENCES_LIST_VERSION_2 1541 then do; 1542 P_code = error_table_$unimplemented_version; 1543 return; 1544 end; 1545 1546 string (ifo.flags) = ""b; /* standard formatting options */ 1547 1548 ifo.line_length = P_line_length; 1549 1550 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1551 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1552 1553 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1554 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1555 P_code = error_table_$bad_subr_arg; 1556 return; 1557 end; 1558 1559 ifo.wrap = (ifo.line_length ^= -1); 1560 1561 call format_references_list_field_internal (P_fieldname, P_message_references_list_ptr, printing); 1562 1563 if printing then /* make sure the last part gets out to the switch */ 1564 call print_buffer (); 1565 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1566 1567 P_code = 0; /* success */ 1568 1569 return; 1570 1571 1572 1573 /* Actually formats a field which is a list of message references (called by several entrypoints) */ 1574 1575 format_references_list_field_internal: 1576 procedure (p_fieldname, p_message_references_list_ptr, p_add_trailing_NL); 1577 1578 dcl p_fieldname character (*) varying parameter; 1579 dcl p_message_references_list_ptr pointer parameter; 1580 dcl p_add_trailing_NL bit (1) aligned parameter; 1581 1582 last_column_used = 0; /* nothing printed/formatted yet */ 1583 1584 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1585 call add_to_buffer_varying (p_fieldname); 1586 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1587 end; 1588 1589 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1590 1591 call format_references_list (p_message_references_list_ptr); 1592 1593 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1594 1595 return; 1596 1597 end format_references_list_field_internal; 1598 1599 /* Convert a text field into its printed representation */ 1600 1601 format_text_field: /* ... into the caller's buffer */ 1602 entry (P_fieldname, P_text, P_multiline_text, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1603 1604 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1605 buffer_size = P_buffer_size; 1606 buffer_used = P_buffer_used; 1607 1608 printing = "0"b; 1609 output_switch = null (); /* shouldn't get used, but ... */ 1610 1611 ifo.buffer_overflow = report_smallarg; 1612 1613 go to FORMAT_TEXT_FIELD_COMMON; 1614 1615 1616 print_text_field: /* ... and print it on the given switch */ 1617 entry (P_fieldname, P_text, P_multiline_text, P_line_length, P_output_switch, P_code); 1618 1619 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1620 buffer_size = length (local_buffer); 1621 buffer_used = 0; 1622 1623 printing = "1"b; /* need to know this when we're done formatting */ 1624 output_switch = P_output_switch; 1625 if output_switch = null () then output_switch = iox_$user_output; 1626 1627 ifo.buffer_overflow = print_buffer; 1628 1629 1630 FORMAT_TEXT_FIELD_COMMON: 1631 string (ifo.flags) = ""b; /* standard formatting options */ 1632 1633 ifo.line_length = P_line_length; 1634 1635 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1636 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1637 1638 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1639 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1640 P_code = error_table_$bad_subr_arg; 1641 return; 1642 end; 1643 1644 ifo.wrap = (ifo.line_length ^= -1); 1645 1646 call format_text_field_internal (P_fieldname, P_text, P_multiline_text, printing); 1647 1648 if printing then /* make sure the last part gets out to the switch */ 1649 call print_buffer (); 1650 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1651 1652 P_code = 0; /* success */ 1653 1654 return; 1655 1656 1657 1658 /* Actually formats a text field (called by several entrypoints) */ 1659 1660 format_text_field_internal: 1661 procedure (p_fieldname, p_text, p_multiline_text, p_add_trailing_NL); 1662 1663 dcl p_fieldname character (*) varying parameter; 1664 dcl p_text character (*) parameter; 1665 dcl p_multiline_text bit (1) aligned parameter; 1666 dcl p_add_trailing_NL bit (1) aligned parameter; 1667 1668 last_column_used = 0; /* nothing printed/formatted yet */ 1669 1670 if length (p_fieldname) > 0 then do; /* a non-blank fieldname should be output first */ 1671 call add_to_buffer_varying (p_fieldname); 1672 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1673 end; 1674 1675 ifo.indentation = last_column_used; /* indent additional lines by this amount */ 1676 1677 if ifo.build_mf_extension then do; /* subsequent string searches will examine this field ... */ 1678 mf_extension.n_text_fragments = mf_extension.n_text_fragments + 1; 1679 mf_extension.text_fragments (mf_extension.n_text_fragments).start = buffer_used + 1; 1680 end; 1681 1682 call format_text (p_text, p_multiline_text); 1683 1684 if ifo.build_mf_extension then /* also record the field's length */ 1685 mf_extension.text_fragments (mf_extension.n_text_fragments).lth = 1686 buffer_used - mf_extension.text_fragments (mf_extension.n_text_fragments).start + 1; 1687 1688 if p_add_trailing_NL then call add_to_buffer_fixed (NL); 1689 1690 return; 1691 1692 end format_text_field_internal; 1693 1694 /* Convert a section of the message body into its printed representation */ 1695 1696 format_body_section: /* ... into the caller's buffer */ 1697 entry (P_message_body_section_parameter_ptr, P_line_length, P_buffer_ptr, P_buffer_size, P_buffer_used, P_code); 1698 1699 buffer_ptr = P_buffer_ptr; /* use the caller's buffer */ 1700 buffer_size = P_buffer_size; 1701 buffer_used = P_buffer_used; 1702 1703 printing = "0"b; 1704 output_switch = null (); /* shouldn't get used, but ... */ 1705 1706 ifo.buffer_overflow = report_smallarg; 1707 1708 go to FORMAT_BODY_SECTION_COMMON; 1709 1710 1711 print_body_section: /* ... and print it on the given switch */ 1712 entry (P_message_body_section_parameter_ptr, P_line_length, P_output_switch, P_code); 1713 1714 buffer_ptr = addr (local_buffer); /* format it into our automatic buffer */ 1715 buffer_size = length (local_buffer); 1716 buffer_used = 0; 1717 1718 printing = "1"b; /* need to know this when we're done formatting */ 1719 output_switch = P_output_switch; 1720 if output_switch = null () then output_switch = iox_$user_output; 1721 1722 ifo.buffer_overflow = print_buffer; 1723 1724 1725 FORMAT_BODY_SECTION_COMMON: 1726 message_body_section_parameter_ptr = P_message_body_section_parameter_ptr; 1727 if message_body_section_parameter.version ^= MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 then do; 1728 P_code = error_table_$unimplemented_version; 1729 return; 1730 end; 1731 if (message_body_section_parameter.section_type < MESSAGE_PREFORMATTED_BODY_SECTION) 1732 | (message_body_section_parameter.section_type > MESSAGE_BIT_STRING_BODY_SECTION) then do; 1733 P_code = mlsys_et_$unknown_body_section_type; 1734 return; 1735 end; 1736 1737 string (ifo.flags) = ""b; /* standard formatting options */ 1738 1739 ifo.line_length = P_line_length; 1740 1741 if printing & (ifo.line_length = 0) then /* default to line length of the output switch */ 1742 ifo.line_length = get_line_length_$switch (output_switch, (0)); 1743 1744 if printing & (P_line_length = 0) then ; /* don't check line length if we set it */ 1745 else if (ifo.line_length ^= -1) & (ifo.line_length ^> 30) then do; 1746 P_code = error_table_$bad_subr_arg; 1747 return; 1748 end; 1749 1750 ifo.wrap = (ifo.line_length ^= -1); 1751 ifo.count_lines = "1"b; /* we need to return the line count */ 1752 line_count = 0; 1753 1754 call format_body_section_internal (addr (message_body_section_parameter.section)); 1755 1756 if printing then /* make sure the last part gets out to the switch */ 1757 call print_buffer (); 1758 else P_buffer_used = buffer_used; /* reflect what's been used to the caller */ 1759 1760 message_body_section_parameter.section.section_n_lines = line_count; 1761 1762 P_code = 0; /* success */ 1763 1764 return; 1765 1766 /* format: ^indcomtxt */ 1767 /* Formats an address for use by the interim inter-system mailer (mlsys_mailer_): The format used by mlsys_mailer_ is a 1768* variant of the Multics standard format for a local address. In particular, RFC822 quoting is used and the keywords 1769* "at" and "via" are both replaced by commerical at-signs (@). In addition, the formatted address is broken into two 1770* parts -- the "user name" and "host name". The "user name" consists of the actual foreign address and, if any relay 1771* systems are needed to send the message, the name of the foreign system and all but the first relay system. The "host 1772* name" is either the name of the foreign system if there are no relays or the name of the first relay system. For 1773* example, the address: 1774* GMP at MIT-MC via MIT-MULTICS.ARPA via CISL-SERVICE-MULTICS.ARPA 1775* is formatted for mlsys_mailer_ as: 1776* GMP@MIT-MC@MIT-MULTICS.ARPA and CISL-SERVICE-MULTICS.ARPA */ 1777 /* format: indcomtxt */ 1778 1779 format_address_for_ism: 1780 entry (P_address_string, P_address_route_ptr, P_user_name, P_host_name, P_code); 1781 1782 printing = "0"b; /* formatting data to be returned to the caller */ 1783 output_switch = null (); /* shouldn't get used, but ... */ 1784 1785 ifo.buffer_overflow = report_foreign_address_too_long; 1786 ifo.line_length = -1; /* don't wrap */ 1787 ifo.indentation = 0; 1788 string (ifo.flags) = ""b; /* setup entry-specific flags ... */ 1789 ifo.rfc822_format = "1"b; /* ... ARPA network standard format */ 1790 1791 address_route_ptr = P_address_route_ptr; 1792 1793 begin; 1794 dcl user_name_buffer character (maxlength (P_user_name)); 1795 dcl host_name_buffer character (maxlength (P_host_name)); 1796 1797 /*** Format the "user name" */ 1798 buffer_ptr = addr (user_name_buffer); 1799 buffer_size = length (user_name_buffer); 1800 buffer_used = 0; /* nothing in it yet */ 1801 call format_top_level_string (P_address_string); 1802 /* the actual address on the foreign system ... */ 1803 do idx = address_route.n_relays to 2 by -1; 1804 /*** ... plus the names of all but the first relay system */ 1805 call add_to_buffer_fixed (ATSIGN); 1806 call format_top_level_string (address_route.relays (idx)); 1807 end; 1808 P_user_name = substr (user_name_buffer, 1, buffer_used); 1809 1810 /*** Format the "host name" */ 1811 buffer_ptr = addr (host_name_buffer); 1812 buffer_size = length (host_name_buffer); 1813 buffer_used = 0; 1814 call format_top_level_string (address_route.relays (1)); 1815 P_host_name = substr (host_name_buffer, 1, buffer_used); 1816 end; 1817 1818 P_code = 0; /* can only get here if OK */ 1819 1820 return; 1821 1822 /* Format/print the contents of a message/redistribution envelope */ 1823 1824 format_envelope: 1825 procedure (p_envelope_ptr, p_is_redistribution, p_date_time_created, p_from, p_formatting_mode); 1826 1827 dcl p_envelope_ptr pointer parameter; 1828 dcl p_is_redistribution bit (1) aligned parameter; 1829 dcl p_date_time_created fixed binary (71) parameter; 1830 dcl p_from pointer parameter; 1831 dcl p_formatting_mode fixed binary parameter; 1832 1833 dcl 1 p_envelope aligned based (p_envelope_ptr) like message_envelope; 1834 1835 dcl (delivered_by, sender) pointer; 1836 dcl full_fieldname character (64) varying; 1837 dcl fieldname_prefix character (32) varying; 1838 dcl (sender_is_different, delivered_by_is_different) bit (1) aligned; 1839 1840 1841 if p_envelope.date_time_mailed = 0 then /* can't display the envelope if it has never been mailed */ 1842 return; 1843 1844 if p_is_redistribution then /* setup fieldname prefix */ 1845 if ifo.rfc822_format then 1846 fieldname_prefix = RESENT_PREFIX; 1847 else fieldname_prefix = REDISTRIBUTED_PREFIX; 1848 else fieldname_prefix = ""; 1849 1850 sender = p_envelope.sender; /* get a value for the Sender field */ 1851 if sender = null () then do; /* ... From field is guarenteed to have 1 address */ 1852 sender = p_from -> address_list.addresses (1); 1853 sender_is_different = "0"b; 1854 end; 1855 else if p_from -> address_list.n_addresses = 1 /* Sender and From field may be identical */ 1856 then 1857 sender_is_different = ^mail_system_$compare_addresses (sender, p_from -> address_list.addresses (1), (0)); 1858 else sender_is_different = "1"b; /* multiple authors */ 1859 1860 delivered_by = p_envelope.delivered_by; /* get a value for the Delivery-By field */ 1861 if delivered_by = null () then do; 1862 delivered_by = sender; 1863 delivered_by_is_different = "0"b; 1864 end; 1865 else delivered_by_is_different = ^mail_system_$compare_addresses (delivered_by, sender, (0)); 1866 1867 full_fieldname = fieldname_prefix || DATE_TIME_DELIVERED_FIELDNAME; 1868 if p_envelope.date_time_delivered > 0 then /* it's been delivered ... */ 1869 if (p_formatting_mode = LONG_FORMATTING_MODE) 1870 | ^date_time_equal (p_envelope.date_time_delivered, p_envelope.date_time_mailed) then 1871 call format_date_time_field_internal (full_fieldname, p_envelope.date_time_delivered, "0"b, "1"b); 1872 1873 full_fieldname = fieldname_prefix || DELIVERED_BY_FIELDNAME; 1874 if (p_formatting_mode = LONG_FORMATTING_MODE) | delivered_by_is_different then 1875 call format_address_field_internal (full_fieldname, delivered_by, "1"b); 1876 1877 full_fieldname = fieldname_prefix || DATE_TIME_MAILED_FIELDNAME; 1878 if (p_formatting_mode = LONG_FORMATTING_MODE) 1879 | ^date_time_equal (p_envelope.date_time_mailed, p_date_time_created) then 1880 call format_date_time_field_internal (full_fieldname, p_envelope.date_time_mailed, "0"b, "1"b); 1881 1882 full_fieldname = fieldname_prefix || SENDER_FIELDNAME; 1883 if (p_formatting_mode = LONG_FORMATTING_MODE) | sender_is_different then 1884 call format_address_field_internal (full_fieldname, sender, "1"b); 1885 1886 if (ifo.include_trace | (p_formatting_mode = LONG_FORMATTING_MODE)) & (p_envelope.trace ^= null ()) then 1887 call format_trace (p_envelope.trace, p_is_redistribution); 1888 1889 full_fieldname = fieldname_prefix || ACKNOWLEDGE_TO_FIELDNAME; 1890 if p_envelope.acknowledge_to ^= null () then /* only if it's present */ 1891 call format_address_field_internal (full_fieldname, p_envelope.acknowledge_to, "1"b); 1892 1893 return; 1894 1895 end format_envelope; 1896 1897 /* Actually format the header of a message (called by several entrypoints): Contrary to the documentation, the Date and 1898* From fields can be ommitted from the printed representation; however, this only occurs when formatting a new message as 1899* a new message's Date field is not available to the caller to avoid problems with "qedx -header" like uses of the 1900* printed representation and the From field is empty unless the user has set it to a non-default value as the default is 1901* supplied at message delivery time */ 1902 1903 format_header: 1904 procedure (p_formatting_mode); 1905 1906 dcl p_formatting_mode fixed binary parameter; 1907 1908 dcl user_fieldname character (256) varying; /* should be big enough for any conceivable field name */ 1909 dcl value_picture picture "-----------9v"; 1910 dcl six_digits_picture picture "zzzzz9"; 1911 dcl user_is_recipient bit (1) aligned; 1912 dcl (n_recipients, idx) fixed binary; 1913 1914 1915 if message.date_time_created > 0 then /* there's a Date field ... */ 1916 if ifo.forum_format & date_time_equal (message.date_time_created, clock ()) then 1917 ; /* ... but not if the same as what forum will display */ 1918 else call format_date_time_field_internal (DATE_TIME_CREATED_FIELDNAME, message.date_time_created, "1"b, 1919 "1"b); 1920 1921 if message.from ^= null () then /* always show the From it it's not empty ... */ 1922 if message.from -> address_list.n_addresses > 0 then 1923 if ifo.forum_format & (message.from -> address_list.n_addresses = 1) then 1924 if mail_system_$compare_addresses (mlsys_data_$user_default_mailbox_address, 1925 message.from -> address_list.addresses (1), (0)) 1926 | 1927 mail_system_$compare_addresses (mlsys_data_$user_mail_table_address, 1928 message.from -> address_list.addresses (1), (0)) then 1929 ; /* ... unless it's the same as what forum will display */ 1930 else call format_address_list_field_internal (FROM_FIELDNAME, message.from, "1"b); 1931 else call format_address_list_field_internal (FROM_FIELDNAME, message.from, "1"b); 1932 1933 if ^ifo.forum_format & (message.subject.text_lth > 0) then 1934 /* always show Subject if present and not going to a forum */ 1935 call format_text_field_internal (SUBJECT_FIELDNAME, message_subject, "0"b, "1"b); 1936 1937 if p_formatting_mode > BRIEF_FORMATTING_MODE then 1938 if message.reply_to ^= null () then /* only display the Reply-To field if not -brief_header */ 1939 if message.reply_to -> address_list.n_addresses > 0 then 1940 call format_address_list_field_internal (REPLY_TO_FIELDNAME, message.reply_to, "1"b); 1941 1942 if p_formatting_mode > BRIEF_FORMATTING_MODE then 1943 if message.to ^= null () then /* only display the To field if not -brief_header */ 1944 if message.to -> address_list.n_addresses > 0 then 1945 call format_address_list_field_internal (TO_FIELDNAME, message.to, "1"b); 1946 1947 if p_formatting_mode > BRIEF_FORMATTING_MODE then 1948 if message.cc ^= null () then /* only display the cc field if not -brief_header */ 1949 if message.cc -> address_list.n_addresses > 0 then 1950 if ifo.use_canonical_fieldnames then 1951 call format_address_list_field_internal (CANONICAL_CC_FIELDNAME, message.cc, "1"b); 1952 else call format_address_list_field_internal (CC_FIELDNAME, message.cc, "1"b); 1953 1954 if p_formatting_mode > BRIEF_FORMATTING_MODE then 1955 if message.bcc ^= null () then /* only display the bcc field if not -brief_header */ 1956 if message.bcc -> address_list.n_addresses > 0 then 1957 if ifo.use_canonical_fieldnames then 1958 call format_address_list_field_internal (CANONICAL_BCC_FIELDNAME, message.bcc, "1"b); 1959 else call format_address_list_field_internal (BCC_FIELDNAME, message.bcc, "1"b); 1960 1961 if p_formatting_mode = BRIEF_FORMATTING_MODE then do; 1962 /*** Check for multiple recipients and/or the user not being the recipient */ 1963 user_is_recipient = "0"b; 1964 n_recipients = 0; 1965 do address_list_ptr = message.to, message.cc, message.bcc; 1966 if address_list_ptr ^= null () then do; /* ... there are some addresses on this list */ 1967 n_recipients = n_recipients + address_list.n_addresses; 1968 do idx = 1 to address_list.n_addresses while (^user_is_recipient); 1969 if mail_system_$compare_addresses (mlsys_data_$user_default_mailbox_address, 1970 address_list.addresses (idx), (0)) then 1971 user_is_recipient = "1"b; 1972 else if 1973 mail_system_$compare_addresses (mlsys_data_$user_mail_table_address, 1974 address_list.addresses (idx), (0)) then 1975 user_is_recipient = "1"b; 1976 end; 1977 end; 1978 end; 1979 if (^user_is_recipient & (n_recipients > 0)) | (n_recipients > 1) then do; 1980 call add_to_buffer_varying (RECIPIENTS_FIELDNAME); 1981 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 1982 if user_is_recipient then do; /* must be others beside this person */ 1983 call add_to_buffer_fixed ("Yourself and "); 1984 n_recipients = n_recipients - 1; /* ... don't count ourselves twice */ 1985 end; 1986 call add_to_buffer_fixed (ltrim (convert (six_digits_picture, n_recipients))); 1987 if n_recipients = 1 then 1988 call add_to_buffer_fixed (" other"); 1989 else call add_to_buffer_fixed (" others"); 1990 call add_to_buffer_fixed (NL); 1991 end; 1992 end; 1993 1994 if p_formatting_mode > BRIEF_FORMATTING_MODE then 1995 if message.reply_references ^= null () then /* include the In-Reply-To field only if not -brief_header */ 1996 if message.reply_references -> message_references_list.n_references > 0 then 1997 call format_references_list_field_internal (REPLY_REFERENCES_FIELDNAME, message.reply_references, 1998 "1"b); 1999 2000 if (p_formatting_mode = LONG_FORMATTING_MODE) 2001 | ((p_formatting_mode = DEFAULT_FORMATTING_MODE) 2002 & ^aim_check_$equal (message.access_class, get_authorization_ ())) then 2003 call format_access_class_field_internal (ACCESS_CLASS_FIELDNAME, message.access_class, "1"b); 2004 2005 if ifo.include_message_id | (p_formatting_mode = LONG_FORMATTING_MODE) then 2006 /* always display Message-ID when asked or in long form ... */ 2007 if message.message_id ^= ""b then /* ... but not for new messages (they don't have one) */ 2008 call format_message_id_field_internal (MESSAGE_ID_FIELDNAME, message.message_id, "1"b); 2009 2010 /*** Finally, process the user-defined fields */ 2011 if p_formatting_mode > BRIEF_FORMATTING_MODE then /* ... but only if not -brief_header */ 2012 if message.user_fields_list ^= null () then do; 2013 do idx = 1 to message_user_fields_list.n_user_fields; 2014 message_user_field_ptr = addr (message_user_fields_list.user_fields (idx)); 2015 call mail_system_$get_user_field_name (message_user_field.field_id, user_fieldname, code); 2016 if code = 0 then do; /* ... I'd be real suprised if it isn't */ 2017 if message_user_field.field_type = MESSAGE_TEXT_USER_FIELD then do; 2018 if (message_text_user_field.text_ptr ^= null ()) 2019 & (message_text_user_field.text_lth ^= 0) then 2020 call format_text_field_internal (user_fieldname, message_text_user_field_text, 2021 (message_text_user_field.multiline_text), "1"b); 2022 end; 2023 else if message_user_field.field_type = MESSAGE_ADDRESS_LIST_USER_FIELD then do; 2024 if message_address_list_user_field.address_list_ptr ^= null () then 2025 if message_address_list_user_field.address_list_ptr -> address_list.n_addresses 2026 > 0 then 2027 call format_address_list_field_internal (user_fieldname, 2028 message_address_list_user_field.address_list_ptr, "1"b); 2029 end; 2030 else if message_user_field.field_type = MESSAGE_DATE_USER_FIELD then do; 2031 call format_date_time_field_internal (user_fieldname, 2032 message_date_user_field.date_time, "0"b, "1"b); 2033 end; 2034 else /*** if message_user_field.field_type = MESSAGE_INTEGER_USER_FIELD then */ 2035 do; 2036 call add_to_buffer_varying (user_fieldname); 2037 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 2038 call add_to_buffer_fixed ( 2039 ltrim (convert (value_picture, message_integer_user_field.value))); 2040 call add_to_buffer_fixed (NL); 2041 end; 2042 end; 2043 end; 2044 end; 2045 2046 return; 2047 2048 end format_header; 2049 2050 /* Actually formats the redistributions list of a message (called by several entrypoints) */ 2051 2052 format_redistributions_list_internal: 2053 procedure (p_formatting_mode); 2054 2055 dcl p_formatting_mode fixed binary parameter; 2056 dcl (first_idx, last_idx, idx_increment, idx) fixed binary; 2057 2058 if message.redistributions_list = null () then return; 2059 2060 if ifo.reverse_redistributions then do; /* format most recent redistribution first */ 2061 first_idx = message_redistributions_list.n_redistributions; 2062 last_idx = 1; 2063 idx_increment = -1; 2064 end; 2065 else do; /* format oldest redistribution first */ 2066 first_idx = 1; 2067 last_idx = message_redistributions_list.n_redistributions; 2068 idx_increment = 1; 2069 end; 2070 2071 if ifo.reverse_redistributions then /* display Last-Redistributed field at very top */ 2072 call format_last_redistributed_if_needed (); 2073 2074 do idx = first_idx to last_idx by idx_increment; 2075 message_redistribution_ptr = addr (message_redistributions_list.redistributions (idx)); 2076 if (p_formatting_mode > BRIEF_FORMATTING_MODE) | (message_redistribution.comment.text_lth > 0) then 2077 call format_redistribution (p_formatting_mode); 2078 end; /* only if there's a comment when brief ... */ 2079 2080 if ^ifo.reverse_redistributions then /* display Last-Redistributed at the end if chronological */ 2081 call format_last_redistributed_if_needed (); 2082 2083 return; 2084 2085 2086 2087 /* Internal to format_redistributions_list_internal: includes a "Last-Redistributed" field if the last redistributions 2088* does not have a comment and brief formatting is in effect */ 2089 2090 format_last_redistributed_if_needed: 2091 procedure (); 2092 2093 if (p_formatting_mode ^= BRIEF_FORMATTING_MODE) | (message_redistributions_list.n_redistributions = 0) then 2094 return; 2095 2096 message_redistribution_ptr = 2097 addr (message_redistributions_list.redistributions (message_redistributions_list.n_redistributions)); 2098 2099 if message_redistribution.comment.text_lth = 0 then do; 2100 last_column_used = 0; /* starting a new line of output here ... */ 2101 if ifo.rfc822_format then 2102 call add_to_buffer_varying (LAST_RESENT_FIELDNAME); 2103 else call add_to_buffer_varying (LAST_REDISTRIBUTED_FIELDNAME); 2104 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 2105 ifo.indentation = last_column_used; /* ... and we need to know where to indent things */ 2106 call format_date_time (message_redistribution.date_time_created, "0"b); 2107 call add_to_buffer_fixed (" by "); 2108 call format_address_list (message_redistribution.from); 2109 call add_to_buffer_fixed (NL); 2110 end; 2111 2112 return; 2113 2114 end format_last_redistributed_if_needed; 2115 2116 end format_redistributions_list_internal; 2117 2118 /* Actually formats the body of a message (called by several entrypoints) */ 2119 2120 format_body: 2121 procedure (); 2122 2123 dcl idx fixed binary; 2124 2125 if ifo.build_mf_extension then do; /* subsequent string searches will examine the body ... */ 2126 mf_extension.n_text_fragments = mf_extension.n_text_fragments + 1; 2127 mf_extension.text_fragments (mf_extension.n_text_fragments).start = buffer_used + 1; 2128 end; 2129 2130 do idx = 1 to message.n_body_sections; 2131 2132 if idx > 1 then /* separate it from the previous part */ 2133 call add_to_buffer_fixed (NL); 2134 2135 call format_body_section_internal (addr (message.body_sections (idx))); 2136 end; 2137 2138 if ifo.build_mf_extension then /* also record the body's length */ 2139 mf_extension.text_fragments (mf_extension.n_text_fragments).lth = 2140 buffer_used - mf_extension.text_fragments (mf_extension.n_text_fragments).start + 1; 2141 2142 return; 2143 2144 end format_body; 2145 2146 /* Actually formats a message trace (called by several entrypoints) */ 2147 2148 format_trace: 2149 procedure (p_trace_ptr, p_is_redistribution); 2150 2151 dcl p_trace_ptr pointer parameter; 2152 dcl p_is_redistribution bit (1) aligned parameter; 2153 2154 dcl 1 the_relay aligned like message_trace.relays based (the_relay_ptr); 2155 dcl the_relay_ptr pointer; 2156 2157 dcl fieldname_prefix character (32) varying; 2158 dcl canonicalize bit (1) aligned; 2159 dcl idx fixed binary; 2160 2161 2162 if ifo.rfc822_format then return; /* can't allow old trace into RFC822 messages as SMTP will add 2163* new fields which would be indistinguishable from the old 2164* ones */ 2165 2166 message_trace_ptr = p_trace_ptr; /* can't use like because of refer-extents */ 2167 2168 if p_is_redistribution then 2169 fieldname_prefix = REDISTRIBUTED_PREFIX; 2170 else fieldname_prefix = ""; 2171 2172 if message_trace.implicit_route ^= null () then do; 2173 address_route_ptr = message_trace.implicit_route; 2174 last_column_used = 0; /* will need this for proper formatting */ 2175 call add_to_buffer_varying ((fieldname_prefix || IMPLICIT_ROUTE_FIELDNAME)); 2176 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 2177 ifo.indentation = last_column_used; 2178 do idx = address_route.n_relays to 1 by -1; 2179 if ifo.wrap then /* check if we should start a continuation line ... */ 2180 if last_column_used > ifo.indentation then 2181 if (idx = 1) & ^ifo.dont_canonicalize_system_names then 2182 if (last_column_used + length (SP_VIA_SP) 2183 + 2184 top_level_length ( 2185 mlsys_nit_interface_$canonicalize_system_name (address_route.relays (idx)))) 2186 > ifo.line_length then 2187 call new_line (); 2188 else ; 2189 else if (last_column_used + length (SP_VIA_SP) 2190 + top_level_length (address_route.relays (idx))) > ifo.line_length then 2191 call new_line (); 2192 call add_to_buffer_fixed (SP_VIA_SP); 2193 if (idx = 1) & ^ifo.dont_canonicalize_system_names then 2194 call format_top_level_string ( 2195 mlsys_nit_interface_$canonicalize_system_name (address_route.relays (idx))); 2196 else call format_top_level_string (address_route.relays (idx)); 2197 end; 2198 call add_to_buffer_fixed (NL); /* end of that field */ 2199 end; 2200 2201 do idx = 1 to message_trace.n_relays; 2202 the_relay_ptr = addr (message_trace.relays (idx)); 2203 last_column_used = 0; /* need the indentation point again */ 2204 call add_to_buffer_varying ((fieldname_prefix || RELAY_FIELDNAME)); 2205 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 2206 ifo.indentation = last_column_used; 2207 canonicalize = 2208 ^ifo.dont_canonicalize_system_names & mlsys_nit_interface_$is_local_system (the_relay.receiving_host); 2209 call add_to_buffer_fixed ("from "); 2210 if canonicalize then 2211 call add_to_buffer_varying (mlsys_nit_interface_$canonicalize_system_name (the_relay.sending_host)); 2212 else call add_to_buffer_varying (the_relay.sending_host); 2213 if canonicalize then 2214 call add_phrase ("to", mlsys_nit_interface_$canonicalize_system_name (the_relay.receiving_host)); 2215 else call add_phrase ("to", the_relay.receiving_host); 2216 if the_relay.mail_protocol ^= "" then call add_phrase ("using", rtrim (the_relay.mail_protocol)); 2217 if the_relay.communications_protocol ^= "" then 2218 call add_phrase ("with", rtrim (the_relay.communications_protocol)); 2219 if the_relay.communications_media ^= "" then 2220 call add_phrase ("via", rtrim (the_relay.communications_media)); 2221 if the_relay.relay_id ^= ""b then do; 2222 if ifo.wrap then /* ... perform a simple check to insure there's some room */ 2223 if last_column_used > ifo.indentation then 2224 if (last_column_used + length ("ID") + 12) > ifo.line_length then call new_line (); 2225 call add_to_buffer_fixed (" ID "); 2226 call format_message_id (the_relay.relay_id); 2227 end; 2228 if the_relay.relay_recipient ^= null () then do; 2229 if ifo.wrap then /* ... perform a simple check to insure there's some room */ 2230 if last_column_used > ifo.indentation then 2231 if (last_column_used + length ("for") + 12) > ifo.line_length then call new_line (); 2232 call add_to_buffer_fixed (" for "); 2233 call format_address (the_relay.relay_recipient, ""); 2234 end; 2235 call add_to_buffer_fixed (SEMICOLON); 2236 call add_to_buffer_fixed (SP); 2237 call format_date_time (the_relay.date_time_relayed, "0"b); 2238 call add_to_buffer_fixed (NL); 2239 end; 2240 2241 return; 2242 2243 2244 2245 /* Internal to format_trace: adds a phrase to the current Relayed field */ 2246 2247 add_phrase: 2248 procedure (p_phrase_prefix, p_phrase); 2249 2250 dcl p_phrase_prefix character (*) parameter; 2251 dcl p_phrase character (*) varying parameter; 2252 2253 if ifo.wrap then /* try no to overflow the line */ 2254 if last_column_used > ifo.indentation then 2255 if (last_column_used + length (p_phrase_prefix) + 2 + top_level_length (p_phrase)) 2256 > ifo.line_length then 2257 call new_line (); 2258 2259 call add_to_buffer_fixed (SP); 2260 call add_to_buffer_fixed (p_phrase_prefix); 2261 call add_to_buffer_fixed (SP); 2262 2263 call format_top_level_string (p_phrase); 2264 2265 return; 2266 2267 end add_phrase; 2268 2269 end format_trace; 2270 2271 /* Actually formats a single redistribution (called directly by one entrypoint) */ 2272 2273 format_redistribution: 2274 procedure (p_formatting_mode); 2275 2276 dcl p_formatting_mode fixed binary parameter; 2277 dcl full_fieldname character (64) varying; 2278 dcl fieldname_prefix character (32) varying; 2279 dcl six_digits_picture picture "zzzzz9"; 2280 dcl user_is_recipient bit (1) aligned; 2281 dcl (n_recipients, idx) fixed binary; 2282 2283 if ifo.rfc822_format then 2284 fieldname_prefix = RESENT_PREFIX; 2285 else fieldname_prefix = REDISTRIBUTED_PREFIX; 2286 2287 if ^ifo.forum_format & (p_formatting_mode > BRIEF_FORMATTING_MODE) then 2288 call format_envelope (addr (message_redistribution.envelope), "1"b, 2289 message_redistribution.date_time_created, message_redistribution.from, p_formatting_mode); 2290 2291 if message_redistribution.date_time_created > 0 then do; 2292 full_fieldname = fieldname_prefix || DATE_TIME_CREATED_FIELDNAME; 2293 call format_date_time_field_internal (full_fieldname, message_redistribution.date_time_created, "0"b, "1"b) 2294 ; 2295 end; /* always show the Redistributed-Date if it's present */ 2296 2297 if message_redistribution.from ^= null () then 2298 if message_redistribution.from -> address_list.n_addresses > 0 then do; 2299 full_fieldname = fieldname_prefix || FROM_FIELDNAME; 2300 call format_address_list_field_internal (full_fieldname, message_redistribution.from, "1"b); 2301 end; /* always show the Redistributed-From it it's not empty ... */ 2302 2303 if p_formatting_mode > BRIEF_FORMATTING_MODE then 2304 if message_redistribution.to ^= null () then 2305 if message_redistribution.to -> address_list.n_addresses > 0 then do; 2306 full_fieldname = fieldname_prefix || TO_FIELDNAME; 2307 call format_address_list_field_internal (full_fieldname, message_redistribution.to, "1"b); 2308 end; /* only display the Redistributed-To field if not -bfhe */ 2309 2310 if p_formatting_mode = BRIEF_FORMATTING_MODE then do; 2311 /*** Check for multiple recipients and/or the user not being the recipient */ 2312 user_is_recipient = "0"b; 2313 n_recipients = 0; 2314 address_list_ptr = message_redistribution.to; 2315 if address_list_ptr ^= null () then do; /* ... there are some addresses on this list */ 2316 n_recipients = n_recipients + address_list.n_addresses; 2317 do idx = 1 to address_list.n_addresses while (^user_is_recipient); 2318 if mail_system_$compare_addresses (mlsys_data_$user_default_mailbox_address, 2319 address_list.addresses (idx), (0)) then 2320 user_is_recipient = "1"b; 2321 else if 2322 mail_system_$compare_addresses (mlsys_data_$user_mail_table_address, 2323 address_list.addresses (idx), (0)) then 2324 user_is_recipient = "1"b; 2325 end; 2326 end; 2327 if (^user_is_recipient & (n_recipients > 0)) | (n_recipients > 1) then do; 2328 full_fieldname = fieldname_prefix || RECIPIENTS_FIELDNAME; 2329 call add_to_buffer_varying (full_fieldname); 2330 call add_to_buffer_fixed (FIELDNAME_SUFFIX); 2331 if user_is_recipient then do; /* must be others beside this person */ 2332 call add_to_buffer_fixed ("Yourself and "); 2333 n_recipients = n_recipients - 1; 2334 end; /* ... don't count ourselves twice */ 2335 call add_to_buffer_fixed (ltrim (convert (six_digits_picture, n_recipients))); 2336 if n_recipients = 1 then 2337 call add_to_buffer_fixed (" other"); 2338 else call add_to_buffer_fixed (" others"); 2339 call add_to_buffer_fixed (NL); 2340 end; 2341 end; 2342 2343 if message_redistribution.comment.text_lth > 0 then do; 2344 full_fieldname = fieldname_prefix || COMMENT_FIELDNAME; 2345 call format_text_field_internal (full_fieldname, message_redistribution_comment, "1"b, "1"b); 2346 /* always display the Redistributed-Comment */ 2347 end; 2348 2349 if ifo.include_message_id | (p_formatting_mode = LONG_FORMATTING_MODE) then 2350 if message_redistribution.message_id ^= ""b then do; 2351 full_fieldname = fieldname_prefix || MESSAGE_ID_FIELDNAME; 2352 call format_message_id_field_internal (full_fieldname, message_redistribution.message_id, "1"b); 2353 end; /* only display Redistributed-Message-ID in long mode */ 2354 2355 return; 2356 2357 end format_redistribution; 2358 2359 /* Actually formats an access class (called by numerous entrypoints) */ 2360 2361 format_access_class: 2362 procedure (p_access_class); 2363 2364 dcl p_access_class bit (72) aligned parameter; 2365 2366 dcl short_string character (200); 2367 dcl (string_lth, comma_lth, used, idx) fixed binary; 2368 2369 call convert_authorization_$to_string_short (p_access_class, short_string, (0)); 2370 /* above string is large enough for any access class */ 2371 2372 if short_string = "" then /* special case it so it will say something */ 2373 short_string = "system_low"; 2374 else if aim_check_$equal (p_access_class, sys_info$access_class_ceiling) then short_string = "system_high"; 2375 /* make's it easier to read */ 2376 2377 string_lth = length (rtrim (short_string)); 2378 used = 0; /* haven't examined any of it yet */ 2379 2380 do while (used < string_lth); 2381 begin; 2382 dcl rest_of_string character (string_lth - used) unaligned defined (short_string) position (used + 1); 2383 idx = index (rest_of_string, COMMA); 2384 if idx = 0 then idx = length (rest_of_string) + 1; 2385 end; 2386 2387 begin; 2388 dcl next_word character (idx - 1) unaligned defined (short_string) position (used + 1); 2389 if (length (next_word) + used + 1) > string_lth then 2390 comma_lth = 0; 2391 else comma_lth = length (COMMA_SP); 2392 2393 if ifo.wrap then /* check for overflow */ 2394 if last_column_used > ifo.indentation then 2395 if (last_column_used + length (next_word) + comma_lth) > ifo.line_length then 2396 call new_line (); 2397 2398 call add_to_buffer_fixed (next_word); 2399 if comma_lth > 0 then call add_to_buffer_fixed (COMMA_SP); 2400 2401 used = used + idx; /* to the next word */ 2402 end; 2403 end; 2404 2405 return; 2406 2407 end format_access_class; 2408 2409 /* Actually formats an address (called by numerous entrypoints) */ 2410 2411 format_address: 2412 procedure (p_address_ptr, p_address_suffix) options (non_quick); 2413 2414 dcl p_address_ptr pointer parameter; 2415 dcl p_address_suffix character (*) varying parameter; 2416 2417 dcl address_string character (address_string_max_lth) varying based (address_string_ptr); 2418 dcl address_name character (address_name_max_lth) varying based (address_name_ptr); 2419 dcl address_comment character (address_comment_max_lth) varying based (address_comment_ptr); 2420 dcl (address_string_ptr, address_name_ptr, address_comment_ptr) pointer; 2421 dcl (address_string_max_lth, address_name_max_lth, address_comment_max_lth) fixed binary (21); 2422 2423 dcl (local_address_string, local_address_name, local_address_comment) character (256) varying; 2424 2425 dcl saved_indentation fixed binary; 2426 dcl (have_address_data, display_list) bit (1) aligned; 2427 2428 dcl address_pathname character (204); /* pathname associated with the address */ 2429 dcl (address_pathname_varying, address_system) character (256) varying; 2430 dcl address_dirname character (168); 2431 dcl (address_ename, address_component) character (32); 2432 2433 dcl address_representation_lth fixed binary (21); 2434 dcl address_type fixed binary; 2435 2436 2437 call mail_system_$get_address_type (p_address_ptr, address_type, (0)); 2438 2439 call get_address_variable (local_address_name, address_name_ptr, address_name_max_lth, 2440 mail_system_$get_address_name); 2441 2442 call get_address_variable (local_address_comment, address_comment_ptr, address_comment_max_lth, 2443 mail_system_$get_address_comment); 2444 2445 have_address_data = "0"b; 2446 2447 if ^ifo.wrap then go to BEGIN_TO_FORMAT; /* if we don't care about line wrapping ... */ 2448 2449 have_address_data = "1"b; /* don't bother to fetch things twice */ 2450 2451 address_representation_lth = length (p_address_suffix); 2452 2453 if length (address_name) > 0 then /* there's a name: compute how long it will be */ 2454 address_representation_lth = 2455 address_representation_lth + phrase_length (address_name) + length (SP_LEFT_ANGLE_BRACKET) 2456 + length (RIGHT_ANGLE_BRACKET); 2457 2458 if length (address_comment) > 0 then /* there's a comment: compute how long it will be */ 2459 address_representation_lth = 2460 address_representation_lth + comment_length (address_comment) + length (SP_OPEN_PAREN) 2461 + length (CLOSE_PAREN); 2462 2463 go to COMPUTE_ADDRESS_WIDTH (address_type); 2464 2465 COMPUTE_ADDRESS_WIDTH (0): /* invalid address */ 2466 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2467 mail_system_$get_address_string); 2468 address_representation_lth = 2469 address_representation_lth + structured_length (address_string) + length ("{invalid }") 2470 + quotes_if_rfc822 (); 2471 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2472 2473 COMPUTE_ADDRESS_WIDTH (1): /* user mailbox address */ 2474 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2475 mail_system_$get_address_string); 2476 address_representation_lth = address_representation_lth + top_level_length (address_string); 2477 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2478 2479 COMPUTE_ADDRESS_WIDTH (2): /* logbox address */ 2480 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2481 mail_system_$get_address_string); 2482 if ifo.dont_show_logsave | (address_string ^= mlsys_data_$user_id) then 2483 address_representation_lth = address_representation_lth + top_level_length (address_string); 2484 else address_representation_lth = address_representation_lth + length ("{logbox}") + quotes_if_rfc822 (); 2485 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2486 2487 COMPUTE_ADDRESS_WIDTH (3): /* savebox address */ 2488 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2489 mail_system_$get_address_string); 2490 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2491 if ifo.dont_show_logsave | (address_string ^= mlsys_data_$user_id) then do; 2492 address_representation_lth = address_representation_lth + top_level_length (address_string); 2493 address_pathname_varying = reverse (after (reverse (address_ename), reverse (".sv.mbx"))); 2494 address_representation_lth = 2495 address_representation_lth + comment_length (address_pathname_varying) + length (SP_OPEN_PAREN) 2496 + length (CLOSE_PAREN); 2497 end; 2498 else do; 2499 address_pathname = pathname_ (address_dirname, address_ename); 2500 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".sv.mbx"))); 2501 address_representation_lth = 2502 address_representation_lth + structured_length (address_pathname_varying) + length ("{save }") 2503 + quotes_if_rfc822 (); 2504 end; 2505 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2506 2507 COMPUTE_ADDRESS_WIDTH (4): /* mailbox address */ 2508 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2509 address_pathname = pathname_ (address_dirname, address_ename); 2510 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".mbx"))); 2511 address_representation_lth = 2512 address_representation_lth + structured_length (address_pathname_varying) + length ("{mbx }") 2513 + quotes_if_rfc822 (); 2514 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2515 2516 COMPUTE_ADDRESS_WIDTH (5): /* forum address */ 2517 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2518 if address_dirname = "" then /* ... null dirname => not found in "forum" search list */ 2519 address_pathname_varying = rtrim (address_ename); 2520 else address_pathname_varying = rtrim (pathname_ (address_dirname, address_ename)); 2521 if ^ifo.include_forum_suffix then /* ... caller doesn't need the suffix for later use */ 2522 if index (reverse (address_pathname_varying), reverse (".forum")) = 1 then 2523 address_pathname_varying = 2524 substr (address_pathname_varying, 1, (length (address_pathname_varying) - length (".forum"))); 2525 else if index (reverse (address_pathname_varying), reverse (".control")) = 1 then 2526 address_pathname_varying = 2527 substr (address_pathname_varying, 1, (length (address_pathname_varying) - length (".control"))); 2528 address_representation_lth = 2529 address_representation_lth + structured_length (address_pathname_varying) + length ("{forum }") 2530 + quotes_if_rfc822 (); 2531 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2532 2533 COMPUTE_ADDRESS_WIDTH (6): /* foreign address */ 2534 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2535 mail_system_$get_address_string); 2536 call mail_system_$get_address_system (p_address_ptr, address_system, (0)); 2537 address_route_ptr = null (); /* ... assume no route initially */ 2538 call mail_system_$get_address_route (p_address_ptr, ADDRESS_ROUTE_VERSION_1, address_route_ptr, (0)); 2539 address_representation_lth = address_representation_lth + top_level_length (address_string); 2540 if ifo.rfc822_format then 2541 address_representation_lth = address_representation_lth + length (ATSIGN); 2542 else address_representation_lth = address_representation_lth + length (SP_AT_SP); 2543 if address_route_ptr ^= null () then /* ... have a route: system name may not be known to us */ 2544 address_representation_lth = address_representation_lth + top_level_length (address_system); 2545 else if ifo.dont_canonicalize_system_names then /* ... can't use partial names across top-level domains */ 2546 address_representation_lth = address_representation_lth + top_level_length (address_system); 2547 else address_representation_lth = 2548 address_representation_lth 2549 + top_level_length (mlsys_nit_interface_$canonicalize_system_name (address_system)); 2550 if address_route_ptr ^= null () then do; /* ... include the explicit route */ 2551 do idx = 1 to address_route.n_relays; 2552 if ifo.rfc822_format then /* ... RFC 822 form is: <@HOST,...,@HOST:LOCAL@HOST> */ 2553 address_representation_lth = address_representation_lth + length (ATSIGN) + length (COMMA); 2554 else address_representation_lth = address_representation_lth + length (SP_VIA_SP); 2555 if idx = 1 then /* ... only the first relay name is in our NIT */ 2556 if ifo.dont_canonicalize_system_names then 2557 address_representation_lth = 2558 address_representation_lth + top_level_length (address_route.relays (1)); 2559 else address_representation_lth = 2560 address_representation_lth 2561 + 2562 top_level_length ( 2563 mlsys_nit_interface_$canonicalize_system_name (address_route.relays (1))); 2564 else address_representation_lth = 2565 address_representation_lth + top_level_length (address_route.relays (idx)); 2566 end; 2567 if ifo.rfc822_format & (length (address_name) = 0) then 2568 address_representation_lth = address_representation_lth + length (ANGLE_BRACKETS); 2569 end; 2570 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2571 2572 COMPUTE_ADDRESS_WIDTH (7): /* mail table address */ 2573 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2574 mail_system_$get_address_string); 2575 address_representation_lth = address_representation_lth + top_level_length (address_string); 2576 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2577 2578 COMPUTE_ADDRESS_WIDTH (8): /* mailing list address */ 2579 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, address_component, (0)); 2580 address_pathname = pathname_$component (address_dirname, address_ename, address_component); 2581 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".mls"))); 2582 address_representation_lth = 2583 address_representation_lth + structured_length (address_pathname_varying) + length ("{list }") 2584 + quotes_if_rfc822 (); 2585 go to END_COMPUTE_ADDRESS_WIDTH_CASE; 2586 2587 COMPUTE_ADDRESS_WIDTH (9): /* named group address */ 2588 call mail_system_$get_named_group_display_flag (p_address_ptr, display_list, (0)); 2589 go to END_COMPUTE_ADDRESS_WIDTH_CASE; /* ... is treated quite differently */ 2590 2591 END_COMPUTE_ADDRESS_WIDTH_CASE: 2592 if ifo.include_local_system_name & ((address_type ^= FOREIGN_ADDRESS) & (address_type ^= NAMED_GROUP_ADDRESS)) 2593 then do; 2594 if ifo.dont_canonicalize_system_names then 2595 address_representation_lth = 2596 address_representation_lth + top_level_length (mlsys_nit_interface_$get_local_system_name ()); 2597 else address_representation_lth = 2598 address_representation_lth 2599 + 2600 top_level_length ( 2601 mlsys_nit_interface_$canonicalize_system_name (mlsys_nit_interface_$get_local_system_name ())); 2602 if ifo.rfc822_format then 2603 address_representation_lth = address_representation_lth + length (ATSIGN); 2604 else address_representation_lth = address_representation_lth + length (SP_AT_SP); 2605 end; 2606 2607 if address_type = NAMED_GROUP_ADDRESS then /* special case: start a newline if it's not first */ 2608 if display_list then /* ... but only if the list is going to be displayed */ 2609 if (last_column_used > ifo.indentation) then 2610 call new_line (); 2611 else ; 2612 else go to STANDARD_WRAP_CRITERIA; /* ... otherwise treat it as a normal address */ 2613 2614 else 2615 STANDARD_WRAP_CRITERIA: 2616 if (last_column_used > ifo.indentation) /* never output a newline if the line's still empty */ 2617 & ((last_column_used + address_representation_lth) > ifo.line_length) then 2618 call new_line (); 2619 2620 2621 BEGIN_TO_FORMAT: 2622 if length (address_name) > 0 then do; /* put out the address_name */ 2623 call format_phrase_string (address_name); 2624 if address_type = NAMED_GROUP_ADDRESS then 2625 call add_to_buffer_fixed (COLON_SP); 2626 else call add_to_buffer_fixed (SP_LEFT_ANGLE_BRACKET); 2627 end; 2628 2629 go to FORMAT_ADDRESS (address_type); 2630 2631 FORMAT_ADDRESS (0): /* invalid address */ 2632 if ^have_address_data then 2633 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2634 mail_system_$get_address_string); 2635 call format_structured_string ("invalid", address_string); 2636 go to END_FORMAT_ADDRESS_CASE; 2637 2638 FORMAT_ADDRESS (1): /* user mailbox address */ 2639 if ^have_address_data then 2640 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2641 mail_system_$get_address_string); 2642 call format_top_level_string (address_string); 2643 go to END_FORMAT_ADDRESS_CASE; 2644 2645 FORMAT_ADDRESS (2): /* logbox address */ 2646 if ^have_address_data then 2647 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2648 mail_system_$get_address_string); 2649 if ifo.dont_show_logsave | (address_string ^= mlsys_data_$user_id) then 2650 call format_top_level_string (address_string); 2651 else call format_structured_string ("logbox", ""); 2652 go to END_FORMAT_ADDRESS_CASE; 2653 2654 FORMAT_ADDRESS (3): /* savebox address */ 2655 if ^have_address_data then do; 2656 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2657 mail_system_$get_address_string); 2658 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2659 address_pathname = pathname_ (address_dirname, address_ename); 2660 end; 2661 if ifo.dont_show_logsave | (address_string ^= mlsys_data_$user_id) then do; 2662 call format_top_level_string (address_string); 2663 address_pathname_varying = reverse (after (reverse (address_ename), reverse (".sv.mbx"))); 2664 call format_comment_string (address_pathname_varying); 2665 end; 2666 else do; 2667 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".sv.mbx"))); 2668 call format_structured_string ("save", address_pathname_varying); 2669 end; 2670 go to END_FORMAT_ADDRESS_CASE; 2671 2672 FORMAT_ADDRESS (4): /* mailbox address */ 2673 if ^have_address_data then do; 2674 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2675 address_pathname = pathname_ (address_dirname, address_ename); 2676 end; 2677 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".mbx"))); 2678 call format_structured_string ("mbx", address_pathname_varying); 2679 go to END_FORMAT_ADDRESS_CASE; 2680 2681 FORMAT_ADDRESS (5): /* forum address */ 2682 if ^have_address_data then do; 2683 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, ((32)" "), (0)); 2684 if address_dirname = "" then /* ... null dirname => not found in "forum" search list */ 2685 address_pathname_varying = rtrim (address_ename); 2686 else address_pathname_varying = rtrim (pathname_ (address_dirname, address_ename)); 2687 end; 2688 if ^ifo.include_forum_suffix then /* ... caller doesn't need the suffix for later use */ 2689 if index (reverse (address_pathname_varying), reverse (".forum")) = 1 then 2690 address_pathname_varying = 2691 substr (address_pathname_varying, 1, (length (address_pathname_varying) - length (".forum"))); 2692 else if index (reverse (address_pathname_varying), reverse (".control")) = 1 then 2693 address_pathname_varying = 2694 substr (address_pathname_varying, 1, (length (address_pathname_varying) - length (".control"))); 2695 call format_structured_string ("forum", address_pathname_varying); 2696 go to END_FORMAT_ADDRESS_CASE; 2697 2698 FORMAT_ADDRESS (6): /* foreign address */ 2699 if ^have_address_data then do; 2700 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2701 mail_system_$get_address_string); 2702 call mail_system_$get_address_system (p_address_ptr, address_system, (0)); 2703 address_route_ptr = null (); /* ... in case there is no route */ 2704 call mail_system_$get_address_route (p_address_ptr, ADDRESS_ROUTE_VERSION_1, address_route_ptr, (0)); 2705 end; 2706 if ifo.rfc822_format then do; /* ... RFC 822 format */ 2707 if address_route_ptr ^= null () then do; /* ... ... we'll be creating a "path": add "<" if nameless */ 2708 if length (address_name) = 0 then call add_to_buffer_fixed (LEFT_ANGLE_BRACKET); 2709 do idx = 1 to address_route.n_relays; 2710 if idx > 1 then call add_to_buffer_fixed (COMMA); 2711 call add_to_buffer_fixed (ATSIGN); 2712 if idx = 1 then /* ... only the first relay name is in our tables */ 2713 if ifo.dont_canonicalize_system_names then 2714 call format_top_level_string (address_route.relays (1)); 2715 else call format_top_level_string ( 2716 mlsys_nit_interface_$canonicalize_system_name (address_route.relays (1))); 2717 else call format_top_level_string (address_route.relays (idx)); 2718 end; 2719 call add_to_buffer_fixed (COLON); 2720 end; 2721 call format_top_level_string (address_string); 2722 call add_to_buffer_fixed (ATSIGN); 2723 if address_route_ptr ^= null () then /* ... if there's a route, this name may not be in NIT */ 2724 call format_top_level_string (address_system); 2725 else if ifo.dont_canonicalize_system_names then call format_top_level_string (address_system); 2726 else call format_top_level_string (mlsys_nit_interface_$canonicalize_system_name (address_system)); 2727 if (address_route_ptr ^= null ()) & (length (address_name) = 0) then 2728 call add_to_buffer_fixed (RIGHT_ANGLE_BRACKET); 2729 end; 2730 else do; /* ... Multics format */ 2731 call format_top_level_string (address_string); 2732 call add_to_buffer_fixed (SP_AT_SP); 2733 if address_route_ptr ^= null () then /* ... if there's a route, this name may not be in NIT */ 2734 call format_top_level_string (address_system); 2735 else if ifo.dont_canonicalize_system_names then call format_top_level_string (address_system); 2736 else call format_top_level_string (mlsys_nit_interface_$canonicalize_system_name (address_system)); 2737 if address_route_ptr ^= null () then /* Multics routes come out "backwards" */ 2738 do idx = address_route.n_relays to 1 by -1; 2739 call add_to_buffer_fixed (SP_VIA_SP); 2740 if idx = 1 then /* ... only the first relay name is in our tables */ 2741 if ifo.dont_canonicalize_system_names then 2742 call format_top_level_string (address_route.relays (1)); 2743 else call format_top_level_string ( 2744 mlsys_nit_interface_$canonicalize_system_name (address_route.relays (1))); 2745 else call format_top_level_string (address_route.relays (idx)); 2746 end; 2747 end; 2748 go to END_FORMAT_ADDRESS_CASE; 2749 2750 FORMAT_ADDRESS (7): /* mail table address */ 2751 if ^have_address_data then 2752 call get_address_variable (local_address_string, address_string_ptr, address_string_max_lth, 2753 mail_system_$get_address_string); 2754 call format_top_level_string (address_string); 2755 go to END_FORMAT_ADDRESS_CASE; 2756 2757 FORMAT_ADDRESS (8): /* mailing list address */ 2758 if ^have_address_data then do; 2759 call mail_system_$get_address_pathname (p_address_ptr, address_dirname, address_ename, address_component, 2760 (0)); 2761 address_pathname = pathname_$component (address_dirname, address_ename, address_component); 2762 end; 2763 address_pathname_varying = reverse (after (reverse (address_pathname), reverse (".mls"))); 2764 call format_structured_string ("list", address_pathname_varying); 2765 go to END_FORMAT_ADDRESS_CASE; 2766 2767 FORMAT_ADDRESS (9): /* named group address */ 2768 if ^have_address_data then call mail_system_$get_named_group_display_flag (p_address_ptr, display_list, (0)); 2769 if display_list then do; /* ... show the list */ 2770 saved_indentation = ifo.indentation; 2771 ifo.indentation = last_column_used; /* ... make the address in the list line up */ 2772 call mail_system_$expand_list_address (p_address_ptr, ADDRESS_LIST_VERSION_2, address_list_ptr, (0)); 2773 call format_address_list (address_list_ptr); 2774 ifo.indentation = saved_indentation; 2775 end; 2776 2777 END_FORMAT_ADDRESS_CASE: 2778 if ifo.include_local_system_name & ((address_type ^= FOREIGN_ADDRESS) & (address_type ^= NAMED_GROUP_ADDRESS)) 2779 then do; 2780 if ifo.rfc822_format then 2781 call add_to_buffer_fixed (ATSIGN); 2782 else call add_to_buffer_fixed (SP_AT_SP); 2783 if ifo.dont_canonicalize_system_names then 2784 call format_top_level_string (mlsys_nit_interface_$get_local_system_name ()); 2785 else call format_top_level_string ( 2786 mlsys_nit_interface_$canonicalize_system_name (mlsys_nit_interface_$get_local_system_name ())); 2787 end; 2788 2789 if length (address_name) > 0 then /* close off the address */ 2790 if address_type = NAMED_GROUP_ADDRESS then 2791 call add_to_buffer_fixed (SEMICOLON); 2792 else call add_to_buffer_fixed (RIGHT_ANGLE_BRACKET); 2793 2794 if length (address_comment) > 0 then call format_comment_string (address_comment); 2795 2796 if length (p_address_suffix) > 0 then call add_to_buffer_varying (p_address_suffix); 2797 2798 return; 2799 2800 2801 2802 /* Internal to format_address: gets one of the variables (string, name, comment) associated with an address; it will grow 2803* the format_address stack frame as necessary */ 2804 2805 get_address_variable: 2806 procedure (p_local_variable, p_variable_ptr, p_variable_max_lth, p_get_primitive); 2807 2808 dcl p_local_variable character (256) varying parameter; 2809 dcl p_variable_ptr pointer parameter; 2810 dcl p_variable_max_lth fixed binary (21) parameter; 2811 dcl p_get_primitive entry (pointer, character (*) varying, fixed binary (35)); 2812 2813 dcl p_variable character (p_variable_max_lth) varying based (p_variable_ptr); 2814 dcl code fixed binary (35); 2815 2816 p_variable_ptr = addr (p_local_variable); /* assume it will fit in the preallocated space */ 2817 p_variable_max_lth = maxlength (p_local_variable); 2818 2819 call p_get_primitive (p_address_ptr, p_variable, code); 2820 2821 if code = error_table_$smallarg then do; /* too large for the preallocated space ... */ 2822 call cu_$grow_stack_frame (STACK_EXTENSION, p_variable_ptr, (0)); 2823 p_variable_max_lth = 4 * (STACK_EXTENSION - 1); 2824 2825 call p_get_primitive (p_address_ptr, p_variable, code); 2826 /* try again using space at the end of the stack ... */ 2827 2828 do while (code = error_table_$smallarg);/* ... and keep trying 'till it fits */ 2829 call cu_$grow_stack_frame (STACK_EXTENSION, (null ()), (0)); 2830 p_variable_max_lth = p_variable_max_lth + (4 * STACK_EXTENSION); 2831 call p_get_primitive (p_address_ptr, p_variable, code); 2832 end; 2833 end; 2834 2835 return; 2836 2837 end get_address_variable; 2838 2839 end format_address; 2840 2841 /* Actually formats an address list (called by numerous entrypoints) */ 2842 2843 format_address_list: 2844 procedure (p_address_list_ptr); 2845 2846 dcl p_address_list_ptr pointer parameter; 2847 dcl idx fixed binary; 2848 2849 if p_address_list_ptr -> address_list.n_addresses = 0 then return; 2850 2851 do idx = 1 to (p_address_list_ptr -> address_list.n_addresses - 1); 2852 call format_address (p_address_list_ptr -> address_list.addresses (idx), (COMMA_SP)); 2853 end; 2854 2855 call format_address (p_address_list_ptr 2856 -> address_list.addresses (p_address_list_ptr -> address_list.n_addresses), ""); 2857 2858 return; 2859 2860 end format_address_list; 2861 2862 /* Actually formats a date/time (called by numerous entrypoints) */ 2863 2864 format_date_time: 2865 procedure (p_date_time, p_include_dow); 2866 2867 dcl p_date_time fixed binary (71) parameter; 2868 dcl p_include_dow bit (1) aligned parameter; 2869 2870 dcl four_digits_picture picture "9999"; 2871 dcl two_digits_picture picture "99"; 2872 dcl time_zone character (3); 2873 dcl recognized_zone bit (1) aligned; 2874 dcl code fixed binary (35); 2875 dcl (month, day_of_month, year, hour, minute, day_of_week, offset, hours, minutes, process_zone_offset, idx) fixed 2876 binary; 2877 2878 2879 time_zone = ""; /* use the time zone of this process */ 2880 2881 call decode_clock_value_$date_time (p_date_time, month, day_of_month, year, hour, minute, (0), (0), day_of_week, 2882 time_zone, code); 2883 if code ^= 0 then do; /* shouldn't happen: provide some output anyway */ 2884 month, day_of_month = 1; /* ... use the base time for Multics clocks */ 2885 day_of_week = 2; /* ... which was a Tuesday */ 2886 year = 1901; 2887 hour, minute = 0; 2888 time_zone = "gmt"; 2889 end; 2890 2891 if ifo.rfc822_format then /* networks use uppercase zones; Multics uses lowercase */ 2892 time_zone = translate (time_zone, UPPERCASE, LOWERCASE); 2893 else time_zone = translate (time_zone, LOWERCASE, UPPERCASE); 2894 2895 if printing then /* always use the process time-zone if displaying the date */ 2896 recognized_zone = "1"b; 2897 else do; /* check if other processes/systems will understand it */ 2898 recognized_zone = "0"b; 2899 if ifo.rfc822_format then do; /* ... formatting for the network (ie: other systems) */ 2900 process_zone_offset = divide ((-time_data_$time_delta), ONE_MINUTE, 17, 0); 2901 do idx = lbound (RFC822_ZONES, 1) to hbound (RFC822_ZONES, 1) while (^recognized_zone); 2902 if (time_zone = RFC822_ZONES (idx)) & (process_zone_offset = RFC822_ZONE_OFFSETS (idx)) then 2903 recognized_zone = "1"b; 2904 end; 2905 end; 2906 else do; /* ... formatting for this Multics system */ 2907 do idx = 1 to ti_zone.number_lang while (^recognized_zone); 2908 do jdx = 1 to ti_zone.number_zone while (^recognized_zone); 2909 if (time_zone = translate (ti_zone.short (idx, jdx), LOWERCASE, UPPERCASE)) 2910 & (time_data_$time_delta = ti_zone.delta (idx, jdx)) then 2911 recognized_zone = "1"b; 2912 end; 2913 end; 2914 end; 2915 end; 2916 2917 if p_include_dow then do; /* callers wants the day of the week */ 2918 if ifo.rfc822_format then /* ... networks use short names; Multics uses long names */ 2919 call add_to_buffer_fixed (RFC822_DAY_OF_WEEKS (day_of_week)); 2920 else call add_to_buffer_varying (DAY_OF_WEEKS (day_of_week)); 2921 call add_to_buffer_fixed (COMMA_SP); 2922 end; 2923 2924 call add_to_buffer_fixed (ltrim (convert (two_digits_picture, day_of_month), "0")); 2925 call add_to_buffer_fixed (SP); 2926 2927 if ifo.rfc822_format then /* networks use short names; Multics uses long names */ 2928 call add_to_buffer_fixed (RFC822_MONTHS (month)); 2929 else call add_to_buffer_varying (MONTHS (month)); 2930 call add_to_buffer_fixed (SP); 2931 2932 if ifo.rfc822_format then /* networks use 2 digit years; Multics uses four digits */ 2933 call add_to_buffer_fixed (convert (two_digits_picture, mod (year, 100))); 2934 else call add_to_buffer_fixed (convert (four_digits_picture, year)); 2935 call add_to_buffer_fixed (SP); 2936 2937 call add_to_buffer_fixed (convert (two_digits_picture, hour)); 2938 call add_to_buffer_fixed (COLON); 2939 2940 call add_to_buffer_fixed (convert (two_digits_picture, minute)); 2941 2942 if recognized_zone then do; /* we recognize the time zone */ 2943 call add_to_buffer_fixed (SP); 2944 call add_to_buffer_fixed (rtrim (time_zone)); 2945 end; 2946 else do; /* non-standard zone: record its offset instead */ 2947 if time_data_$time_delta > 0 then /* ... Multics uses negative of the ISO offset */ 2948 call add_to_buffer_fixed (HYPHEN); 2949 else call add_to_buffer_fixed (PLUS); 2950 offset = divide (abs (time_data_$time_delta), ONE_MINUTE, 35, 0); 2951 hours = divide (offset, ONE_HOUR, 17, 0); /* ... convert into HHMM */ 2952 minutes = mod (offset, ONE_HOUR); 2953 call add_to_buffer_fixed (convert (two_digits_picture, hours)); 2954 call add_to_buffer_fixed (convert (two_digits_picture, minutes)); 2955 end; 2956 2957 return; 2958 2959 end format_date_time; 2960 2961 /* Actually formats a Message-ID */ 2962 2963 format_message_id: 2964 procedure (p_message_id) options (non_quick); 2965 2966 dcl p_message_id bit (72) aligned parameter; 2967 2968 dcl message_id_string character (message_id_string_max_lth) varying based (message_id_string_ptr); 2969 dcl message_id_string_ptr pointer; 2970 dcl message_id_string_max_lth fixed binary (21); 2971 2972 dcl local_message_id_string character (256) varying; 2973 dcl message_id_system character (256) varying; 2974 dcl is_local_system bit (1) aligned; 2975 dcl code fixed binary (35); 2976 2977 2978 message_id_string_ptr = addr (local_message_id_string); 2979 message_id_string_max_lth = maxlength (local_message_id_string); 2980 /* assume it will fit in the preallocated space */ 2981 2982 call mail_system_$decode_message_id (p_message_id, message_id_string, message_id_system, is_local_system, code); 2983 2984 if code = error_table_$smallarg then do; /* too large for the preallocated space ... */ 2985 call cu_$grow_stack_frame (STACK_EXTENSION, message_id_string_ptr, (0)); 2986 message_id_string_max_lth = 4 * (STACK_EXTENSION - 1); 2987 2988 call mail_system_$decode_message_id (p_message_id, message_id_string, message_id_system, is_local_system, 2989 code); /* try again using space at the end of the stack ... */ 2990 2991 do while (code = error_table_$smallarg); /* ... and keep trying 'till it fits */ 2992 call cu_$grow_stack_frame (STACK_EXTENSION, (null ()), (0)); 2993 message_id_string_max_lth = message_id_string_max_lth + (4 * STACK_EXTENSION); 2994 call mail_system_$decode_message_id (p_message_id, message_id_string, message_id_system, 2995 is_local_system, code); 2996 end; 2997 end; 2998 2999 call add_to_buffer_fixed (LEFT_ANGLE_BRACKET); 3000 3001 call format_top_level_string (message_id_string); 3002 3003 if ifo.include_local_system_name | ^is_local_system then do; 3004 if ifo.rfc822_format then 3005 call add_to_buffer_fixed (ATSIGN); 3006 else call add_to_buffer_fixed (SP_AT_SP); 3007 if ifo.dont_canonicalize_system_names then 3008 call add_to_buffer_varying (message_id_system); 3009 else call add_to_buffer_varying (mlsys_nit_interface_$canonicalize_system_name (message_id_system)); 3010 end; 3011 3012 call add_to_buffer_fixed (RIGHT_ANGLE_BRACKET); 3013 3014 return; 3015 3016 end format_message_id; 3017 3018 /* Actually formats a list of references to other messages */ 3019 3020 format_references_list: 3021 procedure (p_message_references_list_ptr) options (non_quick); 3022 3023 dcl p_message_references_list_ptr pointer parameter; 3024 dcl idx fixed binary; 3025 3026 message_references_list_ptr = p_message_references_list_ptr; 3027 3028 do idx = 1 to message_references_list.n_references; 3029 call format_reference (addr (message_references_list.references (idx))); 3030 if idx < message_references_list.n_references then do; 3031 call add_to_buffer_fixed (COMMA); /* must separate each reference from the next */ 3032 call new_line (); 3033 end; 3034 end; 3035 3036 return; 3037 3038 3039 3040 /* Internal to format_references_list: formats a single message reference. If the reference only has a Message-ID, the 3041* text of the ID is used as the text of the field */ 3042 3043 format_reference: 3044 procedure (p_message_reference_ptr); 3045 3046 dcl p_message_reference_ptr pointer parameter; 3047 3048 dcl message_id_string character (message_id_string_max_lth) varying based (message_id_string_ptr); 3049 dcl message_id_string_ptr pointer; 3050 dcl message_id_string_max_lth fixed binary (21); 3051 3052 dcl author_string character (256) varying; /* will be truncated if necessary */ 3053 dcl local_message_id_string character (256) varying; 3054 dcl code fixed binary (35); 3055 3056 3057 message_reference_ptr = p_message_reference_ptr; 3058 3059 ifo.indentation = ifo.indentation + 5; /* in case something wraps (which it won't) */ 3060 3061 if (message_reference.date_time_created > 0) & (message_reference.from ^= null ()) then do; 3062 /*** A modern reference: create the "Message of DATE from AUTHOR" format of reference */ 3063 call add_to_buffer_fixed ("Message of "); 3064 call format_date_time (message_reference.date_time_created, "0"b); 3065 call add_to_buffer_fixed (" from "); 3066 call mlsys_misc_utils_$get_best_address_name (message_reference.from -> address_list.addresses (1), 3067 author_string, (0)); 3068 call format_top_level_string (author_string); 3069 end; 3070 3071 else do; 3072 /*** A old reference: get its text from the Message-ID and print it (newlines and all) */ 3073 message_id_string_ptr = addr (local_message_id_string); 3074 message_id_string_max_lth = maxlength (local_message_id_string); 3075 call mail_system_$decode_message_id (message_reference.message_id, message_id_string, (""), ("0"b), 3076 code); 3077 if code = error_table_$smallarg then do; 3078 call cu_$grow_stack_frame (STACK_EXTENSION, message_id_string_ptr, (0)); 3079 message_id_string_max_lth = 4 * (STACK_EXTENSION - 1); 3080 call mail_system_$decode_message_id (message_reference.message_id, message_id_string, (""), 3081 ("0"b), code); 3082 do while (code = error_table_$smallarg); 3083 call cu_$grow_stack_frame (STACK_EXTENSION, (null ()), (0)); 3084 message_id_string_max_lth = message_id_string_max_lth + (4 * STACK_EXTENSION); 3085 call mail_system_$decode_message_id (message_reference.message_id, message_id_string, (""), 3086 ("0"b), code); 3087 end; 3088 end; 3089 call add_to_buffer_varying (message_id_string); 3090 end; /* sure would be nice to format it but it's random text */ 3091 3092 ifo.indentation = ifo.indentation - 5; 3093 3094 return; 3095 3096 end format_reference; 3097 3098 end format_references_list; 3099 3100 /* Actually formats a piece of text which is to appear in the message envelope, header, or redistributions list (called by 3101* several entrypoints) */ 3102 3103 format_text: 3104 procedure (p_text, p_multiline_text); 3105 3106 dcl p_text character (*) parameter; 3107 dcl p_multiline_text bit (1) aligned parameter; 3108 3109 if p_multiline_text then /* just invoke the proper internal procedure */ 3110 call format_multiline_text (p_text); 3111 else call format_single_line_text (p_text); 3112 3113 return; 3114 3115 3116 3117 /* Internal to format_text: formats a piece of text which is a single line field; as the mail system will turn such text 3118* back into a single line field, this procedure will wrap the text at the requested line length for readability */ 3119 3120 format_single_line_text: 3121 procedure (p_text); 3122 3123 dcl p_text character (*) parameter; 3124 3125 dcl (text_lth, text_used, space_left_on_line, idx) fixed binary (21); 3126 3127 3128 text_used = verify (p_text, SP) - 1; /* mail system guarentees only spaces; no other whitespace */ 3129 if text_used = -1 then return; /* ... it's a blank field */ 3130 3131 begin; /* strip trailing whitespace */ 3132 dcl text character (length (p_text) - text_used) unaligned defined (p_text) position (text_used + 1); 3133 text_lth = length (rtrim (text, SP)); 3134 text_lth = text_lth + text_used; /* ... get true length for proper use of defined */ 3135 end; 3136 3137 3138 if ifo.wrap then do; /* text must be split to fit within request line length ... */ 3139 3140 do while (text_used < text_lth); 3141 begin; 3142 dcl rest_of_text character (text_lth - text_used) unaligned defined (p_text) position (text_used + 1); 3143 3144 space_left_on_line = ifo.line_length - last_column_used; 3145 3146 if length (rest_of_text) <= space_left_on_line then 3147 idx = length (rest_of_text) + 1; 3148 3149 else do; /* find an appropriate place to split the text */ 3150 begin; 3151 dcl text_substring character (space_left_on_line) unaligned defined (p_text) position (text_used + 1); 3152 idx = length (text_substring) - index (reverse (text_substring), SP) + 1; 3153 if idx = (length (text_substring) + 1) then do; 3154 idx = index (rest_of_text, SP); 3155 if idx = 0 then idx = length (rest_of_text) + 1; 3156 end; /* do-group is executed iff the substring is a ... */ 3157 end; /* ... single word longer than the space left on the line */ 3158 end; 3159 3160 begin; /* output all but the space on which we split the text */ 3161 dcl output_substring character (idx - 1) unaligned defined (p_text) position (text_used + 1); 3162 call add_to_buffer_fixed (output_substring); 3163 end; 3164 3165 text_used = text_used + idx; /* the SP is never actuall sent: but a NL is if needed */ 3166 3167 if text_used < length (p_text) then call new_line (); 3168 end; /* ... there's more to come */ 3169 end; 3170 end; 3171 3172 3173 else call add_to_buffer_fixed (p_text); /* no line wrapping requested: just output the text as is */ 3174 3175 3176 return; 3177 3178 end format_single_line_text; 3179 3180 3181 3182 /* Internal to format_text: formats a multiline text text fieldfor subsquent displayby insuring each line starts out at 3183* least at the indentation column and that no blank lines appear in the printed representation */ 3184 3185 format_multiline_text: 3186 procedure (p_text); 3187 3188 dcl p_text character (*) parameter; 3189 3190 dcl first_line bit (1) aligned; 3191 dcl (text_lth, text_used, idx) fixed binary (21); 3192 3193 3194 text_used = verify (p_text, WHITESPACE) - 1; 3195 if text_used = -1 then return; /* nothing in the field but whitespace */ 3196 3197 begin; /* strip trailing whitespace */ 3198 dcl text character (length (p_text) - text_used) unaligned defined (p_text) position (text_used + 1); 3199 text_lth = length (rtrim (text, WHITESPACE)); 3200 text_lth = text_lth + text_used; /* ... get proper length for use of defined */ 3201 end; 3202 3203 3204 if ifo.indentation <= MAX_MULTILINE_INDENTATION then do; 3205 ifo.indentation = max (1, (ifo.indentation - length (MULTILINE_BLANK_LINE_DESIGNATOR))); 3206 first_line = "1"b; /* ... this line is already at the proper indentation */ 3207 end; 3208 3209 else do; /* enforce a maximum indentation for aesthetic reasons */ 3210 begin; /* ... strip any trailing whitespace after fieldname ... */ 3211 dcl buffer_in_use character (buffer_used) unaligned defined (buffer) position (1); 3212 buffer_used = length (rtrim (buffer_in_use, SP)); 3213 end; 3214 ifo.indentation = STANDARD_MULTILINE_INDENTATION - length (MULTILINE_BLANK_LINE_DESIGNATOR); 3215 call new_line (); /* ... and start a new line */ 3216 first_line = "0"b; 3217 end; 3218 3219 3220 do while (text_used < length (p_text)); 3221 begin; 3222 dcl rest_of_text character (length (p_text) - text_used) unaligned defined (p_text) position (text_used + 1); 3223 3224 idx = index (rest_of_text, NL); 3225 if idx = 0 then idx = length (rest_of_text) + 1; 3226 end; 3227 3228 begin; 3229 dcl the_line character (idx - 1) unaligned defined (p_text) position (text_used + 1); 3230 3231 if verify (the_line, WHITESPACE) = 0 then 3232 call add_to_buffer_fixed (MULTILINE_BLANK_LINE_DESIGNATOR); 3233 3234 else do; 3235 if ^first_line then call add_to_buffer_fixed (SPSP); 3236 call add_to_buffer_fixed (the_line); 3237 end; 3238 end; 3239 3240 first_line = "0"b; /* can't be on the first line anymore */ 3241 text_used = text_used + idx; /* skip to next line */ 3242 3243 if text_used < text_lth then call new_line (); 3244 end; /* more to come */ 3245 3246 return; 3247 3248 end format_multiline_text; 3249 3250 end format_text; 3251 3252 /* Actually formats a section of the message body (called by several entrypoints): This procedure violates the modularity 3253* of this program by its use of the knowledge of whether we are printing or formatting in order to cut down on the number 3254* iox_$put_chars calls per body section */ 3255 3256 format_body_section_internal: 3257 procedure (p_body_section_ptr); 3258 3259 dcl p_body_section_ptr pointer parameter; 3260 3261 dcl the_line character (80) varying; 3262 dcl words (4) bit (36) aligned; 3263 dcl words_as_characters (4) character (4) aligned based (addr (words)); 3264 dcl last_line_printed (4) bit (36) aligned; 3265 dcl translated_words (4) character (4) aligned; 3266 dcl in_duplicate bit (1) aligned; 3267 dcl (n_words, n_lines, n_words_on_line, n_bits_in_last_word, offset, idx, jdx, kdx) fixed binary; 3268 3269 3270 message_body_section_ptr = p_body_section_ptr; /* none of our caller's uses this variable */ 3271 3272 go to FORMAT_BODY_SECTION (message_body_section.section_type); 3273 3274 3275 FORMAT_BODY_SECTION (1): /* preformatted text: use single iox_$put_chars if possible */ 3276 if printing then do; 3277 call print_buffer (); /* ... dump anything that's still pending */ 3278 call iox_$put_chars (output_switch, message_preformatted_body_section.text_ptr, 3279 message_preformatted_body_section.text_lth, code); 3280 if code ^= 0 then do; /* ... fatal error */ 3281 P_code = code; 3282 go to RETURN_FROM_FORMAT_ENTRY_WITH_ERROR; 3283 end; 3284 if substr (message_preformatted_body_section_text, message_preformatted_body_section.text_lth, 1) ^= NL 3285 then 3286 call iox_$put_chars (output_switch, addr (NL), 1, (0)); 3287 line_count = count_lines_in_text (message_preformatted_body_section_text); 3288 last_column_used = 0; /* ... guarenteed to now be at the start of a line */ 3289 end; 3290 3291 else do; 3292 call add_to_buffer_fixed (message_preformatted_body_section_text); 3293 if substr (message_preformatted_body_section_text, message_preformatted_body_section.text_lth, 1) ^= NL 3294 then 3295 call add_to_buffer_fixed (NL); /* ... insure a trailing newline in the section */ 3296 end; 3297 3298 return; 3299 3300 3301 FORMAT_BODY_SECTION (2): /* bit string: generated dump_segment-like output */ 3302 n_words = divide ((message_bit_string_body_section.bit_string_lth + 35), 36, 18, 0); 3303 n_lines = divide ((n_words + 3), 4, 18, 0); 3304 3305 unspec (last_line_printed) = ""b; /* nothing printed (will set this before it's checked) */ 3306 in_duplicate = "0"b; /* not suppressing duplicate lines yet */ 3307 3308 offset = 0; /* offset from start of the string */ 3309 3310 do idx = 1 to n_lines; 3311 if idx = n_lines then do; 3312 n_words_on_line = mod (n_words, 4); 3313 if n_words_on_line = 0 then n_words_on_line = 4; 3314 n_bits_in_last_word = mod (message_bit_string_body_section.bit_string_lth, 36); 3315 if n_bits_in_last_word = 0 then n_bits_in_last_word = 36; 3316 end; 3317 else do; 3318 n_words_on_line = 4; 3319 n_bits_in_last_word = 36; 3320 end; 3321 do jdx = 1 to (n_words_on_line - 1); 3322 unspec (words (jdx)) = 3323 substr (message_bit_string_body_section_bit_string, (36 * (4 * (idx - 1) + jdx - 1) + 1), 36); 3324 end; 3325 unspec (words (n_words_on_line)) = 3326 substr (message_bit_string_body_section_bit_string, (36 * (4 * (idx - 1) + n_words_on_line - 1) + 1), 3327 n_bits_in_last_word); 3328 do jdx = 1 to n_words_on_line; 3329 do kdx = 1 to 4; 3330 if index (SINGLE_WIDTH_CHARACTERS, substr (words_as_characters (jdx), kdx, 1)) = 0 then 3331 substr (translated_words (jdx), kdx, 1) = "."; 3332 else substr (translated_words (jdx), kdx, 1) = substr (words_as_characters (jdx), kdx, 1); 3333 end; 3334 end; 3335 if (idx = 1) & (idx = n_lines) then do; /* don't perform duplicate suppression on 1st/last lines */ 3336 DISPLAY_THIS_LINE_OF_DUMP: 3337 call ioa_$rsnnl ("^6.3b", the_line, (0), bit (binary (offset, 18, 0), 18)); 3338 call ioa_$rsnnl ("^a^v( ^12.3b^)", the_line, (0), the_line, n_words_on_line, words (*)); 3339 call ioa_$rsnnl ("^a^vx^v(^4a^)", the_line, (0), the_line, (13 * (4 - n_words_on_line) + 1), 3340 n_words_on_line, translated_words (*)); 3341 call add_to_buffer_varying (the_line); 3342 call add_to_buffer_fixed (NL); 3343 unspec (last_line_printed) = unspec (words); 3344 in_duplicate = "0"b; 3345 end; 3346 else if unspec (words) ^= unspec (last_line_printed) then go to DISPLAY_THIS_LINE_OF_DUMP; 3347 else do; /* a duplicate line */ 3348 if ^in_duplicate then do; 3349 call add_to_buffer_fixed ("======"); 3350 call add_to_buffer_fixed (NL); 3351 end; 3352 in_duplicate = "1"b; 3353 end; 3354 3355 3356 offset = offset + 4; 3357 end; 3358 3359 return; 3360 3361 end format_body_section_internal; 3362 3363 /* Computes the width of phrases which appear outside of comments and structured addresses */ 3364 3365 simple_lengths: 3366 procedure (p_string) returns (fixed binary (21)); 3367 3368 return (0); /* not an entrypoint */ 3369 3370 dcl p_string character (*) varying parameter; 3371 3372 dcl must_requote bit (1) aligned; 3373 dcl (string_lth, used, idx) fixed binary (21); 3374 3375 3376 phrase_length: /* RFC822 format may contain spaces but no unquoted periods */ 3377 entry (p_string) returns (fixed binary (21)); 3378 3379 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3380 must_requote = 3381 (search (p_string, TOP_LEVEL_RFC822_REQUOTE) ^= 0) | (index (p_string, PERIOD) ^= 0) 3382 | (index (p_string, SPSP) ^= 0); 3383 else must_requote = (search (p_string, TOP_LEVEL_REQUOTE) ^= 0) | (index (p_string, SPSP) ^= 0); 3384 go to COMPUTE_THE_LENGTH; 3385 3386 3387 top_level_length: /* RFC822 format must be quoted for single spaces */ 3388 entry (p_string) returns (fixed binary (21)); 3389 3390 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3391 must_requote = (search (p_string, TOP_LEVEL_RFC822_REQUOTE) ^= 0) | (index (p_string, SP) ^= 0); 3392 else must_requote = (search (p_string, TOP_LEVEL_REQUOTE) ^= 0) | (index (p_string, SPSP) ^= 0); 3393 3394 3395 COMPUTE_THE_LENGTH: 3396 if must_requote then /* start out with surrounding quotes */ 3397 string_lth = 2 * length (QUOTE); 3398 else return (length (p_string)); /* can use it just the way it is */ 3399 3400 used = 0; 3401 3402 do while (used < length (p_string)); 3403 if ifo.rfc822_format then /* find next character which must be escaped */ 3404 idx = search (substr (p_string, (used + 1)), BACKSLASH_QUOTE_NL); 3405 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3406 if idx = 0 then idx = length (p_string) - used + 1; 3407 string_lth = string_lth + idx - 1; 3408 used = used + idx - 1; /* skip past normal characters */ 3409 if used < length (p_string) then do; 3410 string_lth = string_lth + 2; /* escape character (quote/backslash) plus the character */ 3411 used = used + 1; 3412 if ifo.rfc822_format then /* for RFC822: newlines are printed as three characters */ 3413 if substr (p_string, used, 1) = NL then string_lth = string_lth + 1; 3414 end; 3415 end; 3416 3417 return (string_lth); 3418 3419 end simple_lengths; 3420 3421 /* Computes the length of a string which is used within a structured address: always uses Multics conventions for those 3422* characters which must be escaped but, for RFC822 format, the entire text will be quoted */ 3423 3424 structured_length: 3425 procedure (p_string) returns (fixed binary (21)); 3426 3427 dcl p_string character (*) varying parameter; 3428 3429 dcl must_requote bit (1) aligned; 3430 dcl (string_lth, used, idx) fixed binary (21); 3431 3432 3433 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3434 must_requote = (search (p_string, STRUCTURED_RFC822_REQUOTE) ^= 0); 3435 else must_requote = (search (p_string, STRUCTURED_REQUOTE) ^= 0); 3436 3437 if must_requote then /* start out with surrounding quotes */ 3438 if ifo.rfc822_format then /* ... these quotes are within quotes: preceed them "\" */ 3439 string_lth = 2 * length (BACKSLASH_QUOTE); 3440 else string_lth = 2 * length (QUOTE); 3441 else return (length (p_string)); /* can use it just the way it is */ 3442 3443 used = 0; 3444 3445 do while (used < length (p_string)); 3446 if ifo.rfc822_format then /* find next character which must be escaped */ 3447 idx = search (substr (p_string, (used + 1)), BACKSLASH_QUOTE_NL); 3448 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3449 if idx = 0 then idx = length (p_string) - used + 1; 3450 string_lth = string_lth + idx - 1; 3451 used = used + idx - 1; /* skip past normal characters */ 3452 if used < length (p_string) then do; 3453 string_lth = string_lth + 2; /* escape character (quote/backslash) plus the character */ 3454 used = used + 1; 3455 if ifo.rfc822_format then /* for RFC822: newlines are printed as three characters */ 3456 if substr (p_string, used, 1) = NL then string_lth = string_lth + 1; 3457 if ifo.rfc822_format then /* for RFC822: quotes are printed as four(!) characters */ 3458 if substr (p_string, used, 1) = QUOTE then string_lth = string_lth + length (BACKSLASH_QUOTE); 3459 end; 3460 end; 3461 3462 return (string_lth); 3463 3464 end structured_length; 3465 3466 /* Computes the width of a string which is a comment */ 3467 3468 comment_length: 3469 procedure (p_string) returns (fixed binary (21)); 3470 3471 dcl p_string character (*) varying parameter; 3472 3473 dcl must_requote bit (1) aligned; 3474 dcl (string_lth, used, idx) fixed binary (21); 3475 3476 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3477 must_requote = (search (p_string, COMMENT_RFC822_REQUOTE) ^= 0); 3478 else must_requote = (search (p_string, COMMENT_REQUOTE) ^= 0); 3479 3480 if must_requote then 3481 if ifo.rfc822_format then /* RFC822 comment: quotes aren't special */ 3482 string_lth = 0; 3483 else string_lth = 2 * length (QUOTE); /* start out with surrounding quotes */ 3484 else return (length (p_string)); /* can use it just the way it is */ 3485 3486 used = 0; 3487 3488 do while (used < length (p_string)); 3489 if ifo.rfc822_format then /* find next character which must be escaped */ 3490 idx = search (substr (p_string, (used + 1)), BACKSLASH_PARENS_NL); 3491 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3492 if idx = 0 then idx = length (p_string) - used + 1; 3493 string_lth = string_lth + idx - 1; 3494 used = used + idx - 1; /* skip past normal characters */ 3495 if used < length (p_string) then do; 3496 string_lth = string_lth + 2; /* escape character (quote/backslash) plus the character */ 3497 used = used + 1; 3498 if ifo.rfc822_format then /* for RFC822: newlines are printed as three characters */ 3499 if substr (p_string, used, 1) = NL then string_lth = string_lth + 1; 3500 end; 3501 end; 3502 3503 return (string_lth); 3504 3505 end comment_length; 3506 3507 /* Places phrases which appear outside of comments and structured addresses into the output buffer */ 3508 3509 format_simple_strings: 3510 procedure (p_string); 3511 3512 return; /* not an entrypoint */ 3513 3514 dcl p_string character (*) varying parameter; 3515 3516 dcl 1 the_string aligned based (addr (p_string)), 3517 2 lth fixed binary (21), 3518 2 string character (maxlength (p_string)); 3519 3520 dcl the_character character (1); 3521 dcl must_requote bit (1) aligned; 3522 dcl (used, idx) fixed binary (21); 3523 3524 3525 format_phrase_string: /* RFC822 format may contain spaces but no unquoted periods */ 3526 entry (p_string); 3527 3528 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3529 must_requote = 3530 (search (p_string, TOP_LEVEL_RFC822_REQUOTE) ^= 0) | (index (p_string, PERIOD) ^= 0) 3531 | (index (p_string, SPSP) ^= 0); 3532 else must_requote = (search (p_string, TOP_LEVEL_REQUOTE) ^= 0) | (index (p_string, SPSP) ^= 0); 3533 go to OUTPUT_THE_STRING; 3534 3535 3536 format_top_level_string: /* RFC822 format must be quoted for single spaces */ 3537 entry (p_string); 3538 3539 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3540 must_requote = (search (p_string, TOP_LEVEL_RFC822_REQUOTE) ^= 0) | (index (p_string, SP) ^= 0); 3541 else must_requote = (search (p_string, TOP_LEVEL_REQUOTE) ^= 0) | (index (p_string, SPSP) ^= 0); 3542 3543 3544 OUTPUT_THE_STRING: 3545 if ^must_requote then do; /* simplest case: just put it out verbatim */ 3546 call add_to_buffer_varying (p_string); 3547 return; 3548 end; 3549 3550 call add_to_buffer_fixed (QUOTE); 3551 3552 used = 0; 3553 3554 do while (used < length (p_string)); 3555 if ifo.rfc822_format then /* find next character which must be escaped */ 3556 idx = search (substr (p_string, (used + 1)), BACKSLASH_QUOTE_NL); 3557 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3558 if idx = 0 then idx = length (p_string) - used + 1; 3559 if idx > 1 then call add_to_buffer (addcharno (addr (the_string.string), used), (idx - 1)); 3560 used = used + idx - 1; /* skip past normal characters */ 3561 if used < length (p_string) then do; /* process the special character */ 3562 used = used + 1; 3563 the_character = substr (p_string, used, 1); 3564 if ifo.rfc822_format then do; 3565 call add_to_buffer_fixed (BACKSLASH); 3566 call add_to_buffer_fixed (the_character); 3567 if the_character = NL then call add_to_buffer_fixed (SP); 3568 end; 3569 else do; 3570 if the_character = QUOTE then 3571 call add_to_buffer_fixed (QUOTE_QUOTE); 3572 else call add_to_buffer_fixed (NLSP); 3573 end; 3574 end; 3575 end; 3576 3577 call add_to_buffer_fixed (QUOTE); /* close the string */ 3578 3579 return; 3580 3581 end format_simple_strings; 3582 3583 /* format: ^indcomtxt */ 3584 3585 /* Places a structured address into the output buffer: When generating Multics format, the entire address is left 3586* unquoted (ie: the braces ({}) are the first and last characters of the address) and the arguument string, if any, is 3587* quoted if necessary. When generating RFC822 format, however, the entire address is quoted as it would be syntactically 3588* incorrect otherwise. Further, if the argument string needs quoting, it is done using the Multics doubling convention 3589* with the RFC822 backslash escape added on top. In other words, if the printed presentation on Multics is 3590* 3591* {list ">udd>""Multi Homed"">hackers"} 3592* 3593* then the RFC822 representation will be 3594* 3595* "{list \">udd>\"\"Multi Homed\"\">hackers\"}" 3596* */ 3597 3598 /* format: indcomtxt */ 3599 3600 format_structured_string: 3601 procedure (p_address_type_string, p_string); 3602 3603 dcl p_address_type_string character (*) parameter; 3604 dcl p_string character (*) varying parameter; 3605 3606 dcl 1 the_string aligned based (addr (p_string)), 3607 2 lth fixed binary (21), 3608 2 string character (maxlength (p_string)); 3609 3610 dcl the_character character (1); 3611 dcl must_requote bit (1) aligned; 3612 dcl (used, idx) fixed binary (21); 3613 3614 3615 if ifo.rfc822_format then /* always quote these addresses in RFC 822 land */ 3616 call add_to_buffer_fixed (QUOTE_LEFT_BRACE); 3617 else call add_to_buffer_fixed (LEFT_BRACE); 3618 3619 call add_to_buffer_fixed (p_address_type_string); 3620 3621 if length (p_string) > 0 then do; /* it has an argument ... */ 3622 call add_to_buffer_fixed (SP); 3623 3624 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3625 must_requote = (search (p_string, STRUCTURED_RFC822_REQUOTE) ^= 0); 3626 else must_requote = (search (p_string, STRUCTURED_REQUOTE) ^= 0); 3627 3628 if must_requote then do; /* start out with surrounding quotes */ 3629 if ifo.rfc822_format then /* ... these quotes are within quotes: preceed them "\" */ 3630 call add_to_buffer_fixed (BACKSLASH_QUOTE); 3631 else call add_to_buffer_fixed (QUOTE); 3632 3633 used = 0; 3634 3635 do while (used < length (p_string)); 3636 if ifo.rfc822_format then /* find next character which must be escaped */ 3637 idx = search (substr (p_string, (used + 1)), BACKSLASH_QUOTE_NL); 3638 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3639 if idx = 0 then idx = length (p_string) - used + 1; 3640 if idx > 1 then call add_to_buffer (addcharno (addr (the_string.string), used), (idx - 1)); 3641 used = used + idx - 1; /* skip past normal characters */ 3642 if used < length (p_string) then do; 3643 /* needs to be quoted */ 3644 used = used + 1; 3645 the_character = substr (p_string, used, 1); 3646 if ifo.rfc822_format then do; 3647 if the_character = QUOTE then do; 3648 call add_to_buffer_fixed (BACKSLASH_QUOTE); 3649 call add_to_buffer_fixed (BACKSLASH_QUOTE); 3650 end; 3651 else do; 3652 call add_to_buffer_fixed (BACKSLASH); 3653 call add_to_buffer_fixed (the_character); 3654 if the_character = NL then call add_to_buffer_fixed (SP); 3655 end; 3656 end; 3657 else do; /* Multics format */ 3658 if the_character = QUOTE then 3659 call add_to_buffer_fixed (QUOTE_QUOTE); 3660 else call add_to_buffer_fixed (NLSP); 3661 end; 3662 end; 3663 end; 3664 3665 if ifo.rfc822_format then 3666 call add_to_buffer_fixed (BACKSLASH_QUOTE); 3667 else call add_to_buffer_fixed (QUOTE); 3668 end; 3669 3670 else call add_to_buffer_varying (p_string); 3671 end; 3672 3673 if ifo.rfc822_format then 3674 call add_to_buffer_fixed (RIGHT_BRACE_QUOTE); 3675 else call add_to_buffer_fixed (RIGHT_BRACE); 3676 3677 return; 3678 3679 end format_structured_string; 3680 3681 /* Places a comment into the output buffer */ 3682 3683 format_comment_string: 3684 procedure (p_string); 3685 3686 dcl p_string character (*) varying parameter; 3687 3688 dcl 1 the_string aligned based (addr (p_string)), 3689 2 lth fixed binary (21), 3690 2 string character (maxlength (p_string)); 3691 3692 dcl the_character character (1); 3693 dcl must_requote bit (1) aligned; 3694 dcl (used, idx) fixed binary (21); 3695 3696 call add_to_buffer_fixed (SP_OPEN_PAREN); 3697 3698 if ifo.rfc822_format then /* check for requoting with the proper specials */ 3699 must_requote = (search (p_string, COMMENT_RFC822_REQUOTE) ^= 0); 3700 else must_requote = (search (p_string, COMMENT_REQUOTE) ^= 0); 3701 3702 if must_requote then do; /* there are special characters in the comment */ 3703 if ^ifo.rfc822_format then /* Multics supports quoted comments */ 3704 call add_to_buffer_fixed (QUOTE); 3705 3706 used = 0; 3707 3708 do while (used < length (p_string)); 3709 if ifo.rfc822_format then /* find next character which must be escaped */ 3710 idx = search (substr (p_string, (used + 1)), BACKSLASH_PARENS_NL); 3711 else idx = search (substr (p_string, (used + 1)), QUOTE_NL); 3712 if idx = 0 then idx = length (p_string) - used + 1; 3713 if idx > 1 then call add_to_buffer (addcharno (addr (the_string.string), used), (idx - 1)); 3714 used = used + idx - 1; /* skip past normal characters */ 3715 if used < length (p_string) then do; 3716 used = used + 1; 3717 the_character = substr (p_string, used, 1); 3718 if ifo.rfc822_format then do; 3719 call add_to_buffer_fixed (BACKSLASH); 3720 call add_to_buffer_fixed (the_character); 3721 if the_character = NL then call add_to_buffer_fixed (SP); 3722 end; 3723 else do; 3724 if the_character = QUOTE then 3725 call add_to_buffer_fixed (QUOTE_QUOTE); 3726 else call add_to_buffer_fixed (NLSP); 3727 end; 3728 end; 3729 end; 3730 3731 if ^ifo.rfc822_format then call add_to_buffer_fixed (QUOTE); 3732 end; 3733 3734 else call add_to_buffer_varying (p_string); 3735 3736 call add_to_buffer_fixed (CLOSE_PAREN); 3737 3738 return; 3739 3740 end format_comment_string; 3741 3742 /* Returns either 0 or 2 depending on whether something will be surrounded by quotes in RFC822 format text */ 3743 3744 quotes_if_rfc822: 3745 procedure () returns (fixed binary); 3746 3747 if ifo.rfc822_format then 3748 return (2); 3749 else return (0); 3750 3751 end quotes_if_rfc822; 3752 3753 3754 3755 /* Start a new line with the level of indentation presently in effect */ 3756 3757 new_line: 3758 procedure (); 3759 3760 dcl n_spaces_to_add fixed binary (21); 3761 3762 call add_to_buffer_fixed (NL); 3763 3764 n_spaces_to_add = ifo.indentation; 3765 do while (n_spaces_to_add > length (SPACES)); 3766 call add_to_buffer_fixed (SPACES); 3767 n_spaces_to_add = n_spaces_to_add - length (SPACES); 3768 end; 3769 3770 call add_to_buffer (addr (SPACES), n_spaces_to_add); 3771 3772 return; 3773 3774 end new_line; 3775 3776 /* Output a piece of text to the buffer and invoke the overflow handler if necessary */ 3777 3778 add_to_buffer: 3779 procedure (p_text_ptr, p_text_lth); 3780 3781 dcl p_text_ptr pointer parameter; 3782 dcl p_text_lth fixed binary (21) parameter; 3783 dcl p_fixed_text character (*) parameter; 3784 dcl p_varying_text character (*) varying parameter; 3785 3786 dcl text character (text_lth) unaligned based (text_ptr); 3787 dcl text_ptr pointer; 3788 dcl (text_lth, text_used) fixed binary (21); 3789 3790 dcl 1 varying_string aligned based, /* need to know PL/I's internal format to set text_ptr */ 3791 2 lth fixed binary (21), 3792 2 string character (maxlength (p_varying_text)); 3793 3794 3795 /* add_to_buffer: entry (p_text_ptr, p_text_lth); */ 3796 3797 text_ptr = p_text_ptr; 3798 text_lth = p_text_lth; 3799 go to ADD_TO_BUFFER_COMMON; 3800 3801 3802 add_to_buffer_fixed: /* a fixed length string */ 3803 entry (p_fixed_text); 3804 3805 text_ptr = addr (p_fixed_text); 3806 text_lth = length (p_fixed_text); 3807 go to ADD_TO_BUFFER_COMMON; 3808 3809 3810 add_to_buffer_varying: /* a varying length string */ 3811 entry (p_varying_text); 3812 3813 text_ptr = addr (addr (p_varying_text) -> varying_string.string); 3814 text_lth = length (p_varying_text); 3815 3816 3817 ADD_TO_BUFFER_COMMON: 3818 text_used = 0; 3819 3820 do while (text_used < text_lth); /* while there's stuff left to output */ 3821 begin; 3822 dcl rest_of_text character (text_lth - text_used) unaligned defined (text) position (text_used + 1); 3823 3824 begin; 3825 3826 dcl rest_of_buffer character (buffer_size - buffer_used) unaligned defined (buffer) position (buffer_used + 1); 3827 3828 begin; 3829 dcl next_piece_of_text character (min (length (rest_of_buffer), length (rest_of_text))) unaligned defined (text) 3830 position (text_used + 1); 3831 3832 substr (rest_of_buffer, 1, length (next_piece_of_text)) = next_piece_of_text; 3833 call update_last_column (next_piece_of_text); 3834 if ifo.count_lines then do; 3835 line_count = line_count + count_lines_in_text (next_piece_of_text); 3836 if substr (next_piece_of_text, length (next_piece_of_text), 1) ^= NL then 3837 line_count = line_count - 1; 3838 end; /* ... count_lines_in_text always counts partial pieces */ 3839 buffer_used = buffer_used + length (next_piece_of_text); 3840 text_used = text_used + length (next_piece_of_text); 3841 end; 3842 end; 3843 end; 3844 3845 if text_used < text_lth then /* only can happen due to buffer overflow */ 3846 call ifo.buffer_overflow (); 3847 end; 3848 3849 return; 3850 3851 3852 3853 /* Internal to add_to_buffer: computes the last column occupied by the given string */ 3854 3855 update_last_column: 3856 procedure (p_string); 3857 3858 dcl p_string character (*) parameter; 3859 3860 dcl the_character character (1); 3861 dcl (string_used, idx) fixed binary (21); 3862 3863 3864 string_used = 0; 3865 3866 do while (string_used < length (p_string)); 3867 3868 begin; 3869 dcl rest_of_string character (length (p_string) - string_used) unaligned defined (p_string) position (string_used + 1); 3870 3871 idx = verify (rest_of_string, SINGLE_WIDTH_CHARACTERS); 3872 if idx = 0 then idx = length (rest_of_string) + 1; 3873 3874 last_column_used = last_column_used + idx - 1; 3875 string_used = string_used + idx - 1; 3876 end; /* update where we are */ 3877 3878 if string_used < length (p_string) then do; 3879 /* we did find a special character */ 3880 the_character = substr (p_string, (string_used + 1), 1); 3881 string_used = string_used + 1; 3882 3883 if the_character = HT then last_column_used = last_column_used + 10 - mod (last_column_used, 10); 3884 3885 else if the_character = BS then last_column_used = max ((last_column_used - 1), 0); 3886 3887 else if (the_character = NL) | (the_character = CR) | (the_character = VT) | (the_character = FF) 3888 then 3889 last_column_used = 0; 3890 3891 else ; /* ... all others are non-printing */ 3892 end; 3893 end; 3894 3895 return; 3896 3897 end update_last_column; 3898 3899 end add_to_buffer; 3900 3901 /* Buffer overflow handler for the formatting entrypoints: returns error_table_$smallarg to the caller */ 3902 3903 report_smallarg: 3904 procedure (); 3905 3906 P_code = error_table_$smallarg; 3907 3908 go to RETURN_FROM_FORMAT_ENTRY_WITH_ERROR; 3909 3910 end report_smallarg; 3911 3912 RETURN_FROM_FORMAT_ENTRY_WITH_ERROR: 3913 return; 3914 3915 3916 3917 /* Buffer overflow handler for the format_address_for_ism entrypoint: returns mlsys_et_$foreign_address_too_long */ 3918 3919 report_foreign_address_too_long: 3920 procedure (); 3921 3922 P_code = mlsys_et_$foreign_address_too_long; 3923 3924 go to RETURN_FROM_FORMAT_ENTRY_WITH_ERROR; 3925 3926 end report_foreign_address_too_long; 3927 3928 3929 3930 /* Buffer overflow handler for the printing entrypoints: prints the buffer, empties it, and then continues */ 3931 3932 print_buffer: 3933 procedure (); 3934 3935 call iox_$put_chars (output_switch, buffer_ptr, buffer_used, code); 3936 if code ^= 0 then do; /* fatal error of some kind */ 3937 P_code = code; 3938 go to RETURN_FROM_FORMAT_ENTRY_WITH_ERROR; 3939 end; 3940 3941 buffer_used = 0; 3942 3943 return; 3944 3945 end print_buffer; 3946 3947 /* Compare two date/times for equality with appropriate fuzz factor */ 3948 3949 date_time_equal: 3950 procedure (p_date_time_1, p_date_time_2) returns (bit (1) aligned); 3951 3952 dcl (p_date_time_1, p_date_time_2) fixed binary (71) parameter; 3953 3954 return (abs ((p_date_time_1 - p_date_time_2)) < ONE_MINUTE); 3955 3956 end date_time_equal; 3957 3958 3959 3960 /* Count the lines in a piece of text */ 3961 3962 count_lines_in_text: 3963 procedure (p_text) returns (fixed binary (21)); 3964 3965 dcl p_text character (*) parameter; 3966 dcl (text_lth, n_lines, used, idx) fixed binary (21); 3967 3968 text_lth = length (p_text); 3969 3970 n_lines, used = 0; 3971 3972 do while (used < text_lth); 3973 3974 begin; 3975 3976 dcl rest_of_text character (text_lth - used) unaligned defined (p_text) position (used + 1); 3977 3978 idx = index (rest_of_text, NL); 3979 if idx = 0 then idx = length (rest_of_text) + 1; 3980 3981 n_lines = n_lines + 1; 3982 used = used + idx; 3983 end; 3984 end; 3985 3986 return (n_lines); 3987 3988 end count_lines_in_text; 3989 1 1 /* BEGIN INCLUDE FILE ... mlsys_format_options.incl.pl1 */ 1 2 /* Created: June 1983 by G. Palter */ 1 3 1 4 /* Options for the mlsys_utils_$format_message and mlsys_utils_$print_message entrypoints */ 1 5 1 6 dcl 1 format_message_options aligned based (format_message_options_ptr), 1 7 2 version character (8) unaligned, 1 8 2 line_length fixed binary, /* line length to be used to format/print the message */ 1 9 2 envelope_formatting_mode fixed binary, /* level of detail to be displayed for the envelope ... */ 1 10 2 header_formatting_mode fixed binary, /* ... for the message ... */ 1 11 2 redistributions_list_formatting_mode fixed binary, /* ... and for the redistributions list ... */ 1 12 2 include_body bit (1) aligned; /* ON => include message body when formatting/printing; 1 13* OFF => exclude the message body */ 1 14 1 15 dcl FORMAT_MESSAGE_OPTIONS_VERSION_1 character (8) static options (constant) initial ("mlsfmo01"); 1 16 1 17 dcl format_message_options_ptr pointer; 1 18 1 19 1 20 /* Defined formatting modes */ 1 21 1 22 dcl (NONE_FORMATTING_MODE initial (0), /* exclude this part of the message */ 1 23 BRIEF_FORMATTING_MODE initial (1), /* include only minimal information from this part of the 1 24* message; not valid for the envelope */ 1 25 DEFAULT_FORMATTING_MODE initial (2), /* include default amount of information from this part */ 1 26 LONG_FORMATTING_MODE initial (3)) /* include all information from this part of the message */ 1 27 fixed binary static options (constant); 1 28 1 29 /* END INCLUDE FILE ... mlsys_format_options.incl.pl1 */ 3990 3991 2 1 /* BEGIN INCLUDE FILE ... mlsys_field_names.incl.pl1 */ 2 2 /* Created: June 1983 by G. Palter */ 2 3 2 4 /* Standard names for all message envelope, header, and redistributions list fields supported by the mail system */ 2 5 2 6 dcl (ACCESS_CLASS_FIELDNAME initial ("Access-Class"), 2 7 ACKNOWLEDGE_TO_FIELDNAME initial ("Acknowledge-To"), 2 8 BCC_FIELDNAME initial ("bcc"), 2 9 CC_FIELDNAME initial ("cc"), 2 10 DATE_TIME_CREATED_FIELDNAME initial ("Date"), 2 11 DATE_TIME_DELIVERED_FIELDNAME initial ("Delivery-Date"), 2 12 DATE_TIME_MAILED_FIELDNAME initial ("Posted-Date"), 2 13 DELIVERED_BY_FIELDNAME initial ("Delivery-By"), 2 14 FROM_FIELDNAME initial ("From"), 2 15 IMPLICIT_ROUTE_FIELDNAME initial ("Route"), 2 16 MESSAGE_ID_FIELDNAME initial ("Message-ID"), 2 17 RELAY_FIELDNAME initial ("Relayed"), 2 18 REPLY_REFERENCES_FIELDNAME initial ("In-Reply-To"), 2 19 REPLY_TO_FIELDNAME initial ("Reply-To"), 2 20 SENDER_FIELDNAME initial ("Sender"), 2 21 SUBJECT_FIELDNAME initial ("Subject"), 2 22 TO_FIELDNAME initial ("To"), 2 23 2 24 2 25 /* Prefix to apply to a field name to produce the field name of the equivalent field in the redistributions list. Ie: 2 26* 2 27* call mlsys_utils_$print_address_field 2 28* (REDISTRIBUTED_PREFIX || FROM_FIELDNAME, ...) */ 2 29 2 30 REDISTRIBUTED_PREFIX initial ("Redistributed-"), 2 31 2 32 2 33 /* Fields in a redistribution which do not have a corresponding non-redistributed field */ 2 34 2 35 REDISTRIBUTED_COMMENT_FIELDNAME initial ("Redistributed-Comment")) 2 36 2 37 character (32) varying static options (constant); 2 38 2 39 2 40 /* END INCLUDE FILE ... mlsys_field_names.incl.pl1 */ 3992 3993 3 1 /* BEGIN INCLUDE FILE ... mlsys_message.incl.pl1 */ 3 2 3 3 3 4 /****^ HISTORY COMMENTS: 3 5* 1) change(85-12-19,Herbst), approve(86-03-25,MCR7367), 3 6* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 3 7* Added seen switch to message. 3 8* END HISTORY COMMENTS */ 3 9 3 10 3 11 /* Created: June 1983 by G. Palter */ 3 12 3 13 /* Definition of a message as used by the Multics Mail System */ 3 14 3 15 dcl 1 message aligned based (message_ptr), 3 16 2 version character (8) unaligned, 3 17 2 reserved bit (144), /* for exclusive use of the mail system */ 3 18 2 n_reply_references fixed binary, /* # of messages for which this is a reply */ 3 19 2 n_user_fields fixed binary, /* # of non-standard header fields in this message */ 3 20 2 n_redistributions fixed binary, /* # of times this message has been forwarded */ 3 21 2 n_body_sections fixed binary, /* # of sections in the body */ 3 22 2 flags, 3 23 3 interactive bit (1) unaligned, /* ON => this is an interactive message */ 3 24 3 can_be_deleted bit (1) unaligned, /* ON => the user can delete this message if desired */ 3 25 3 marked_for_deletion bit (1) unaligned, /* ON => message will be deleted when mailbox is closed */ 3 26 3 must_be_acknowledged bit (1) unaligned, /* ON => an ACK should be generated when message is read */ 3 27 3 seen bit (1) unaligned, /* ON => user has printed message at least once */ 3 28 3 reserved bit (31) unaligned, /* for use by the mail system */ 3 29 2 pad bit (36), 3 30 2 envelope like message_envelope, /* who/when/how the message was mailed & delivered */ 3 31 2 header, 3 32 3 message_id bit (72), /* ID of this message (same value for all copies) */ 3 33 3 access_class bit (72), /* AIM access class of this message */ 3 34 3 date_time_created fixed binary (71), /* date/time this message was composed */ 3 35 3 from pointer, /* -> address list of author(s) of the message */ 3 36 3 reply_to pointer, /* -> address list of recipients for reply (if not authors) */ 3 37 3 to pointer, /* -> address list of primary recipients */ 3 38 3 cc pointer, /* -> address list of secondary recipients */ 3 39 3 bcc pointer, /* -> address list of blind recipients */ 3 40 3 subject like message_text_field, /* subject of the message */ 3 41 3 reply_references pointer, /* -> list of messages for which this message is a reply */ 3 42 3 user_fields_list pointer, /* -> list of user-defined fields in this message */ 3 43 2 redistributions_list pointer, /* -> redistributions list for this message */ 3 44 2 body, 3 45 3 total_lines fixed binary (21), /* total # of lines in the body or -1 if indeterminate */ 3 46 3 pad bit (36), 3 47 3 body_sections (message_n_body_sections refer (message.n_body_sections)) like message_body_section; 3 48 3 49 dcl MESSAGE_VERSION_2 character (8) static options (constant) initial ("mlsmsg02"); 3 50 3 51 dcl message_subject character (message.header.subject.text_lth) unaligned based (message.header.subject.text_ptr); 3 52 3 53 dcl message_ptr pointer; 3 54 3 55 dcl (message_n_body_sections, message_trace_n_relays, message_n_redistributions, message_n_user_fields, 3 56 message_references_list_n_references) 3 57 fixed binary; /* for exclusive use of the mail system */ 3 58 3 59 /* Definition of a message envelope: describes when, by whom, and by what route the message was mailed */ 3 60 3 61 dcl 1 message_envelope aligned based (message_envelope_ptr), 3 62 2 date_time_mailed fixed binary (71), /* date/time this message was entered into the mail system */ 3 63 2 sender pointer, /* -> address of entity that mailed the message */ 3 64 2 trace pointer, /* -> message_trace describing how it got here */ 3 65 2 date_time_delivered fixed binary (71), /* date/time this message was delivered */ 3 66 2 delivered_by pointer, /* -> address of entity that delivered the message */ 3 67 2 acknowledge_to pointer; /* -> address of entity to receive ACK when message is read */ 3 68 3 69 dcl message_envelope_ptr pointer; 3 70 3 71 3 72 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the message envelope */ 3 73 3 74 dcl 1 message_envelope_parameter aligned based (message_envelope_parameter_ptr), 3 75 2 pad pointer, /* forces even word alignment */ 3 76 2 version character (8) unaligned, 3 77 2 envelope like message_envelope; 3 78 3 79 dcl MESSAGE_ENVELOPE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsenv02"); 3 80 3 81 dcl message_envelope_parameter_ptr pointer; 3 82 3 83 3 84 /* Definition of a message trace: describes the route and each relay operation by which a message was passed through the 3 85* networks to reach this recipient */ 3 86 3 87 dcl 1 message_trace aligned based (message_trace_ptr), 3 88 2 version character (8) unaligned, 3 89 2 reserved bit (144), /* ... exclusively for use by the mail system */ 3 90 2 implicit_route pointer, /* -> an address_route which defines the route it took */ 3 91 2 pad bit (36), 3 92 2 n_relays fixed binary, /* # of relay operations required to reach this site */ 3 93 2 relays (message_trace_n_relays refer (message_trace.n_relays)), 3 94 3 date_time_relayed fixed binary (71), /* ... when this relay operation took place */ 3 95 3 sending_host character (256) varying, /* ... the host which relayed the message */ 3 96 3 receiving_host character (256) varying, /* ... the host which received it */ 3 97 3 communications_media character (32) unaligned, /* ... medium over which relay took place (ARPA, Tymnet) */ 3 98 3 communications_protocol character (32) unaligned,/* ... low-level protocol used (TCP, X.25) */ 3 99 3 mail_protocol character (32) unaligned, /* ... mailer protocol used (SMTP, NBS) */ 3 100 3 relay_id bit (72), /* ... unique ID assigned by receiving system or ""b */ 3 101 3 relay_recipient pointer; /* ... -> address of recipient as given by sending system */ 3 102 3 103 dcl MESSAGE_TRACE_VERSION_2 character (8) static options (constant) initial ("mlstrc02"); 3 104 3 105 dcl message_trace_ptr pointer; 3 106 3 107 /* Definition of a message's redistributions list */ 3 108 3 109 dcl 1 message_redistributions_list aligned based (message.redistributions_list), 3 110 2 version character (8) unaligned, 3 111 2 reserved bit (144), /* ... exclusively for use by the mail system */ 3 112 2 pad bit (36), 3 113 2 n_redistributions fixed binary, /* # of redistributions */ 3 114 2 redistributions (message_n_redistributions refer (message_redistributions_list.n_redistributions)) 3 115 like message_redistribution; /* the redistributions: oldest first */ 3 116 3 117 dcl MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsrl002"); 3 118 3 119 3 120 /* Definition of a single redistribution (forwarding) of a message */ 3 121 3 122 dcl 1 message_redistribution aligned based (message_redistribution_ptr), 3 123 2 envelope like message_envelope, 3 124 2 header, 3 125 3 message_id bit (72), /* ID of this redistribution (same for all copies) */ 3 126 3 date_time_created fixed binary (71), /* date/time when this redistribution was made */ 3 127 3 from pointer, /* -> address list of authors of this redistribution */ 3 128 3 to pointer, /* -> address list of recipients of the redistribution */ 3 129 3 comment like message_text_field; /* optional comment associated with the redistribution */ 3 130 3 131 dcl message_redistribution_comment character (message_redistribution.comment.text_lth) unaligned 3 132 based (message_redistribution.comment.text_ptr); 3 133 3 134 dcl message_redistribution_ptr pointer; 3 135 3 136 3 137 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate the redistributions of a message */ 3 138 3 139 dcl 1 message_redistribution_parameter aligned based (message_redistribution_parameter_ptr), 3 140 2 pad pointer, /* forces even word alignment */ 3 141 2 version character (8) unaligned, 3 142 2 redistribution like message_redistribution; 3 143 3 144 dcl MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsdist2"); 3 145 3 146 dcl message_redistribution_parameter_ptr pointer; 3 147 3 148 /* Definition of the list of user-defined fields in a message */ 3 149 3 150 dcl 1 message_user_fields_list aligned based (message.user_fields_list), 3 151 2 version character (8) unaligned, 3 152 2 reserved bit (144), /* ... exclusively for use by the mail system */ 3 153 2 pad bit (36), 3 154 2 n_user_fields fixed binary, /* # of user-defined fields in the message */ 3 155 2 user_fields (message_n_user_fields refer (message_user_fields_list.n_user_fields)) 3 156 like message_user_field; /* the actual user-defined fields */ 3 157 3 158 dcl MESSAGE_USER_FIELDS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsufl02"); 3 159 3 160 3 161 /* Definition of a user defined message header field */ 3 162 3 163 dcl 1 message_user_field aligned based (message_user_field_ptr), 3 164 2 header, 3 165 3 field_id bit (36) aligned, /* identifies the purpose of this field */ 3 166 3 field_type fixed binary, /* type of data contained in this field */ 3 167 2 field_type_variable bit (144); /* the actual data (see below) */ 3 168 3 169 dcl message_user_field_ptr pointer; 3 170 3 171 3 172 /* Defined types of user defined fields */ 3 173 3 174 dcl (MESSAGE_TEXT_USER_FIELD initial (1), /* content of the field is a text string */ 3 175 MESSAGE_ADDRESS_LIST_USER_FIELD initial (2), /* content of the field is an address list */ 3 176 MESSAGE_DATE_USER_FIELD initial (3), /* content of the field is a date/time */ 3 177 MESSAGE_INTEGER_USER_FIELD initial (4)) /* content of the filed is a fixed binary value */ 3 178 fixed binary static options (constant); 3 179 3 180 3 181 /* Structures used to access the data for the different types of user defined fields */ 3 182 3 183 dcl 1 message_text_user_field aligned based (message_user_field_ptr), 3 184 2 header like message_user_field.header, 3 185 2 text like message_text_field; /* the message text */ 3 186 3 187 dcl message_text_user_field_text character (message_text_user_field.text.text_lth) unaligned 3 188 based (message_text_user_field.text.text_ptr); 3 189 3 190 dcl 1 message_address_list_user_field aligned based (message_user_field_ptr), 3 191 2 header like message_user_field.header, 3 192 2 address_list_ptr pointer, /* -> the address list */ 3 193 2 pad bit (72); 3 194 3 195 dcl 1 message_date_user_field aligned based (message_user_field_ptr), 3 196 2 header like message_user_field.header, 3 197 2 date_time fixed binary (71), /* the clock reading */ 3 198 2 pad bit (72); 3 199 3 200 dcl 1 message_integer_user_field aligned based (message_user_field_ptr), 3 201 2 header like message_user_field.header, 3 202 2 value fixed binary (35), /* the integer value */ 3 203 2 pad bit (108); 3 204 3 205 3 206 /* Structure used in calls to mail_system_ entrypoints which manipulate the user-defined fields of a message */ 3 207 3 208 dcl 1 message_user_field_parameter aligned based (message_user_field_parameter_ptr), 3 209 2 pad pointer, /* forces even word alignment */ 3 210 2 version character (8) unaligned, 3 211 2 user_field like message_user_field; 3 212 3 213 dcl MESSAGE_USER_FIELD_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsudf02"); 3 214 3 215 dcl message_user_field_parameter_ptr pointer; 3 216 3 217 /* Definition of a list of message references used as the value of message header fields (eg: In-Reply-To) */ 3 218 3 219 dcl 1 message_references_list aligned based (message_references_list_ptr), 3 220 2 version character (8) unaligned, 3 221 2 reserved bit (144), /* ... exclusively for use by the mail system */ 3 222 2 pad bit (36), 3 223 2 n_references fixed binary, /* # of references in this list */ 3 224 2 references (message_references_list_n_references refer (message_references_list.n_references)) 3 225 like message_reference; /* the references themselves */ 3 226 3 227 dcl MESSAGE_REFERENCES_LIST_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 3 228 3 229 dcl message_references_list_ptr pointer; 3 230 3 231 3 232 /* Definition of a reference to another message */ 3 233 3 234 dcl 1 message_reference aligned based (message_reference_ptr), 3 235 2 message_id bit (72), /* ID of the other message */ 3 236 2 date_time_created fixed binary (71), /* date/time the other message was created */ 3 237 2 from pointer, /* -> address list of authors of the other message */ 3 238 2 subject like message_text_field; /* subject of the other message */ 3 239 3 240 dcl message_reference_subject character (message_reference.subject.text_lth) unaligned 3 241 based (message_reference.subject.text_ptr); 3 242 3 243 dcl message_reference_ptr pointer; 3 244 3 245 3 246 /* Structure used in calls to mail_system_daemon_ entrypoints which manipulate message references */ 3 247 3 248 dcl 1 message_reference_parameter aligned based (message_reference_parameter_ptr), 3 249 2 pad pointer, /* forces even word alignment */ 3 250 2 version character (8) unaligned, 3 251 2 reference like message_reference; 3 252 3 253 dcl MESSAGE_REFERENCE_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsref02"); 3 254 3 255 dcl message_reference_parameter_ptr pointer; 3 256 3 257 3 258 /* Definition of a text field in a message (Subject, Comment, or a user defined field) */ 3 259 3 260 dcl 1 message_text_field aligned based (message_text_field_ptr), 3 261 2 text_ptr pointer, /* -> the actual text */ 3 262 2 text_lth fixed binary (21), /* length of said text */ 3 263 2 flags, 3 264 3 multiline_text bit (1) unaligned, /* ON => the text of this field may span multiple lines; 3 265* OFF => the text will always be a single line */ 3 266 3 reserved bit (35) unaligned; /* for exclusive use of the mail system */ 3 267 3 268 dcl message_text_field_text character (message_text_field.text_lth) unaligned based (message_text_field.text_ptr); 3 269 3 270 dcl message_text_field_ptr pointer; 3 271 3 272 /* Definition of a section of the body of a message */ 3 273 3 274 dcl 1 message_body_section aligned based (message_body_section_ptr), 3 275 2 header, 3 276 3 section_type fixed binary, /* type of "text" stored in this section */ 3 277 3 section_n_lines fixed binary (21), /* # of lines in this section or -1 if indeterminate */ 3 278 2 section_type_variable bit (144); /* the actual data (see below) */ 3 279 3 280 dcl message_body_section_ptr pointer; 3 281 3 282 3 283 /* Defined types of message body sections */ 3 284 3 285 dcl (MESSAGE_PREFORMATTED_BODY_SECTION initial (1), /* text formatted by the authors/sender */ 3 286 MESSAGE_BIT_STRING_BODY_SECTION initial (2)) /* arbitrary bit string */ 3 287 fixed binary static options (constant); 3 288 3 289 3 290 /* Structures used to access the data for the different types of message body sections */ 3 291 3 292 dcl 1 message_preformatted_body_section aligned based (message_body_section_ptr), 3 293 2 header like message_body_section.header, 3 294 2 text_ptr pointer, /* -> the text */ 3 295 2 text_lth fixed binary (21), /* length of said text in characters */ 3 296 2 reserved bit (36); /* for exclusive use of the mail system */ 3 297 3 298 dcl message_preformatted_body_section_text character (message_preformatted_body_section.text_lth) unaligned 3 299 based (message_preformatted_body_section.text_ptr); 3 300 3 301 dcl 1 message_bit_string_body_section aligned based (message_body_section_ptr), 3 302 2 header like message_body_section.header, 3 303 2 bit_string_ptr pointer, /* -> the bit string */ 3 304 2 bit_string_lth fixed binary (24), /* length of said bit string in bits (obviously) */ 3 305 2 reserved bit (36); /* for exclusive use of the mail system */ 3 306 3 307 dcl message_bit_string_body_section_bit_string bit (message_bit_string_body_section.bit_string_lth) unaligned 3 308 based (message_bit_string_body_section.bit_string_ptr); 3 309 3 310 3 311 /* Structure used in calls to mail_system_ entrypoints which manipulate the sections of a message's body */ 3 312 3 313 dcl 1 message_body_section_parameter aligned based (message_body_section_parameter_ptr), 3 314 2 pad pointer, /* forces even word alignment */ 3 315 2 version character (8) unaligned, 3 316 2 section like message_body_section; 3 317 3 318 dcl MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 character (8) static options (constant) initial ("mlsmbs02"); 3 319 3 320 dcl message_body_section_parameter_ptr pointer; 3 321 3 322 /* END INCLUDE FILE ... mlsys_message.incl.pl1 */ 3994 3995 4 1 /* BEGIN INCLUDE FILE ... mlsys_address_types.incl.pl1 */ 4 2 /* Created: June 1983 by G. Palter */ 4 3 4 4 /* Types of addresses supported by the Multics Mail System */ 4 5 4 6 dcl (INVALID_ADDRESS initial (0), /* a syntactically invalid address: used as a place holder 4 7* when parsing printed representations */ 4 8 USER_MAILBOX_ADDRESS initial (1), /* identifies a user's default mailbox */ 4 9 LOGBOX_ADDRESS initial (2), /* identifies a user's logbox */ 4 10 SAVEBOX_ADDRESS initial (3), /* identifies one of a user's saveboxes by pathname */ 4 11 MAILBOX_ADDRESS initial (4), /* identifies some other mailbox by pathname */ 4 12 FORUM_ADDRESS initial (5), /* identifies a forum meeting by pathname */ 4 13 FOREIGN_ADDRESS initial (6), /* identifies a user (or group) on another compute system */ 4 14 MAIL_TABLE_ADDRESS initial (7), /* identifies an entry in the system's mail table */ 4 15 MAILING_LIST_ADDRESS initial (8), /* identifies a mailing list by pathname */ 4 16 NAMED_GROUP_ADDRESS initial (9)) /* identifies a named group of addresses */ 4 17 fixed binary static options (constant); 4 18 4 19 /* END INCLUDE FILE ... mlsys_address_types.incl.pl1 */ 3996 3997 5 1 /* BEGIN INCLUDE FILE ... mlsys_address_list.incl.pl1 */ 5 2 /* Created: June 1983 by G. Palter */ 5 3 5 4 /* Definition of an address list -- a collection of addresses used as the value of certain message fields, etc. */ 5 5 5 6 dcl 1 address_list aligned based (address_list_ptr), 5 7 2 version character (8) unaligned, 5 8 2 reserved bit (144), /* ... exclusively for use by the mail system */ 5 9 2 n_addresses fixed binary, /* # of address in this list */ 5 10 2 addresses (address_list_n_addresses refer (address_list.n_addresses)) pointer; 5 11 5 12 dcl ADDRESS_LIST_VERSION_2 character (8) static options (constant) initial ("mlsals02"); 5 13 5 14 dcl address_list_ptr pointer; 5 15 5 16 dcl address_list_n_addresses fixed binary; /* reserved exclusively for use by the mail system */ 5 17 5 18 /* END INCLUDE FILE ... mlsys_address_list.incl.pl1 */ 3998 3999 6 1 /* BEGIN INCLUDE FILE ... mlsys_address_route.incl.pl1 */ 6 2 /* Created: June 1983 by G. Palter */ 6 3 6 4 /* Definition of a mail system address route */ 6 5 6 6 dcl 1 address_route aligned based (address_route_ptr), 6 7 2 header, 6 8 3 version character (8) unaligned, 6 9 3 reserved bit (144), /* ... exclusively for use by the mail system */ 6 10 3 n_relays fixed binary, /* # of relay systems in the route */ 6 11 2 relays (address_route_n_relays refer (address_route.n_relays)) character (256) varying; 6 12 /* the relays: relays(1) is closest to the local host */ 6 13 6 14 dcl ADDRESS_ROUTE_VERSION_1 character (8) static options (constant) initial ("mlsrte01"); 6 15 6 16 dcl address_route_ptr pointer; 6 17 6 18 dcl address_route_n_relays fixed binary; /* for allocating above structure (users do on occasion) */ 6 19 6 20 /* END INCLUDE FILE ... mlsys_address_route.incl.pl1 */ 4000 4001 7 1 /* BEGIN INCLUDE FILE ... mlsys_data.incl.pl1 */ 7 2 /* Created: 20 Decembber 1978 by G. Palter */ 7 3 /* Modified: 1 July 1983 by G. Palter to merge with mlsys_internal_data_ */ 7 4 7 5 /* Constants defined by the Multics mail system for external use */ 7 6 7 7 dcl mlsys_data_$system_directory character (168) external; /* directory containing per-system data (mail table/queues) */ 7 8 7 9 7 10 /* Static data defined by the Multics mail system for external use */ 7 11 7 12 dcl mlsys_data_$user_default_mailbox_address pointer external; 7 13 /* -> the address of the user's default mailbox */ 7 14 dcl mlsys_data_$user_mail_table_address pointer external; /* -> the address of the user's entry in the mail table */ 7 15 dcl mlsys_data_$user_logbox_address pointer external; /* -> the address of the user's logbox */ 7 16 7 17 /* END INCLUDE FILE ... mlsys_data.incl.pl1 */ 4002 4003 8 1 /* BEGIN INCLUDE FILE ... mlsys_internal_data.incl.pl1 */ 8 2 8 3 8 4 /****^ HISTORY COMMENTS: 8 5* 1) change(86-06-11,Mills), approve(86-06-11,MCR7419), 8 6* audit(86-06-17,Margolin), install(86-06-30,MR12.0-1080): 8 7* Added mlsys_data_$domains_available. 8 8* END HISTORY COMMENTS */ 8 9 8 10 8 11 /* Created: May 1981 by G. Palter */ 8 12 /* Modified: July 1983 by G. Palter to merge with mlsys_data_ */ 8 13 8 14 /* Constants used internally by the Multics mail system */ 8 15 8 16 dcl mlsys_data_$max_opening_retries fixed binary external; /* maximum number of times to reopen a mailbox if it gets 8 17* damaged and salvaged while open */ 8 18 8 19 dcl mlsys_data_$max_lock_wait_retries fixed binary external; 8 20 /* maximum number of times to try to send a message while the 8 21* mailbox is locked (being salvaged?) */ 8 22 8 23 8 24 /* Allocation overhead factors: When allocating those structures with refer extents, insure that the variable portion of 8 25* the structure contains a multiple of the appropriate constant number of slots. These extra slots will be used for 8 26* later additions to the structure; when a new element must be added to a full structure, add this many new slots (rather 8 27* than a single new slot) 8 28* 8 29* The following expression should be used to determine the initial allocation: 8 30* 8 31* n_slots_to_allocate = n_slots_needed + CONSTANT - mod (n_slots_needed, CONSTANT); */ 8 32 8 33 dcl (mlsys_data_$mailbox_allocation, /* mailbox.messages */ 8 34 mlsys_data_$message_body_sections_allocation, /* message.body_sections */ 8 35 mlsys_data_$message_redistributions_list_allocation, /* message_redistributions_list.redistributions */ 8 36 mlsys_data_$message_user_fields_allocation, /* message_user_fields_list.user_fields */ 8 37 mlsys_data_$message_references_list_allocation, /* message_references_list.references */ 8 38 mlsys_data_$address_list_allocation) /* address_list.addresses */ 8 39 fixed binary external; 8 40 8 41 8 42 /* Static data user by the Multics mail system */ 8 43 8 44 dcl (mlsys_data_$forum_not_available, /* 1 => forum isn't available on the system or in this ring */ 8 45 mlsys_data_$ism_not_available, /* 1 => no inter-system mailer on this system */ 8 46 mlsys_data_$domains_available) /* 1 => domain name system software on this sytem */ 8 47 fixed binary (1) external; 8 48 8 49 dcl (mlsys_data_$subsystem_ring, /* ring in which the mail system is secured */ 8 50 mlsys_data_$highest_usable_ring, /* highest ring of execution which may use the mail system */ 8 51 mlsys_data_$lowest_forum_ring) /* lowest ring of execution with access to forum */ 8 52 fixed binary (3) external; 8 53 8 54 dcl mlsys_data_$temp_segment_list_ptr pointer external; /* -> list of all mail system temporary segments */ 8 55 8 56 dcl mlsys_data_$valid_segments (0:4095) bit (1) unaligned external; 8 57 /* indicates which segments have been used by the mail system 8 58* for the allocation of user-visible data in order to 8 59* validate that pointers passed from the user-ring are OK */ 8 60 8 61 dcl mlsys_area area based (mlsys_data_$subsystem_area_ptr);/* area used for all user-visible allocations ... */ 8 62 dcl mlsys_data_$subsystem_area_ptr pointer external; /* ... and the pointer on which it is based */ 8 63 8 64 dcl mlsys_data_$hash_tables_segment_ptr pointer external; /* -> hash tables used by the mail system */ 8 65 8 66 dcl mlsys_data_$transmit_cache_ptr pointer external; /* -> cache of recently used mailboxes for mlsys_transmit_ */ 8 67 8 68 dcl mlsys_data_$user_is_anonymous bit (1) aligned external;/* ON => the user is an anonymous user */ 8 69 8 70 dcl mlsys_data_$person_id character (24) varying external; /* the user's Person_id */ 8 71 dcl mlsys_data_$project_id character (12) varying external;/* the user's Project_id */ 8 72 dcl mlsys_data_$user_id character (32) varying external; /* the user's User_id (Person_id.Project_id) */ 8 73 8 74 /* END INCLUDE FILE ... mlsys_internal_data.incl.pl1 */ 4004 4005 9 1 /* BEGIN Mailbox Message Include File (mail_format.incl.pl1) */ 9 2 9 3 9 4 /****^ HISTORY COMMENTS: 9 5* 1) change(86-01-09,Herbst), approve(86-03-25,MCR7367), 9 6* audit(86-04-28,Margolin), install(86-05-22,MR12.0-1059): 9 7* Added "seen" switch. 9 8* 2) change(86-06-02,Herbst), approve(86-06-02,MCR7367), audit(86-06-30,Wong), 9 9* install(86-06-30,MR12.0-1080): 9 10* Updated to version 4 for seen switch. 9 11* END HISTORY COMMENTS */ 9 12 9 13 /* Last modified by K. T. Pogran, 3/6/75 */ 9 14 /* Modified by D. M. Wells, August 10, 1977 for v4 message segments. */ 9 15 /* Modified: 3 June 1981 by G. Palter for mail system subroutine interface */ 9 16 9 17 declare mail_format_ptr pointer aligned; 9 18 9 19 declare MAIL_FORMAT_VERSION_4 initial (4) 9 20 fixed bin internal static options (constant); 9 21 9 22 declare text_length fixed bin (21); 9 23 9 24 declare 1 mail_format aligned based (mail_format_ptr), 9 25 2 header, 9 26 3 version fixed bin (17), 9 27 3 sent_from char (32) aligned, 9 28 3 lines fixed bin (17), 9 29 3 text_len fixed bin (21), 9 30 3 switches aligned, 9 31 4 wakeup bit (1) unaligned, 9 32 4 urgent bit (1) unaligned, 9 33 4 notify bit (1) unaligned, 9 34 4 acknowledge bit (1) unaligned, 9 35 4 obsolete bit (1) unaligned, 9 36 4 canonical bit (1) unaligned, 9 37 4 seen bit (1) unaligned, 9 38 4 others bit (65) unaligned, 9 39 2 text char(text_length refer (mail_format.header.text_len)) aligned; 9 40 9 41 /* END Mailbox Message Include File (mail_format.incl.pl1) */ 4006 4007 10 1 /* BEGIN INCLUDE FILE ... mlsys_mf_extension.incl.pl1 */ 10 2 /* Created: December 1983 by G. Palter */ 10 3 10 4 /* Definition of the extension to the mail_format structure used by the Multics Mail System: When the 10 5* mail_format.canonical flag is ON, the mail_format structure stored in a mailbox contains the canonical form of the 10 6* message; in addition, the following structure is also stored in the mailbox immediately after the mail_format 10 7* structure. This extension contains information that will be necessary to preserve the performance of context searching 10 8* of a message in future releases. Said information consists of the location and length within the canonical form of the 10 9* message body, subject, redistribution comments, and user-defined text fields */ 10 10 10 11 dcl 1 mf_extension aligned based (mf_extension_ptr), 10 12 2 n_text_fragments fixed binary (21), /* # of pieces of text which will be searched */ 10 13 2 text_fragments (mf_extension_n_text_fragments refer (mf_extension.n_text_fragments)), 10 14 3 start fixed binary (21), 10 15 3 lth fixed binary (21); 10 16 10 17 dcl mf_extension_n_text_fragments fixed binary (21); 10 18 dcl mf_extension_ptr pointer; 10 19 10 20 /* END INCLUDE FILE ... mlsys_mf_extension.incl.pl1 */ 4008 4009 11 1 /* START OF: time_names_.incl.pl1 * * * * * * * * * * * * * * * * */ 11 2 11 3 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 11 4 /* */ 11 5 /* Name: time_names_.incl.pl1 */ 11 6 /* */ 11 7 /* This include file defines the structure of values in the time_table_. The table */ 11 8 /* includes a list of time zones known to the system, as well as lists of month names */ 11 9 /* and names of days of the week. All names are expressed in several different languages */ 11 10 /* to facilitate transliteration of dates into these languages. The table includes */ 11 11 /* the list of languages in which dates may be expressed. */ 11 12 /* */ 11 13 /* Status */ 11 14 /* */ 11 15 /* 0) Created 06/07/78: J. Falksen */ 11 16 /* 1) Modified 07/04/78: G. Dixon */ 11 17 /* */ 11 18 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 11 19 11 20 11 21 dcl time_info_$version char (8) ext static; /* Version number of all structures in the */ 11 22 /* time_info_. Currently = 1. */ 11 23 dcl Vtime_info_2 char (8) int static options(constant) init("tinfo002"); 11 24 11 25 dcl time_info_$gmt_zone_index fixed bin (17) ext static; 11 26 dcl time_info_$default_language_index fixed bin (17) ext static; 11 27 11 28 dcl time_info_$date_time_keywords fixed bin ext static; /* Table of named date/time format strings */ 11 29 dcl 1 ti_keyword based (addr (time_info_$date_time_keywords)), 11 30 2 number_kwd fixed bin, /* number of keywords present */ 11 31 2 pad fixed bin, 11 32 2 e (0 refer (ti_keyword.number_kwd)), 11 33 3 name char (32), 11 34 3 str char (128)var; 11 35 dcl (site_date init (1), 11 36 site_date_time init (2), 11 37 site_time init (3) 11 38 ) fixed bin int static options (constant); 11 39 11 40 dcl time_info_$language_names fixed bin ext static; /* Table of language names, in various languages */ 11 41 11 42 dcl 1 ti_language based (addr (time_info_$language_names)), 11 43 2 number_lang fixed bin, /* number of language names present */ 11 44 2 pad fixed bin, 11 45 2 name (0 refer (ti_language.number_lang), 0 refer (ti_language.number_lang)) 11 46 char(32) varying; /* Name of the language. */ 11 47 /* All language names are expressed in all languages. name(i,j) gives the */ 11 48 /* jth language name in language i. name(i,i) gives a language name in its */ 11 49 /* own language. */ 11 50 dcl time_info_$month_names fixed bin ext static; /* Table of month names in various languages. */ 11 51 11 52 dcl 1 ti_month based (addr (time_info_$month_names)), 11 53 2 number_lang fixed bin, /* number of languages in the table. */ 11 54 2 pad fixed bin, 11 55 2 e (0 refer (ti_month.number_lang), 12), 11 56 3 short char(8) var, /* short form of a month name, i.e., Nov */ 11 57 3 long char(32) var; /* long form of a month name, i.e. November */ 11 58 dcl time_info_$day_names fixed bin ext static; /* Table of day names in various languages. */ 11 59 11 60 dcl 1 ti_day based (addr (time_info_$day_names)), 11 61 2 number_lang fixed bin, /* number of languages in the table. */ 11 62 2 pad fixed bin, 11 63 2 e (0 refer (ti_day.number_lang), 7), 11 64 3 short char(8) var, /* short for of a day name, i.e. Sat */ 11 65 3 long char(32) var; /* long form of a day name, i.e. Saturday */ 11 66 dcl time_info_$offset_names fixed bin ext static; /* Table of offset names in various languages. */ 11 67 11 68 dcl 1 ti_offset based (addr (time_info_$offset_names)), 11 69 2 number_lang fixed bin, /* number of languages in the table. */ 11 70 2 number_offset fixed bin, 11 71 2 e (0 refer (ti_offset.number_lang), 0 refer (ti_offset.number_offset)), 11 72 3 short char(32) var, /* short form of an offset name, i.e. min */ 11 73 3 plural char(32) var, /* plural form of an offset name, i.e. minutes */ 11 74 3 singular char(32) var, /* singular for of an offset name, i.e. minute */ 11 75 3 this char(32) var; /* "this" which goes with singular */ 11 76 dcl time_info_$word_names fixed bin ext static; /* Table of word names in various languages. */ 11 77 11 78 dcl 1 ti_word based (addr (time_info_$word_names)), 11 79 2 number_lang fixed bin, /* number of languages in the table. */ 11 80 2 number_word fixed bin, 11 81 2 short (0 refer (ti_word.number_lang), 0 refer (ti_word.number_word)) 11 82 char (8) var, 11 83 2 word (0 refer (ti_word.number_lang), 0 refer (ti_word.number_word)) 11 84 char(32) var; /* a "word", i.e. Midnight */ 11 85 11 86 dcl time_info_$zone_names fixed bin ext static; /* Table of known time zones. */ 11 87 11 88 dcl 1 ti_zone based (addr (time_info_$zone_names)), 11 89 2 number_lang fixed bin, /* number of languages in which zone names */ 11 90 /* are defined. */ 11 91 2 number_zone fixed bin, /* number of zone names in the table. */ 11 92 2 e (0 refer (ti_zone.number_lang), 0 refer (ti_zone.number_zone)), 11 93 3 short char(4) var, /* short form of the zone name. */ 11 94 3 long char(64) var, /* long form of the zone name */ 11 95 3 pad fixed bin, 11 96 3 delta fixed bin(71); /* offset, in microseconds, of this time zone */ 11 97 /* from GMT (Greenwich mean time). This value */ 11 98 /* should be subtracted from a clock value */ 11 99 /* (which is expressed in GMT by definition). */ 11 100 /* to obtain a date/time expressed in the */ 11 101 /* named time zone. */ 11 102 /* NOTE: zones are listed in order of descending */ 11 103 /* delta, from +11 to -12. print_time_zones */ 11 104 /* requires this. */ 11 105 11 106 11 107 dcl (tiw_FiscalIndicator init (11) 11 108 ) fixed bin int static options (constant); 11 109 11 110 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 11 111 /* NOTE TO MAINTAINER: Before changing this file, see the comments in */ 11 112 /* time_info_cds.incl.pl1 */ 11 113 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 11 114 11 115 /* END OF: time_names_.incl.pl1 * * * * * * * * * * * * * * * * */ 4010 4011 12 1 /* BEGIN INCLUDE FILE ... mlsys_special_chars.incl.pl1 */ 12 2 /* Created: June 1981 by G. Palter */ 12 3 /* Modified: July 1983 by G. Palter for new mail interfaces and RFC822 */ 12 4 12 5 /* Sets of characters with special meanings to the Multics mail system: */ 12 6 12 7 /* The definition of whitespace used by the mail system */ 12 8 12 9 dcl WHITESPACE character (5) static options (constant) initial (" 12 10 "); /* horizontal tab, space, newline, vertical tab, formfeed */ 12 11 12 12 dcl BACKSLASH_PARENS_NL character (4) static options (constant) initial ("\() 12 13 "); 12 14 12 15 dcl BACKSLASH_QUOTE_NL character (3) static options (constant) initial ("\"" 12 16 "); 12 17 12 18 dcl QUOTE_PARENS_NL character (4) static options (constant) initial ("""() 12 19 "); 12 20 12 21 12 22 /* Address, date/time, and message-id parsing self-defining tokens and token delimiters */ 12 23 12 24 dcl DATE_TIME_BREAKS character (4) static options (constant) initial (",:+-"); 12 25 12 26 dcl NORMAL_BREAKS character (8) static options (constant) initial (",:;{}<>@"); 12 27 12 28 dcl DATE_TIME_RFC822_DELIMITERS character (13) static options (constant) initial (",:+-()""\ 12 29 "); /* last five are: tab, space, newline, vertical tab, formfeed */ 12 30 12 31 dcl DATE_TIME_DELIMITERS character (12) static options (constant) initial (",:+-()"" 12 32 "); 12 33 12 34 dcl NORMAL_RFC822_DELIMITERS character (17) static options (constant) initial (",:;{}<>@()""\ 12 35 "); 12 36 12 37 dcl NORMAL_DELIMITERS character (16) static options (constant) initial (",:;{}<>@()"" 12 38 "); 12 39 12 40 dcl STRUCTURED_RFC822_DELIMITERS character (11) static options (constant) initial ("{}()""\ 12 41 "); 12 42 12 43 dcl STRUCTURED_DELIMITERS character (10) static options (constant) initial ("{}()"" 12 44 "); 12 45 12 46 12 47 /* Characters which must be requoted within the printed or RFC822 representation of addresses */ 12 48 12 49 dcl COMMENT_REQUOTE character (7) static options (constant) initial ("()"" 12 50 "); 12 51 12 52 dcl COMMENT_RFC822_REQUOTE character (7) static options (constant) initial ("()\ 12 53 "); 12 54 12 55 dcl STRUCTURED_REQUOTE character (10) static options (constant) initial ("{}()"" 12 56 "); 12 57 12 58 dcl STRUCTURED_RFC822_REQUOTE character (11) static options (constant) initial ("{}()""\ 12 59 "); 12 60 12 61 dcl TOP_LEVEL_REQUOTE character (15) static options (constant) initial (",:;<>(){}@"" 12 62 "); 12 63 12 64 dcl TOP_LEVEL_RFC822_REQUOTE character (18) static options (constant) initial (",:;<>(){}[]@""\ 12 65 "); 12 66 12 67 12 68 /* Common sequences used when constructing printed and RFC822 representations */ 12 69 12 70 dcl (ATSIGN initial ("@"), 12 71 BACKSLASH initial ("\"), 12 72 CLOSE_PAREN initial (")"), 12 73 COMMA initial (","), 12 74 SEMICOLON initial (";"), 12 75 HT initial (" "), 12 76 BS initial (""), 12 77 LEFT_ANGLE_BRACKET initial ("<"), 12 78 LEFT_BRACE initial ("{"), 12 79 OPEN_PAREN initial ("("), 12 80 PERIOD initial ("."), 12 81 QUOTE initial (""""), 12 82 RIGHT_ANGLE_BRACKET initial (">"), 12 83 RIGHT_BRACE initial ("}"), 12 84 SP initial (" "), 12 85 COLON initial (":"), 12 86 HYPHEN initial ("-"), 12 87 PLUS initial ("+"), 12 88 NL initial (" 12 89 "), 12 90 CR initial (" "), 12 91 VT initial (" "), 12 92 FF initial (" ")) 12 93 character (1) static options (constant); 12 94 12 95 dcl (ANGLE_BRACKETS initial ("<>"), 12 96 BACKSLASH_QUOTE initial ("\"""), 12 97 HTSP initial (" "), 12 98 NLSP initial (" 12 99 "), 12 100 QUOTE_LEFT_BRACE initial ("""{"), 12 101 QUOTE_NL initial (""" 12 102 "), 12 103 QUOTE_QUOTE initial (""""""), 12 104 RIGHT_BRACE_QUOTE initial ("}"""), 12 105 SP_LEFT_ANGLE_BRACKET initial (" <"), 12 106 SP_OPEN_PAREN initial (" ("), 12 107 COLON_SP initial (": "), 12 108 COMMA_SP initial (", "), 12 109 SPSP initial (" "), 12 110 NLNL initial (" 12 111 12 112 ")) 12 113 character (2) static options (constant); 12 114 12 115 dcl SP_AT_SP character (4) static options (constant) initial (" at "); 12 116 12 117 dcl SP_VIA_SP character (5) static options (constant) initial (" via "); 12 118 12 119 /* END INCLUDE FILE ... mlsys_special_chars.incl.pl1 */ 4012 4013 4014 end mlsys_format_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 04/26/87 1555.0 mlsys_format_.pl1 >spec>install>1026>mlsys_format_.pl1 3990 1 10/27/83 2104.2 mlsys_format_options.incl.pl1 >ldd>include>mlsys_format_options.incl.pl1 3992 2 10/27/83 2104.2 mlsys_field_names.incl.pl1 >ldd>include>mlsys_field_names.incl.pl1 3994 3 05/22/86 1225.8 mlsys_message.incl.pl1 >ldd>include>mlsys_message.incl.pl1 3996 4 10/27/83 2104.2 mlsys_address_types.incl.pl1 >ldd>include>mlsys_address_types.incl.pl1 3998 5 10/27/83 2104.2 mlsys_address_list.incl.pl1 >ldd>include>mlsys_address_list.incl.pl1 4000 6 10/27/83 2104.2 mlsys_address_route.incl.pl1 >ldd>include>mlsys_address_route.incl.pl1 4002 7 10/27/83 2104.2 mlsys_data.incl.pl1 >ldd>include>mlsys_data.incl.pl1 4004 8 06/30/86 2023.8 mlsys_internal_data.incl.pl1 >ldd>include>mlsys_internal_data.incl.pl1 4006 9 06/30/86 2023.8 mail_format.incl.pl1 >ldd>include>mail_format.incl.pl1 4008 10 12/12/83 1616.5 mlsys_mf_extension.incl.pl1 >ldd>include>mlsys_mf_extension.incl.pl1 4010 11 09/06/84 0850.2 time_names.incl.pl1 >ldd>include>time_names.incl.pl1 4012 12 11/30/83 1737.3 mlsys_special_chars.incl.pl1 >ldd>include>mlsys_special_chars.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. ACCESS_CLASS_FIELDNAME 000355 constant varying char(32) initial dcl 2-6 set ref 2000* ACKNOWLEDGE_TO_FIELDNAME 000344 constant varying char(32) initial dcl 2-6 ref 1889 ADDRESS_LIST_VERSION_2 000112 constant char(8) initial unaligned dcl 5-12 set ref 1277 2772* ADDRESS_ROUTE_VERSION_1 000110 constant char(8) initial unaligned dcl 6-14 set ref 2538* 2704* ANGLE_BRACKETS constant char(2) initial unaligned dcl 12-95 ref 2567 ATSIGN 000060 constant char(1) initial unaligned dcl 12-70 set ref 1805* 2540 2552 2602 2711* 2722* 2780* 3004* BACKSLASH 000057 constant char(1) initial unaligned dcl 12-70 set ref 3565* 3652* 3719* BACKSLASH_PARENS_NL 000105 constant char(4) initial unaligned dcl 12-12 ref 3489 3709 BACKSLASH_QUOTE 000042 constant char(2) initial unaligned dcl 12-95 set ref 3437 3457 3629* 3648* 3649* 3665* BACKSLASH_QUOTE_NL 000104 constant char(3) initial unaligned dcl 12-15 ref 3403 3446 3555 3636 BCC_FIELDNAME 000333 constant varying char(32) initial dcl 2-6 set ref 1959* BRIEF_FORMATTING_MODE constant fixed bin(17,0) initial dcl 1-22 ref 323 845 913 1937 1942 1947 1954 1961 1994 2011 2076 2093 2287 2303 2310 BS constant char(1) initial unaligned dcl 12-70 ref 3885 CANONICAL_BCC_FIELDNAME 000773 constant varying char(32) initial dcl 176 set ref 1954* CANONICAL_CC_FIELDNAME 000762 constant varying char(32) initial dcl 176 set ref 1947* CC_FIELDNAME 000322 constant varying char(32) initial dcl 2-6 set ref 1952* CLOSE_PAREN 000056 constant char(1) initial unaligned dcl 12-70 set ref 2458 2494 3736* COLON 000046 constant char(1) initial unaligned dcl 12-70 set ref 2719* 2938* COLON_SP 000033 constant char(2) initial unaligned dcl 12-95 set ref 2624* COMMA 000055 constant char(1) initial unaligned dcl 12-70 set ref 2383 2552 2710* 3031* COMMA_SP 000032 constant char(2) initial unaligned dcl 12-95 set ref 2391 2399* 2852 2921* COMMENT_FIELDNAME 000727 constant varying char(32) initial dcl 176 ref 2344 COMMENT_REQUOTE 000102 constant char(7) initial unaligned dcl 12-49 ref 3478 3700 COMMENT_RFC822_REQUOTE 000100 constant char(7) initial unaligned dcl 12-52 ref 3476 3698 CR constant char(1) initial unaligned dcl 12-70 ref 3887 DATE_TIME_CREATED_FIELDNAME 000311 constant varying char(32) initial dcl 2-6 set ref 1918* 2292 DATE_TIME_DELIVERED_FIELDNAME 000300 constant varying char(32) initial dcl 2-6 set ref 618 629* 1867 DATE_TIME_MAILED_FIELDNAME 000267 constant varying char(32) initial dcl 2-6 ref 1877 DAY_OF_WEEKS 000504 constant varying char(12) initial array dcl 214 set ref 2920* DEFAULT_FORMATTING_MODE 000762 constant fixed bin(17,0) initial dcl 1-22 set ref 408 408 408 520* 522* 525* 608* 720* 724* 726* 776 2000 DELIVERED_BY_FIELDNAME 000256 constant varying char(32) initial dcl 2-6 set ref 623 632* 1873 FF constant char(1) initial unaligned dcl 12-70 ref 3887 FIELDNAME_SUFFIX 000702 constant char(3) initial unaligned dcl 192 set ref 1142* 1233* 1323* 1409* 1494* 1586* 1672* 1981* 2037* 2104* 2176* 2205* 2330* FOREIGN_ADDRESS constant fixed bin(17,0) initial dcl 4-6 ref 2591 2777 FORMAT_MESSAGE_OPTIONS_VERSION_1 000366 constant char(8) initial unaligned dcl 1-15 ref 318 398 FROM_FIELDNAME 000245 constant varying char(32) initial dcl 2-6 set ref 1930* 1931* 2299 HT constant char(1) initial unaligned dcl 12-70 ref 3883 HYPHEN 000045 constant char(1) initial unaligned dcl 12-70 set ref 2947* IMPLICIT_ROUTE_FIELDNAME 000234 constant varying char(32) initial dcl 2-6 ref 2175 LAST_REDISTRIBUTED_FIELDNAME 000705 constant varying char(32) initial dcl 176 set ref 2103* LAST_RESENT_FIELDNAME 000716 constant varying char(32) initial dcl 176 set ref 2101* LEFT_ANGLE_BRACKET 000053 constant char(1) initial unaligned dcl 12-70 set ref 2708* 2999* LEFT_BRACE 000052 constant char(1) initial unaligned dcl 12-70 set ref 3617* LONG_FORMATTING_MODE constant fixed bin(17,0) initial dcl 1-22 ref 323 323 323 776 845 913 1868 1874 1878 1883 1886 2000 2005 2349 LOWERCASE 000631 constant char(26) initial unaligned dcl 203 ref 2891 2893 2909 MAX_MULTILINE_INDENTATION constant fixed bin(17,0) initial dcl 186 ref 3204 MESSAGE_ADDRESS_LIST_USER_FIELD constant fixed bin(17,0) initial dcl 3-174 ref 2023 MESSAGE_BIT_STRING_BODY_SECTION constant fixed bin(17,0) initial dcl 3-285 ref 1731 MESSAGE_BODY_SECTION_PARAMETER_VERSION_2 000114 constant char(8) initial unaligned dcl 3-318 ref 1727 MESSAGE_DATE_USER_FIELD constant fixed bin(17,0) initial dcl 3-174 ref 2030 MESSAGE_ID_FIELDNAME 000223 constant varying char(32) initial dcl 2-6 set ref 2005* 2351 MESSAGE_PREFORMATTED_BODY_SECTION constant fixed bin(17,0) initial dcl 3-285 ref 1731 MESSAGE_REFERENCES_LIST_VERSION_2 000116 constant char(8) initial unaligned dcl 3-227 ref 1539 MESSAGE_TEXT_USER_FIELD constant fixed bin(17,0) initial dcl 3-174 ref 2017 MESSAGE_TRACE_VERSION_2 000120 constant char(8) initial unaligned dcl 3-103 ref 1040 MESSAGE_VERSION_2 000122 constant char(8) initial unaligned dcl 3-49 ref 313 392 482 566 701 771 840 908 976 MONTHS 000551 constant varying char(12) initial array dcl 207 set ref 2929* MULTILINE_BLANK_LINE_DESIGNATOR 000704 constant char(2) initial unaligned dcl 188 set ref 3205 3214 3231* NAMED_GROUP_ADDRESS constant fixed bin(17,0) initial dcl 4-6 ref 2591 2607 2624 2777 2789 NL 000043 constant char(1) initial unaligned dcl 12-70 set ref 373* 462* 527* 728* 1149* 1240* 1330* 1416* 1501* 1593* 1688* 1990* 2040* 2109* 2132* 2198* 2238* 2339* 3224 3284 3284 3284 3293 3293* 3342* 3350* 3412 3455 3498 3567 3654 3721 3762* 3836 3887 3978 NLSP 000041 constant char(2) initial unaligned dcl 12-95 set ref 3572* 3660* 3726* NONE_FORMATTING_MODE constant fixed bin(17,0) initial dcl 1-22 ref 323 323 323 334 334 334 357 357 357 362 366 369 408 408 408 418 418 418 446 446 446 451 454 458 ONE_HOUR 034574 constant fixed bin(17,0) initial dcl 200 ref 2951 2952 ONE_MINUTE 000650 constant fixed bin(71,0) initial dcl 199 ref 2900 2950 3954 PERIOD constant char(1) initial unaligned dcl 12-70 ref 3379 3528 PLUS 000044 constant char(1) initial unaligned dcl 12-70 set ref 2949* P_access_class parameter bit(72) dcl 86 set ref 1072 1087 1117* P_address_list_ptr parameter pointer dcl 90 set ref 1248 1263 1277 1298* P_address_ptr parameter pointer dcl 88 set ref 1157 1172 1186* 1208* P_address_route_ptr parameter pointer dcl 107 ref 1779 1791 P_address_string parameter varying char dcl 105 set ref 1779 1801* P_buffer_ptr parameter pointer dcl 47 ref 280 283 388 426 478 487 561 573 675 686 706 740 743 809 812 877 880 945 948 1008 1012 1072 1075 1157 1160 1248 1251 1338 1341 1424 1427 1509 1513 1601 1604 1696 1699 P_buffer_size parameter fixed bin(21,0) dcl 48 ref 280 284 388 427 675 686 707 740 744 809 813 877 881 945 949 1008 1013 1072 1076 1157 1161 1248 1252 1338 1342 1424 1428 1509 1514 1601 1605 1696 1700 P_buffer_size_words parameter fixed bin(19,0) dcl 66 ref 478 489 537 561 575 654 P_buffer_used parameter fixed bin(21,0) dcl 49 set ref 280 285 379* 388 428 466* 675 686 732* 740 745 801* 809 814 869* 877 882 937* 945 950 1000* 1008 1014 1064* 1072 1077 1121* 1157 1162 1212* 1248 1253 1302* 1338 1343 1387* 1424 1429 1473* 1509 1515 1565* 1601 1606 1650* 1696 1701 1758* P_buffer_used_words parameter fixed bin(19,0) dcl 68 set ref 478 551* 561 668* P_code parameter fixed bin(35,0) dcl 53 set ref 280 295 314* 319* 330* 338* 351* 381* 388 393* 399* 404* 414* 422* 467* 478 483* 552* 561 567* 669* 675 686 702* 734* 740 755 772* 777* 790* 803* 809 824 841* 846* 859* 871* 877 892 909* 914* 927* 939* 945 960 977* 990* 1002* 1008 1024 1041* 1054* 1066* 1072 1087 1111* 1123* 1157 1172 1189* 1202* 1214* 1248 1263 1279* 1292* 1304* 1338 1353 1377* 1389* 1424 1439 1463* 1475* 1509 1525 1542* 1555* 1567* 1601 1616 1640* 1652* 1696 1711 1728* 1733* 1746* 1762* 1779 1818* 3281* 3906* 3922* 3937* P_date_time parameter fixed bin(71,0) dcl 92 set ref 1338 1353 1383* P_fieldname parameter varying char dcl 43 set ref 1072 1087 1117* 1157 1172 1208* 1248 1263 1298* 1338 1353 1383* 1424 1439 1469* 1509 1525 1561* 1601 1616 1646* P_format_message_options_ptr parameter pointer dcl 62 ref 280 295 311 388 397 P_format_redistribution_trace parameter bit(1) dcl 82 set ref 1008 1024 1060* P_formatting_mode parameter fixed bin(17,0) dcl 77 set ref 740 755 776 776 796* 809 824 845 845 865* 877 892 913 913 933* P_host_name parameter varying char dcl 111 set ref 1779 1795 1815* P_include_dow parameter bit(1) dcl 93 set ref 1338 1353 1383* P_line_length parameter fixed bin(17,0) dcl 45 ref 740 755 783 788 809 824 852 857 877 892 920 925 945 960 983 988 1008 1024 1047 1052 1072 1087 1104 1109 1157 1172 1195 1200 1248 1263 1285 1290 1338 1353 1370 1375 1424 1439 1456 1461 1509 1525 1548 1553 1601 1616 1633 1638 1696 1711 1739 1744 P_message_body_section_parameter_ptr parameter pointer dcl 103 ref 1696 1711 1725 P_message_id parameter bit(72) dcl 95 set ref 1424 1439 1469* P_message_ptr parameter pointer dcl 55 ref 280 295 309 388 391 478 481 561 565 675 686 699 740 755 769 809 824 838 877 892 906 945 960 974 P_message_references_list_ptr parameter pointer dcl 97 set ref 1509 1525 1539 1561* P_message_trace_ptr parameter pointer dcl 81 ref 1008 1024 1038 P_multiline_text parameter bit(1) dcl 101 set ref 1601 1616 1646* P_original_mf_extension_ptr parameter pointer dcl 74 ref 561 572 P_original_mf_ptr parameter pointer dcl 72 ref 561 571 P_output_switch parameter pointer dcl 51 ref 295 303 755 763 824 832 892 900 960 968 1024 1032 1087 1095 1172 1180 1263 1271 1353 1361 1439 1447 1525 1533 1616 1624 1711 1719 P_text parameter char unaligned dcl 100 set ref 1601 1616 1646* P_user_name parameter varying char dcl 109 set ref 1779 1794 1808* QUOTE 000051 constant char(1) initial unaligned dcl 12-70 set ref 3395 3440 3457 3483 3550* 3570 3577* 3631* 3647 3658 3667* 3703* 3724 3731* QUOTE_LEFT_BRACE 000040 constant char(2) initial unaligned dcl 12-95 set ref 3615* QUOTE_NL constant char(2) initial unaligned dcl 12-95 ref 3405 3448 3491 3557 3638 3711 QUOTE_QUOTE 000037 constant char(2) initial unaligned dcl 12-95 set ref 3570* 3658* 3724* RECIPIENTS_FIELDNAME 000740 constant varying char(32) initial dcl 176 set ref 1980* 2328 REDISTRIBUTED_PREFIX 000124 constant varying char(32) initial dcl 2-6 ref 618 623 1847 2168 2285 RELAY_FIELDNAME 000212 constant varying char(32) initial dcl 2-6 ref 2204 REPLY_REFERENCES_FIELDNAME 000201 constant varying char(32) initial dcl 2-6 set ref 1994* REPLY_TO_FIELDNAME 000170 constant varying char(32) initial dcl 2-6 set ref 1937* RESENT_PREFIX 000751 constant varying char(32) initial dcl 176 ref 1844 2283 RFC822_DAY_OF_WEEKS 000476 constant char(3) initial array unaligned dcl 216 set ref 2918* RFC822_MONTHS 000540 constant char(3) initial array unaligned dcl 210 set ref 2927* RFC822_ZONES 000433 constant char(4) initial array unaligned dcl 219 ref 2901 2901 2902 RFC822_ZONE_OFFSETS 000370 constant fixed bin(17,0) initial array dcl 224 ref 2902 RIGHT_ANGLE_BRACKET 000050 constant char(1) initial unaligned dcl 12-70 set ref 2453 2727* 2792* 3012* RIGHT_BRACE 000047 constant char(1) initial unaligned dcl 12-70 set ref 3675* RIGHT_BRACE_QUOTE 000036 constant char(2) initial unaligned dcl 12-95 set ref 3673* SEMICOLON 000054 constant char(1) initial unaligned dcl 12-70 set ref 2235* 2789* SENDER_FIELDNAME 000157 constant varying char(32) initial dcl 2-6 ref 1882 SINGLE_WIDTH_CHARACTERS 000652 constant char(95) initial unaligned dcl 196 ref 3330 3871 SP 001050 constant char(1) initial unaligned dcl 12-70 set ref 2236* 2259* 2261* 2925* 2930* 2935* 2943* 3128 3133 3152 3154 3212 3390 3539 3567* 3622* 3654* 3721* SPACES 034575 constant char(32) initial unaligned dcl 194 set ref 3765 3766* 3767 3770 3770 SPSP 000031 constant char(2) initial unaligned dcl 12-95 set ref 3235* 3379 3383 3392 3528 3532 3541 SP_AT_SP 000030 constant char(4) initial unaligned dcl 12-115 set ref 2542 2604 2732* 2782* 3006* SP_LEFT_ANGLE_BRACKET 000035 constant char(2) initial unaligned dcl 12-95 set ref 2453 2626* SP_OPEN_PAREN 000034 constant char(2) initial unaligned dcl 12-95 set ref 2458 2494 3696* SP_VIA_SP 000026 constant char(5) initial unaligned dcl 12-117 set ref 2179 2189 2192* 2554 2739* STACK_EXTENSION 000703 constant fixed bin(18,0) initial dcl 190 set ref 2822* 2823 2829* 2830 2985* 2986 2992* 2993 3078* 3079 3083* 3084 STANDARD_MULTILINE_INDENTATION constant fixed bin(17,0) initial dcl 187 ref 3214 STRUCTURED_REQUOTE 000075 constant char(10) initial unaligned dcl 12-55 ref 3435 3626 STRUCTURED_RFC822_REQUOTE 000072 constant char(11) initial unaligned dcl 12-58 ref 3433 3624 SUBJECT_FIELDNAME 000146 constant varying char(32) initial dcl 2-6 set ref 1933* TOP_LEVEL_REQUOTE 000066 constant char(15) initial unaligned dcl 12-61 ref 3383 3392 3532 3541 TOP_LEVEL_RFC822_REQUOTE 000061 constant char(18) initial unaligned dcl 12-64 ref 3379 3390 3528 3539 TO_FIELDNAME 000135 constant varying char(32) initial dcl 2-6 set ref 1942* 2306 UPPERCASE 000640 constant char(26) initial unaligned dcl 203 ref 2891 2893 2909 VT constant char(1) initial unaligned dcl 12-70 ref 3887 WHITESPACE 000106 constant char(5) initial unaligned dcl 12-9 ref 3194 3199 3231 abs builtin function dcl 274 ref 2950 3954 access_class 32 based bit(72) level 3 dcl 3-15 set ref 2000* 2000* acknowledge_to 12 based pointer level 2 dcl 1833 set ref 1890 1890* addcharno builtin function dcl 274 ref 3559 3559 3640 3640 3713 3713 addr builtin function dcl 274 ref 298 362 362 454 454 522 522 606 615 646 720 720 758 796 796 827 895 963 1027 1090 1175 1266 1356 1442 1528 1619 1714 1754 1754 1798 1811 2014 2075 2096 2135 2135 2202 2287 2287 2816 2907 2908 2909 2909 2978 3029 3029 3073 3284 3284 3330 3332 3559 3559 3559 3559 3640 3640 3640 3640 3713 3713 3713 3713 3770 3770 3805 3813 3813 address_comment based varying char dcl 2419 set ref 2458 2458* 2794 2794* address_comment_max_lth 000110 automatic fixed bin(21,0) dcl 2421 set ref 2442* 2458 2794 address_comment_ptr 000104 automatic pointer dcl 2420 set ref 2442* 2458 2458 2794 2794 address_component 000766 automatic char(32) unaligned dcl 2431 set ref 2578* 2580* 2759* 2761* address_dirname 000704 automatic char(168) unaligned dcl 2430 set ref 2490* 2499* 2507* 2509* 2516* 2518 2520* 2578* 2580* 2658* 2659* 2674* 2675* 2683* 2684 2686* 2759* 2761* address_ename 000756 automatic char(32) unaligned dcl 2431 set ref 2490* 2493 2499* 2507* 2509* 2516* 2518 2520* 2578* 2580* 2658* 2659* 2663 2674* 2675* 2683* 2684 2686* 2759* 2761* address_list based structure level 1 dcl 5-6 address_list_ptr 2 based pointer level 2 in structure "message_address_list_user_field" dcl 3-190 in procedure "mlsys_format_" set ref 2024 2024 2024* address_list_ptr 000312 automatic pointer dcl 5-14 in procedure "mlsys_format_" set ref 1965* 1966 1967 1968 1969 1972* 2314* 2315 2316 2317 2318 2321 2772* 2773* address_name based varying char dcl 2418 set ref 2453 2453* 2567 2621 2623* 2708 2727 2789 address_name_max_lth 000107 automatic fixed bin(21,0) dcl 2421 set ref 2439* 2453 2623 address_name_ptr 000102 automatic pointer dcl 2420 set ref 2439* 2453 2453 2567 2621 2623 2708 2727 2789 address_pathname 000417 automatic char(204) unaligned dcl 2428 set ref 2499* 2500 2509* 2510 2580* 2581 2659* 2667 2675* 2677 2761* 2763 address_pathname_varying 000502 automatic varying char(256) dcl 2429 set ref 2493* 2494* 2500* 2501* 2510* 2511* 2518* 2520* 2521 2521* 2521 2521 2525 2525* 2525 2525 2528* 2581* 2582* 2663* 2664* 2667* 2668* 2677* 2678* 2684* 2686* 2688 2688* 2688 2688 2692 2692* 2692 2692 2695* 2763* 2764* address_representation_lth 000776 automatic fixed bin(21,0) dcl 2433 set ref 2451* 2453* 2453 2458* 2458 2468* 2468 2476* 2476 2482* 2482 2484* 2484 2492* 2492 2494* 2494 2501* 2501 2511* 2511 2528* 2528 2539* 2539 2540* 2540 2542* 2542 2543* 2543 2545* 2545 2547* 2547 2552* 2552 2554* 2554 2555* 2555 2559* 2559 2564* 2564 2567* 2567 2575* 2575 2582* 2582 2594* 2594 2597* 2597 2602* 2602 2604* 2604 2614 address_route based structure level 1 dcl 6-6 address_route_ptr 000314 automatic pointer dcl 6-16 set ref 1791* 1803 1806 1814 2173* 2178 2179 2189 2193 2196 2537* 2538* 2543 2550 2551 2555 2559 2564 2703* 2704* 2707 2709 2712 2715 2717 2723 2727 2733 2737 2737 2740 2743 2745 address_string based varying char dcl 2417 set ref 2468* 2476* 2482 2482* 2491 2492* 2539* 2575* 2635* 2642* 2649 2649* 2661 2662* 2721* 2731* 2754* address_string_max_lth 000106 automatic fixed bin(21,0) dcl 2421 set ref 2465* 2468 2473* 2476 2479* 2482 2487* 2492 2533* 2539 2572* 2575 2631* 2635 2638* 2642 2645* 2649 2656* 2662 2700* 2721 2731 2750* 2754 address_string_ptr 000100 automatic pointer dcl 2420 set ref 2465* 2468 2473* 2476 2479* 2482 2482 2487* 2491 2492 2533* 2539 2572* 2575 2631* 2635 2638* 2642 2645* 2649 2649 2656* 2661 2662 2700* 2721 2731 2750* 2754 address_system 000603 automatic varying char(256) dcl 2429 set ref 2536* 2543* 2545* 2547* 2702* 2723* 2725* 2726* 2733* 2735* 2736* address_type 000777 automatic fixed bin(17,0) dcl 2434 set ref 2437* 2463 2591 2591 2607 2624 2629 2777 2777 2789 addresses 10 based pointer array level 2 dcl 5-6 set ref 1852 1855* 1921* 1921* 1969* 1972* 2318* 2321* 2852* 2855* 3066* addwordno builtin function dcl 274 ref 539 656 after builtin function dcl 274 ref 2493 2500 2510 2581 2663 2667 2677 2763 aim_check_$equal 000040 constant entry external dcl 244 ref 2000 2374 author_string 000113 automatic varying char(256) dcl 3052 set ref 3066* 3068* bcc 46 based pointer level 3 dcl 3-15 set ref 1954 1954 1954* 1959* 1965 binary builtin function dcl 274 ref 3336 3336 bit builtin function dcl 274 ref 3336 3336 bit_string_lth 4 based fixed bin(24,0) level 2 dcl 3-301 ref 3301 3314 3322 3325 bit_string_ptr 2 based pointer level 2 dcl 3-301 ref 3322 3325 body 62 based structure level 2 dcl 3-15 body_sections 64 based structure array level 3 dcl 3-15 set ref 2135 2135 buffer based char unaligned dcl 118 ref 3212 3212 3829 3829 3832 3832 buffer_in_use defined char unaligned dcl 3211 ref 3212 buffer_overflow 000114 automatic entry variable level 2 dcl 135 set ref 290* 306* 433* 496* 582* 713* 750* 766* 819* 835* 887* 903* 955* 971* 1019* 1035* 1082* 1098* 1167* 1183* 1258* 1274* 1348* 1364* 1434* 1450* 1520* 1536* 1611* 1627* 1706* 1722* 1785* 3845 buffer_ptr 000100 automatic pointer dcl 119 set ref 283* 298* 426* 487* 573* 706* 743* 758* 812* 827* 880* 895* 948* 963* 1012* 1027* 1075* 1090* 1160* 1175* 1251* 1266* 1341* 1356* 1427* 1442* 1513* 1528* 1604* 1619* 1699* 1714* 1798* 1811* 3212 3829 3832 3935* buffer_size 000102 automatic fixed bin(21,0) dcl 120 set ref 284* 299* 427* 489* 575* 707* 744* 759* 813* 828* 881* 896* 949* 964* 1013* 1028* 1076* 1091* 1161* 1176* 1252* 1267* 1342* 1357* 1428* 1443* 1514* 1529* 1605* 1620* 1700* 1715* 1799* 1812* 3212 3826 3829 3832 buffer_used 000103 automatic fixed bin(21,0) dcl 120 set ref 285* 300* 379 428* 466 490* 532 576* 640 649 708* 732 745* 760* 801 814* 829* 869 882* 897* 937 950* 965* 1000 1014* 1029* 1064 1077* 1092* 1121 1162* 1177* 1212 1253* 1268* 1302 1343* 1358* 1387 1429* 1444* 1473 1515* 1530* 1565 1606* 1621* 1650 1679 1684 1701* 1716* 1758 1800* 1808 1813* 1815 2127 2138 3211 3212* 3826 3829 3832 3839* 3839 3935* 3941* build_mf_extension 21 000114 automatic bit(1) level 3 dcl 135 set ref 508* 594* 1677 1684 2125 2138 canonicalize 000661 automatic bit(1) dcl 2158 set ref 2207* 2210 2213 cc 44 based pointer level 3 dcl 3-15 set ref 1947 1947 1947* 1952* 1965 clock builtin function dcl 274 ref 1915 1915 code 001010 automatic fixed bin(35,0) dcl 2814 in procedure "get_address_variable" set ref 2819* 2821 2825* 2828 2831* code 000306 automatic fixed bin(35,0) dcl 2975 in procedure "format_message_id" set ref 2982* 2984 2988* 2991 2994* code 000315 automatic fixed bin(35,0) dcl 3054 in procedure "format_reference" set ref 3075* 3077 3080* 3082 3085* code 000112 automatic fixed bin(35,0) dcl 127 in procedure "mlsys_format_" set ref 1186* 1188 1189 2015* 2016 3278* 3280 3281 3935* 3936 3937 code 000102 automatic fixed bin(35,0) dcl 2874 in procedure "format_date_time" set ref 2881* 2883 comma_lth 001021 automatic fixed bin(17,0) dcl 2367 set ref 2389* 2391* 2393 2399 comment 24 based structure level 3 dcl 3-122 communications_media 204 based char(32) level 2 packed unaligned dcl 2154 ref 2219 2219 2219 communications_protocol 214 based char(32) level 2 packed unaligned dcl 2154 ref 2217 2217 2217 convert builtin function dcl 274 ref 1986 1986 2038 2038 2335 2335 2924 2924 2932 2932 2934 2934 2937 2937 2940 2940 2953 2953 2954 2954 convert_authorization_$to_string_short 000042 constant entry external dcl 245 ref 2369 count_lines 14 000114 automatic bit(1) level 3 dcl 135 set ref 503* 589* 1751* 3834 cu_$grow_stack_frame 000044 constant entry external dcl 246 ref 514 599 2822 2829 2985 2992 3078 3083 currentsize builtin function dcl 274 ref 490 537 537 539 551 551 576 654 654 656 668 668 date_time 2 based fixed bin(71,0) level 2 dcl 3-195 set ref 2031* date_time_created 34 based fixed bin(71,0) level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 362* 454* 522* 720* 796* 1915 1915* 1918* date_time_created 16 based fixed bin(71,0) level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 2106* 2287* 2291 2293* date_time_created 2 based fixed bin(71,0) level 2 in structure "message_reference" dcl 3-234 in procedure "mlsys_format_" set ref 3061 3064* date_time_delivered 22 based fixed bin(71,0) level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 629* 629* date_time_delivered 6 based fixed bin(71,0) level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 619* 619* date_time_delivered 6 based fixed bin(71,0) level 2 in structure "p_envelope" dcl 1833 in procedure "format_envelope" set ref 1868 1868* 1868* date_time_mailed based fixed bin(71,0) level 2 in structure "p_envelope" dcl 1833 in procedure "format_envelope" set ref 1841 1868* 1878* 1878* date_time_mailed based fixed bin(71,0) level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 619* date_time_mailed 14 based fixed bin(71,0) level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 629* date_time_relayed based fixed bin(71,0) level 2 dcl 2154 set ref 2237* day_of_month 000104 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2884* 2924 2924 day_of_week 000110 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2885* 2918 2920 decode_clock_value_$date_time 000046 constant entry external dcl 247 ref 2881 delivered_by 10 based pointer level 2 in structure "p_envelope" dcl 1833 in procedure "format_envelope" ref 1860 delivered_by 24 based pointer level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 632 632* delivered_by 10 based pointer level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 624 624* delivered_by 000430 automatic pointer dcl 1835 in procedure "format_envelope" set ref 1860* 1861 1862* 1865* 1874* delivered_by_is_different 000467 automatic bit(1) dcl 1838 set ref 1863* 1865* 1874 delta 26 based fixed bin(71,0) array level 3 dcl 11-88 ref 2909 display_list 000416 automatic bit(1) dcl 2426 set ref 2587* 2607 2767* 2769 divide builtin function dcl 274 ref 2900 2950 2951 3301 3303 dont_canonicalize_system_names 11 000114 automatic bit(1) level 3 dcl 135 set ref 693* 2179 2193 2207 2545 2555 2594 2712 2725 2735 2740 2783 3007 dont_show_logsave 12 000114 automatic bit(1) level 3 dcl 135 set ref 502* 588* 718* 2482 2491 2649 2661 e 2 based structure array level 2 unaligned dcl 11-88 envelope based structure level 2 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 2287 2287 envelope 14 based structure level 2 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 362 362 454 454 522 522 720 720 796 796 envelope_formatting_mode 3 based fixed bin(17,0) level 2 dcl 1-6 set ref 323 323 323 334 357 362 362* 408 408 418 446 454 454* error_table_$bad_subr_arg 000016 external static fixed bin(35,0) dcl 238 ref 330 351 404 414 777 790 846 859 914 927 990 1054 1111 1202 1292 1377 1463 1555 1640 1746 error_table_$inconsistent 000020 external static fixed bin(35,0) dcl 238 ref 338 422 error_table_$smallarg 000022 external static fixed bin(35,0) dcl 238 ref 2821 2828 2984 2991 3077 3082 3906 error_table_$unimplemented_version 000024 external static fixed bin(35,0) dcl 238 ref 319 399 1542 1728 field_id based bit(36) level 3 dcl 3-163 set ref 2015* field_type 1 based fixed bin(17,0) level 3 dcl 3-163 ref 2017 2023 2030 fieldname_prefix 000455 automatic varying char(32) dcl 1837 in procedure "format_envelope" set ref 1844* 1847* 1848* 1867 1873 1877 1882 1889 fieldname_prefix 000713 automatic varying char(32) dcl 2278 in procedure "format_redistribution" set ref 2283* 2285* 2292 2299 2306 2328 2344 2351 fieldname_prefix 000650 automatic varying char(32) dcl 2157 in procedure "format_trace" set ref 2168* 2170* 2175 2204 first_idx 000614 automatic fixed bin(17,0) dcl 2056 set ref 2061* 2066* 2074 first_line 001064 automatic bit(1) dcl 3190 set ref 3206* 3216* 3235 3240* flags 6 000114 automatic structure level 2 in structure "ifo" dcl 135 in procedure "mlsys_format_" set ref 342* 435* 499* 585* 678* 689* 781* 850* 918* 981* 1045* 1101* 1193* 1283* 1367* 1453* 1546* 1630* 1737* 1788* flags 5 based structure level 3 in structure "message_text_user_field" dcl 3-183 in procedure "mlsys_format_" format_message_options based structure level 1 dcl 1-6 format_message_options_ptr 000270 automatic pointer dcl 1-17 set ref 311* 318 323 323 323 323 323 323 323 334 334 334 334 344 349 357 357 357 362 362 366 366 369 369 372 397* 398 403 408 408 408 408 408 408 418 418 418 418 446 446 446 451 451 454 454 458 458 461 forum_format 7 000114 automatic bit(1) level 3 dcl 135 set ref 437* 501* 587* 680* 691* 720 1915 1921 1933 2287 four_digits_picture automatic picture(4) unaligned dcl 2870 ref 2934 2934 from 20 based pointer level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 2108* 2287* 2297 2297 2300* from 36 based pointer level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 362* 454* 522* 720* 796* 1921 1921 1921 1921 1921 1930* 1931* from 4 based pointer level 2 in structure "message_reference" dcl 3-234 in procedure "mlsys_format_" ref 3061 3066 full_fieldname 000244 automatic varying char(64) dcl 169 in procedure "mlsys_format_" set ref 618* 619* 623* 624* full_fieldname 000672 automatic varying char(64) dcl 2277 in procedure "format_redistribution" set ref 2292* 2293* 2299* 2300* 2306* 2307* 2328* 2329* 2344* 2345* 2351* 2352* full_fieldname 000434 automatic varying char(64) dcl 1836 in procedure "format_envelope" set ref 1867* 1868* 1873* 1874* 1877* 1878* 1882* 1883* 1889* 1890* get_authorization_ 000050 constant entry external dcl 250 ref 2000 2000 get_line_length_$switch 000052 constant entry external dcl 251 ref 346 785 854 922 985 1049 1106 1197 1287 1372 1458 1550 1635 1741 have_address_data 000415 automatic bit(1) dcl 2426 set ref 2445* 2449* 2631 2638 2645 2654 2672 2681 2698 2750 2757 2767 hbound builtin function dcl 274 ref 2901 header 14 based structure level 2 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" header 30 based structure level 2 in structure "message" dcl 3-15 in procedure "mlsys_format_" header 64 based structure array level 4 in structure "message" dcl 3-15 in procedure "mlsys_format_" header based structure level 2 in structure "message_user_field" dcl 3-163 in procedure "mlsys_format_" header based structure level 2 in structure "mail_format" dcl 9-24 in procedure "mlsys_format_" header based structure level 2 in structure "message_body_section" dcl 3-274 in procedure "mlsys_format_" header 4 based structure level 3 in structure "message_body_section_parameter" dcl 3-313 in procedure "mlsys_format_" header based structure level 2 in structure "address_route" dcl 6-6 in procedure "mlsys_format_" header 4 based structure level 3 in structure "message_user_field_parameter" dcl 3-208 in procedure "mlsys_format_" header 10 based structure array level 3 in structure "message_user_fields_list" dcl 3-150 in procedure "mlsys_format_" header_formatting_mode 4 based fixed bin(17,0) level 2 dcl 1-6 set ref 323 323 334 357 366 366* 408 408 418 446 458 458* host_name_buffer 000100 automatic char unaligned dcl 1795 set ref 1811 1812 1815 hour 000106 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2887* 2937 2937 hours 000112 automatic fixed bin(17,0) dcl 2875 set ref 2951* 2953 2953 idx 000617 automatic fixed bin(17,0) dcl 2056 in procedure "format_redistributions_list_internal" set ref 2074* 2075* idx 001023 automatic fixed bin(17,0) dcl 2367 in procedure "format_access_class" set ref 2383* 2384 2384* 2388 2401 idx 000266 automatic fixed bin(17,0) dcl 173 in procedure "mlsys_format_" set ref 544* 545 545* 639* 640 640* 661* 662 662* 1803* 1806* 2551* 2555 2564* 2709* 2710 2712 2717* 2737* 2740 2745* idx 000103 automatic fixed bin(21,0) dcl 3373 in procedure "simple_lengths" set ref 3403* 3405* 3406 3406* 3407 3408 idx 001061 automatic fixed bin(21,0) dcl 3694 in procedure "format_comment_string" set ref 3709* 3711* 3712 3712* 3713 3713 3714 idx 001023 automatic fixed bin(21,0) dcl 3430 in procedure "structured_length" set ref 3446* 3448* 3449 3449* 3450 3451 idx 000103 automatic fixed bin(21,0) dcl 3522 in procedure "format_simple_strings" set ref 3555* 3557* 3558 3558* 3559 3559 3560 idx 000100 automatic fixed bin(17,0) dcl 3024 in procedure "format_references_list" set ref 3028* 3029 3029 3030* idx 001153 automatic fixed bin(17,0) dcl 3267 in procedure "format_body_section_internal" set ref 3310* 3311 3322 3325 3335 3335* idx 000100 automatic fixed bin(17,0) dcl 2847 in procedure "format_address_list" set ref 2851* 2852* idx 001047 automatic fixed bin(21,0) dcl 3612 in procedure "format_structured_string" set ref 3636* 3638* 3639 3639* 3640 3640 3641 idx 000636 automatic fixed bin(17,0) dcl 2123 in procedure "format_body" set ref 2130* 2132 2135 2135* idx 001047 automatic fixed bin(21,0) dcl 3125 in procedure "format_single_line_text" set ref 3146* 3152* 3153 3154* 3155 3155* 3161 3165 idx 000726 automatic fixed bin(17,0) dcl 2281 in procedure "format_redistribution" set ref 2317* 2318 2321* idx 000115 automatic fixed bin(17,0) dcl 2875 in procedure "format_date_time" set ref 2901* 2902 2902* 2907* 2909 2909* idx 001035 automatic fixed bin(21,0) dcl 3474 in procedure "comment_length" set ref 3489* 3491* 3492 3492* 3493 3494 idx 000601 automatic fixed bin(17,0) dcl 1912 in procedure "format_header" set ref 1968* 1969 1972* 2013* 2014* idx 001067 automatic fixed bin(21,0) dcl 3191 in procedure "format_multiline_text" set ref 3224* 3225 3225* 3229 3241 idx 000103 automatic fixed bin(21,0) dcl 3966 in procedure "count_lines_in_text" set ref 3978* 3979 3979* 3982 idx 000122 automatic fixed bin(21,0) dcl 3861 in procedure "update_last_column" set ref 3871* 3872 3872* 3874 3875 idx 000662 automatic fixed bin(17,0) dcl 2159 in procedure "format_trace" set ref 2178* 2179 2179 2189 2193 2193 2196* 2201* 2202* idx_increment 000616 automatic fixed bin(17,0) dcl 2056 set ref 2063* 2068* 2074 ifo 000114 automatic structure level 1 dcl 135 implicit_route 6 based pointer level 2 dcl 3-87 ref 2172 2173 in_duplicate 001145 automatic bit(1) dcl 3266 set ref 3306* 3344* 3348 3352* include_body 6 based bit(1) level 2 dcl 1-6 ref 334 372 418 461 include_forum_suffix 22 000114 automatic bit(1) level 3 dcl 135 set ref 442* 509* 595* 696* 2521 2688 include_local_system_name 10 000114 automatic bit(1) level 3 dcl 135 set ref 692* 2591 2777 3003 include_message_id 15 000114 automatic bit(1) level 3 dcl 135 set ref 438* 504* 590* 681* 694* 2005 2349 include_trace 16 000114 automatic bit(1) level 3 dcl 135 set ref 439* 505* 591* 681* 695* 1886 indentation 5 000114 automatic fixed bin(17,0) level 2 dcl 135 set ref 1145* 1236* 1326* 1412* 1497* 1589* 1675* 1787* 2105* 2177* 2179 2206* 2222 2229 2253 2393 2607 2614 2770 2771* 2774* 3059* 3059 3092* 3092 3204 3205* 3205 3214* 3764 index builtin function dcl 274 ref 2383 2521 2525 2688 2692 3152 3154 3224 3330 3379 3379 3383 3390 3392 3528 3528 3532 3539 3541 3978 ioa_$rsnnl 000054 constant entry external dcl 252 ref 3336 3338 3339 iox_$put_chars 000056 constant entry external dcl 253 ref 3278 3284 3935 iox_$user_output 000014 external static pointer dcl 235 ref 304 764 833 901 969 1033 1096 1181 1272 1362 1448 1534 1625 1720 is_local_system 000305 automatic bit(1) dcl 2974 set ref 2982* 2988* 2994* 3003 jdx 000267 automatic fixed bin(17,0) dcl 173 in procedure "mlsys_format_" set ref 2908* 2909 2909* jdx 001154 automatic fixed bin(17,0) dcl 3267 in procedure "format_body_section_internal" set ref 3321* 3322 3322* 3328* 3330 3330 3332 3332* kdx 001155 automatic fixed bin(17,0) dcl 3267 set ref 3329* 3330 3330 3332 3332* last_column_used 000142 automatic fixed bin(17,0) dcl 164 set ref 1138* 1145 1229* 1236 1319* 1326 1405* 1412 1490* 1497 1582* 1589 1668* 1675 2100* 2105 2174* 2177 2179 2179 2189 2203* 2206 2222 2222 2229 2229 2253 2253 2393 2393 2607 2614 2614 2771 3144 3288* 3874* 3874 3883* 3883 3883 3885* 3885 3887* last_idx 000615 automatic fixed bin(17,0) dcl 2056 set ref 2062* 2067* 2074 last_line_printed 001135 automatic bit(36) array dcl 3264 set ref 3305* 3343* 3346 lbound builtin function dcl 274 ref 2901 length builtin function dcl 274 ref 299 759 828 896 964 1028 1091 1140 1176 1231 1267 1321 1357 1407 1443 1492 1529 1584 1620 1670 1715 1799 1812 2179 2189 2222 2229 2253 2377 2384 2389 2391 2393 2451 2453 2453 2453 2458 2458 2458 2468 2484 2494 2494 2501 2511 2521 2521 2525 2525 2528 2540 2542 2552 2552 2554 2567 2567 2582 2602 2604 2621 2688 2688 2692 2692 2708 2727 2789 2794 2796 3132 3133 3146 3146 3152 3153 3155 3167 3198 3199 3205 3212 3214 3220 3222 3225 3395 3398 3402 3406 3409 3437 3440 3441 3445 3449 3452 3457 3483 3484 3488 3492 3495 3554 3558 3561 3621 3635 3639 3642 3708 3712 3715 3765 3767 3806 3814 3829 3829 3832 3836 3839 3840 3866 3869 3872 3878 3968 3979 line_count 000143 automatic fixed bin(17,0) dcl 165 set ref 491* 531 577* 648 1752* 1760 3287* 3835* 3835 3836* 3836 line_length 2 based fixed bin(17,0) level 2 in structure "format_message_options" dcl 1-6 in procedure "mlsys_format_" ref 344 349 403 line_length 4 000114 automatic fixed bin(17,0) level 2 in structure "ifo" dcl 135 in procedure "mlsys_format_" set ref 344* 346 346* 350 350 355 444* 497* 583* 715* 783* 785 785* 789 789 794 852* 854 854* 858 858 863 920* 922 922* 926 926 931 983* 985 985* 989 989 994 1047* 1049 1049* 1053 1053 1058 1104* 1106 1106* 1110 1110 1115 1195* 1197 1197* 1201 1201 1206 1285* 1287 1287* 1291 1291 1296 1370* 1372 1372* 1376 1376 1381 1456* 1458 1458* 1462 1462 1467 1548* 1550 1550* 1554 1554 1559 1633* 1635 1635* 1639 1639 1644 1739* 1741 1741* 1745 1745 1750 1786* 2179 2189 2222 2229 2253 2393 2614 3144 lines 11 based fixed bin(17,0) level 3 dcl 9-24 set ref 531* 648* local_address_comment 000313 automatic varying char(256) dcl 2423 set ref 2442* local_address_name 000212 automatic varying char(256) dcl 2423 set ref 2439* local_address_string 000111 automatic varying char(256) dcl 2423 set ref 2465* 2473* 2479* 2487* 2533* 2572* 2631* 2638* 2645* 2656* 2700* 2750* local_buffer 000144 automatic char(256) unaligned dcl 167 set ref 298 299 758 759 827 828 895 896 963 964 1027 1028 1090 1091 1175 1176 1266 1267 1356 1357 1442 1443 1528 1529 1619 1620 1714 1715 local_message_id_string 000103 automatic varying char(256) dcl 2972 in procedure "format_message_id" set ref 2978 2979 local_message_id_string 000214 automatic varying char(256) dcl 3053 in procedure "format_reference" set ref 3073 3074 lth 2 based fixed bin(21,0) array level 3 dcl 10-11 set ref 1684* 2138* ltrim builtin function dcl 274 ref 1986 1986 2038 2038 2335 2335 2924 2924 mail_format based structure level 1 dcl 9-24 set ref 537 539 551 654 656 668 mail_format_header based structure level 1 dcl 157 ref 490 576 mail_format_header_lth 000137 automatic fixed bin(21,0) dcl 158 set ref 490* 532 545 576* 649 662 mail_format_ptr 000316 automatic pointer dcl 9-17 set ref 487* 490 531 532 537 539 539 551 573* 576 648 649 654 656 656 668 mail_protocol 224 based char(32) level 2 packed unaligned dcl 2154 ref 2216 2216 2216 mail_system_$compare_addresses 000060 constant entry external dcl 254 ref 1855 1865 1921 1921 1969 1972 2318 2321 mail_system_$decode_message_id 000062 constant entry external dcl 255 ref 2982 2988 2994 3075 3080 3085 mail_system_$expand_list_address 000064 constant entry external dcl 257 ref 2772 mail_system_$get_address_comment 000066 constant entry external dcl 258 ref 2442 2442 mail_system_$get_address_name 000070 constant entry external dcl 259 ref 2439 2439 mail_system_$get_address_pathname 000072 constant entry external dcl 260 ref 2490 2507 2516 2578 2658 2674 2683 2759 mail_system_$get_address_route 000074 constant entry external dcl 261 ref 2538 2704 mail_system_$get_address_string 000076 constant entry external dcl 262 ref 2465 2465 2473 2473 2479 2479 2487 2487 2533 2533 2572 2572 2631 2631 2638 2638 2645 2645 2656 2656 2700 2700 2750 2750 mail_system_$get_address_system 000100 constant entry external dcl 263 ref 2536 2702 mail_system_$get_address_type 000102 constant entry external dcl 264 ref 1186 2437 mail_system_$get_named_group_display_flag 000104 constant entry external dcl 265 ref 2587 2767 mail_system_$get_user_field_name 000106 constant entry external dcl 266 ref 2015 max builtin function dcl 274 ref 3205 3885 maxlength builtin function dcl 274 ref 1794 1795 2817 2979 3074 3559 3559 3640 3640 3713 3713 3813 message based structure level 1 dcl 3-15 message_address_list_user_field based structure level 1 dcl 3-190 message_bit_string_body_section based structure level 1 dcl 3-301 message_bit_string_body_section_bit_string based bit unaligned dcl 3-307 ref 3322 3325 message_body_section based structure level 1 dcl 3-274 message_body_section_parameter based structure level 1 dcl 3-313 message_body_section_parameter_ptr 000310 automatic pointer dcl 3-320 set ref 1725* 1727 1731 1731 1754 1754 1760 message_body_section_ptr 000306 automatic pointer dcl 3-280 set ref 3270* 3272 3278 3278 3284 3284 3284 3287 3287 3287 3292 3292 3292 3293 3293 3293 3301 3314 3322 3322 3325 3325 message_date_user_field based structure level 1 dcl 3-195 message_envelope based structure level 1 dcl 3-61 message_id based bit(72) level 2 in structure "message_reference" dcl 3-234 in procedure "mlsys_format_" set ref 3075* 3080* 3085* message_id 30 based bit(72) level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 2005 2005* message_id 14 based bit(72) level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 2349 2352* message_id_string based varying char dcl 3048 in procedure "format_reference" set ref 3075* 3080* 3085* 3089* message_id_string based varying char dcl 2968 in procedure "format_message_id" set ref 2982* 2988* 2994* 3001* message_id_string_max_lth 000112 automatic fixed bin(21,0) dcl 3050 in procedure "format_reference" set ref 3074* 3075 3079* 3080 3084* 3084 3085 3089 message_id_string_max_lth 000102 automatic fixed bin(21,0) dcl 2970 in procedure "format_message_id" set ref 2979* 2982 2986* 2988 2993* 2993 2994 3001 message_id_string_ptr 000100 automatic pointer dcl 2969 in procedure "format_message_id" set ref 2978* 2982 2985* 2988 2994 3001 message_id_string_ptr 000110 automatic pointer dcl 3049 in procedure "format_reference" set ref 3073* 3075 3078* 3080 3085 3089 message_id_system 000204 automatic varying char(256) dcl 2973 set ref 2982* 2988* 2994* 3007* 3009* message_integer_user_field based structure level 1 dcl 3-200 message_preformatted_body_section based structure level 1 dcl 3-292 message_preformatted_body_section_text based char unaligned dcl 3-298 set ref 3284 3287* 3292* 3293 message_ptr 000272 automatic pointer dcl 3-53 set ref 309* 313 362 362 362 362 391* 392 454 454 454 454 481* 482 511 511 522 522 522 522 565* 566 606 606 614 615 615 629 629 629 632 632 699* 701 720 720 720 720 769* 771 796 796 796 796 838* 840 906* 908 974* 976 1915 1915 1918 1921 1921 1921 1921 1921 1930 1931 1933 1933 1933 1933 1937 1937 1937 1942 1942 1942 1947 1947 1947 1952 1954 1954 1954 1959 1965 1965 1965 1994 1994 1994 2000 2000 2005 2005 2011 2013 2014 2058 2061 2067 2075 2093 2096 2096 2130 2135 2135 message_redistribution based structure level 1 dcl 3-122 message_redistribution_comment based char unaligned dcl 3-131 set ref 2345* message_redistribution_ptr 000276 automatic pointer dcl 3-134 set ref 606* 615* 619 619 619 624 624 2075* 2076 2096* 2099 2106 2108 2287 2287 2287 2287 2291 2293 2297 2297 2300 2303 2303 2307 2314 2343 2345 2345 2345 2349 2352 message_redistributions_list based structure level 1 dcl 3-109 message_reference based structure level 1 dcl 3-234 message_reference_ptr 000304 automatic pointer dcl 3-243 set ref 3057* 3061 3061 3064 3066 3075 3080 3085 message_references_list based structure level 1 dcl 3-219 message_references_list_ptr 000302 automatic pointer dcl 3-229 set ref 3026* 3028 3029 3029 3030 message_subject based char unaligned dcl 3-51 set ref 1933* message_text_field based structure level 1 dcl 3-260 message_text_user_field based structure level 1 dcl 3-183 message_text_user_field_text based char unaligned dcl 3-187 set ref 2018* message_trace based structure level 1 dcl 3-87 message_trace_ptr 000274 automatic pointer dcl 3-105 set ref 1038* 1040 1060* 2166* 2172 2173 2201 2202 message_user_field based structure level 1 dcl 3-163 message_user_field_ptr 000300 automatic pointer dcl 3-169 set ref 2014* 2015 2017 2018 2018 2018 2018 2018 2018 2023 2024 2024 2024 2030 2031 2038 2038 message_user_fields_list based structure level 1 dcl 3-150 mf_extension based structure level 1 dcl 10-11 set ref 514 514 537 551 599 599 654 668 mf_extension_n_text_fragments 000320 automatic fixed bin(21,0) dcl 10-17 set ref 511* 514 514 597* 599 599 mf_extension_ptr 000322 automatic pointer dcl 10-18 set ref 514 514 514* 515 537 540 541 543* 544 545 545 551 599 599 599* 600 601 640 640 654 657 658 660* 661 662 662 668 1678 1678 1679 1679 1684 1684 1684 1684 2126 2126 2127 2127 2138 2138 2138 2138 min builtin function dcl 274 ref 3829 minute 000107 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2887* 2940 2940 minutes 000113 automatic fixed bin(17,0) dcl 2875 set ref 2952* 2954 2954 mlsys_data_$user_default_mailbox_address 000124 external static pointer dcl 7-12 set ref 1921* 1969* 2318* mlsys_data_$user_id 000130 external static varying char(32) dcl 8-72 ref 2482 2491 2649 2661 mlsys_data_$user_mail_table_address 000126 external static pointer dcl 7-14 set ref 1921* 1972* 2321* mlsys_et_$foreign_address_too_long 000026 external static fixed bin(35,0) dcl 238 ref 3922 mlsys_et_$not_address_list 000030 external static fixed bin(35,0) dcl 238 ref 1279 mlsys_et_$not_message 000032 external static fixed bin(35,0) dcl 238 ref 314 393 483 567 702 772 841 909 977 mlsys_et_$not_message_trace 000034 external static fixed bin(35,0) dcl 238 ref 1041 mlsys_et_$unknown_body_section_type 000036 external static fixed bin(35,0) dcl 238 ref 1733 mlsys_misc_utils_$get_best_address_name 000110 constant entry external dcl 267 ref 3066 mlsys_nit_interface_$canonicalize_system_name 000112 constant entry external dcl 268 ref 2179 2193 2210 2213 2547 2559 2597 2715 2726 2736 2743 2785 3009 mlsys_nit_interface_$get_local_system_name 000114 constant entry external dcl 269 ref 2594 2597 2783 2785 mlsys_nit_interface_$is_local_system 000116 constant entry external dcl 270 ref 2207 mod builtin function dcl 274 ref 2932 2932 2952 3312 3314 3883 month 000103 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2884* 2927 2929 multiline_text 5 based bit(1) level 4 packed unaligned dcl 3-183 ref 2018 must_requote 000100 automatic bit(1) dcl 3372 in procedure "simple_lengths" set ref 3379* 3383* 3390* 3392* 3395 must_requote 000101 automatic bit(1) dcl 3521 in procedure "format_simple_strings" set ref 3528* 3532* 3539* 3541* 3544 must_requote 001045 automatic bit(1) dcl 3611 in procedure "format_structured_string" set ref 3624* 3626* 3628 must_requote 001020 automatic bit(1) dcl 3429 in procedure "structured_length" set ref 3433* 3435* 3437 must_requote 001032 automatic bit(1) dcl 3473 in procedure "comment_length" set ref 3476* 3478* 3480 must_requote 001057 automatic bit(1) dcl 3693 in procedure "format_comment_string" set ref 3698* 3700* 3702 n_addresses 6 based fixed bin(17,0) level 2 dcl 5-6 ref 1855 1921 1921 1937 1942 1947 1954 1967 1968 2024 2297 2303 2316 2317 2849 2851 2855 n_bits_in_last_word 001151 automatic fixed bin(17,0) dcl 3267 set ref 3314* 3315 3315* 3319* 3325 n_body_sections 11 based fixed bin(17,0) level 2 dcl 3-15 ref 2130 n_lines 001147 automatic fixed bin(17,0) dcl 3267 in procedure "format_body_section_internal" set ref 3303* 3310 3311 3335 n_lines 000101 automatic fixed bin(21,0) dcl 3966 in procedure "count_lines_in_text" set ref 3970* 3981* 3981 3986 n_recipients 000600 automatic fixed bin(17,0) dcl 1912 in procedure "format_header" set ref 1964* 1967* 1967 1979 1979 1984* 1984 1986 1986 1987 n_recipients 000725 automatic fixed bin(17,0) dcl 2281 in procedure "format_redistribution" set ref 2313* 2316* 2316 2327 2327 2333* 2333 2335 2335 2336 n_redistributions 10 based fixed bin(17,0) level 2 in structure "message" dcl 3-15 in procedure "mlsys_format_" ref 511 n_redistributions 7 based fixed bin(17,0) level 2 in structure "message_redistributions_list" dcl 3-109 in procedure "mlsys_format_" ref 606 614 615 2061 2067 2093 2096 n_references 7 based fixed bin(17,0) level 2 dcl 3-219 ref 1994 3028 3030 n_relays 11 based fixed bin(17,0) level 2 in structure "message_trace" dcl 3-87 in procedure "mlsys_format_" ref 2201 n_relays 6 based fixed bin(17,0) level 3 in structure "address_route" dcl 6-6 in procedure "mlsys_format_" ref 1803 2178 2551 2709 2737 n_spaces_to_add 000100 automatic fixed bin(21,0) dcl 3760 set ref 3764* 3765 3767* 3767 3770* n_text_fragments based fixed bin(21,0) level 2 dcl 10-11 set ref 515* 537 540* 540 541 544 551 597 600* 600 601 639 654 657* 657 658 661 668 1678* 1678 1679 1684 1684 2126* 2126 2127 2138 2138 n_user_fields 7 based fixed bin(17,0) level 2 in structure "message_user_fields_list" dcl 3-150 in procedure "mlsys_format_" ref 2013 n_user_fields 7 based fixed bin(17,0) level 2 in structure "message" dcl 3-15 in procedure "mlsys_format_" ref 511 n_words 001146 automatic fixed bin(17,0) dcl 3267 set ref 3301* 3303 3312 n_words_on_line 001150 automatic fixed bin(17,0) dcl 3267 set ref 3312* 3313 3313* 3318* 3321 3325 3325 3328 3338* 3339 3339* need_separator 000265 automatic bit(1) dcl 171 set ref 357* 373 446* 462 new_mf_extension_ptr 000140 automatic pointer dcl 162 set ref 539* 540 541 543 656* 657 658 660 next_piece_of_text defined char unaligned dcl 3829 set ref 3832 3832 3833* 3835* 3836 3836 3839 3840 next_word defined char unaligned dcl 2388 set ref 2389 2393 2398* null builtin function dcl 274 ref 288 304 431 494 580 624 632 711 748 764 817 833 885 901 953 969 1017 1033 1080 1096 1165 1181 1256 1272 1346 1362 1432 1448 1518 1534 1609 1625 1704 1720 1783 1851 1861 1886 1890 1921 1937 1942 1947 1954 1966 1994 2011 2018 2024 2058 2172 2228 2297 2303 2315 2537 2543 2550 2703 2707 2723 2727 2733 2737 2829 2992 3061 3083 number_lang based fixed bin(17,0) level 2 dcl 11-88 ref 2907 number_zone 1 based fixed bin(17,0) level 2 dcl 11-88 ref 2908 2909 2909 2909 2909 offset 000111 automatic fixed bin(17,0) dcl 2875 in procedure "format_date_time" set ref 2950* 2951 2952 offset 001152 automatic fixed bin(17,0) dcl 3267 in procedure "format_body_section_internal" set ref 3308* 3336 3336 3356* 3356 original_mf_extension_ptr 000110 automatic pointer dcl 125 set ref 572* 597 600 601 639 original_mf_ptr 000106 automatic pointer dcl 124 set ref 571* 646 646 646 original_mf_text based char unaligned dcl 160 set ref 646* output_substring defined char unaligned dcl 3161 set ref 3162* output_switch 000104 automatic pointer dcl 122 set ref 288* 303* 304 304* 346* 431* 494* 580* 711* 748* 763* 764 764* 785* 817* 832* 833 833* 854* 885* 900* 901 901* 922* 953* 968* 969 969* 985* 1017* 1032* 1033 1033* 1049* 1080* 1095* 1096 1096* 1106* 1165* 1180* 1181 1181* 1197* 1256* 1271* 1272 1272* 1287* 1346* 1361* 1362 1362* 1372* 1432* 1447* 1448 1448* 1458* 1518* 1533* 1534 1534* 1550* 1609* 1624* 1625 1625* 1635* 1704* 1719* 1720 1720* 1741* 1783* 3278* 3284* 3935* p_access_class parameter bit(72) dcl 2364 in procedure "format_access_class" set ref 2361 2369* 2374* p_access_class parameter bit(72) dcl 1135 in procedure "format_access_class_field_internal" set ref 1131 1147* p_add_trailing_NL parameter bit(1) dcl 1488 in procedure "format_message_id_field_internal" ref 1483 1501 p_add_trailing_NL parameter bit(1) dcl 1403 in procedure "format_date_time_field_internal" ref 1397 1416 p_add_trailing_NL parameter bit(1) dcl 1666 in procedure "format_text_field_internal" ref 1660 1688 p_add_trailing_NL parameter bit(1) dcl 1317 in procedure "format_address_list_field_internal" ref 1312 1330 p_add_trailing_NL parameter bit(1) dcl 1580 in procedure "format_references_list_field_internal" ref 1575 1593 p_add_trailing_NL parameter bit(1) dcl 1227 in procedure "format_address_field_internal" ref 1222 1240 p_add_trailing_NL parameter bit(1) dcl 1136 in procedure "format_access_class_field_internal" ref 1131 1149 p_address_list_ptr parameter pointer dcl 1316 in procedure "format_address_list_field_internal" set ref 1312 1328* p_address_list_ptr parameter pointer dcl 2846 in procedure "format_address_list" ref 2843 2849 2851 2852 2855 2855 p_address_ptr parameter pointer dcl 1226 in procedure "format_address_field_internal" set ref 1222 1238* p_address_ptr parameter pointer dcl 2414 in procedure "format_address" set ref 2411 2437* 2490* 2507* 2516* 2536* 2538* 2578* 2587* 2658* 2674* 2683* 2702* 2704* 2759* 2767* 2772* 2819* 2825* 2831* p_address_suffix parameter varying char dcl 2415 set ref 2411 2451 2796 2796* p_address_type_string parameter char unaligned dcl 3603 set ref 3600 3619* p_body_section_ptr parameter pointer dcl 3259 ref 3256 3270 p_date_time parameter fixed bin(71,0) dcl 2867 in procedure "format_date_time" set ref 2864 2881* p_date_time parameter fixed bin(71,0) dcl 1401 in procedure "format_date_time_field_internal" set ref 1397 1414* p_date_time_1 parameter fixed bin(71,0) dcl 3952 ref 3949 3954 p_date_time_2 parameter fixed bin(71,0) dcl 3952 ref 3949 3954 p_date_time_created parameter fixed bin(71,0) dcl 1829 set ref 1824 1878* p_envelope based structure level 1 dcl 1833 p_envelope_ptr parameter pointer dcl 1827 ref 1824 1841 1850 1860 1868 1868 1868 1868 1878 1878 1886 1886 1890 1890 p_fieldname parameter varying char dcl 1134 in procedure "format_access_class_field_internal" set ref 1131 1140 1141* p_fieldname parameter varying char dcl 1225 in procedure "format_address_field_internal" set ref 1222 1231 1232* p_fieldname parameter varying char dcl 1578 in procedure "format_references_list_field_internal" set ref 1575 1584 1585* p_fieldname parameter varying char dcl 1315 in procedure "format_address_list_field_internal" set ref 1312 1321 1322* p_fieldname parameter varying char dcl 1400 in procedure "format_date_time_field_internal" set ref 1397 1407 1408* p_fieldname parameter varying char dcl 1663 in procedure "format_text_field_internal" set ref 1660 1670 1671* p_fieldname parameter varying char dcl 1486 in procedure "format_message_id_field_internal" set ref 1483 1492 1493* p_fixed_text parameter char unaligned dcl 3783 set ref 3802 3805 3806 p_formatting_mode parameter fixed bin(17,0) dcl 1906 in procedure "format_header" ref 1903 1937 1942 1947 1954 1961 1994 2000 2000 2005 2011 p_formatting_mode parameter fixed bin(17,0) dcl 2055 in procedure "format_redistributions_list_internal" set ref 2052 2076 2076* 2093 p_formatting_mode parameter fixed bin(17,0) dcl 2276 in procedure "format_redistribution" set ref 2273 2287 2287* 2303 2310 2349 p_formatting_mode parameter fixed bin(17,0) dcl 1831 in procedure "format_envelope" ref 1824 1868 1874 1878 1883 1886 p_from parameter pointer dcl 1830 ref 1824 1852 1855 1855 p_get_primitive parameter entry variable dcl 2811 ref 2805 2819 2825 2831 p_include_dow parameter bit(1) dcl 1402 in procedure "format_date_time_field_internal" set ref 1397 1414* p_include_dow parameter bit(1) dcl 2868 in procedure "format_date_time" ref 2864 2917 p_is_redistribution parameter bit(1) dcl 1828 in procedure "format_envelope" set ref 1824 1844 1886* p_is_redistribution parameter bit(1) dcl 2152 in procedure "format_trace" ref 2148 2168 p_local_variable parameter varying char(256) dcl 2808 set ref 2805 2816 2817 p_message_id parameter bit(72) dcl 1487 in procedure "format_message_id_field_internal" set ref 1483 1499* p_message_id parameter bit(72) dcl 2966 in procedure "format_message_id" set ref 2963 2982* 2988* 2994* p_message_reference_ptr parameter pointer dcl 3046 ref 3043 3057 p_message_references_list_ptr parameter pointer dcl 3023 in procedure "format_references_list" ref 3020 3026 p_message_references_list_ptr parameter pointer dcl 1579 in procedure "format_references_list_field_internal" set ref 1575 1591* p_multiline_text parameter bit(1) dcl 1665 in procedure "format_text_field_internal" set ref 1660 1682* p_multiline_text parameter bit(1) dcl 3107 in procedure "format_text" ref 3103 3109 p_phrase parameter varying char dcl 2251 set ref 2247 2253* 2263* p_phrase_prefix parameter char unaligned dcl 2250 set ref 2247 2253 2260* p_string parameter varying char dcl 3370 in procedure "simple_lengths" ref 3365 3376 3379 3379 3379 3383 3383 3387 3390 3390 3392 3392 3398 3402 3403 3405 3406 3409 3412 p_string parameter varying char dcl 3604 in procedure "format_structured_string" set ref 3600 3621 3624 3626 3635 3636 3638 3639 3640 3640 3640 3640 3642 3645 3670* p_string parameter varying char dcl 3471 in procedure "comment_length" ref 3468 3476 3478 3484 3488 3489 3491 3492 3495 3498 p_string parameter varying char dcl 3427 in procedure "structured_length" ref 3424 3433 3435 3441 3445 3446 3448 3449 3452 3455 3457 p_string parameter varying char dcl 3686 in procedure "format_comment_string" set ref 3683 3698 3700 3708 3709 3711 3712 3713 3713 3713 3713 3715 3717 3734* p_string parameter varying char dcl 3514 in procedure "format_simple_strings" set ref 3509 3525 3528 3528 3528 3532 3532 3536 3539 3539 3541 3541 3546* 3554 3555 3557 3558 3559 3559 3559 3559 3561 3563 p_string parameter char unaligned dcl 3858 in procedure "update_last_column" ref 3855 3866 3869 3871 3871 3872 3872 3878 3880 p_text parameter char unaligned dcl 3965 in procedure "count_lines_in_text" ref 3962 3968 3978 3978 3979 3979 p_text parameter char unaligned dcl 1664 in procedure "format_text_field_internal" set ref 1660 1682* p_text parameter char unaligned dcl 3188 in procedure "format_multiline_text" ref 3185 3194 3198 3199 3199 3220 3222 3224 3224 3225 3225 3231 3231 3236 3236 p_text parameter char unaligned dcl 3106 in procedure "format_text" set ref 3103 3109* 3111* p_text parameter char unaligned dcl 3123 in procedure "format_single_line_text" set ref 3120 3128 3132 3133 3133 3146 3146 3146 3146 3152 3152 3152 3152 3153 3153 3154 3154 3155 3155 3162 3162 3167 3173* p_text_lth parameter fixed bin(21,0) dcl 3782 ref 3778 3798 p_text_ptr parameter pointer dcl 3781 ref 3778 3797 p_trace_ptr parameter pointer dcl 2151 ref 2148 2166 p_variable based varying char dcl 2813 set ref 2819* 2825* 2831* p_variable_max_lth parameter fixed bin(21,0) dcl 2810 set ref 2805 2817* 2819 2823* 2825 2830* 2830 2831 p_variable_ptr parameter pointer dcl 2809 set ref 2805 2816* 2819 2822* 2825 2831 p_varying_text parameter varying char dcl 3784 set ref 3810 3813 3813 3814 pathname_ 000120 constant entry external dcl 271 ref 2499 2509 2520 2659 2675 2686 pathname_$component 000122 constant entry external dcl 272 ref 2580 2761 printing 000113 automatic bit(1) dcl 132 set ref 287* 302* 346 349 377 430* 493* 579* 710* 747* 762* 785 788 799 816* 831* 854 857 867 884* 899* 922 925 935 952* 967* 985 988 998 1016* 1031* 1049 1052 1062 1079* 1094* 1106 1109 1117* 1119 1164* 1179* 1197 1200 1208* 1210 1255* 1270* 1287 1290 1298* 1300 1345* 1360* 1372 1375 1383* 1385 1431* 1446* 1458 1461 1469* 1471 1517* 1532* 1550 1553 1561* 1563 1608* 1623* 1635 1638 1646* 1648 1703* 1718* 1741 1744 1756 1782* 2895 3275 process_zone_offset 000114 automatic fixed bin(17,0) dcl 2875 set ref 2900* 2902 receiving_host 103 based varying char(256) level 2 dcl 2154 set ref 2207* 2213* 2215* recognized_zone 000101 automatic bit(1) dcl 2873 set ref 2895* 2898* 2901 2902* 2907 2908 2909* 2942 redistributions 10 based structure array level 2 dcl 3-109 set ref 606 615 2075 2096 redistributions_list 60 based pointer level 2 dcl 3-15 ref 606 606 614 615 615 2058 2061 2067 2075 2093 2096 2096 redistributions_list_formatting_mode 5 based fixed bin(17,0) level 2 dcl 1-6 set ref 323 323 334 357 369 369* 408 408 418 446 451 451* references 10 based structure array level 2 dcl 3-219 set ref 3029 3029 relay_id 234 based bit(72) level 2 dcl 2154 set ref 2221 2226* relay_recipient 236 based pointer level 2 dcl 2154 set ref 2228 2233* relays 7 based varying char(256) array level 2 in structure "address_route" dcl 6-6 in procedure "mlsys_format_" set ref 1806* 1814* 2179* 2189* 2193* 2196* 2555* 2559* 2564* 2712* 2715* 2717* 2740* 2743* 2745* relays 12 based structure array level 2 in structure "message_trace" dcl 3-87 in procedure "mlsys_format_" set ref 2202 reply_references 54 based pointer level 3 dcl 3-15 set ref 1994 1994 1994* reply_to 40 based pointer level 3 dcl 3-15 set ref 1937 1937 1937* rest_of_buffer defined char unaligned dcl 3826 set ref 3829 3832* rest_of_string defined char unaligned dcl 3869 in begin block on line 3868 ref 3871 3872 rest_of_string defined char unaligned dcl 2382 in begin block on line 2381 ref 2383 2384 rest_of_text defined char unaligned dcl 3976 in begin block on line 3974 ref 3978 3979 rest_of_text defined char unaligned dcl 3822 in begin block on line 3821 ref 3829 rest_of_text defined char unaligned dcl 3222 in begin block on line 3221 ref 3224 3225 rest_of_text defined char unaligned dcl 3142 in begin block on line 3141 ref 3146 3146 3154 3155 reverse builtin function dcl 274 ref 2493 2493 2493 2500 2500 2500 2510 2510 2510 2521 2521 2525 2525 2581 2581 2581 2663 2663 2663 2667 2667 2667 2677 2677 2677 2688 2688 2692 2692 2763 2763 2763 3152 reverse_redistributions 17 000114 automatic bit(1) level 3 dcl 135 set ref 440* 506* 592* 2060 2071 2080 rfc822_format 6 000114 automatic bit(1) level 3 dcl 135 set ref 436* 500* 586* 679* 690* 1789* 1844 2101 2162 2283 2540 2552 2567 2602 2706 2780 2891 2899 2918 2927 2932 3004 3379 3390 3403 3412 3433 3437 3446 3455 3457 3476 3480 3489 3498 3528 3539 3555 3564 3615 3624 3629 3636 3646 3665 3673 3698 3703 3709 3718 3731 3747 rtrim builtin function dcl 274 ref 2216 2216 2217 2217 2219 2219 2377 2518 2520 2684 2686 2944 2944 3133 3199 3212 saved_indentation 000414 automatic fixed bin(17,0) dcl 2425 set ref 2770* 2774 search builtin function dcl 274 ref 3379 3383 3390 3392 3403 3405 3433 3435 3446 3448 3476 3478 3489 3491 3528 3532 3539 3541 3555 3557 3624 3626 3636 3638 3698 3700 3709 3711 section 4 based structure level 2 dcl 3-313 set ref 1754 1754 section_n_lines 5 based fixed bin(21,0) level 4 dcl 3-313 set ref 1760* section_type based fixed bin(17,0) level 3 in structure "message_body_section" dcl 3-274 in procedure "mlsys_format_" ref 3272 section_type 4 based fixed bin(17,0) level 4 in structure "message_body_section_parameter" dcl 3-313 in procedure "mlsys_format_" set ref 1731 1731 sender 2 based pointer level 2 in structure "p_envelope" dcl 1833 in procedure "format_envelope" ref 1850 sender 000432 automatic pointer dcl 1835 in procedure "format_envelope" set ref 1850* 1851 1852* 1855* 1862 1865* 1883* sender_is_different 000466 automatic bit(1) dcl 1838 set ref 1853* 1855* 1858* 1883 sending_host 2 based varying char(256) level 2 dcl 2154 set ref 2210* 2212* short 2 based varying char(4) array level 3 dcl 11-88 ref 2909 short_string 000736 automatic char(200) unaligned dcl 2366 set ref 2369* 2372 2372* 2374* 2377 2383 2383 2384 2384 2389 2389 2393 2393 2398 2398 six_digits_picture automatic picture(6) unaligned dcl 2279 in procedure "format_redistribution" ref 2335 2335 six_digits_picture automatic picture(6) unaligned dcl 1910 in procedure "format_header" ref 1986 1986 size builtin function dcl 274 ref 514 514 599 599 space_left_on_line 001046 automatic fixed bin(21,0) dcl 3125 set ref 3144* 3146 3151 start 1 based fixed bin(21,0) array level 3 dcl 10-11 set ref 545* 545 640* 640 662* 662 1679* 1684 2127* 2138 string builtin function dcl 274 in procedure "mlsys_format_" set ref 342* 435* 499* 585* 678* 689* 781* 850* 918* 981* 1045* 1101* 1193* 1283* 1367* 1453* 1546* 1630* 1737* 1788* string 1 based char level 2 in structure "varying_string" dcl 3790 in procedure "add_to_buffer" set ref 3813 string 1 based char level 2 in structure "the_string" dcl 3516 in procedure "format_simple_strings" set ref 3559 3559 string 1 based char level 2 in structure "the_string" dcl 3606 in procedure "format_structured_string" set ref 3640 3640 string 1 based char level 2 in structure "the_string" dcl 3688 in procedure "format_comment_string" set ref 3713 3713 string_lth 001020 automatic fixed bin(17,0) dcl 2367 in procedure "format_access_class" set ref 2377* 2380 2382 2389 string_lth 001021 automatic fixed bin(21,0) dcl 3430 in procedure "structured_length" set ref 3437* 3440* 3450* 3450 3453* 3453 3455* 3455 3457* 3457 3462 string_lth 000101 automatic fixed bin(21,0) dcl 3373 in procedure "simple_lengths" set ref 3395* 3407* 3407 3410* 3410 3412* 3412 3417 string_lth 001033 automatic fixed bin(21,0) dcl 3474 in procedure "comment_length" set ref 3480* 3483* 3493* 3493 3496* 3496 3498* 3498 3503 string_used 000121 automatic fixed bin(21,0) dcl 3861 set ref 3864* 3866 3869 3871 3872 3875* 3875 3878 3880 3881* 3881 subject 50 based structure level 3 dcl 3-15 substr builtin function dcl 274 set ref 1808 1815 2521 2525 2688 2692 3284 3293 3322 3325 3330 3330* 3332* 3332 3403 3405 3412 3446 3448 3455 3457 3489 3491 3498 3555 3557 3563 3636 3638 3645 3709 3711 3717 3832* 3836 3880 sys_info$access_class_ceiling 000012 external static bit(72) dcl 233 set ref 2374* text defined char unaligned dcl 3198 in begin block on line 3197 ref 3199 text 15 based char level 2 in structure "mail_format" dcl 9-24 in procedure "mlsys_format_" set ref 646 text based char unaligned dcl 3786 in procedure "add_to_buffer" ref 3829 3829 3832 3832 3832 3832 3833 3833 3835 3835 3836 3836 3836 3836 3839 3839 3840 3840 text defined char unaligned dcl 3132 in begin block on line 3131 ref 3133 text 2 based structure level 2 in structure "message_text_user_field" dcl 3-183 in procedure "mlsys_format_" text_fragments 1 based structure array level 2 dcl 10-11 set ref 541* 541 601* 601 658* 658 text_len 12 based fixed bin(21,0) level 3 dcl 9-24 set ref 532* 537 539 551 646 646 646 649* 654 656 668 text_lth 001044 automatic fixed bin(21,0) dcl 3125 in procedure "format_single_line_text" set ref 3133* 3134* 3134 3140 3142 text_lth 52 based fixed bin(21,0) level 4 in structure "message" dcl 3-15 in procedure "mlsys_format_" ref 1933 1933 1933 text_lth 4 based fixed bin(21,0) level 2 in structure "message_preformatted_body_section" dcl 3-292 in procedure "mlsys_format_" set ref 3278* 3284 3284 3287 3287 3292 3292 3293 3293 text_lth 4 based fixed bin(21,0) level 3 in structure "message_text_user_field" dcl 3-183 in procedure "mlsys_format_" ref 2018 2018 2018 text_lth 26 based fixed bin(21,0) level 4 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" ref 2076 2099 2343 2345 2345 text_lth 000100 automatic fixed bin(21,0) dcl 3966 in procedure "count_lines_in_text" set ref 3968* 3972 3976 text_lth 000102 automatic fixed bin(21,0) dcl 3788 in procedure "add_to_buffer" set ref 3798* 3806* 3814* 3820 3822 3829 3832 3832 3833 3835 3836 3836 3839 3840 3845 text_lth 001065 automatic fixed bin(21,0) dcl 3191 in procedure "format_multiline_text" set ref 3199* 3200* 3200 3243 text_ptr 2 based pointer level 2 in structure "message_preformatted_body_section" dcl 3-292 in procedure "mlsys_format_" set ref 3278* 3284 3287 3292 3293 text_ptr 24 based pointer level 4 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" ref 2345 text_ptr 50 based pointer level 4 in structure "message" dcl 3-15 in procedure "mlsys_format_" ref 1933 text_ptr 000100 automatic pointer dcl 3787 in procedure "add_to_buffer" set ref 3797* 3805* 3813* 3829 3832 3832 3833 3835 3836 3836 3839 3840 text_ptr 2 based pointer level 3 in structure "message_text_user_field" dcl 3-183 in procedure "mlsys_format_" ref 2018 2018 text_substring defined char unaligned dcl 3151 ref 3152 3152 3153 text_used 000103 automatic fixed bin(21,0) dcl 3788 in procedure "add_to_buffer" set ref 3817* 3820 3822 3829 3832 3832 3833 3835 3836 3836 3839 3840* 3840 3840 3845 text_used 001045 automatic fixed bin(21,0) dcl 3125 in procedure "format_single_line_text" set ref 3128* 3129 3132 3133 3134 3140 3142 3146 3146 3152 3152 3153 3154 3155 3162 3165* 3165 3167 text_used 001066 automatic fixed bin(21,0) dcl 3191 in procedure "format_multiline_text" set ref 3194* 3195 3198 3199 3200 3220 3222 3224 3225 3231 3236 3241* 3241 3243 the_character 000100 automatic char(1) unaligned dcl 3520 in procedure "format_simple_strings" set ref 3563* 3566* 3567 3570 the_character 001056 automatic char(1) unaligned dcl 3692 in procedure "format_comment_string" set ref 3717* 3720* 3721 3724 the_character 000120 automatic char(1) unaligned dcl 3860 in procedure "update_last_column" set ref 3880* 3883 3885 3887 3887 3887 3887 the_character 001044 automatic char(1) unaligned dcl 3610 in procedure "format_structured_string" set ref 3645* 3647 3653* 3654 3658 the_line 001104 automatic varying char(80) dcl 3261 in procedure "format_body_section_internal" set ref 3336* 3338* 3338* 3339* 3339* 3341* the_line defined char unaligned dcl 3229 in begin block on line 3228 set ref 3231 3236* the_relay based structure level 1 dcl 2154 the_relay_ptr 000646 automatic pointer dcl 2155 set ref 2202* 2207 2210 2212 2213 2215 2216 2216 2216 2217 2217 2217 2219 2219 2219 2221 2226 2228 2233 2237 the_string based structure level 1 dcl 3606 in procedure "format_structured_string" the_string based structure level 1 dcl 3516 in procedure "format_simple_strings" the_string based structure level 1 dcl 3688 in procedure "format_comment_string" ti_zone based structure level 1 unaligned dcl 11-88 time_data_$time_delta 000010 external static fixed bin(71,0) dcl 231 ref 2900 2909 2947 2950 time_info_$zone_names 000132 external static fixed bin(17,0) dcl 11-86 set ref 2907 2908 2909 2909 time_zone 000100 automatic char(3) unaligned dcl 2872 set ref 2879* 2881* 2888* 2891* 2891 2893* 2893 2902 2909 2944 2944 to 42 based pointer level 3 in structure "message" dcl 3-15 in procedure "mlsys_format_" set ref 1942 1942 1942* 1965 to 22 based pointer level 3 in structure "message_redistribution" dcl 3-122 in procedure "mlsys_format_" set ref 2303 2303 2307* 2314 trace 4 based pointer level 2 dcl 1833 set ref 1886 1886* translate builtin function dcl 274 ref 2891 2893 2909 translated_words 001141 automatic char(4) array dcl 3265 set ref 3330* 3332* 3339* two_digits_picture automatic picture(2) unaligned dcl 2871 ref 2924 2924 2932 2932 2937 2937 2940 2940 2953 2953 2954 2954 unspec builtin function dcl 274 set ref 3305* 3322* 3325* 3343* 3343 3346 3346 use_canonical_fieldnames 20 000114 automatic bit(1) level 3 dcl 135 set ref 441* 507* 593* 1947 1954 used 000102 automatic fixed bin(21,0) dcl 3522 in procedure "format_simple_strings" set ref 3552* 3554 3555 3557 3558 3559 3559 3560* 3560 3561 3562* 3562 3563 used 001034 automatic fixed bin(21,0) dcl 3474 in procedure "comment_length" set ref 3486* 3488 3489 3491 3492 3494* 3494 3495 3497* 3497 3498 used 001022 automatic fixed bin(21,0) dcl 3430 in procedure "structured_length" set ref 3443* 3445 3446 3448 3449 3451* 3451 3452 3454* 3454 3455 3457 used 001046 automatic fixed bin(21,0) dcl 3612 in procedure "format_structured_string" set ref 3633* 3635 3636 3638 3639 3640 3640 3641* 3641 3642 3644* 3644 3645 used 001022 automatic fixed bin(17,0) dcl 2367 in procedure "format_access_class" set ref 2378* 2380 2382 2383 2384 2389 2389 2393 2398 2401* 2401 used 000102 automatic fixed bin(21,0) dcl 3373 in procedure "simple_lengths" set ref 3400* 3402 3403 3405 3406 3408* 3408 3409 3411* 3411 3412 used 000102 automatic fixed bin(21,0) dcl 3966 in procedure "count_lines_in_text" set ref 3970* 3972 3976 3978 3979 3982* 3982 used 001060 automatic fixed bin(21,0) dcl 3694 in procedure "format_comment_string" set ref 3706* 3708 3709 3711 3712 3713 3713 3714* 3714 3715 3716* 3716 3717 user_fieldname 000476 automatic varying char(256) dcl 1908 set ref 2015* 2018* 2024* 2031* 2036* user_fields 10 based structure array level 2 dcl 3-150 set ref 2014 user_fields_list 56 based pointer level 3 dcl 3-15 ref 2011 2013 2014 user_is_recipient 000724 automatic bit(1) dcl 2280 in procedure "format_redistribution" set ref 2312* 2317 2318* 2321* 2327 2331 user_is_recipient 000577 automatic bit(1) dcl 1911 in procedure "format_header" set ref 1963* 1968 1969* 1972* 1979 1982 user_name_buffer 000100 automatic char unaligned dcl 1794 set ref 1798 1799 1808 value 2 based fixed bin(35,0) level 2 dcl 3-200 ref 2038 2038 value_picture automatic picture(12) unaligned dcl 1909 ref 2038 2038 varying_string based structure level 1 dcl 3790 verify builtin function dcl 274 ref 3128 3194 3231 3871 version based char(8) level 2 in structure "message_references_list" packed unaligned dcl 3-219 in procedure "mlsys_format_" ref 1539 version based char(8) level 2 in structure "message_trace" packed unaligned dcl 3-87 in procedure "mlsys_format_" ref 1040 version based char(8) level 2 in structure "address_list" packed unaligned dcl 5-6 in procedure "mlsys_format_" ref 1277 version based char(8) level 2 in structure "format_message_options" packed unaligned dcl 1-6 in procedure "mlsys_format_" ref 318 398 version based char(8) level 2 in structure "message" packed unaligned dcl 3-15 in procedure "mlsys_format_" ref 313 392 482 566 701 771 840 908 976 version 2 based char(8) level 2 in structure "message_body_section_parameter" packed unaligned dcl 3-313 in procedure "mlsys_format_" ref 1727 words 001131 automatic bit(36) array dcl 3262 set ref 3322* 3325* 3330 3332 3338* 3343 3346 words_as_characters based char(4) array dcl 3263 ref 3330 3332 wrap 13 000114 automatic bit(1) level 3 dcl 135 set ref 355* 716* 794* 863* 931* 994* 1058* 1115* 1206* 1296* 1381* 1467* 1559* 1644* 1750* 2179 2222 2229 2253 2393 2447 3138 year 000105 automatic fixed bin(17,0) dcl 2875 set ref 2881* 2886* 2932 2932 2934 2934 NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. DATE_TIME_BREAKS internal static char(4) initial unaligned dcl 12-24 DATE_TIME_DELIMITERS internal static char(12) initial unaligned dcl 12-31 DATE_TIME_RFC822_DELIMITERS internal static char(13) initial unaligned dcl 12-28 FORUM_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 HTSP internal static char(2) initial unaligned dcl 12-95 INVALID_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 LOGBOX_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 MAILBOX_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 MAILING_LIST_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 MAIL_FORMAT_VERSION_4 internal static fixed bin(17,0) initial dcl 9-19 MAIL_TABLE_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 MESSAGE_ENVELOPE_PARAMETER_VERSION_2 internal static char(8) initial unaligned dcl 3-79 MESSAGE_INTEGER_USER_FIELD internal static fixed bin(17,0) initial dcl 3-174 MESSAGE_REDISTRIBUTIONS_LIST_VERSION_2 internal static char(8) initial unaligned dcl 3-117 MESSAGE_REDISTRIBUTION_PARAMETER_VERSION_2 internal static char(8) initial unaligned dcl 3-144 MESSAGE_REFERENCE_PARAMETER_VERSION_2 internal static char(8) initial unaligned dcl 3-253 MESSAGE_USER_FIELDS_LIST_VERSION_2 internal static char(8) initial unaligned dcl 3-158 MESSAGE_USER_FIELD_PARAMETER_VERSION_2 internal static char(8) initial unaligned dcl 3-213 NLNL internal static char(2) initial unaligned dcl 12-95 NORMAL_BREAKS internal static char(8) initial unaligned dcl 12-26 NORMAL_DELIMITERS internal static char(16) initial unaligned dcl 12-37 NORMAL_RFC822_DELIMITERS internal static char(17) initial unaligned dcl 12-34 OPEN_PAREN internal static char(1) initial unaligned dcl 12-70 QUOTE_PARENS_NL internal static char(4) initial unaligned dcl 12-18 REDISTRIBUTED_COMMENT_FIELDNAME internal static varying char(32) initial dcl 2-6 SAVEBOX_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 STRUCTURED_DELIMITERS internal static char(10) initial unaligned dcl 12-43 STRUCTURED_RFC822_DELIMITERS internal static char(11) initial unaligned dcl 12-40 USER_MAILBOX_ADDRESS internal static fixed bin(17,0) initial dcl 4-6 Vtime_info_2 internal static char(8) initial unaligned dcl 11-23 address_list_n_addresses automatic fixed bin(17,0) dcl 5-16 address_route_n_relays automatic fixed bin(17,0) dcl 6-18 message_envelope_parameter based structure level 1 dcl 3-74 message_envelope_parameter_ptr automatic pointer dcl 3-81 message_envelope_ptr automatic pointer dcl 3-69 message_n_body_sections automatic fixed bin(17,0) dcl 3-55 message_n_redistributions automatic fixed bin(17,0) dcl 3-55 message_n_user_fields automatic fixed bin(17,0) dcl 3-55 message_redistribution_parameter based structure level 1 dcl 3-139 message_redistribution_parameter_ptr automatic pointer dcl 3-146 message_reference_parameter based structure level 1 dcl 3-248 message_reference_parameter_ptr automatic pointer dcl 3-255 message_reference_subject based char unaligned dcl 3-240 message_references_list_n_references automatic fixed bin(17,0) dcl 3-55 message_text_field_ptr automatic pointer dcl 3-270 message_text_field_text based char unaligned dcl 3-268 message_trace_n_relays automatic fixed bin(17,0) dcl 3-55 message_user_field_parameter based structure level 1 dcl 3-208 message_user_field_parameter_ptr automatic pointer dcl 3-215 mlsys_area based area(1024) dcl 8-61 mlsys_data_$address_list_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$domains_available external static fixed bin(1,0) dcl 8-44 mlsys_data_$forum_not_available external static fixed bin(1,0) dcl 8-44 mlsys_data_$hash_tables_segment_ptr external static pointer dcl 8-64 mlsys_data_$highest_usable_ring external static fixed bin(3,0) dcl 8-49 mlsys_data_$ism_not_available external static fixed bin(1,0) dcl 8-44 mlsys_data_$lowest_forum_ring external static fixed bin(3,0) dcl 8-49 mlsys_data_$mailbox_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$max_lock_wait_retries external static fixed bin(17,0) dcl 8-19 mlsys_data_$max_opening_retries external static fixed bin(17,0) dcl 8-16 mlsys_data_$message_body_sections_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$message_redistributions_list_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$message_references_list_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$message_user_fields_allocation external static fixed bin(17,0) dcl 8-33 mlsys_data_$person_id external static varying char(24) dcl 8-70 mlsys_data_$project_id external static varying char(12) dcl 8-71 mlsys_data_$subsystem_area_ptr external static pointer dcl 8-62 mlsys_data_$subsystem_ring external static fixed bin(3,0) dcl 8-49 mlsys_data_$system_directory external static char(168) unaligned dcl 7-7 mlsys_data_$temp_segment_list_ptr external static pointer dcl 8-54 mlsys_data_$transmit_cache_ptr external static pointer dcl 8-66 mlsys_data_$user_is_anonymous external static bit(1) dcl 8-68 mlsys_data_$user_logbox_address external static pointer dcl 7-15 mlsys_data_$valid_segments external static bit(1) array unaligned dcl 8-56 site_date internal static fixed bin(17,0) initial dcl 11-35 site_date_time internal static fixed bin(17,0) initial dcl 11-35 site_time internal static fixed bin(17,0) initial dcl 11-35 text_length automatic fixed bin(21,0) dcl 9-22 ti_day based structure level 1 unaligned dcl 11-60 ti_keyword based structure level 1 unaligned dcl 11-29 ti_language based structure level 1 unaligned dcl 11-42 ti_month based structure level 1 unaligned dcl 11-52 ti_offset based structure level 1 unaligned dcl 11-68 ti_word based structure level 1 unaligned dcl 11-78 time_info_$date_time_keywords external static fixed bin(17,0) dcl 11-28 time_info_$day_names external static fixed bin(17,0) dcl 11-58 time_info_$default_language_index external static fixed bin(17,0) dcl 11-26 time_info_$gmt_zone_index external static fixed bin(17,0) dcl 11-25 time_info_$language_names external static fixed bin(17,0) dcl 11-40 time_info_$month_names external static fixed bin(17,0) dcl 11-50 time_info_$offset_names external static fixed bin(17,0) dcl 11-66 time_info_$version external static char(8) unaligned dcl 11-21 time_info_$word_names external static fixed bin(17,0) dcl 11-76 tiw_FiscalIndicator internal static fixed bin(17,0) initial dcl 11-107 NAMES DECLARED BY EXPLICIT CONTEXT. ADD_TO_BUFFER_COMMON 030445 constant label dcl 3817 ref 3799 3807 BEGIN_TO_FORMAT 017560 constant label dcl 2621 ref 2447 COMPUTE_ADDRESS_WIDTH 000000 constant label array(0:9) dcl 2465 ref 2463 COMPUTE_THE_LENGTH 026022 constant label dcl 3395 ref 3384 DISPLAY_THIS_LINE_OF_DUMP 025317 constant label dcl 3336 ref 3346 END_COMPUTE_ADDRESS_WIDTH_CASE 017417 constant label dcl 2591 ref 2471 2477 2485 2505 2514 2531 2570 2576 2585 2589 END_FORMAT_ADDRESS_CASE 021606 constant label dcl 2777 ref 2636 2643 2652 2670 2679 2696 2748 2755 2765 FORMAT_ACCESS_CLASS_FIELD_COMMON 005025 constant label dcl 1101 ref 1084 FORMAT_ADDRESS 000012 constant label array(0:9) dcl 2631 ref 2629 FORMAT_ADDRESS_FIELD_COMMON 005262 constant label dcl 1186 ref 1169 FORMAT_ADDRESS_LIST_FIELD_COMMON 005531 constant label dcl 1277 ref 1260 FORMAT_BODY_SECTION 000024 constant label array(2) dcl 3275 ref 3272 FORMAT_BODY_SECTION_COMMON 007163 constant label dcl 1725 ref 1708 FORMAT_DATE_TIME_FIELD_COMMON 006003 constant label dcl 1367 ref 1350 FORMAT_MESSAGE_BODY_COMMON 004351 constant label dcl 974 ref 957 FORMAT_MESSAGE_COMMON 001333 constant label dcl 309 set ref 292 FORMAT_MESSAGE_ENVELOPE_COMMON 003430 constant label dcl 769 ref 752 FORMAT_MESSAGE_FOR_FORUM_OR_NETWORK 003214 constant label dcl 699 ref 683 FORMAT_MESSAGE_HEADER_COMMON 003672 constant label dcl 838 ref 821 FORMAT_MESSAGE_ID_FIELD_COMMON 006234 constant label dcl 1453 ref 1436 FORMAT_MESSAGE_REDISTRIBUTIONS_LIST_COMMON 004116 constant label dcl 906 ref 889 FORMAT_MESSAGE_TRACE_COMMON 004565 constant label dcl 1038 ref 1021 FORMAT_REFERENCES_LIST_FIELD_COMMON 006462 constant label dcl 1539 ref 1522 FORMAT_TEXT_FIELD_COMMON 006746 constant label dcl 1630 ref 1613 OUTPUT_THE_STRING 026760 constant label dcl 3544 ref 3533 RETURN_FROM_FORMAT_ENTRY_WITH_ERROR 007557 constant label dcl 3912 ref 3282 3908 3924 3938 STANDARD_WRAP_CRITERIA 017545 constant label dcl 2614 ref 2607 add_phrase 014246 constant entry internal dcl 2247 ref 2213 2215 2216 2217 2219 add_to_buffer 030364 constant entry internal dcl 3778 ref 3559 3640 3713 3770 add_to_buffer_fixed 030401 constant entry internal dcl 3802 ref 373 462 527 646 728 1142 1149 1233 1240 1323 1330 1409 1416 1494 1501 1586 1593 1672 1688 1805 1981 1983 1986 1987 1989 1990 2037 2038 2040 2104 2107 2109 2132 2176 2192 2198 2205 2209 2225 2232 2235 2236 2238 2259 2260 2261 2330 2332 2335 2336 2338 2339 2398 2399 2624 2626 2708 2710 2711 2719 2722 2727 2732 2739 2780 2782 2789 2792 2918 2921 2924 2925 2927 2930 2932 2934 2935 2937 2938 2940 2943 2944 2947 2949 2953 2954 2999 3004 3006 3012 3031 3063 3065 3162 3173 3231 3235 3236 3292 3293 3342 3349 3350 3550 3565 3566 3567 3570 3572 3577 3615 3617 3619 3622 3629 3631 3648 3649 3652 3653 3654 3658 3660 3665 3667 3673 3675 3696 3703 3719 3720 3721 3724 3726 3731 3736 3762 3766 add_to_buffer_varying 030423 constant entry internal dcl 3810 ref 1141 1232 1322 1408 1493 1585 1671 1980 2036 2101 2103 2175 2204 2210 2212 2329 2796 2920 2929 3007 3009 3089 3341 3546 3670 3734 comment_length 026331 constant entry internal dcl 3468 ref 2458 2494 count_lines_in_text 031013 constant entry internal dcl 3962 ref 3287 3835 date_time_equal 031000 constant entry internal dcl 3949 ref 619 629 1868 1878 1915 format_access_class 015332 constant entry internal dcl 2361 ref 1147 format_access_class_field 004705 constant entry external dcl 1072 format_access_class_field_internal 007560 constant entry internal dcl 1131 ref 1117 2000 format_address 015534 constant entry internal dcl 2411 ref 1238 2233 2852 2855 format_address_field 005142 constant entry external dcl 1157 format_address_field_internal 007645 constant entry internal dcl 1222 ref 624 632 1208 1874 1883 1890 format_address_for_ism 007315 constant entry external dcl 1779 format_address_list 022165 constant entry internal dcl 2843 ref 1328 2108 2773 format_address_list_field 005414 constant entry external dcl 1248 format_address_list_field_internal 007741 constant entry internal dcl 1312 ref 1298 1930 1931 1937 1942 1947 1952 1954 1959 2024 2300 2307 format_body 013101 constant entry internal dcl 2120 ref 374 463 529 730 996 format_body_section 007062 constant entry external dcl 1696 format_body_section_internal 024753 constant entry internal dcl 3256 ref 1754 2135 format_canon_redistributed_msg 002361 constant entry external dcl 561 format_comment_string 027730 constant entry internal dcl 3683 ref 2664 2794 format_date_time 022271 constant entry internal dcl 2864 ref 1414 2106 2237 3064 format_date_time_field 005662 constant entry external dcl 1338 format_date_time_field_internal 010026 constant entry internal dcl 1397 ref 619 629 1383 1868 1878 1918 2031 2293 format_envelope 010414 constant entry internal dcl 1824 ref 362 454 522 720 796 2287 format_header 011163 constant entry internal dcl 1903 ref 366 458 525 724 865 format_last_redistributed_if_needed 012757 constant entry internal dcl 2090 ref 2071 2080 format_message 001233 constant entry external dcl 280 format_message_body 004245 constant entry external dcl 945 format_message_canonical_form 001612 constant entry external dcl 388 format_message_envelope 003324 constant entry external dcl 740 format_message_for_forum 003132 constant entry external dcl 675 format_message_for_mailbox 002071 constant entry external dcl 478 format_message_for_rfc822_network 003163 constant entry external dcl 686 format_message_header 003571 constant entry external dcl 809 format_message_id 023257 constant entry internal dcl 2963 ref 1499 2226 format_message_id_field 006117 constant entry external dcl 1424 format_message_id_field_internal 010115 constant entry internal dcl 1483 ref 1469 2005 2352 format_message_trace 004461 constant entry external dcl 1008 format_multiline_text 024520 constant entry internal dcl 3185 ref 3109 format_phrase_string 026534 constant entry internal dcl 3525 ref 2623 format_redistribution 014377 constant entry internal dcl 2273 ref 608 2076 format_redistributions_list 004015 constant entry external dcl 877 format_redistributions_list_internal 012652 constant entry internal dcl 2052 ref 369 451 520 726 933 format_reference 023676 constant entry internal dcl 3043 ref 3029 format_references_list 023617 constant entry internal dcl 3020 ref 1591 format_references_list_field 006345 constant entry external dcl 1509 format_references_list_field_internal 010202 constant entry internal dcl 1575 ref 1561 1994 format_simple_strings 026517 constant entry internal dcl 3509 format_single_line_text 024315 constant entry internal dcl 3120 ref 3111 format_structured_string 027223 constant entry internal dcl 3600 ref 2635 2651 2668 2678 2695 2764 format_text 024254 constant entry internal dcl 3103 ref 1682 format_text_field 006613 constant entry external dcl 1601 format_text_field_internal 010267 constant entry internal dcl 1660 ref 1646 1933 2018 2345 format_top_level_string 026655 constant entry internal dcl 3536 ref 1801 1806 1814 2193 2196 2263 2642 2649 2662 2712 2715 2717 2721 2723 2725 2726 2731 2733 2735 2736 2740 2743 2745 2754 2783 2785 3001 3068 format_trace 013163 constant entry internal dcl 2148 ref 1060 1886 get_address_variable 022005 constant entry internal dcl 2805 ref 2439 2442 2465 2473 2479 2487 2533 2572 2631 2638 2645 2656 2700 2750 mlsys_format_ 001217 constant entry external dcl 35 new_line 030307 constant entry internal dcl 3757 ref 2179 2189 2222 2229 2253 2393 2607 2614 3032 3167 3215 3243 phrase_length 025576 constant entry internal dcl 3376 ref 2453 print_access_class_field 004756 constant entry external dcl 1087 print_address_field 005213 constant entry external dcl 1172 print_address_list_field 005462 constant entry external dcl 1263 print_body_section 007122 constant entry external dcl 1711 print_buffer 030745 constant entry internal dcl 3932 ref 306 377 766 799 835 867 903 935 971 998 1035 1062 1098 1119 1183 1210 1274 1300 1364 1385 1450 1471 1536 1563 1627 1648 1722 1756 3277 print_date_time_field 005734 constant entry external dcl 1353 print_message 001274 constant entry external dcl 295 print_message_body 004310 constant entry external dcl 960 print_message_envelope 003367 constant entry external dcl 755 print_message_header 003631 constant entry external dcl 824 print_message_id_field 006165 constant entry external dcl 1439 print_message_trace 004524 constant entry external dcl 1024 print_redistributions_list 004055 constant entry external dcl 892 print_references_list_field 006413 constant entry external dcl 1525 print_text_field 006672 constant entry external dcl 1616 quotes_if_rfc822 030274 constant entry internal dcl 3744 ref 2468 2484 2501 2511 2528 2582 report_foreign_address_too_long 030731 constant entry internal dcl 3919 ref 1785 report_smallarg 030715 constant entry internal dcl 3903 ref 290 433 496 537 582 654 713 750 819 887 955 1019 1082 1167 1258 1348 1434 1520 1611 1706 simple_lengths 025557 constant entry internal dcl 3365 structured_length 026132 constant entry internal dcl 3424 ref 2468 2501 2511 2528 2582 top_level_length 025717 constant entry internal dcl 3387 ref 2179 2189 2253 2476 2482 2492 2539 2543 2545 2547 2555 2559 2564 2575 2594 2597 update_last_column 030573 constant entry internal dcl 3855 ref 3833 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 36360 36514 34612 36370 Length 37542 34612 134 1012 1545 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME mlsys_format_ 1172 external procedure is an external procedure. format_access_class_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_address_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_address_list_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_date_time_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_message_id_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_references_list_field_internal internal procedure shares stack frame of external procedure mlsys_format_. format_text_field_internal internal procedure shares stack frame of external procedure mlsys_format_. begin block on line 1793 81 begin block uses auto adjustable storage. format_envelope internal procedure shares stack frame of external procedure mlsys_format_. format_header internal procedure shares stack frame of external procedure mlsys_format_. format_redistributions_list_internal internal procedure shares stack frame of external procedure mlsys_format_. format_last_redistributed_if_needed internal procedure shares stack frame of external procedure mlsys_format_. format_body internal procedure shares stack frame of external procedure mlsys_format_. format_trace internal procedure shares stack frame of external procedure mlsys_format_. add_phrase 80 internal procedure is called during a stack extension. format_redistribution internal procedure shares stack frame of external procedure mlsys_format_. format_access_class internal procedure shares stack frame of external procedure mlsys_format_. begin block on line 2381 begin block shares stack frame of external procedure mlsys_format_. begin block on line 2387 begin block shares stack frame of external procedure mlsys_format_. format_address 1203 internal procedure is declared options(non_quick). get_address_variable internal procedure shares stack frame of internal procedure format_address. format_address_list 82 internal procedure is called by several nonquick procedures. format_date_time 114 internal procedure is called by several nonquick procedures. format_message_id 289 internal procedure is declared options(non_quick). format_references_list 334 internal procedure is declared options(non_quick). format_reference internal procedure shares stack frame of internal procedure format_references_list. format_text internal procedure shares stack frame of external procedure mlsys_format_. format_single_line_text internal procedure shares stack frame of external procedure mlsys_format_. begin block on line 3131 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3141 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3150 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3160 begin block shares stack frame of external procedure mlsys_format_. format_multiline_text internal procedure shares stack frame of external procedure mlsys_format_. begin block on line 3197 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3210 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3221 begin block shares stack frame of external procedure mlsys_format_. begin block on line 3228 begin block shares stack frame of external procedure mlsys_format_. format_body_section_internal internal procedure shares stack frame of external procedure mlsys_format_. simple_lengths 71 internal procedure is called by several nonquick procedures. structured_length internal procedure shares stack frame of internal procedure format_address. comment_length internal procedure shares stack frame of internal procedure format_address. format_simple_strings 82 internal procedure is called by several nonquick procedures. format_structured_string internal procedure shares stack frame of internal procedure format_address. format_comment_string internal procedure shares stack frame of internal procedure format_address. quotes_if_rfc822 internal procedure shares stack frame of internal procedure format_address. new_line 76 internal procedure is called by several nonquick procedures. add_to_buffer 108 internal procedure is called during a stack extension. begin block on line 3821 begin block shares stack frame of internal procedure add_to_buffer. begin block on line 3824 begin block shares stack frame of internal procedure add_to_buffer. begin block on line 3828 begin block shares stack frame of internal procedure add_to_buffer. update_last_column internal procedure shares stack frame of internal procedure add_to_buffer. begin block on line 3868 begin block shares stack frame of internal procedure add_to_buffer. report_smallarg 64 internal procedure is assigned to an entry variable. report_foreign_address_too_long 64 internal procedure is assigned to an entry variable. print_buffer 74 internal procedure is assigned to an entry variable. date_time_equal internal procedure shares stack frame of external procedure mlsys_format_. count_lines_in_text 70 internal procedure is called by several nonquick procedures. begin block on line 3974 begin block shares stack frame of internal procedure count_lines_in_text. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME add_to_buffer 000100 text_ptr add_to_buffer 000102 text_lth add_to_buffer 000103 text_used add_to_buffer 000120 the_character update_last_column 000121 string_used update_last_column 000122 idx update_last_column begin block on line 1793 000100 user_name_buffer begin block on line 1793 000100 host_name_buffer begin block on line 1793 count_lines_in_text 000100 text_lth count_lines_in_text 000101 n_lines count_lines_in_text 000102 used count_lines_in_text 000103 idx count_lines_in_text format_address 000100 address_string_ptr format_address 000102 address_name_ptr format_address 000104 address_comment_ptr format_address 000106 address_string_max_lth format_address 000107 address_name_max_lth format_address 000110 address_comment_max_lth format_address 000111 local_address_string format_address 000212 local_address_name format_address 000313 local_address_comment format_address 000414 saved_indentation format_address 000415 have_address_data format_address 000416 display_list format_address 000417 address_pathname format_address 000502 address_pathname_varying format_address 000603 address_system format_address 000704 address_dirname format_address 000756 address_ename format_address 000766 address_component format_address 000776 address_representation_lth format_address 000777 address_type format_address 001010 code get_address_variable 001020 must_requote structured_length 001021 string_lth structured_length 001022 used structured_length 001023 idx structured_length 001032 must_requote comment_length 001033 string_lth comment_length 001034 used comment_length 001035 idx comment_length 001044 the_character format_structured_string 001045 must_requote format_structured_string 001046 used format_structured_string 001047 idx format_structured_string 001056 the_character format_comment_string 001057 must_requote format_comment_string 001060 used format_comment_string 001061 idx format_comment_string format_address_list 000100 idx format_address_list format_date_time 000100 time_zone format_date_time 000101 recognized_zone format_date_time 000102 code format_date_time 000103 month format_date_time 000104 day_of_month format_date_time 000105 year format_date_time 000106 hour format_date_time 000107 minute format_date_time 000110 day_of_week format_date_time 000111 offset format_date_time 000112 hours format_date_time 000113 minutes format_date_time 000114 process_zone_offset format_date_time 000115 idx format_date_time format_message_id 000100 message_id_string_ptr format_message_id 000102 message_id_string_max_lth format_message_id 000103 local_message_id_string format_message_id 000204 message_id_system format_message_id 000305 is_local_system format_message_id 000306 code format_message_id format_references_list 000100 idx format_references_list 000110 message_id_string_ptr format_reference 000112 message_id_string_max_lth format_reference 000113 author_string format_reference 000214 local_message_id_string format_reference 000315 code format_reference format_simple_strings 000100 the_character format_simple_strings 000101 must_requote format_simple_strings 000102 used format_simple_strings 000103 idx format_simple_strings mlsys_format_ 000100 buffer_ptr mlsys_format_ 000102 buffer_size mlsys_format_ 000103 buffer_used mlsys_format_ 000104 output_switch mlsys_format_ 000106 original_mf_ptr mlsys_format_ 000110 original_mf_extension_ptr mlsys_format_ 000112 code mlsys_format_ 000113 printing mlsys_format_ 000114 ifo mlsys_format_ 000137 mail_format_header_lth mlsys_format_ 000140 new_mf_extension_ptr mlsys_format_ 000142 last_column_used mlsys_format_ 000143 line_count mlsys_format_ 000144 local_buffer mlsys_format_ 000244 full_fieldname mlsys_format_ 000265 need_separator mlsys_format_ 000266 idx mlsys_format_ 000267 jdx mlsys_format_ 000270 format_message_options_ptr mlsys_format_ 000272 message_ptr mlsys_format_ 000274 message_trace_ptr mlsys_format_ 000276 message_redistribution_ptr mlsys_format_ 000300 message_user_field_ptr mlsys_format_ 000302 message_references_list_ptr mlsys_format_ 000304 message_reference_ptr mlsys_format_ 000306 message_body_section_ptr mlsys_format_ 000310 message_body_section_parameter_ptr mlsys_format_ 000312 address_list_ptr mlsys_format_ 000314 address_route_ptr mlsys_format_ 000316 mail_format_ptr mlsys_format_ 000320 mf_extension_n_text_fragments mlsys_format_ 000322 mf_extension_ptr mlsys_format_ 000430 delivered_by format_envelope 000432 sender format_envelope 000434 full_fieldname format_envelope 000455 fieldname_prefix format_envelope 000466 sender_is_different format_envelope 000467 delivered_by_is_different format_envelope 000476 user_fieldname format_header 000577 user_is_recipient format_header 000600 n_recipients format_header 000601 idx format_header 000614 first_idx format_redistributions_list_internal 000615 last_idx format_redistributions_list_internal 000616 idx_increment format_redistributions_list_internal 000617 idx format_redistributions_list_internal 000636 idx format_body 000646 the_relay_ptr format_trace 000650 fieldname_prefix format_trace 000661 canonicalize format_trace 000662 idx format_trace 000672 full_fieldname format_redistribution 000713 fieldname_prefix format_redistribution 000724 user_is_recipient format_redistribution 000725 n_recipients format_redistribution 000726 idx format_redistribution 000736 short_string format_access_class 001020 string_lth format_access_class 001021 comma_lth format_access_class 001022 used format_access_class 001023 idx format_access_class 001044 text_lth format_single_line_text 001045 text_used format_single_line_text 001046 space_left_on_line format_single_line_text 001047 idx format_single_line_text 001064 first_line format_multiline_text 001065 text_lth format_multiline_text 001066 text_used format_multiline_text 001067 idx format_multiline_text 001104 the_line format_body_section_internal 001131 words format_body_section_internal 001135 last_line_printed format_body_section_internal 001141 translated_words format_body_section_internal 001145 in_duplicate format_body_section_internal 001146 n_words format_body_section_internal 001147 n_lines format_body_section_internal 001150 n_words_on_line format_body_section_internal 001151 n_bits_in_last_word format_body_section_internal 001152 offset format_body_section_internal 001153 idx format_body_section_internal 001154 jdx format_body_section_internal 001155 kdx format_body_section_internal new_line 000100 n_spaces_to_add new_line simple_lengths 000100 must_requote simple_lengths 000101 string_lth simple_lengths 000102 used simple_lengths 000103 idx simple_lengths THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_l_a r_e_as r_ne_as alloc_char_temp realloc_char_temp enter_begin_block leave_begin_block call_ent_var_desc call_ent_var call_ext_out_desc call_ext_out call_int_this_desc call_int_this call_int_other_desc call_int_other return_mac tra_ext_1 alloc_auto_adj mdfx1 shorten_stack ext_entry ext_entry_desc int_entry int_entry_desc reverse_cs set_chars_eis divide_fx4 index_after_cs clock_mac ix_rev_chars THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. aim_check_$equal convert_authorization_$to_string_short cu_$grow_stack_frame decode_clock_value_$date_time get_authorization_ get_line_length_$switch ioa_$rsnnl iox_$put_chars mail_system_$compare_addresses mail_system_$decode_message_id mail_system_$expand_list_address mail_system_$get_address_comment mail_system_$get_address_name mail_system_$get_address_pathname mail_system_$get_address_route mail_system_$get_address_string mail_system_$get_address_system mail_system_$get_address_type mail_system_$get_named_group_display_flag mail_system_$get_user_field_name mlsys_misc_utils_$get_best_address_name mlsys_nit_interface_$canonicalize_system_name mlsys_nit_interface_$get_local_system_name mlsys_nit_interface_$is_local_system pathname_ pathname_$component THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_subr_arg error_table_$inconsistent error_table_$smallarg error_table_$unimplemented_version iox_$user_output mlsys_data_$user_default_mailbox_address mlsys_data_$user_id mlsys_data_$user_mail_table_address mlsys_et_$foreign_address_too_long mlsys_et_$not_address_list mlsys_et_$not_message mlsys_et_$not_message_trace mlsys_et_$unknown_body_section_type sys_info$access_class_ceiling time_data_$time_delta time_info_$zone_names LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 35 001216 38 001224 280 001225 283 001251 284 001254 285 001256 287 001260 288 001261 290 001263 292 001266 295 001267 298 001306 299 001310 300 001312 302 001313 303 001315 304 001320 306 001330 309 001333 311 001337 313 001342 314 001346 315 001351 318 001352 319 001356 320 001361 323 001362 330 001400 331 001403 334 001404 338 001414 339 001417 342 001420 344 001423 346 001425 349 001446 350 001455 351 001462 352 001465 355 001466 357 001472 362 001506 366 001534 369 001545 372 001556 373 001561 374 001573 377 001574 379 001604 381 001606 383 001607 388 001610 391 001630 392 001634 393 001640 394 001643 397 001644 398 001647 399 001653 400 001656 403 001657 404 001662 405 001665 408 001666 414 001714 415 001717 418 001720 422 001730 423 001733 426 001734 427 001737 428 001741 430 001743 431 001744 433 001746 435 001751 436 001754 437 001755 438 001756 439 001760 440 001761 441 001762 442 001763 444 001764 446 001766 451 001772 454 002002 458 002031 461 002042 462 002045 463 002057 466 002060 467 002062 469 002063 478 002064 481 002107 482 002113 483 002117 484 002122 487 002123 489 002127 490 002132 491 002135 493 002136 494 002137 496 002141 497 002144 499 002146 500 002151 501 002152 502 002153 503 002155 504 002156 505 002157 506 002160 507 002161 508 002162 509 002163 511 002164 514 002170 515 002207 520 002210 522 002212 525 002236 527 002240 529 002250 531 002251 532 002254 537 002257 539 002276 540 002306 541 002310 543 002316 544 002317 545 002327 546 002334 551 002336 552 002351 554 002352 561 002353 565 002377 566 002403 567 002407 568 002412 571 002413 572 002416 573 002421 575 002425 576 002430 577 002433 579 002434 580 002435 582 002437 583 002442 585 002444 586 002447 587 002450 588 002451 589 002453 590 002454 591 002455 592 002456 593 002457 594 002460 595 002461 597 002462 599 002465 600 002504 601 002506 606 002515 608 002523 614 002525 615 002532 618 002535 619 002556 623 002624 624 002645 626 002675 629 002676 632 002743 639 002772 640 003001 641 003006 646 003010 648 003024 649 003027 654 003032 656 003051 657 003061 658 003063 660 003071 661 003072 662 003101 663 003106 668 003110 669 003123 671 003124 675 003125 678 003150 679 003153 680 003154 681 003156 683 003160 686 003161 689 003201 690 003204 691 003206 692 003207 693 003210 694 003211 695 003212 696 003213 699 003214 701 003220 702 003224 703 003227 706 003230 707 003233 708 003235 710 003236 711 003237 713 003241 715 003244 716 003246 718 003250 720 003251 724 003275 726 003277 728 003301 730 003311 732 003312 734 003314 736 003315 740 003316 743 003344 744 003347 745 003351 747 003353 748 003354 750 003356 752 003361 755 003362 758 003403 759 003405 760 003407 762 003410 763 003412 764 003415 766 003425 769 003430 771 003434 772 003440 773 003443 776 003444 777 003451 778 003454 781 003455 783 003460 785 003462 788 003503 789 003511 790 003516 791 003521 794 003522 796 003526 799 003553 801 003563 803 003565 805 003566 809 003567 812 003611 813 003614 814 003616 816 003620 817 003621 819 003623 821 003626 824 003627 827 003645 828 003647 829 003651 831 003652 832 003654 833 003657 835 003667 838 003672 840 003676 841 003702 842 003705 845 003706 846 003713 847 003716 850 003717 852 003722 854 003724 857 003745 858 003753 859 003760 860 003763 863 003764 865 003770 867 003777 869 004007 871 004011 873 004012 877 004013 880 004035 881 004040 882 004042 884 004044 885 004045 887 004047 889 004052 892 004053 895 004071 896 004073 897 004075 899 004076 900 004100 901 004103 903 004113 906 004116 908 004122 909 004126 910 004131 913 004132 914 004137 915 004142 918 004143 920 004146 922 004150 925 004171 926 004177 927 004204 928 004207 931 004210 933 004214 935 004223 937 004233 939 004235 941 004236 945 004237 948 004265 949 004270 950 004272 952 004274 953 004275 955 004277 957 004302 960 004303 963 004324 964 004326 965 004330 967 004331 968 004333 969 004336 971 004346 974 004351 976 004355 977 004361 978 004364 981 004365 983 004370 985 004372 988 004413 989 004421 990 004426 991 004431 994 004432 996 004436 998 004437 1000 004447 1002 004451 1004 004452 1008 004453 1012 004501 1013 004504 1014 004506 1016 004510 1017 004511 1019 004513 1021 004516 1024 004517 1027 004540 1028 004542 1029 004544 1031 004545 1032 004547 1033 004552 1035 004562 1038 004565 1040 004571 1041 004575 1042 004600 1045 004601 1047 004604 1049 004606 1052 004627 1053 004635 1054 004642 1055 004645 1058 004646 1060 004652 1062 004663 1064 004673 1066 004675 1068 004676 1072 004677 1075 004733 1076 004736 1077 004740 1079 004742 1080 004743 1082 004745 1084 004750 1087 004751 1090 005000 1091 005002 1092 005004 1094 005005 1095 005007 1096 005012 1098 005022 1101 005025 1104 005030 1106 005032 1109 005053 1110 005061 1111 005066 1112 005071 1115 005072 1117 005076 1119 005120 1121 005130 1123 005132 1125 005133 1157 005134 1160 005170 1161 005173 1162 005175 1164 005177 1165 005200 1167 005202 1169 005205 1172 005206 1175 005235 1176 005237 1177 005241 1179 005242 1180 005244 1181 005247 1183 005257 1186 005262 1188 005277 1189 005301 1190 005302 1193 005303 1195 005306 1197 005310 1200 005331 1201 005337 1202 005344 1203 005347 1206 005350 1208 005354 1210 005376 1212 005406 1214 005410 1216 005411 1248 005412 1251 005442 1252 005445 1253 005447 1255 005451 1256 005452 1258 005454 1260 005457 1263 005460 1266 005504 1267 005506 1268 005510 1270 005511 1271 005513 1272 005516 1274 005526 1277 005531 1279 005540 1280 005543 1283 005544 1285 005547 1287 005551 1290 005572 1291 005600 1292 005605 1293 005610 1296 005611 1298 005615 1300 005637 1302 005647 1304 005651 1306 005652 1338 005653 1341 005710 1342 005713 1343 005715 1345 005717 1346 005720 1348 005722 1350 005725 1353 005726 1356 005756 1357 005760 1358 005762 1360 005763 1361 005765 1362 005770 1364 006000 1367 006003 1370 006006 1372 006010 1375 006031 1376 006037 1377 006044 1378 006047 1381 006050 1383 006054 1385 006101 1387 006111 1389 006113 1391 006114 1424 006115 1427 006145 1428 006150 1429 006152 1431 006154 1432 006155 1434 006157 1436 006162 1439 006163 1442 006207 1443 006211 1444 006213 1446 006214 1447 006216 1448 006221 1450 006231 1453 006234 1456 006237 1458 006241 1461 006262 1462 006270 1463 006275 1464 006300 1467 006301 1469 006305 1471 006327 1473 006337 1475 006341 1477 006342 1509 006343 1513 006373 1514 006376 1515 006400 1517 006402 1518 006403 1520 006405 1522 006410 1525 006411 1528 006435 1529 006437 1530 006441 1532 006442 1533 006444 1534 006447 1536 006457 1539 006462 1542 006471 1543 006474 1546 006475 1548 006500 1550 006502 1553 006523 1554 006531 1555 006536 1556 006541 1559 006542 1561 006546 1563 006570 1565 006600 1567 006602 1569 006603 1601 006604 1604 006646 1605 006651 1606 006653 1608 006655 1609 006656 1611 006660 1613 006663 1616 006664 1619 006721 1620 006723 1621 006725 1623 006726 1624 006730 1625 006733 1627 006743 1630 006746 1633 006751 1635 006753 1638 006774 1639 007002 1640 007007 1641 007012 1644 007013 1646 007017 1648 007044 1650 007054 1652 007056 1654 007057 1696 007060 1699 007102 1700 007105 1701 007107 1703 007111 1704 007112 1706 007114 1708 007117 1711 007120 1714 007136 1715 007140 1716 007142 1718 007143 1719 007145 1720 007150 1722 007160 1725 007163 1727 007167 1728 007173 1729 007176 1731 007177 1733 007204 1734 007207 1737 007210 1739 007213 1741 007215 1744 007236 1745 007244 1746 007251 1747 007254 1750 007255 1751 007261 1752 007263 1754 007264 1756 007271 1758 007301 1760 007303 1762 007306 1764 007307 1779 007310 1782 007345 1783 007346 1785 007350 1786 007353 1787 007355 1788 007356 1789 007361 1791 007363 1793 007367 1794 007372 1795 007406 1798 007420 1799 007422 1800 007424 1801 007425 1803 007437 1805 007450 1806 007461 1807 007500 1808 007504 1811 007517 1812 007521 1813 007523 1814 007524 1815 007540 1816 007554 1818 007555 1820 007556 3912 007557 1131 007560 1138 007571 1140 007572 1141 007576 1142 007607 1145 007617 1147 007621 1149 007630 1151 007644 1222 007645 1229 007656 1231 007657 1232 007663 1233 007674 1236 007704 1238 007706 1240 007724 1242 007740 1312 007741 1319 007752 1321 007753 1322 007757 1323 007770 1326 010000 1328 010002 1330 010011 1332 010025 1397 010026 1405 010037 1407 010040 1408 010044 1409 010055 1412 010065 1414 010067 1416 010100 1418 010114 1483 010115 1490 010126 1492 010127 1493 010133 1494 010144 1497 010154 1499 010156 1501 010165 1503 010201 1575 010202 1582 010213 1584 010214 1585 010220 1586 010231 1589 010241 1591 010243 1593 010252 1595 010266 1660 010267 1668 010305 1670 010306 1671 010312 1672 010323 1675 010333 1677 010335 1678 010337 1679 010340 1682 010347 1684 010365 1688 010377 1690 010413 1824 010414 1841 010416 1844 010422 1847 010435 1848 010443 1850 010444 1851 010447 1852 010453 1853 010457 1854 010460 1855 010461 1858 010511 1860 010513 1861 010520 1862 010524 1863 010526 1864 010527 1865 010530 1867 010552 1868 010575 1873 010660 1874 010703 1877 010717 1878 010742 1882 011021 1883 011044 1886 011060 1889 011105 1890 011130 1893 011162 1903 011163 1915 011165 1918 011212 1921 011241 1930 011324 1931 011350 1933 011372 1937 011430 1942 011466 1947 011524 1952 011565 1954 011607 1959 011650 1961 011672 1963 011676 1964 011677 1965 011700 1966 011705 1967 011711 1968 011714 1969 011725 1972 011754 1976 012001 1978 012003 1979 012020 1980 012027 1981 012037 1982 012047 1983 012051 1984 012065 1986 012067 1987 012130 1989 012147 1990 012161 1994 012171 2000 012227 2005 012313 2011 012350 2013 012361 2014 012371 2015 012376 2016 012417 2017 012421 2018 012425 2022 012465 2023 012466 2024 012470 2029 012521 2030 012522 2031 012524 2033 012553 2036 012554 2037 012564 2038 012574 2040 012636 2043 012647 2046 012651 2052 012652 2058 012654 2060 012662 2061 012664 2062 012667 2063 012671 2064 012673 2066 012674 2067 012676 2068 012701 2071 012703 2074 012706 2075 012726 2076 012734 2078 012750 2080 012753 2083 012756 2090 012757 2093 012760 2096 012771 2099 012774 2100 012776 2101 012777 2103 013012 2104 013022 2105 013032 2106 013034 2107 013047 2108 013061 2109 013070 2112 013100 2120 013101 2125 013102 2126 013104 2127 013105 2130 013114 2132 013125 2135 013137 2136 013146 2138 013150 2142 013162 2148 013163 2162 013165 2166 013170 2168 013173 2170 013204 2172 013205 2173 013211 2174 013213 2175 013214 2176 013245 2177 013256 2178 013260 2179 013267 2188 013341 2189 013342 2192 013374 2193 013404 2196 013435 2197 013452 2198 013455 2201 013465 2202 013475 2203 013501 2204 013502 2205 013533 2206 013544 2207 013546 2209 013567 2210 013601 2212 013626 2213 013637 2215 013672 2216 013711 2217 013754 2219 014020 2221 014064 2222 014072 2225 014106 2226 014120 2228 014127 2229 014134 2232 014150 2233 014162 2235 014200 2236 014210 2237 014220 2238 014232 2239 014242 2241 014244 2247 014245 2253 014266 2259 014326 2260 014337 2261 014352 2263 014363 2265 014376 2273 014377 2283 014401 2285 014411 2287 014416 2291 014447 2292 014452 2293 014475 2297 014525 2299 014535 2300 014560 2303 014603 2306 014617 2307 014642 2310 014665 2312 014671 2313 014672 2314 014673 2315 014676 2316 014702 2317 014704 2318 014715 2321 014744 2325 014771 2327 014773 2328 015002 2329 015025 2330 015036 2331 015046 2332 015050 2333 015064 2335 015066 2336 015127 2338 015146 2339 015160 2343 015170 2344 015173 2345 015216 2349 015250 2351 015263 2352 015306 2355 015331 2361 015332 2369 015334 2372 015356 2374 015366 2377 015410 2378 015422 2380 015423 2382 015427 2383 015432 2384 015444 2388 015450 2389 015453 2391 015461 2393 015463 2398 015500 2399 015515 2401 015527 2403 015531 2405 015532 2411 015533 2437 015547 2439 015563 2442 015572 2445 015601 2447 015602 2449 015605 2451 015607 2453 015613 2458 015642 2463 015670 2465 015672 2468 015701 2471 015730 2473 015731 2476 015740 2477 015763 2479 015764 2482 015773 2484 016033 2485 016041 2487 016042 2490 016051 2491 016107 2492 016123 2493 016146 2494 016205 2497 016215 2499 016216 2500 016240 2501 016277 2505 016312 2507 016313 2509 016351 2510 016374 2511 016433 2514 016446 2516 016447 2518 016505 2520 016532 2521 016572 2525 016614 2528 016632 2531 016644 2533 016645 2536 016654 2537 016671 2538 016674 2539 016713 2540 016736 2542 016743 2543 016745 2545 016771 2547 017013 2550 017043 2551 017050 2552 017062 2554 017070 2555 017072 2559 017122 2564 017154 2566 017200 2567 017203 2570 017211 2572 017212 2575 017221 2576 017244 2578 017245 2580 017277 2581 017326 2582 017365 2585 017400 2587 017401 2589 017416 2591 017417 2594 017427 2597 017460 2602 017517 2604 017524 2607 017526 2611 017544 2614 017545 2621 017560 2623 017562 2624 017577 2626 017614 2629 017625 2631 017627 2635 017640 2636 017662 2638 017663 2642 017674 2643 017711 2645 017712 2649 017723 2651 017755 2652 017763 2654 017764 2656 017766 2658 017775 2659 020033 2661 020056 2662 020072 2663 020107 2664 020146 2665 020152 2667 020153 2668 020212 2670 020220 2672 020221 2674 020223 2675 020261 2677 020304 2678 020343 2679 020351 2681 020352 2683 020354 2684 020412 2686 020437 2688 020477 2692 020521 2695 020537 2696 020544 2698 020545 2700 020547 2702 020556 2703 020573 2704 020576 2706 020615 2707 020620 2708 020624 2709 020637 2710 020652 2711 020665 2712 020676 2715 020721 2717 020745 2718 020763 2719 020766 2721 020777 2722 021014 2723 021025 2725 021044 2726 021060 2727 021102 2729 021122 2731 021123 2732 021140 2733 021151 2735 021170 2736 021204 2737 021226 2739 021242 2740 021253 2743 021276 2745 021322 2746 021340 2748 021344 2750 021345 2754 021356 2755 021373 2757 021374 2759 021376 2761 021430 2763 021457 2764 021516 2765 021524 2767 021525 2769 021544 2770 021547 2771 021552 2772 021554 2773 021573 2774 021603 2777 021606 2780 021616 2782 021632 2783 021643 2785 021667 2789 021720 2792 021737 2794 021750 2796 021766 2798 022004 2805 022005 2816 022007 2817 022012 2819 022014 2821 022040 2822 022044 2823 022060 2825 022063 2828 022110 2829 022114 2830 022131 2831 022134 2832 022162 2835 022163 2843 022164 2849 022172 2851 022177 2852 022207 2853 022240 2855 022242 2858 022267 2864 022270 2879 022276 2881 022300 2883 022336 2884 022340 2885 022343 2886 022345 2887 022347 2888 022351 2891 022353 2893 022366 2895 022375 2898 022403 2899 022404 2900 022406 2901 022414 2902 022423 2904 022437 2905 022441 2907 022442 2908 022455 2909 022472 2912 022531 2913 022534 2917 022536 2918 022542 2920 022563 2921 022576 2924 022607 2925 022651 2927 022663 2929 022704 2930 022717 2932 022730 2934 022763 2935 023005 2937 023016 2938 023041 2940 023052 2942 023075 2943 023077 2944 023110 2945 023141 2947 023143 2949 023160 2950 023171 2951 023201 2952 023203 2953 023207 2954 023232 2957 023255 2963 023256 2978 023264 2979 023266 2982 023270 2984 023323 2985 023327 2986 023342 2988 023344 2991 023401 2992 023406 2993 023423 2994 023425 2996 023463 2999 023464 3001 023475 3003 023512 3004 023520 3006 023534 3007 023545 3009 023562 3012 023604 3014 023615 3020 023616 3026 023624 3028 023631 3029 023641 3030 023650 3031 023655 3032 023666 3034 023673 3036 023675 3043 023676 3057 023700 3059 023704 3061 023706 3063 023714 3064 023731 3065 023746 3066 023761 3068 024010 3069 024021 3073 024022 3074 024024 3075 024026 3077 024064 3078 024070 3079 024103 3080 024105 3082 024145 3083 024152 3084 024167 3085 024171 3087 024232 3089 024233 3092 024250 3094 024253 3103 024254 3109 024265 3111 024303 3113 024314 3120 024315 3128 024326 3129 024341 3132 024344 3133 024347 3134 024364 3138 024366 3140 024370 3142 024373 3144 024376 3146 024401 3151 024407 3152 024411 3153 024431 3154 024435 3155 024447 3161 024453 3162 024456 3165 024473 3167 024475 3169 024504 3170 024505 3173 024506 3176 024517 3185 024520 3194 024531 3195 024544 3198 024547 3199 024552 3200 024567 3204 024571 3205 024574 3206 024601 3207 024603 3211 024604 3212 024606 3214 024621 3215 024623 3216 024627 3220 024630 3222 024633 3224 024636 3225 024652 3229 024656 3231 024661 3235 024707 3236 024721 3240 024737 3241 024740 3243 024742 3244 024751 3246 024752 3256 024753 3270 024755 3272 024760 3275 024762 3277 024765 3278 024771 3280 025007 3281 025011 3282 025012 3284 025013 3287 025044 3288 025066 3289 025067 3292 025070 3293 025103 3298 025122 3301 025123 3303 025127 3305 025132 3306 025135 3308 025136 3310 025137 3311 025145 3312 025147 3313 025153 3314 025156 3315 025163 3316 025166 3318 025167 3319 025171 3321 025173 3322 025203 3324 025217 3325 025221 3328 025236 3329 025245 3330 025253 3332 025302 3333 025306 3334 025310 3335 025312 3336 025317 3338 025354 3339 025415 3341 025467 3342 025477 3343 025507 3344 025515 3345 025516 3346 025517 3348 025523 3349 025525 3350 025537 3352 025547 3356 025551 3357 025553 3359 025555 3365 025556 3368 025572 3376 025575 3379 025611 3383 025663 3384 025715 3387 025716 3390 025732 3392 025770 3395 026022 3398 026026 3400 026031 3402 026032 3403 026037 3405 026060 3406 026075 3407 026102 3408 026105 3409 026111 3410 026113 3411 026115 3412 026116 3415 026126 3417 026127 3424 026132 3433 026143 3435 026165 3437 026203 3440 026211 3441 026214 3443 026217 3445 026220 3446 026225 3448 026246 3449 026263 3450 026270 3451 026273 3452 026277 3453 026301 3454 026303 3455 026304 3457 026314 3460 026325 3462 026326 3468 026331 3476 026342 3478 026364 3480 026402 3483 026407 3484 026412 3486 026415 3488 026416 3489 026423 3491 026444 3492 026461 3493 026466 3494 026471 3495 026475 3496 026477 3497 026501 3498 026502 3501 026512 3503 026513 3509 026516 3512 026532 3525 026533 3528 026547 3532 026621 3533 026653 3536 026654 3539 026670 3541 026726 3544 026760 3546 026761 3547 026773 3550 026774 3552 027005 3554 027006 3555 027013 3557 027034 3558 027051 3559 027056 3560 027100 3561 027104 3562 027110 3563 027111 3564 027116 3565 027121 3566 027132 3567 027143 3568 027160 3570 027161 3572 027177 3575 027210 3577 027211 3579 027222 3600 027223 3615 027241 3617 027256 3619 027267 3621 027302 3622 027306 3624 027317 3626 027341 3628 027357 3629 027360 3631 027374 3633 027405 3635 027406 3636 027413 3638 027434 3639 027451 3640 027456 3641 027500 3642 027504 3644 027510 3645 027511 3646 027516 3647 027521 3648 027525 3649 027536 3650 027547 3652 027550 3653 027561 3654 027572 3656 027607 3658 027610 3660 027626 3663 027637 3665 027640 3667 027655 3668 027666 3670 027667 3673 027701 3675 027716 3677 027727 3683 027730 3696 027741 3698 027752 3700 027774 3702 030012 3703 030013 3706 030026 3708 030027 3709 030035 3711 030056 3712 030073 3713 030100 3714 030122 3715 030126 3716 030132 3717 030133 3718 030140 3719 030143 3720 030154 3721 030165 3722 030202 3724 030203 3726 030221 3729 030232 3731 030233 3732 030247 3734 030250 3736 030262 3738 030273 3744 030274 3747 030276 3749 030304 3757 030306 3762 030314 3764 030325 3765 030330 3766 030333 3767 030344 3768 030346 3770 030347 3772 030362 3778 030363 3797 030371 3798 030375 3799 030377 3802 030400 3805 030414 3806 030417 3807 030421 3810 030422 3813 030436 3814 030441 3817 030445 3820 030446 3822 030451 3826 030454 3829 030460 3832 030465 3833 030500 3834 030515 3835 030520 3836 030545 3839 030557 3840 030561 3845 030562 3847 030571 3849 030572 3855 030573 3864 030604 3866 030605 3869 030611 3871 030614 3872 030631 3874 030635 3875 030641 3878 030645 3880 030647 3881 030653 3883 030654 3885 030670 3887 030701 3893 030712 3895 030713 3903 030714 3906 030722 3908 030725 3919 030730 3922 030736 3924 030741 3932 030744 3935 030752 3936 030767 3937 030772 3938 030773 3941 030776 3943 030777 3949 031000 3954 031002 3962 031012 3968 031026 3970 031027 3972 031031 3976 031035 3978 031040 3979 031054 3981 031060 3982 031061 3984 031062 3986 031063 ----------------------------------------------------------- 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