COMPILATION LISTING OF SEGMENT binder_ Compiled by: Multics PL/I Compiler, Release 28d, of October 4, 1983 Compiled at: Honeywell Multics Op. - System M Compiled on: 12/18/84 0855.7 mst Tue Options: optimize map 1 /* *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Information Systems Inc., 1982 * 4* * * 5* * Copyright (c) 1972 by Massachusetts Institute of * 6* * Technology and Honeywell Information Systems, Inc. * 7* * * 8* *********************************************************** */ 9 10 11 binder_: proc (P_old_input_ptr); 12 13 /* * BINDER_ 14* * 15* * This procedure, once the standard subroutine interface for the binder, is now 16* * just a writearound to call bind_ with the appropriately formatted new structure. 17* * It is slightly complicated by the fact that it must copy between two structures 18* * both named input, described in two different include files; this is done by 19* * including one in the outer procedure, and one in a begin block. 20* * 21* * 01/21/81, W. Olin Sibert 22* * 10/3/84, M. Sharpe modified to use version 2 of binder_input.incl.pl1 23* */ 24 25 dcl P_old_input_ptr pointer parameter; 26 27 dcl 1 old_input aligned like inp based (P_old_input_ptr); 28 29 dcl (p, inpp) pointer; /* Silly pointers not declared by the include files */ 30 dcl time_now fixed bin (71); 31 dcl (idx, old_idx) fixed bin; 32 33 dcl inp_area area; 34 35 dcl bind_ entry (pointer); 36 dcl convert_date_to_binary_ entry (char (*), fixed bin (71), fixed bin (35)); 37 dcl get_system_free_area_ entry () returns (area); 38 39 dcl (clock, null, substr) builtin; 40 41 dcl cleanup condition; 42 43 44 45 inpp = null (); 46 on cleanup begin; 47 if inpp ^= null () then free inp in (inp_area); 48 end; 49 begin; /* Copy all the information which is meaningful */ 50 51 inp_area = get_system_free_area_ (); 52 NTOTAL = old_input.nupd+old_input.narc; 53 NOBJ = old_input.nobj; 54 allocate inp in (inp_area) set (inpp); 55 56 57 58 unspec (inp) = ""b; 59 60 inp.version = BINDER_INPUT_VERSION_2; 61 inp.caller_name = "binder_"; /* The "caller_name name", left as binder_ for compatibility */ 62 63 inp.bound_seg_name = old_input.bound_seg_name; 64 65 inp.narc = old_input.narc; 66 inp.nupd = old_input.nupd; 67 inp.ntotal = old_input.narc + old_input.nupd; 68 inp.nobj = old_input.nobj; 69 70 71 inp.archive (*).path = ""; /* First, clean these all out, then copy the used entries */ 72 inp.archive (*).real_path = ""; /* Most things were already initialized by the unspec, above */ 73 inp.archive (*).ptr = null (); /* All archive pointers will be null, sorry */ 74 75 do idx = 1 to inp.ntotal; /* Now, copy what we can from the old input */ 76 inp.archive (idx).real_path = 77 substr (old_input.archive_file (idx).name, 1, old_input.archive_file (idx).lng); 78 inp.archive (idx).uid = old_input.archive_file (idx).uid; 79 inp.archive (idx).dtm = old_input.archive_file (idx).dtm; 80 end; 81 82 inp.bindfilep = old_input.bindfilep; 83 inp.bindfile_bc = old_input.bindfile_bc; 84 inp.bindfile_name = substr (old_input.bindfile_name, 1, old_input.bindfile_name_lng); 85 call convert_date_to_binary_ ((old_input.bindfile_date_up), inp.bindfile_time_up, (0)); 86 call convert_date_to_binary_ ((old_input.bindfile_date_mod), inp.bindfile_time_mod, (0)); 87 inp.bindfile_idx = 1; /* All archive indices are faked to be one, even though */ 88 /* this may be incorrect, since the field must have some */ 89 /* value for certain error messages to work at all. */ 90 91 inp.options.debug = old_input.debug; 92 inp.options.list_seg = old_input.list_seg; 93 inp.options.map_opt = old_input.map_opt; 94 inp.options.list_opt = old_input.list_opt; 95 inp.options.brief_opt = old_input.brief_opt; 96 97 inp.obj (*).base = null (); /* Initialize certain values for all the input components */ 98 inp.obj (*).filename = ""; 99 100 time_now = clock (); 101 102 idx = 0; 103 do old_idx = 1 to old_input.nobj; /* Copy all meaningful values for real components */ 104 if old_input.obj (old_idx).bitcount > 0 then do; 105 idx = idx + 1; 106 inp.obj (idx).filename = old_input.obj (old_idx).filename; 107 inp.obj (idx).base = old_input.obj (old_idx).base; 108 inp.obj (idx).bitcount = old_input.obj (old_idx).bitcount; 109 inp.obj (idx).option = old_input.obj (old_idx).option; 110 inp.obj (idx).flag = old_input.obj (old_idx).flag; 111 112 inp.obj (idx).archive_idx = 1; /* To make messages work; same as for bindfile above */ 113 inp.obj (idx).time_mod = time_now; /* This is as valid as we can make it. They will all be */ 114 inp.obj (idx).time_up = time_now; /* the same, though they will all also be wrong */ 115 end; 116 end; 117 118 inp.nobj = idx; /* reset after tossing out zero-length segs */ 119 call bind_ (addr (inp)); /* Call the real interface */ 120 121 /* BEGIN INCLUDE FILE ... binder_input.incl.pl1 ... 01/14/81 W. Olin Sibert */ 1 2 /* Input structure for binder_. Modified to contain more useful information 01/14/81 */ 1 3 1 4 /* This file is used only by bind.pl1, bind_.pl1 and parse_bindfile_.pl1 */ 1 5 1 6 /* Modified 9/24/84 by M Sharpe to hold a few new flags (originally done 1 7* by Henry Bodzin, Ford Motor Co.), and to allow "unlimited" number of 1 8* input archives/segments and object components. */ 1 9 1 10 dcl 1 inp aligned based (inpp), /* Really based on bx_$inpp */ 1 11 2 version char (4) aligned, 1 12 2 caller_name char (32) unaligned, /* Name of command on whose behalf binder is being invoked */ 1 13 1 14 2 bound_seg_name char (32) unaligned, /* name of new bound segment */ 1 15 1 16 2 narc fixed bin, /* number of input archive files */ 1 17 2 nupd fixed bin, /* number of update archive files */ 1 18 2 ntotal fixed bin, /* total number of input and update files */ 1 19 2 nobj fixed bin, /* number of objects to be bound */ 1 20 1 21 2 bindfilep pointer, /* pointer to bindfile */ 1 22 2 bindfile_bc fixed bin (24), /* bitcount of bindfile */ 1 23 2 bindfile_name char (32) unaligned, /* name of bindfile */ 1 24 2 bindfile_time_up fixed bin (71), /* date updated in archive */ 1 25 2 bindfile_time_mod fixed bin (71), /* date last modified */ 1 26 2 bindfile_idx fixed bin, /* index of archive bindfile was in */ 1 27 1 28 2 options aligned, 1 29 3 debug bit (1) unaligned, /* 1-> debug option ON */ 1 30 3 list_seg bit (1) unaligned, /* 1 -> make list seg */ 1 31 3 map_opt bit (1) unaligned, /* 1 -> map option */ 1 32 3 list_opt bit (1) unaligned, /* 1 -> list option */ 1 33 3 brief_opt bit (1) unaligned, /* 1 -> brief option */ 1 34 3 force_order_opt bit (1) unaligned, /* 1 -> force_order option from command line */ 1 35 3 zeroseg_seen bit (1) unaligned, /* 1 -> a zero-length object is in the obj array */ 1 36 3 flags_pad bit(29) unaligned, 1 37 /* ---- any additions to the include file must be made before 1 38* the "archive" substructure, as inp.ntotal is incremented 1 39* and the structure is extended as we pick up the names of 1 40* archives/segs from the command line arguments. Similarly, 1 41* after inp.ntotal is determined, the "obj" substructure is 1 42* filled and inp.nobj is incremented as we open up each 1 43* archive and take the necessary information from the 1 44* components. To allocate the structure, the user must first 1 45* set NTOTAL and NOBJ, allocate the structure and then set 1 46* inp.notal and inp.nobj; otherwise, this structure must be 1 47* declared in a temporary segment. */ 1 48 1 49 2 archive (NTOTAL refer (inp.ntotal)) aligned, /* info about input archives/segs, for source map, etc. */ 1 50 3 path char (168) unaligned, /* for identifying archive */ 1 51 3 real_path char (168) unaligned, /* determined by translator_info_ */ 1 52 3 ptr pointer, /* pointer to archive */ 1 53 3 bc fixed bin (24), /* and its bitcount */ 1 54 3 standalone_seg bit (1) unaligned, /* 1 -> standalone_seg;0 -> archive */ 1 55 3 entryname char (32), /* entryname of segment */ 1 56 3 uid bit (36) aligned, /* unique id of archive */ 1 57 3 dtm fixed bin (71), /* date-time modified of archive */ 1 58 1 59 1 60 2 obj (NOBJ refer (inp.nobj)) aligned like obj; 1 61 1 62 1 63 dcl 1 obj aligned based (p), /* declaration of single input entry */ 1 64 2 filename char (32) unaligned, 1 65 2 base pointer, /* pointer to base of object segment */ 1 66 2 bitcount fixed bin (24), /* bitcount of object segment */ 1 67 2 option bit (18) unaligned, /* pointer into option structure */ 1 68 2 new_order fixed bin(9) unsigned unaligned, /* new position from XXX_Order statement */ 1 69 2 to_be_ignored bit(1) unaligned, /* mentioned in Ignore statement or is zero-length */ 1 70 2 objectname_stmt bit(1) unaligned, /* mentioned in objectname: statement */ 1 71 2 flag bit (1) unaligned, /* This word of unaligned bits ought to be a substructure, */ 1 72 2 pad bit (6) unaligned, /* but if it is, pl1 scope-of-names stupidly rejects refs */ 1 73 /* to obj.flag as "ambiguous", because of inp.obj.flag */ 1 74 2 archive_idx fixed bin, /* index of archive from which this component comes */ 1 75 2 time_mod fixed bin (71), /* DTCM of component (from archive) */ 1 76 2 time_up fixed bin (71); /* Time updated in archive */ 1 77 1 78 1 79 dcl BINDER_INPUT_VERSION_2 char (4) aligned internal static options (constant) init ("BI.2"); 1 80 dcl (NOBJ, NTOTAL) fixed bin init (0); 1 81 1 82 1 83 /* END INCLUDE FILE ... binder_input.incl.pl1 */ 121 122 123 end; /* Begin block */ 124 125 if inpp ^= null () then free inp in (inp_area); 126 return; /* All done */ 127 128 /* declaration of the binder's input structure Include file input.incl.pl1 */ 2 2 2 3 declare 1 inp based(inpp) aligned, /* argument structure for binder */ 2 4 2 bound_seg_name char(32) aligned, /* name of new bound segment */ 2 5 2 narc fixed bin, /* number of input archive files */ 2 6 2 nupd fixed bin, /* number of update archive files */ 2 7 2 archive_file(30) aligned, /* source map info */ 2 8 3 name char(168) aligned, /* pathnames of source archive files */ 2 9 3 lng fixed bin, /* relevant length of name in chars */ 2 10 3 uid bit(36) aligned, /* unique id of archive */ 2 11 3 dtm fixed bin(71), /* date-time modified of archive */ 2 12 2 bindfilep pointer, /* pointer to bindfile */ 2 13 2 bindfile_bc fixed bin, /* bitcount of bindfile */ 2 14 2 bindfile_name char(32) aligned, /* name of bindfile */ 2 15 2 bindfile_name_lng fixed bin, /* relevant length of name in chars */ 2 16 2 bindfile_date_up char(24) aligned, /* date updated in archive */ 2 17 2 bindfile_date_mod char(24) aligned, /* date last modified */ 2 18 2 debug bit(1) unaligned, /* 1-> debug option ON */ 2 19 2 list_seg bit(1) unaligned, /* 1 -> make list seg */ 2 20 2 map_opt bit(1) unaligned, /* 1 -> map option */ 2 21 2 list_opt bit(1) unaligned, /* 1 -> list option */ 2 22 2 brief_opt bit(1) unaligned, /* 1 -> brief option */ 2 23 2 flags_pad bit(31) unaligned, 2 24 2 nobj fixed bin, /* number of objects to be bound */ 2 25 2 obj(400), 2 26 3 filename char(32) aligned, 2 27 3 base pointer, /* pointer to base of object segment */ 2 28 3 bitcount fixed bin(24), /* bitcount of object segment */ 2 29 3 option bit(18) unaligned, /* pointer into option structure */ 2 30 3 flag bit(1) unaligned; 2 31 2 32 declare 1 obj aligned based(p), /* declaration of single input entry */ 2 33 2 filename char(32) aligned, 2 34 2 base pointer, 2 35 2 bitcount fixed bin(24), 2 36 2 option bit(18) unaligned, 2 37 2 flag bit(1) unaligned; 2 38 128 129 130 end binder_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 12/18/84 0836.8 binder_.pl1 >spec>online>6929-12/18/84>binder_.pl1 121 1 12/18/84 0839.4 binder_input.incl.pl1 >spec>online>6929-12/18/84>binder_input.incl.pl1 128 2 07/26/76 1911.6 input.incl.pl1 >ldd>include>input.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. BINDER_INPUT_VERSION_2 000000 constant char(4) initial dcl 1-79 ref 60 NOBJ 002114 automatic fixed bin(17,0) initial dcl 1-80 set ref 53* 54 54 1-80* NTOTAL 002115 automatic fixed bin(17,0) initial dcl 1-80 set ref 52* 54 54 1-80* P_old_input_ptr parameter pointer dcl 25 ref 11 52 52 53 63 65 66 67 67 68 76 76 78 79 82 83 84 84 85 86 91 92 93 94 95 103 104 106 107 108 109 110 archive 50 based structure array level 2 dcl 1-10 archive_file 12 based structure array level 2 dcl 27 archive_idx based fixed bin(17,0) array level 3 dcl 1-10 set ref 112* base based pointer array level 3 in structure "inp" dcl 1-10 in begin block on line 49 set ref 97* 107* base 2620 based pointer array level 3 in structure "old_input" dcl 27 in procedure "binder_" ref 107 bind_ 000010 constant entry external dcl 35 ref 119 bindfile_bc 30 based fixed bin(24,0) level 2 in structure "inp" dcl 1-10 in begin block on line 49 set ref 83* bindfile_bc 2560 based fixed bin(17,0) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 83 bindfile_date_mod 2600 based char(24) level 2 dcl 27 ref 86 bindfile_date_up 2572 based char(24) level 2 dcl 27 ref 85 bindfile_idx 46 based fixed bin(17,0) level 2 dcl 1-10 set ref 87* bindfile_name 2561 based char(32) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 84 bindfile_name 31 based char(32) level 2 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 84* bindfile_name_lng 2571 based fixed bin(17,0) level 2 dcl 27 ref 84 bindfile_time_mod 44 based fixed bin(71,0) level 2 dcl 1-10 set ref 86* bindfile_time_up 42 based fixed bin(71,0) level 2 dcl 1-10 set ref 85* bindfilep 2556 based pointer level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 82 bindfilep 26 based pointer level 2 in structure "inp" dcl 1-10 in begin block on line 49 set ref 82* bitcount based fixed bin(24,0) array level 3 in structure "inp" dcl 1-10 in begin block on line 49 set ref 108* bitcount 2622 based fixed bin(24,0) array level 3 in structure "old_input" dcl 27 in procedure "binder_" ref 104 108 bound_seg_name 11 based char(32) level 2 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 63* bound_seg_name based char(32) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 63 brief_opt 2606(04) based bit(1) level 2 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 95 brief_opt 47(04) based bit(1) level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 95* caller_name 1 based char(32) level 2 packed unaligned dcl 1-10 set ref 61* cleanup 002106 stack reference condition dcl 41 ref 46 clock builtin function dcl 39 ref 100 convert_date_to_binary_ 000012 constant entry external dcl 36 ref 85 86 debug 2606 based bit(1) level 2 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 91 debug 47 based bit(1) level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 91* dtm 212 based fixed bin(71,0) array level 3 in structure "inp" dcl 1-10 in begin block on line 49 set ref 79* dtm 66 based fixed bin(71,0) array level 3 in structure "old_input" dcl 27 in procedure "binder_" ref 79 filename 2610 based char(32) array level 3 in structure "old_input" dcl 27 in procedure "binder_" ref 106 filename based char(32) array level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 98* 106* flag based bit(1) array level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 110* flag 2623(18) based bit(1) array level 3 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 110 get_system_free_area_ 000014 constant entry external dcl 37 ref 51 idx 000104 automatic fixed bin(17,0) dcl 31 set ref 75* 76 76 76 78 78 79 79* 102* 105* 105 106 107 108 109 110 112 113 114 118 inp based structure level 1 dcl 2-3 in procedure "binder_" ref 47 125 inp based structure level 1 dcl 1-10 in begin block on line 49 set ref 54 58* 119 119 inp_area 000106 automatic area(1024) dcl 33 set ref 33* 47 51* 54 125 inpp 000100 automatic pointer dcl 29 set ref 45* 47 47 54* 58 60 61 63 65 66 67 68 71 72 73 75 76 78 79 82 83 84 85 86 87 91 92 93 94 95 97 98 106 107 108 109 110 112 113 114 118 119 119 125 125 list_opt 47(03) based bit(1) level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 94* list_opt 2606(03) based bit(1) level 2 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 94 list_seg 2606(01) based bit(1) level 2 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 92 list_seg 47(01) based bit(1) level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 92* lng 64 based fixed bin(17,0) array level 3 dcl 27 ref 76 map_opt 2606(02) based bit(1) level 2 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 93 map_opt 47(02) based bit(1) level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 93* name 12 based char(168) array level 3 dcl 27 ref 76 narc 21 based fixed bin(17,0) level 2 in structure "inp" dcl 1-10 in begin block on line 49 set ref 65* narc 10 based fixed bin(17,0) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 52 65 67 nobj 2607 based fixed bin(17,0) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 53 68 103 nobj 24 based fixed bin(17,0) level 2 in structure "inp" dcl 1-10 in begin block on line 49 set ref 54* 58 68* 97 98 118* ntotal 23 based fixed bin(17,0) level 2 dcl 1-10 set ref 54* 58 67* 71 72 73 75 97 98 106 107 108 109 110 112 113 114 null builtin function dcl 39 ref 45 47 73 97 125 nupd 11 based fixed bin(17,0) level 2 in structure "old_input" dcl 27 in procedure "binder_" ref 52 66 67 nupd 22 based fixed bin(17,0) level 2 in structure "inp" dcl 1-10 in begin block on line 49 set ref 66* obj based structure array level 2 in structure "inp" dcl 1-10 in begin block on line 49 obj based structure level 1 dcl 1-63 in begin block on line 49 obj 2610 based structure array level 2 in structure "old_input" dcl 27 in procedure "binder_" old_idx 000105 automatic fixed bin(17,0) dcl 31 set ref 103* 104 106 107 108 109 110* old_input based structure level 1 dcl 27 option 2623 based bit(18) array level 3 in structure "old_input" packed unaligned dcl 27 in procedure "binder_" ref 109 option based bit(18) array level 3 in structure "inp" packed unaligned dcl 1-10 in begin block on line 49 set ref 109* options 47 based structure level 2 dcl 1-10 path 50 based char(168) array level 3 packed unaligned dcl 1-10 set ref 71* ptr 174 based pointer array level 3 dcl 1-10 set ref 73* real_path 122 based char(168) array level 3 packed unaligned dcl 1-10 set ref 72* 76* substr builtin function dcl 39 ref 76 84 time_mod based fixed bin(71,0) array level 3 dcl 1-10 set ref 113* time_now 000102 automatic fixed bin(71,0) dcl 30 set ref 100* 113 114 time_up based fixed bin(71,0) array level 3 dcl 1-10 set ref 114* uid 65 based bit(36) array level 3 in structure "old_input" dcl 27 in procedure "binder_" ref 78 uid 210 based bit(36) array level 3 in structure "inp" dcl 1-10 in begin block on line 49 set ref 78* version based char(4) level 2 dcl 1-10 set ref 60* NAMES DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. obj based structure level 1 dcl 2-32 p automatic pointer dcl 29 NAME DECLARED BY EXPLICIT CONTEXT. binder_ 000017 constant entry external dcl 11 NAMES DECLARED BY CONTEXT OR IMPLICATION. addr builtin function ref 119 119 empty builtin function ref 33 unspec builtin function ref 58 STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 720 736 640 730 Length 1140 640 16 165 60 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME binder_ 1136 external procedure is an external procedure. on unit on line 46 64 on unit begin block on line 49 begin block shares stack frame of external procedure binder_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME binder_ 000100 inpp binder_ 000102 time_now binder_ 000104 idx binder_ 000105 old_idx binder_ 000106 inp_area binder_ 002114 NOBJ begin block on line 49 002115 NTOTAL begin block on line 49 THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. call_ext_out_desc call_ext_out return enable ext_entry int_entry alloc_based free_based empty clock THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. bind_ convert_date_to_binary_ get_system_free_area_ NO EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 11 000014 33 000024 45 000027 46 000031 47 000045 48 000054 1 80 000055 51 000057 52 000066 53 000074 54 000076 58 000115 60 000131 61 000133 63 000136 65 000144 66 000146 67 000150 68 000153 71 000155 72 000174 73 000212 75 000226 76 000235 78 000254 79 000257 80 000261 82 000263 83 000271 84 000275 85 000301 86 000326 87 000357 91 000362 92 000371 93 000375 94 000401 95 000405 97 000411 98 000433 100 000456 102 000460 103 000461 104 000473 105 000502 106 000503 107 000522 108 000530 109 000540 110 000546 112 000566 113 000574 114 000605 116 000613 118 000615 119 000620 125 000631 126 000637 ----------------------------------------------------------- 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