COMPILATION LISTING OF SEGMENT path Compiled by: Multics PL/I Compiler, Release 27d, of October 11, 1982 Compiled at: Honeywell LCPD Phoenix, System M Compiled on: 03/24/83 1503.9 mst Thu 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 path: proc; 12 13 /* U S E F U L A C T I V E F U N C T I O N S . 14* 15* 16* Adapted 11/19/72 by Robert S. Coren from code originally written 17* by Max G.Smith 18* Changed to work when called as commands, S. Herbst 08/31/78 19* Fix [unique 0] return value 06/10/80 S. Herbst 20* Short name dir added to directory 01/12/81 S. Herbst 21* Taught path about archive component pathnames 07/19/81 B. Margolin 22* Taught everything about archive component pathnames, added 23* the component and strip_component entrypoints, fixed some incorrect 24* external entry declarations (w/r/t alignedness of strings). 02/16/82 25* by B. Margolin. 26* Enhanced path (2-3 arg case) and added is_component_pathname and 27* entry_path. 02/19/82 by B. Margolin. 28* Modified path & cohorts so that a segment name with an embedded space 29* will not become two separate segments. 10/15/82 Linda Pugh. 30* Add shortest_path. 01/05/82 R. Harvey. 31* 32* [path a] The complete pathname of "a". 33* 34* [path a b] The complete pathname of "b" in directory "a". 35* 36* [path a b c] The complete pathname of component "c" in segment "b" 37* in directory "a". 38* 39* [directory a] The directory portion of the complete pathname of "a". 40* 41* [entry a] The entry portion of the complete pathname of "a". 42* 43* [component a] The archive component portion of the complete 44* pathname of "a", or [entry a] if "a" is not an archive component 45* pathname. 46* 47* [entry_path a] The complete pathname of the segment that "a" is 48* in. The same as [path a] if "a" is not an archive component pathname. 49* 50* [shortest_path a b c] The shortest pathname of component "c" in segment "b" 51* in directory "a". 52* 53* [strip a b] The complete pathname of "a" with the suffix ".b" 54* removed if it was present. 55* 56* [strip a] The complete pathname of "a" with the suffix 57* removed if there was more than one component. 58* 59* [strip_entry a b] Same as [entry [strip a b]]. 60* 61* [strip_entry a] Same as [entry [strip a]]. 62* 63* [strip_component a] Same as [strip_entry [component a]]. 64* 65* [strip_component a b] Same as [strip_entry [component a] b]. 66* 67* [suffix a] Null if [component a] has only one component; 68* otherwise, the last component. 69* 70* [is_component_pathname a] Returns "true" if a is an archive 71* component pathname. 72* 73* [unique] A 15-character unique idenifier. */ 74 75 /* Declarations. */ 76 77 dcl return_ptr ptr; 78 dcl return_string char (return_len) based (return_ptr) varying; 79 dcl return_len fixed bin; 80 81 dcl arg_ptr (3) ptr; 82 dcl arg_len (3) fixed bin; 83 dcl arg1 char (arg_len (1)) based (arg_ptr (1)); 84 dcl arg2 char (arg_len (2)) based (arg_ptr (2)); 85 dcl arg3 char (arg_len (3)) based (arg_ptr (3)); 86 87 dcl (dn, pn) char (202); 88 dcl char202 character (202) varying; 89 dcl (en, cn, who) char (32); 90 dcl b36 bit (36); 91 dcl af_sw bit (1); 92 dcl fb35 fixed bin (35); 93 dcl (i, j, colon_idx, arg_count) fixed; 94 dcl code fixed bin (35); 95 96 dcl error_table_$bad_conversion fixed binary (35) external; 97 dcl error_table_$not_act_fnc fixed bin (35) ext; 98 99 dcl cv_oct_check_ entry (char (*), fixed bin (35)) returns (fixed bin (35)); 100 dcl (active_fnc_err_, active_fnc_err_$suppress_name, 101 com_err_, com_err_$suppress_name, ioa_) entry options (variable); 102 dcl cu_$af_return_arg entry (fixed bin, ptr, fixed bin, fixed bin (35)); 103 dcl cu_$arg_ptr entry (fixed bin, ptr, fixed bin, fixed bin (35)); 104 dcl expand_pathname_$component entry (char (*), char (*), char (*), char (*), fixed bin (35)); 105 dcl get_shortest_path_ entry (char(*)) returns(char(168)); 106 dcl pathname_$component_check entry (char(*), char(*), char(*), char(*), fixed bin(35)); 107 dcl unique_chars_ ext entry (bit (*)) returns (char (15)); 108 dcl requote_string_ entry (char(*)) returns (char(*)); 109 dcl (addr, index, length, maxlength, reverse, rtrim, search, substr, unspec) builtin; 110 111 /* End of declarations. */ 112 /* */ 113 /* Here for [path a]. */ 114 115 call setup ("path", "", 1, 3, "0"b); 116 go to JOIN_SP; 117 118 119 120 121 /* Here for [shortest_path a]. */ 122 123 shortest_path: entry; 124 125 call setup ("shortest_path", "", 1, 3, "0"b); 126 127 128 JOIN_SP: if arg_count = 1 then go to JOIN_D; /* Simple case */ 129 130 if arg_count = 2 then call pathname_$component_check ((pn), arg2, "", pn, code); 131 else call pathname_$component_check ((pn), arg2, arg3, pn, code); 132 if code ^= 0 then call error (code, "Creating pathname."); 133 if who = "shortest_path" then return_string = rtrim (get_shortest_path_ (pn)); 134 else return_string = rtrim (pn); 135 go to FINISH; 136 137 138 139 140 141 /* Here for [directory a]. */ 142 143 directory: dir: entry; 144 145 call setup ("directory", en, 1, 1, "1"b); 146 pn = dn; 147 148 JOIN_D: if who = "shortest_path" then return_string = rtrim (get_shortest_path_ (pn)); 149 else return_string = rtrim (pn); 150 151 FINISH: if ^af_sw then call ioa_ ("^a", return_string); 152 else if who ^= "is_component_pathname" then; 153 return_string = requote_string_ ((return_string)); 154 155 RETURN: return; 156 157 158 159 160 161 /* Here for [entry a]. */ 162 163 entry: entry; 164 165 call setup ("entry", en, 1, 1, "1"b); 166 return_string = rtrim (en); 167 go to FINISH; 168 169 170 171 172 173 /* Here for [component a]. */ 174 175 component: entry; 176 177 call setup ("component", en, 1, 1, "1"b); 178 if cn ^= "" then return_string = rtrim (cn); 179 else return_string = rtrim (en); 180 go to FINISH; 181 182 183 184 185 186 /* Here for [is_component_pathname a] */ 187 188 is_component_pathname: 189 icpn: entry; 190 191 call setup ("is_component_pathname", en, 1, 1, "1"b); 192 if cn = "" then return_string = "false"; 193 else return_string = "true"; 194 go to FINISH; 195 196 197 198 199 /* Here for [entry_path a] */ 200 entry_path: 201 entry; 202 203 call setup ("entry_path", en, 1, 1, "1"b); 204 call pathname_$component_check (dn, en, "", pn, code); 205 if code ^= 0 then call error (code, "Forming pathname."); 206 return_string = rtrim (pn); 207 go to FINISH; 208 209 210 211 212 213 214 /* Here for [strip a] and [strip a b]. */ 215 216 strip: entry; 217 218 call setup ("strip", "", 1, 2, "0"b); 219 go to JOIN_R; 220 221 222 223 224 /* Here for [strip_component a] and [strip_component a b]. */ 225 226 strip_component: spc: 227 entry; 228 229 call setup ("strip_component", en, 1, 2, "1"b); 230 if cn = "" then pn = en; 231 else pn = cn; 232 go to JOIN_R; 233 234 235 236 237 /* Here for [strip_entry a] and [strip_entry a b]. */ 238 239 strip_entry: spe: entry; 240 241 call setup ("strip_entry", en, 1, 2, "1"b); 242 pn = en; 243 244 JOIN_R: if arg_count = 2 then go to TWO_ARGS; 245 246 /* Here for [strip a] and [strip_entry a]. */ 247 248 colon_idx = index (pn, "::"); 249 if colon_idx = 0 /* not archive */ 250 then j = length (pn) + 1 - search (reverse (pn), ".>"); 251 else j = length (pn) + 1 - 252 index (reverse (substr (pn, colon_idx + 2)), "."); 253 if j = length (pn) + 1 | j = 1 | substr (pn, j, 1) = ">" then return_string = rtrim (pn); 254 else return_string = substr (pn, 1, j - 1); 255 go to FINISH; 256 257 /* Here for [strip a b] and [strip_entry a b]. */ 258 259 TWO_ARGS: i = length (rtrim (pn)); 260 return_string = rtrim (pn); 261 if i > arg_len (2) then 262 if substr (pn, i - arg_len (2)) = "." || arg2 then 263 return_string = substr (pn, 1, i - arg_len (2) - 1); 264 go to FINISH; 265 266 267 268 269 270 /* Here for [suffix a]. */ 271 272 suffix: entry; 273 274 call setup ("suffix", en, 1, 1, "1"b); 275 if cn ^= "" then en = cn; 276 i = 33-index (reverse (en), "."); 277 if i = 33 then return_string = ""; 278 else if i >= length (rtrim (en)) then return_string = ""; 279 else return_string = rtrim (substr (en, i+1)); 280 go to FINISH; 281 282 283 284 285 286 /* Here for [unique]. */ 287 288 unique: entry; 289 290 who = "unique"; 291 call cu_$af_return_arg (arg_count, return_ptr, return_len, code); 292 if code = error_table_$not_act_fnc then do; 293 af_sw = "0"b; 294 return_ptr = addr (char202); 295 return_len = 202; 296 end; 297 else af_sw = "1"b; 298 if arg_count ^= 0 then do; 299 if arg_count ^= 1 then do; 300 if af_sw then call active_fnc_err_$suppress_name 301 (0, "unique", "Usage: [unique {octal_number}]"); 302 else call com_err_$suppress_name (0, "unique", "Usage: unique {octal_number}"); 303 go to RETURN; 304 end; 305 call cu_$arg_ptr (1, arg_ptr (1), arg_len (1), code); 306 fb35 = cv_oct_check_ (arg1, code); 307 if code ^= 0 then do; 308 call error (error_table_$bad_conversion, (arg1)); 309 end; 310 if fb35 = 0 then do; 311 return_string = "!BBBBBBBBBBBBBB"; 312 go to FINISH; 313 end; 314 b36 = unspec (fb35); 315 end; 316 else b36 = ""b; 317 return_string = unique_chars_ (b36); 318 go to FINISH; 319 320 321 322 323 setup: proc (string, a_en, min_arg, max_arg, ret); 324 325 /* Internal function to.. 326* (1) Set the name of the active function in 'who'. 327* (2) Verify that there are the proper number of arguments 328* (as defined by min_arg and max_arg). 329* (3) Expand the first argument into the parts of a full pathname. 330* (4) If ret is set, then put the entryname in a_en, the output 331* argument, else set pn to the the full pathname. 332* 333* (yes, I know this interface is horrible, but that's the way I 334* found it, and I didn't feel like rewriting it -- Barmar) 335* */ 336 337 338 dcl string char (*); 339 dcl a_en char (*); 340 dcl en char (32); 341 dcl (min_arg, max_arg) fixed bin; 342 dcl ret bit (1); /* should we return a value? */ 343 344 who = string; 345 call cu_$af_return_arg (arg_count, return_ptr, return_len, code); 346 if code = error_table_$not_act_fnc then do; 347 af_sw = "0"b; 348 return_ptr = addr (char202); 349 return_len = maxlength (char202); 350 end; 351 else af_sw = "1"b; 352 353 if arg_count < min_arg | arg_count > max_arg then do; 354 if af_sw then call active_fnc_err_$suppress_name (0, string, 355 "Usage: [^a ^[path^;path {string}^;path {string1 {string2}}^]]", 356 string, max_arg); 357 else call com_err_$suppress_name (0, string, 358 "Usage: ^a ^[path^;path {string}^;path {string1 {string2}}^]", 359 string, max_arg); 360 go to RETURN; 361 end; 362 363 /* pick up input args */ 364 365 do i = 1 to arg_count; 366 call cu_$arg_ptr (i, arg_ptr (i), arg_len (i), code); 367 if code ^= 0 then 368 BAD_ARGS: call error (code, ""); 369 end; 370 call expand_pathname_$component (arg1, dn, en, cn, code); 371 if code ^= 0 then call error (code, (arg1)); 372 if ^ret then do; 373 call pathname_$component_check (dn, en, cn, pn, code); 374 if code ^= 0 then call error (code, (arg1)); 375 end; 376 else a_en = en; 377 378 end setup; 379 380 381 382 383 error: proc (acode, string); 384 385 /* Internal procedure to print error messages and exit */ 386 387 dcl acode fixed bin (35), string char (*); 388 389 if af_sw then call active_fnc_err_ (acode, who, string); 390 else call com_err_ (acode, who, string); 391 go to RETURN; 392 393 end error; 394 395 end path; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 03/24/83 1443.7 path.pl1 >spec>on>03/24/83>path.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. a_en parameter char unaligned dcl 339 set ref 323 376* acode parameter fixed bin(35,0) dcl 387 set ref 383 389* 390* active_fnc_err_ 000016 constant entry external dcl 100 ref 389 active_fnc_err_$suppress_name 000020 constant entry external dcl 100 ref 300 354 addr builtin function dcl 109 ref 294 348 af_sw 000400 automatic bit(1) unaligned dcl 91 set ref 151 293* 297* 300 347* 351* 354 389 arg1 based char unaligned dcl 83 set ref 306* 308 370* 371 374 arg2 based char unaligned dcl 84 set ref 130* 131* 261 arg3 based char unaligned dcl 85 set ref 131* arg_count 000405 automatic fixed bin(17,0) dcl 93 set ref 128 130 244 291* 298 299 345* 353 353 365 arg_len 000112 automatic fixed bin(17,0) array dcl 82 set ref 130 130 131 131 131 131 261 261 261 261 305* 306 306 308 366* 370 370 371 374 arg_ptr 000104 automatic pointer array dcl 81 set ref 130 131 131 261 305* 306 308 366* 370 371 374 b36 000377 automatic bit(36) unaligned dcl 90 set ref 314* 316* 317* char202 000263 automatic varying char(202) dcl 88 set ref 294 348 349 cn 000357 automatic char(32) unaligned dcl 89 set ref 178 178 192 230 231 275 275 370* 373* code 000406 automatic fixed bin(35,0) dcl 94 set ref 130* 131* 132 132* 204* 205 205* 291* 292 305* 306* 307 345* 346 366* 367 367* 370* 371 371* 373* 374 374* colon_idx 000404 automatic fixed bin(17,0) dcl 93 set ref 248* 249 251 com_err_ 000022 constant entry external dcl 100 ref 390 com_err_$suppress_name 000024 constant entry external dcl 100 ref 302 357 cu_$af_return_arg 000030 constant entry external dcl 102 ref 291 345 cu_$arg_ptr 000032 constant entry external dcl 103 ref 305 366 cv_oct_check_ 000014 constant entry external dcl 99 ref 306 dn 000115 automatic char(202) unaligned dcl 87 set ref 146 204* 370* 373* en 000347 automatic char(32) unaligned dcl 89 in procedure "path" set ref 145* 165* 166 177* 179 191* 203* 204* 229* 230 241* 242 274* 275* 276 278 279 en 000416 automatic char(32) unaligned dcl 340 in procedure "setup" set ref 370* 373* 376 error_table_$bad_conversion 000010 external static fixed bin(35,0) dcl 96 set ref 308* error_table_$not_act_fnc 000012 external static fixed bin(35,0) dcl 97 ref 292 346 expand_pathname_$component 000034 constant entry external dcl 104 ref 370 fb35 000401 automatic fixed bin(35,0) dcl 92 set ref 306* 310 314 get_shortest_path_ 000036 constant entry external dcl 105 ref 133 148 i 000402 automatic fixed bin(17,0) dcl 93 set ref 259* 261 261 261 276* 277 278 279 365* 366* 366 366* index builtin function dcl 109 ref 248 251 276 ioa_ 000026 constant entry external dcl 100 ref 151 j 000403 automatic fixed bin(17,0) dcl 93 set ref 249* 251* 253 253 253 254 length builtin function dcl 109 ref 249 251 253 259 278 max_arg parameter fixed bin(17,0) dcl 341 set ref 323 353 354* 357* maxlength builtin function dcl 109 ref 349 min_arg parameter fixed bin(17,0) dcl 341 ref 323 353 pathname_$component_check 000040 constant entry external dcl 106 ref 130 131 204 373 pn 000200 automatic char(202) unaligned dcl 87 set ref 130 130* 131 131* 133* 134 146* 148* 149 204* 206 230* 231* 242* 248 249 249 251 251 253 253 253 254 259 260 261 261 373* requote_string_ 000044 constant entry external dcl 108 ref 153 ret parameter bit(1) unaligned dcl 342 ref 323 372 return_len 000102 automatic fixed bin(17,0) dcl 79 set ref 133 134 148 149 151 153 166 178 179 192 193 206 253 254 260 261 277 278 279 291* 295* 311 317 345* 349* return_ptr 000100 automatic pointer dcl 77 set ref 133 134 148 149 151 153 153 166 178 179 192 193 206 253 254 260 261 277 278 279 291* 294* 311 317 345* 348* return_string based varying char dcl 78 set ref 133* 134* 148* 149* 151* 153* 153 166* 178* 179* 192* 193* 206* 253* 254* 260* 261* 277* 278* 279* 311* 317* reverse builtin function dcl 109 ref 249 251 276 rtrim builtin function dcl 109 ref 133 134 148 149 166 178 179 206 253 259 260 278 279 search builtin function dcl 109 ref 249 string parameter char unaligned dcl 338 in procedure "setup" set ref 323 344 354* 354* 357* 357* string parameter char unaligned dcl 387 in procedure "error" set ref 383 389* 390* substr builtin function dcl 109 ref 251 253 254 261 261 279 unique_chars_ 000042 constant entry external dcl 107 ref 317 unspec builtin function dcl 109 ref 314 who 000367 automatic char(32) unaligned dcl 89 set ref 133 148 152 290* 344* 389* 390* NAMES DECLARED BY EXPLICIT CONTEXT. BAD_ARGS 002417 constant label dcl 367 FINISH 000606 constant label dcl 151 ref 135 167 180 194 207 255 264 280 312 318 JOIN_D 000522 constant label dcl 148 ref 128 JOIN_R 001372 constant label dcl 244 ref 219 232 JOIN_SP 000250 constant label dcl 128 ref 116 RETURN 000703 constant label dcl 155 ref 303 360 391 TWO_ARGS 001515 constant label dcl 259 ref 244 component 000750 constant entry external dcl 175 dir 000466 constant entry external dcl 143 directory 000475 constant entry external dcl 143 entry 000706 constant entry external dcl 163 entry_path 001125 constant entry external dcl 200 error 002613 constant entry internal dcl 383 ref 132 205 308 367 371 374 icpn 001042 constant entry external dcl 188 is_component_pathname 001051 constant entry external dcl 188 path 000204 constant entry external dcl 11 setup 002207 constant entry internal dcl 323 ref 115 125 145 165 177 191 203 218 229 241 274 shortest_path 000226 constant entry external dcl 123 spc 001270 constant entry external dcl 226 spe 001336 constant entry external dcl 239 strip 001246 constant entry external dcl 216 strip_component 001277 constant entry external dcl 226 strip_entry 001345 constant entry external dcl 239 suffix 001610 constant entry external dcl 272 unique 001722 constant entry external dcl 288 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 3764 4032 3436 3774 Length 4266 3436 46 220 325 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME path 420 external procedure is an external procedure. setup internal procedure shares stack frame of external procedure path. error 80 internal procedure is called during a stack extension. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME path 000100 return_ptr path 000102 return_len path 000104 arg_ptr path 000112 arg_len path 000115 dn path 000200 pn path 000263 char202 path 000347 en path 000357 cn path 000367 who path 000377 b36 path 000400 af_sw path 000401 fb35 path 000402 i path 000403 j path 000404 colon_idx path 000405 arg_count path 000406 code path 000416 en setup THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. alloc_cs call_ext_out_desc call_ext_out call_int_this_desc return tra_ext shorten_stack ext_entry int_entry_desc THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. active_fnc_err_ active_fnc_err_$suppress_name com_err_ com_err_$suppress_name cu_$af_return_arg cu_$arg_ptr cv_oct_check_ expand_pathname_$component get_shortest_path_ ioa_ pathname_$component_check requote_string_ unique_chars_ THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_conversion error_table_$not_act_fnc LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 11 000203 115 000211 116 000224 123 000225 125 000233 128 000250 130 000253 131 000315 132 000357 133 000400 134 000443 135 000464 143 000465 145 000502 146 000517 148 000522 149 000565 151 000606 152 000634 153 000640 155 000703 163 000705 165 000713 166 000725 167 000746 175 000747 177 000755 178 000771 179 001017 180 001040 188 001041 191 001056 192 001074 193 001112 194 001123 200 001124 203 001132 204 001147 205 001177 206 001223 207 001244 216 001245 218 001253 219 001266 226 001267 229 001304 230 001321 231 001331 232 001334 239 001335 241 001352 242 001367 244 001372 248 001375 249 001406 251 001425 253 001447 254 001503 255 001514 259 001515 260 001527 261 001541 264 001605 272 001607 274 001615 275 001627 276 001636 277 001652 278 001656 279 001673 280 001720 288 001721 290 001727 291 001732 292 001747 293 001753 294 001754 295 001756 296 001760 297 001761 298 001763 299 001765 300 001767 302 002020 303 002046 305 002047 306 002065 307 002110 308 002112 309 002137 310 002140 311 002142 312 002153 314 002154 315 002156 316 002157 317 002160 318 002206 323 002207 344 002225 345 002233 346 002250 347 002254 348 002255 349 002257 350 002261 351 002262 353 002264 354 002272 357 002332 360 002367 365 002370 366 002376 367 002415 369 002433 370 002435 371 002470 372 002516 373 002525 374 002554 375 002602 376 002604 378 002611 383 002612 389 002626 390 002653 391 002674 ----------------------------------------------------------- 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