COMPILATION LISTING OF SEGMENT hcom_cfix_validate_ Compiled by: Multics PL/I Compiler, Release 28e, of February 14, 1985 Compiled at: Honeywell Multics Op. - System M Compiled on: 06/05/86 1121.0 mst Thu Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1985 * 4* * * 5* *********************************************************** */ 6 7 8 /****^ HISTORY COMMENTS: 9* 1) change(85-09-23,LJAdams), approve(85-11-06,MCR7278), 10* audit(86-02-19,Gilcrease), install(86-02-19,MR12.0-1021): 11* Created September 1985. 12* 2) change(86-04-30,LJAdams), approve(86-05-19,MCR7386), 13* audit(86-05-19,Gilcrease), install(86-06-05,MR12.0-1071): 14* Added parameter for error message. 15* END HISTORY COMMENTS */ 16 17 hcom_cfix_validate_: 18 proc (P_caller, P_field_name, P_input_value, P_result, P_canonical_value, P_field_type, P_err_msg); 19 20 /* * HCOM_CFIX_VALIDATE_ 21* * 22* * This is the procedure used to validate values placed in fields 23* * of a history comment or installation description. 24* * 25* * The validation procedure takes an input value to validate, and 26* * returns a bit indicating the validity. The name of the field is 27* * supplied to determine what sort of validation will be applied, 28* * and the name of the calling procedure is supplied for use in 29* * error messages and questions. An error message is always printed 30* * when the field value is invalid, so the caller of the validation 31* * routine need never print one. 32* * 33* * In addition to the valid/invalid result, this procedure also 34* * returns the canonical form of the field value (making appropriate 35* * case translations, etc.), the field type (a character string 36* * whose value depends on the field itself). 37* * 38* * The critical fix validation procedure makes the following checks: 39* * 40* * "author" field 41* * Validated for "correct" syntax and length restriction 42* * "approval" field 43* * Must be a critical fix number in the format: 44* * fix_nn or fix_nn.ds 45* * "audit" field 46* * Validated for "correct" syntax and length restriction 47* * "install" field 48* * Person id of the installer of the critical fix 49* * Other fields 50* * Always rejected. 51* */ 52 53 declare P_caller char (*) varying parameter; /* INPUT: Name of validation procedure's caller */ 54 declare P_field_name char (*) varying parameter; /* INPUT: Name of field to be validated */ 55 declare P_input_value char (*) varying parameter; /* INPUT: Value to be checked for validity */ 56 declare P_result bit (1) aligned parameter; /* OUTPUT: Whether input was valid or not */ 57 58 declare P_canonical_value char (*) varying parameter; /* OUTPUT: Canonical text form of above */ 59 declare P_field_type char (*) varying parameter; /* OUTPUT: Character prefix of approval value */ 60 declare P_err_msg char (100) varying parameter; /* OUTPUT: error message */ 61 62 declare NAMECASE char (53) internal static options (constant) init 63 ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"); 64 declare VALID_CHARACTERS char (17) internal static options (constant) init ("fix_.ds0123456789"); 65 declare DIGITS char (10) internal static options (constant) init ("0123456789"); 66 declare DELIMITER char (1) internal static options (constant) init ("_"); 67 68 69 declare (length, ltrim, null, rtirm, substr, verify) builtin; 70 71 /* */ 72 73 74 P_result = "0"b; /* Initialize output values */ 75 P_canonical_value = P_input_value; /* Just return the input in case of error */ 76 P_field_type = ""; /* Type-dependent values are returned null */ 77 P_err_msg = ""; 78 79 80 /* Call the appropriate (internal) validation procedure, depending on the 81* field name. These procedures are responsible for setting all output 82* parameters, issuing all error messages, and asking questions. When 83* they return, all the results should be set appropriately, since the 84* external procedure just returns at that point. In particular, they must 85* all set P_result, since that has been initialized to "0"b already, above. 86* */ 87 88 if (P_field_name = AUTHOR_FIELD_NAME) then 89 call validate_personid (AUTHOR_FIELD_NAME); 90 else if (P_field_name = APPROVAL_FIELD_NAME) then 91 call validate_cfixno (); 92 else if (P_field_name = AUDIT_FIELD_NAME) then 93 call validate_personid (AUDIT_FIELD_NAME); 94 else if (P_field_name = INSTALL_FIELD_NAME) then 95 call validate_personid(INSTALL_FIELD_NAME); 96 else 97 P_err_msg = "Invalid field name"; 98 99 100 CHECK_RETURNS: 101 return; /* All done */ 102 103 /* */ 104 validate_personid: 105 procedure (P_type); 106 107 declare P_type char (*) varying parameter; /* "author" or "audit" -- not used in this implementation */ 108 109 /* Ideally, perhaps, this would check the person ID against a little database of valid 110* values, giving the updater the opportunity to accept or reject one that wasn't 111* found. It could even translate initials or nicknames to the real name. For now, 112* though, all it does is make a trivial syntactic check that isn't even correct 113* in all cases (deJong, for instance). This represents an opportunity for people 114* to modify this routine to be spiffier. */ 115 116 117 if (length (P_input_value) < 2) then /* Between 2 and 24 characters */ 118 P_result = "0"b; 119 else if (length (P_input_value) > 24) then 120 P_result = "0"b; 121 else if verify (P_input_value, NAMECASE) ^= 0 then 122 P_result = "0"b; /* And be all alphabetic */ 123 else P_result = "1"b; /* Otherwise, it's OK */ 124 125 return; 126 end validate_personid; 127 128 /* */ 129 130 validate_cfixno: 131 procedure (); 132 133 declare approval char (24) varying; 134 declare part_1 char (24) varying; 135 declare part_2 char (24) varying; 136 declare part_3 char (24) varying; 137 declare first_digit fixed bin; 138 declare last_digit fixed bin; 139 140 141 approval = P_input_value; 142 approval = rtrim (approval); 143 approval = ltrim (approval); 144 145 if (length (approval) = 0) then 146 call invalid_cfixno ("Approval must not be null"); 147 148 if (verify (approval, VALID_CHARACTERS) ^= 0) then 149 call invalid_cfixno ("Only critical fix numbers are currently acceptable (e.g. fix_nnnn.ds)"); 150 151 first_digit = verify (approval, "fix_"); 152 if (first_digit = 0) then /* All alpha characters */ 153 call invalid_cfixno ("No fix number supplied."); 154 155 else if (first_digit = 1) then /* Syntax error to omit the identifying word */ 156 call invalid_cfixno ("Must not begin with a digit."); 157 158 else do; /* Contains an identifying number */ 159 part_1 = substr (approval, 1, (first_digit - 1)); 160 part_2 = substr (approval, first_digit); 161 part_2 = ltrim (part_2, DELIMITER); /* Trim off delimiter appearing twix 1st/2nd part */ 162 last_digit = verify(part_2,"0123456789"); 163 if last_digit > 0 then do; 164 part_3 = substr(part_2,last_digit); 165 part_2 = substr(part_2,1,last_digit-1); 166 end; 167 else 168 part_3 = ""; 169 if (length (part_2) = 0) then /* Error if nothing but delimiters */ 170 call invalid_cfixno ("Must include a decimal number"); 171 if (verify (part_2, DIGITS) ^= 0) then 172 call invalid_cfixno ("Approval number field must be all decimal"); 173 if (length (part_2) > 4) then 174 call invalid_cfixno ("Approval number field must be 4 digits or less"); 175 if length(part_3) > 0 & part_3 ^= ".ds" then 176 call invalid_cfixno("Fix number ends improperly."); 177 178 end; 179 180 /* Note that we assign the output values here, and then ask the question; 181* this gives the caller a chance to use the canonical value when asking 182* for a replacement. */ 183 184 P_result = "1"b; /* It's valid */ 185 if part_3 ^= "" then 186 P_canonical_value = part_1 || part_2 || part_3; 187 else 188 P_canonical_value = part_1 || part_2; 189 P_field_type = part_1; /* Make it easier for our caller to re-use */ 190 191 return; 192 end validate_cfixno; 193 194 /* */ 195 196 invalid_cfixno: 197 procedure (P_message); 198 199 declare P_message char (*) parameter; 200 201 /* This procedure prints an error message and returns a false result, 202* for use when the value is invalid */ 203 204 205 P_err_msg = P_message; 206 P_result = "0"b; /* Invalid */ 207 goto CHECK_RETURNS; 208 209 end invalid_cfixno; 210 211 /* */ 212 213 214 /* BEGIN INCLUDE FILE ... hcom_field_names.incl.pl1 */ 1 2 1 3 1 4 /****^ HISTORY COMMENTS: 1 5* 1) change(85-09-20,LJAdams), approve(85-11-06,MCR7278), 1 6* audit(86-02-19,Gilcrease), install(86-02-19,MR12.0-1021): 1 7* Created September 1985. 1 8* END HISTORY COMMENTS */ 1 9 1 10 declare AUTHOR_FIELD_NAME char (24) varying internal static options (constant) init ("author"); 1 11 declare APPROVAL_FIELD_NAME char (24) varying internal static options (constant) init ("approval"); 1 12 declare AUDIT_FIELD_NAME char (24) varying internal static options (constant) init ("audit"); 1 13 declare INSTALL_FIELD_NAME char (24) varying internal static options (constant) init ("install"); 1 14 1 15 /* END INCLUDE FILE ... hcom_field_names.incl.pl1 */ 214 215 /* BEGIN INCLUDE FILE query_info.incl.pl1 TAC June 1, 1973 */ 2 2 /* Renamed to query_info.incl.pl1 and cp_escape_control added, 08/10/78 WOS */ 2 3 /* version number changed to 4, 08/10/78 WOS */ 2 4 /* Version 5 adds explanation_(ptr len) 05/08/81 S. Herbst */ 2 5 /* Version 6 adds literal_sw, prompt_after_explanation switch 12/15/82 S. Herbst */ 2 6 2 7 dcl 1 query_info aligned, /* argument structure for command_query_ call */ 2 8 2 version fixed bin, /* version of this structure - must be set, see below */ 2 9 2 switches aligned, /* various bit switch values */ 2 10 3 yes_or_no_sw bit (1) unaligned init ("0"b), /* not a yes-or-no question, by default */ 2 11 3 suppress_name_sw bit (1) unaligned init ("0"b), /* do not suppress command name */ 2 12 3 cp_escape_control bit (2) unaligned init ("00"b), /* obey static default value */ 2 13 /* "01" -> invalid, "10" -> don't allow, "11" -> allow */ 2 14 3 suppress_spacing bit (1) unaligned init ("0"b), /* whether to print extra spacing */ 2 15 3 literal_sw bit (1) unaligned init ("0"b), /* ON => do not strip leading/trailing white space */ 2 16 3 prompt_after_explanation bit (1) unaligned init ("0"b), /* ON => repeat question after explanation */ 2 17 3 padding bit (29) unaligned init (""b), /* pads it out to t word */ 2 18 2 status_code fixed bin (35) init (0), /* query not prompted by any error, by default */ 2 19 2 query_code fixed bin (35) init (0), /* currently has no meaning */ 2 20 2 21 /* Limit of data defined for version 2 */ 2 22 2 23 2 question_iocbp ptr init (null ()), /* IO switch to write question */ 2 24 2 answer_iocbp ptr init (null ()), /* IO switch to read answer */ 2 25 2 repeat_time fixed bin (71) init (0), /* repeat question every N seconds if no answer */ 2 26 /* minimum of 30 seconds required for repeat */ 2 27 /* otherwise, no repeat will occur */ 2 28 /* Limit of data defined for version 4 */ 2 29 2 30 2 explanation_ptr ptr init (null ()), /* explanation of question to be printed if */ 2 31 2 explanation_len fixed bin (21) init (0); /* user answers "?" (disabled if ptr=null or len=0) */ 2 32 2 33 dcl query_info_version_3 fixed bin int static options (constant) init (3); 2 34 dcl query_info_version_4 fixed bin int static options (constant) init (4); 2 35 dcl query_info_version_5 fixed bin int static options (constant) init (5); 2 36 dcl query_info_version_6 fixed bin int static options (constant) init (6); /* the current version number */ 2 37 2 38 /* END INCLUDE FILE query_info.incl.pl1 */ 215 216 /* BEGIN INCLUDE FILE format_document_options.incl.pl1 3 2* 3 3* Modified 82.10.18 by Paul W. Benjamin to add dont_compress_sw and upgrade 3 4* to version_2. 3 5* Modified 83.02.15 by PWB to add break_word_sw and max_line_length_sw. 3 6* Modified 83.03.01 by PWB to add dont_break_indented_lines_sw. 3 7* Modified 83.03.03 by PWB to add sub_err_sw. 3 8* Modified 83.06.07 by PWB to add dont_fill_sw. 3 9* Modified 83.06.09 by PWB to add hyphenation_sw and syllable_size. 3 10**/ 3 11 3 12 dcl 1 format_document_options aligned based (format_document_options_ptr), 3 13 2 version_number fixed bin, /* input */ 3 14 /* must be format_document_version_2 */ 3 15 2 indentation fixed bin, /* input */ 3 16 /* all lines must be indented by this value */ 3 17 2 line_length fixed bin, /* input */ 3 18 /* initial line length */ 3 19 2 switches, 3 20 3 pgno_sw bit (1) unal, /* input */ 3 21 /* end each page with a centered page number */ 3 22 3 adj_sw bit (1) unal, /* input */ 3 23 /* adjust mode initially on */ 3 24 /* only meaningful if dont_fill_sw = "0"b */ 3 25 3 galley_sw bit (1) unal, /* input */ 3 26 /* galley mode -- no page breaks */ 3 27 3 error_sw bit (1) unal, /* input */ 3 28 /* report all errors on error_output */ 3 29 3 literal_sw bit (1) unal, /* input */ 3 30 /* "1"b - interpret all lines as text */ 3 31 /* "0"b - lines that start with "." are controls */ 3 32 3 file_sw bit (1) unal, /* output */ 3 33 /* has meaning for non-zero storage system status codes */ 3 34 /* "1"b code refers to output file */ 3 35 /* "0"b code refers to input file */ 3 36 3 dont_compress_sw bit (1) unal, /* input */ 3 37 /* "1"b - don't compress white space */ 3 38 /* "0"b - compress white space when filling */ 3 39 3 break_word_sw bit (1) unal, /* input */ 3 40 /* "1"b - break a word rather than exceed line_length */ 3 41 /* "0"b - write an overlength line if no spaces found */ 3 42 3 max_line_length_sw bit (1) unal, /* input */ 3 43 /* "1"b - line_length cannot be exceeded */ 3 44 /* "0"b - line_length can be exceeded (by .pdw controls) */ 3 45 3 dont_break_indented_lines_sw /* input */ 3 46 bit (1) unal, /* don't break a line that begins with whitespace */ 3 47 /* when it is the last line, or the next line is */ 3 48 /* null or the next line begins with whitespace */ 3 49 3 sub_err_sw bit (1) unal, /* input */ 3 50 /* quietly call sub_err_ with diagnostic errors */ 3 51 3 dont_fill_sw bit (1) unal, /* input */ 3 52 /* "1"b - fill mode off initially */ 3 53 /* "0"b - fill mode on initially */ 3 54 3 hyphenation_sw bit (1) unal, 3 55 3 mbz bit (23) unal, /* input */ 3 56 /* MUST be zero */ 3 57 2 syllable_size 3 58 fixed bin; /* input */ 3 59 /* smallest portion of word */ 3 60 /* to be left by hyphenation */ 3 61 3 62 dcl format_document_options_ptr ptr; 3 63 dcl format_document_version_2 fixed bin int static options (constant) init (2); 3 64 dcl format_document_version_1 fixed bin int static options (constant) init (1); 3 65 3 66 /* END INCLUDE FILE format_document_options.incl.pl1 */ 216 217 218 end hcom_cfix_validate_; 219 SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 06/05/86 1121.0 hcom_cfix_validate_.pl1 >special_ldd>install>MR12.0-1071>hcom_cfix_validate_.pl1 214 1 02/19/86 1535.3 hcom_field_names.incl.pl1 >ldd>include>hcom_field_names.incl.pl1 215 2 03/11/83 1204.3 query_info.incl.pl1 >ldd>include>query_info.incl.pl1 216 3 11/01/84 1514.0 format_document_options.incl.pl1 >ldd>include>format_document_options.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. APPROVAL_FIELD_NAME 000016 constant varying char(24) initial dcl 1-11 ref 90 AUDIT_FIELD_NAME 000007 constant varying char(24) initial dcl 1-12 set ref 92 92* AUTHOR_FIELD_NAME 000025 constant varying char(24) initial dcl 1-10 set ref 88 88* DELIMITER constant char(1) initial unaligned dcl 66 ref 161 DIGITS 000034 constant char(10) initial unaligned dcl 65 ref 171 INSTALL_FIELD_NAME 000000 constant varying char(24) initial dcl 1-13 set ref 94 94* NAMECASE 000044 constant char(53) initial unaligned dcl 62 ref 121 P_caller parameter varying char dcl 53 ref 17 P_canonical_value parameter varying char dcl 58 set ref 17 75* 185* 187* P_err_msg parameter varying char(100) dcl 60 set ref 17 77* 96* 205* P_field_name parameter varying char dcl 54 ref 17 88 90 92 94 P_field_type parameter varying char dcl 59 set ref 17 76* 189* P_input_value parameter varying char dcl 55 ref 17 75 117 119 121 141 P_message parameter char unaligned dcl 199 ref 196 205 P_result parameter bit(1) dcl 56 set ref 17 74* 117* 119* 121* 123* 184* 206* P_type parameter varying char dcl 107 ref 104 VALID_CHARACTERS 000037 constant char(17) initial unaligned dcl 64 ref 148 answer_iocbp 6 000100 automatic pointer initial level 2 dcl 2-7 set ref 2-7* approval 000132 automatic varying char(24) dcl 133 set ref 141* 142* 142 143* 143 145 148 151 159 160 cp_escape_control 1(02) 000100 automatic bit(2) initial level 3 packed unaligned dcl 2-7 set ref 2-7* explanation_len 14 000100 automatic fixed bin(21,0) initial level 2 dcl 2-7 set ref 2-7* explanation_ptr 12 000100 automatic pointer initial level 2 dcl 2-7 set ref 2-7* first_digit 000166 automatic fixed bin(17,0) dcl 137 set ref 151* 152 155 159 160 last_digit 000167 automatic fixed bin(17,0) dcl 138 set ref 162* 163 164 165 length builtin function dcl 69 ref 117 119 145 169 173 175 literal_sw 1(05) 000100 automatic bit(1) initial level 3 packed unaligned dcl 2-7 set ref 2-7* ltrim builtin function dcl 69 ref 143 161 null builtin function dcl 69 ref 2-7 2-7 2-7 padding 1(07) 000100 automatic bit(29) initial level 3 packed unaligned dcl 2-7 set ref 2-7* part_1 000141 automatic varying char(24) dcl 134 set ref 159* 185 187 189 part_2 000150 automatic varying char(24) dcl 135 set ref 160* 161* 161 162 164 165* 165 169 171 173 185 187 part_3 000157 automatic varying char(24) dcl 136 set ref 164* 167* 175 175 185 185 prompt_after_explanation 1(06) 000100 automatic bit(1) initial level 3 packed unaligned dcl 2-7 set ref 2-7* query_code 3 000100 automatic fixed bin(35,0) initial level 2 dcl 2-7 set ref 2-7* query_info 000100 automatic structure level 1 dcl 2-7 question_iocbp 4 000100 automatic pointer initial level 2 dcl 2-7 set ref 2-7* repeat_time 10 000100 automatic fixed bin(71,0) initial level 2 dcl 2-7 set ref 2-7* status_code 2 000100 automatic fixed bin(35,0) initial level 2 dcl 2-7 set ref 2-7* substr builtin function dcl 69 ref 159 160 164 165 suppress_name_sw 1(01) 000100 automatic bit(1) initial level 3 packed unaligned dcl 2-7 set ref 2-7* suppress_spacing 1(04) 000100 automatic bit(1) initial level 3 packed unaligned dcl 2-7 set ref 2-7* switches 1 000100 automatic structure level 2 dcl 2-7 verify builtin function dcl 69 ref 121 148 151 162 171 yes_or_no_sw 1 000100 automatic bit(1) initial level 3 packed unaligned dcl 2-7 set ref 2-7* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. format_document_options based structure level 1 dcl 3-12 format_document_options_ptr automatic pointer dcl 3-62 format_document_version_1 internal static fixed bin(17,0) initial dcl 3-64 format_document_version_2 internal static fixed bin(17,0) initial dcl 3-63 query_info_version_3 internal static fixed bin(17,0) initial dcl 2-33 query_info_version_4 internal static fixed bin(17,0) initial dcl 2-34 query_info_version_5 internal static fixed bin(17,0) initial dcl 2-35 query_info_version_6 internal static fixed bin(17,0) initial dcl 2-36 rtirm builtin function dcl 69 NAMES DECLARED BY EXPLICIT CONTEXT. CHECK_RETURNS 000423 constant label dcl 100 ref 207 hcom_cfix_validate_ 000240 constant entry external dcl 17 invalid_cfixno 001130 constant entry internal dcl 196 ref 145 148 152 155 169 171 173 175 validate_cfixno 000470 constant entry internal dcl 130 ref 90 validate_personid 000424 constant entry internal dcl 104 ref 88 92 94 NAME DECLARED BY CONTEXT OR IMPLICATION. rtrim builtin function ref 142 STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 2314 2324 2266 2324 Length 2552 2266 10 212 26 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME hcom_cfix_validate_ 161 external procedure is an external procedure. validate_personid internal procedure shares stack frame of external procedure hcom_cfix_validate_. validate_cfixno internal procedure shares stack frame of external procedure hcom_cfix_validate_. invalid_cfixno internal procedure shares stack frame of external procedure hcom_cfix_validate_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME hcom_cfix_validate_ 000100 query_info hcom_cfix_validate_ 000132 approval validate_cfixno 000141 part_1 validate_cfixno 000150 part_2 validate_cfixno 000157 part_3 validate_cfixno 000166 first_digit validate_cfixno 000167 last_digit validate_cfixno THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. alloc_cs cat_realloc_cs return shorten_stack ext_entry_desc NO EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. NO EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 17 000232 2 7 000277 74 000327 75 000331 76 000343 77 000345 88 000347 90 000362 92 000372 94 000404 96 000416 100 000423 104 000424 117 000435 119 000444 121 000450 123 000465 125 000467 130 000470 141 000471 142 000503 143 000521 145 000543 148 000553 151 000574 152 000607 155 000622 159 000633 160 000643 161 000660 162 000702 163 000715 164 000716 165 000732 166 000740 167 000741 169 000742 171 000752 173 000773 175 001004 184 001021 185 001024 187 001070 189 001115 191 001127 196 001130 205 001141 206 001154 207 001155 ----------------------------------------------------------- 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