COMPILATION LISTING OF SEGMENT cv_integer_string_ Compiled by: Multics PL/I Compiler, Release 32f, of October 9, 1989 Compiled at: Bull HN, Phoenix AZ, System-M Compiled on: 11/11/89 1007.0 mst Sat Options: optimize map 1 /****^ *********************************************************** 2* * * 3* * Copyright, (C) Honeywell Bull Inc., 1987 * 4* * * 5* * Copyright, (C) Honeywell Information Systems Inc., 1984 * 6* * * 7* *********************************************************** */ 8 /* routines to convert strings to integers */ 9 /* Written May 1984 by Chris Jones */ 10 /* Modified November 1984 by Keith Loepere to explictly validate radix base. 11* (avoids signalling condition in bce). Also for negative octal values. */ 12 /* format: style4,delnl,insnl,indattr,ifthen,dclind10 */ 13 cv_integer_string_: 14 proc (p_string, p_default_base) returns (fixed bin (35)) options (support); 15 16 dcl p_string char (*) parameter; /* (I) string to be converted */ 17 dcl p_default_base fixed bin parameter; /* (I) base to use if none is specified */ 18 dcl p_code fixed bin (35) parameter; /* (O) system status code */ 19 20 dcl base fixed bin; 21 dcl char_idx fixed bin; 22 dcl check_entry bit (1) aligned; 23 dcl digit fixed bin; 24 dcl negative bit (1) aligned; /* set if the result is to be negative */ 25 dcl reason char (128); 26 dcl result fixed bin (71); 27 dcl return_result fixed bin (35); 28 29 dcl digits_string char (digits_string_length) based (digits_string_ptr); 30 dcl digits_string_ptr ptr; 31 dcl digits_string_length fixed bin (21); 32 33 dcl MINUS_SIGN char (1) static options (constant) init ("-"); 34 dcl PLUS_SIGN char (1) static options (constant) init ("+"); 35 dcl UNDERSCORE char (1) static options (constant) init ("_"); 36 dcl WHITESPACE char (2) static options (constant) init (" "); 37 /* SP HT */ 38 dcl VALID_DECIMAL_DIGITS char (10) static options (constant) init ("0123456789"); 39 dcl VALID_DIGITS char (22) static options (constant) init ("0123456789AaBbCcDdEeFf"); 40 dcl digit_value (22) fixed bin static options (constant) 41 init (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15); 42 43 dcl RADIX_INDICATORS char (4) static options (constant) init ("bodx"); 44 dcl RADIX_INDICATORS_UPPER_CASE 45 char (4) static options (constant) init ("BODX"); 46 dcl base_values (4) fixed bin static options (constant) init (2, 8, 10, 16); 47 48 dcl error_table_$bad_conversion 49 fixed bin (35) ext static; 50 51 dcl (addcharno, addr, convert, index, length, null, reverse, search, string, substr, translate, 52 unspec, verify) builtin; 53 54 dcl (conversion, fixedoverflow) 55 condition; 56 57 dcl signal_ entry () options (variable); 58 59 check_entry = "0"b; 60 goto COMMON; 61 62 cv_integer_string_check_: 63 entry (p_string, p_default_base, p_code) returns (fixed bin (35)); 64 65 check_entry = "1"b; 66 on conversion, fixedoverflow go to BADNUM; 67 68 COMMON: 69 digits_string_length = length (p_string); /* setup to point at string */ 70 digits_string_ptr = addr (p_string); 71 call trim_whitespace; 72 73 if substr (digits_string, 1, 1) = MINUS_SIGN then do; 74 negative = "1"b; 75 call adjust_from_left (1); 76 call trim_whitespace; 77 end; 78 else if substr (digits_string, 1, 1) = PLUS_SIGN then do; 79 negative = "0"b; 80 call adjust_from_left (1); 81 call trim_whitespace; 82 end; 83 else negative = "0"b; /* implicit positive number */ 84 85 call get_base; 86 87 result = 0; 88 do char_idx = 1 to length (digits_string); 89 digit = digit_value (index (VALID_DIGITS, substr (digits_string, char_idx, 1))); 90 result = result * base + digit; 91 end; 92 if negative then 93 result = -result; 94 if check_entry then 95 p_code = 0; 96 97 if result < -34359738368 /* 2**35 (max for fixed bin (35)) */ 98 | result > 68719476735 /* 2**36-1 (max for fixed bin (36) unsigned) */ 99 then do; 100 reason = "The converted string does not fit in 36 bits."; 101 go to BADNUM; 102 end; 103 104 /* The above, plus the unspec assignment below, is to allow the input of 105* (mostly octal) values up to 777777777777o. */ 106 107 unspec (return_result) = substr (unspec (result), 37, 36); 108 return (return_result); 109 110 get_base: 111 proc; 112 113 /**** This is actually where the most interesting work takes place. If no radix indicator exists to tell us otherwise, 114* we'll use the default base. Radix indicators can be specified by a single character (b, o, d, x), or by the 115* construct r (). Both are optionally preceded by an underscore. 116* If there's a possibility that a character is a valid digit as well as a radix indicator (as is the case with 117* b and d with a base of 16), we assume the character is a digit. ****/ 118 119 dcl radix_string char (radix_string_length) based (radix_string_ptr); 120 dcl radix_string_ptr ptr; 121 dcl radix_string_length fixed bin (21); 122 123 dcl radix_char char (1); 124 dcl radix_char_valid bit (1) aligned; 125 126 base = p_default_base; /* start out assuming there's no radix indicator */ 127 char_idx = search (reverse (digits_string), "Rr"); 128 if char_idx ^= 0 then do; /* there MUST be a radix indicator */ 129 radix_string_ptr = addcharno (digits_string_ptr, digits_string_length - char_idx + 1); 130 radix_string_length = char_idx - 1; 131 call adjust_from_right (char_idx); 132 if substr (digits_string, length (digits_string), 1) = UNDERSCORE then 133 call adjust_from_right (1); 134 if verify (radix_string, VALID_DECIMAL_DIGITS) > 0 then 135 go to BADNUM; 136 base = convert (base, radix_string); 137 end; 138 else do; 139 radix_char = 140 translate (substr (digits_string, length (digits_string), 1), RADIX_INDICATORS, 141 RADIX_INDICATORS_UPPER_CASE); 142 if search (RADIX_INDICATORS, radix_char) ^= 0 then do; 143 /* this MIGHT be a radix character */ 144 if substr (digits_string, length (digits_string) - 1, 1) = UNDERSCORE then do; 145 call adjust_from_right (2); /* strip off the underscore and indicator */ 146 radix_char_valid = "1"b; 147 end; 148 else do; 149 if (base <= 10) | (base <= 12 & radix_char ^= "b") 150 | (base <= 14 & radix_char ^= "b" & radix_char ^= "d") then do; 151 call adjust_from_right (1); 152 radix_char_valid = "1"b; 153 end; 154 else radix_char_valid = "0"b; 155 end; 156 if radix_char_valid then 157 base = base_values (search (RADIX_INDICATORS, radix_char)); 158 end; 159 end; 160 161 if base < 2 | base > 16 then do; 162 reason = "The base is not in the range 2-16."; 163 goto BADNUM; 164 end; 165 if base <= 10 then 166 char_idx = base; 167 else char_idx = base + base - 10; 168 if verify (digits_string, substr (VALID_DIGITS, 1, char_idx)) ^= 0 then do; 169 reason = "The string contains invalid digits."; 170 goto BADNUM; 171 end; 172 173 end get_base; 174 175 BADNUM: 176 if check_entry then do; 177 p_code = error_table_$bad_conversion; 178 return (0); 179 end; 180 else begin options (non_quick); 181 182 dcl 1 auto_pl1_info like pl1_info; 183 184 dcl size builtin; 185 186 pl1_info_ptr = addr (auto_pl1_info); 187 unspec (pl1_info.header) = ""b; 188 pl1_info.header.length = size (pl1_info); 189 pl1_info.header.version = 1; 190 pl1_info.header.action_flags.cant_restart = "1"b; 191 pl1_info.header.info_string = reason; 192 pl1_info.header.status_code = error_table_$bad_conversion; 193 194 pl1_info.id = "pliocond"; 195 string (pl1_info.content_flags) = ""b; 196 pl1_info.oncode_sw = "1"b; 197 pl1_info.oncode = 720; /* see oncode_messages_ */ 198 pl1_info.onsource_sw = "1"b; 199 pl1_info.onsource = p_string; 200 call signal_ ("conversion", null (), pl1_info_ptr); 201 return (0); 202 end; 203 204 trim_whitespace: 205 proc; 206 207 char_idx = verify (digits_string, WHITESPACE); 208 if char_idx = 0 then do; 209 reason = "The string consists only of whitespace."; 210 goto BADNUM; /* consisted only of whitespace characters */ 211 end; 212 call adjust_from_left (char_idx - 1); 213 char_idx = verify (reverse (digits_string), WHITESPACE); 214 if char_idx = 0 then do; 215 reason = "The string consists only of whitespace."; 216 goto BADNUM; 217 end; 218 call adjust_from_right (char_idx - 1); 219 call quit_if_empty_string; 220 221 end trim_whitespace; 222 223 quit_if_empty_string: 224 proc; 225 226 if digits_string_length = 0 then do; 227 reason = "There are no digits to process."; 228 goto BADNUM; 229 end; 230 231 end quit_if_empty_string; 232 233 adjust_from_left: 234 proc (count); 235 236 dcl count fixed bin parameter; 237 238 digits_string_ptr = addcharno (digits_string_ptr, count); 239 240 adjust_from_right: 241 entry (count); 242 243 digits_string_length = digits_string_length - count; 244 245 end adjust_from_left; 246 1 1 /* BEGIN INCLUDE FILE ... pl1_info.incl.pl1 */ 1 2 /* This is intended to be used by all procedures raising pl1 conditions and by the default handler */ 1 3 /* Created June 1981 by Benson I. Margulies from pl1_info_struc.incl.pl1 */ 1 4 /* This include file must be used with condition_info_header.incl.pl1. Both must be %included */ 1 5 1 6 declare pl1_info_ptr pointer; 1 7 declare 1 pl1_info aligned based (pl1_info_ptr), 1 8 2 header aligned like condition_info_header, 1 9 2 id char(8) aligned, /* init "pliocond"; indicates pl1 structure */ 1 10 2 content_flags aligned, 1 11 (3 v1_sw, /* on if raised by version 1 */ 1 12 3 oncode_sw, /* "1"b->valid oncode */ 1 13 3 onfile_sw, /* "1"b->file name is in structure */ 1 14 3 file_ptr_sw, /* "1"b->file is associated with this condition */ 1 15 3 onsource_sw, /* "1"b->valid onsource string for this condition */ 1 16 3 onchar_sw, /* "1"b->valid onchar index in this structure */ 1 17 3 onkey_sw, /* "1"b->valid onkey string in this structure */ 1 18 3 onfield_sw) bit(1) unaligned, /* "1"b->valid onfield string in this structure */ 1 19 2 oncode fixed bin(35), /* oncode for condition */ 1 20 2 onfile char(32) aligned, /* onfile string */ 1 21 2 file_ptr ptr, /* pointer to file value */ 1 22 2 onsource char(256) var, /* onsource string */ 1 23 2 oncharindex fixed bin, /* char offset in onsource of offending char */ 1 24 2 onkey_onfield char(256) var; /* either onkey string or onfield string */ 1 25 1 26 /* END INCLUDE FILE ... pl1_info.incl.pl1 */ 247 2 1 /* BEGIN INCLUDE FILE condition_info_header.incl.pl1 BIM 1981 */ 2 2 /* format: style2 */ 2 3 2 4 declare condition_info_header_ptr 2 5 pointer; 2 6 declare 1 condition_info_header 2 7 aligned based (condition_info_header_ptr), 2 8 2 length fixed bin, /* length in words of this structure */ 2 9 2 version fixed bin, /* version number of this structure */ 2 10 2 action_flags aligned, /* tell handler how to proceed */ 2 11 3 cant_restart bit (1) unaligned, /* caller doesn't ever want to be returned to */ 2 12 3 default_restart bit (1) unaligned, /* caller can be returned to with no further action */ 2 13 3 quiet_restart bit (1) unaligned, /* return, and print no message */ 2 14 3 support_signal bit (1) unaligned, /* treat this signal as if the signalling procedure had the support bit set */ 2 15 /* if the signalling procedure had the support bit set, do the same for its caller */ 2 16 3 pad bit (32) unaligned, 2 17 2 info_string char (256) varying, /* may contain printable message */ 2 18 2 status_code fixed bin (35); /* if^=0, code interpretable by com_err_ */ 2 19 2 20 /* END INCLUDE FILE condition_info_header.incl.pl1 */ 248 249 250 end cv_integer_string_; SOURCE FILES USED IN THIS COMPILATION. LINE NUMBER DATE MODIFIED NAME PATHNAME 0 11/11/89 0803.9 cv_integer_string_.pl1 >spec>install>1110>cv_integer_string_.pl1 247 1 07/18/81 1100.0 pl1_info.incl.pl1 >ldd>include>pl1_info.incl.pl1 248 2 03/24/82 1347.2 condition_info_header.incl.pl1 >ldd>include>condition_info_header.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. MINUS_SIGN constant char(1) initial packed unaligned dcl 33 ref 73 PLUS_SIGN constant char(1) initial packed unaligned dcl 34 ref 78 RADIX_INDICATORS 000005 constant char(4) initial packed unaligned dcl 43 ref 139 142 156 RADIX_INDICATORS_UPPER_CASE 000004 constant char(4) initial packed unaligned dcl 44 ref 139 UNDERSCORE 002070 constant char(1) initial packed unaligned dcl 35 ref 132 144 VALID_DECIMAL_DIGITS 000042 constant char(10) initial packed unaligned dcl 38 ref 134 VALID_DIGITS 000034 constant char(22) initial packed unaligned dcl 39 ref 89 168 WHITESPACE constant char(2) initial packed unaligned dcl 36 ref 207 213 action_flags 2 based structure level 3 dcl 1-7 addcharno builtin function dcl 51 ref 129 238 addr builtin function dcl 51 ref 70 186 auto_pl1_info 000100 automatic structure level 1 unaligned dcl 182 set ref 186 base 000100 automatic fixed bin(17,0) dcl 20 set ref 90 126* 136* 136 149 149 149 156* 161 161 165 165 167 167 base_values 000000 constant fixed bin(17,0) initial array dcl 46 ref 156 cant_restart 2 based bit(1) level 4 packed packed unaligned dcl 1-7 set ref 190* char_idx 000101 automatic fixed bin(17,0) dcl 21 set ref 88* 89* 127* 128 129 130 131* 165* 167* 168 207* 208 212 213* 214 218 check_entry 000102 automatic bit(1) dcl 22 set ref 59* 65* 94 175 condition_info_header based structure level 1 dcl 2-6 content_flags 107 based structure level 2 dcl 1-7 set ref 195* conversion 000156 stack reference condition dcl 54 ref 66 convert builtin function dcl 51 ref 136 count parameter fixed bin(17,0) dcl 236 ref 233 238 240 243 digit 000103 automatic fixed bin(17,0) dcl 23 set ref 89* 90 digit_value 000006 constant fixed bin(17,0) initial array dcl 40 ref 89 digits_string based char packed unaligned dcl 29 ref 73 78 88 89 127 132 132 139 139 144 144 168 207 213 digits_string_length 000154 automatic fixed bin(21,0) dcl 31 set ref 68* 73 78 88 89 127 129 132 132 139 139 144 144 168 207 213 226 243* 243 digits_string_ptr 000152 automatic pointer dcl 30 set ref 70* 73 78 88 89 127 129 132 132 139 139 144 144 168 207 213 238* 238 error_table_$bad_conversion 000010 external static fixed bin(35,0) dcl 48 ref 177 192 fixedoverflow 000164 stack reference condition dcl 54 ref 66 header based structure level 2 dcl 1-7 set ref 187* id 105 based char(8) level 2 dcl 1-7 set ref 194* index builtin function dcl 51 ref 89 info_string 3 based varying char(256) level 3 dcl 1-7 set ref 191* length based fixed bin(17,0) level 3 in structure "pl1_info" dcl 1-7 in procedure "cv_integer_string_" set ref 188* length builtin function dcl 51 in procedure "cv_integer_string_" ref 68 88 132 139 144 negative 000104 automatic bit(1) dcl 24 set ref 74* 79* 83* 92 null builtin function dcl 51 ref 200 200 oncode 110 based fixed bin(35,0) level 2 dcl 1-7 set ref 197* oncode_sw 107(01) based bit(1) level 3 packed packed unaligned dcl 1-7 set ref 196* onsource 124 based varying char(256) level 2 dcl 1-7 set ref 199* onsource_sw 107(04) based bit(1) level 3 packed packed unaligned dcl 1-7 set ref 198* p_code parameter fixed bin(35,0) dcl 18 set ref 62 94* 177* p_default_base parameter fixed bin(17,0) dcl 17 ref 13 62 126 p_string parameter char packed unaligned dcl 16 set ref 13 62 68 70 199 pl1_info based structure level 1 dcl 1-7 set ref 188 pl1_info_ptr 000172 automatic pointer dcl 1-6 set ref 186* 187 188 188 189 190 191 192 194 195 196 197 198 199 200* radix_char 000211 automatic char(1) packed unaligned dcl 123 set ref 139* 142 149 149 149 156 radix_char_valid 000212 automatic bit(1) dcl 124 set ref 146* 152* 154* 156 radix_string based char packed unaligned dcl 119 ref 134 136 radix_string_length 000210 automatic fixed bin(21,0) dcl 121 set ref 130* 134 136 radix_string_ptr 000206 automatic pointer dcl 120 set ref 129* 134 136 reason 000105 automatic char(128) packed unaligned dcl 25 set ref 100* 162* 169* 191 209* 215* 227* result 000146 automatic fixed bin(71,0) dcl 26 set ref 87* 90* 90 92* 92 97 97 107 return_result 000150 automatic fixed bin(35,0) dcl 27 set ref 107* 108 reverse builtin function dcl 51 ref 127 213 search builtin function dcl 51 ref 127 142 156 signal_ 000012 constant entry external dcl 57 ref 200 size builtin function dcl 184 ref 188 status_code 104 based fixed bin(35,0) level 3 dcl 1-7 set ref 192* string builtin function dcl 51 set ref 195* substr builtin function dcl 51 ref 73 78 89 107 132 139 144 168 translate builtin function dcl 51 ref 139 unspec builtin function dcl 51 set ref 107* 107 187* verify builtin function dcl 51 ref 134 168 207 213 version 1 based fixed bin(17,0) level 3 dcl 1-7 set ref 189* NAME DECLARED BY DECLARE STATEMENT AND NEVER REFERENCED. condition_info_header_ptr automatic pointer dcl 2-4 NAMES DECLARED BY EXPLICIT CONTEXT. BADNUM 000403 constant label dcl 175 ref 66 101 134 163 170 210 216 228 COMMON 000261 constant label dcl 68 ref 60 adjust_from_left 001030 constant entry internal dcl 233 ref 75 80 212 adjust_from_right 001037 constant entry internal dcl 240 ref 131 132 145 151 218 cv_integer_string_ 000165 constant entry external dcl 13 cv_integer_string_check_ 000213 constant entry external dcl 62 get_base 000524 constant entry internal dcl 110 ref 85 quit_if_empty_string 001020 constant entry internal dcl 223 ref 219 trim_whitespace 000743 constant entry internal dcl 204 ref 71 76 81 THERE WERE NO NAMES DECLARED BY CONTEXT OR IMPLICATION. STORAGE REQUIREMENTS FOR THIS PROGRAM. Object Text Link Symbol Defs Static Start 0 0 2160 2174 2071 2170 Length 2404 2071 14 174 67 0 BLOCK NAME STACK SIZE TYPE WHY NONQUICK/WHO SHARES STACK FRAME cv_integer_string_ 321 external procedure is an external procedure. on unit on line 66 64 on unit get_base internal procedure shares stack frame of external procedure cv_integer_string_. begin block on line 180 300 begin block is declared options(non_quick). trim_whitespace internal procedure shares stack frame of external procedure cv_integer_string_. quit_if_empty_string internal procedure shares stack frame of external procedure cv_integer_string_. adjust_from_left internal procedure shares stack frame of external procedure cv_integer_string_. STORAGE FOR AUTOMATIC VARIABLES. STACK FRAME LOC IDENTIFIER BLOCK NAME begin block on line 180 000100 auto_pl1_info begin block on line 180 cv_integer_string_ 000100 base cv_integer_string_ 000101 char_idx cv_integer_string_ 000102 check_entry cv_integer_string_ 000103 digit cv_integer_string_ 000104 negative cv_integer_string_ 000105 reason cv_integer_string_ 000146 result cv_integer_string_ 000150 return_result cv_integer_string_ 000152 digits_string_ptr cv_integer_string_ 000154 digits_string_length cv_integer_string_ 000172 pl1_info_ptr cv_integer_string_ 000206 radix_string_ptr get_base 000210 radix_string_length get_base 000211 radix_char get_base 000212 radix_char_valid get_base THE FOLLOWING EXTERNAL OPERATORS ARE USED BY THIS PROGRAM. r_ne_as enter_begin_block call_ext_out_desc begin_return_mac return_mac tra_ext_1 mpfx2 signal_op enable_op ext_entry_desc int_entry verify_eis search_eis any_to_any_truncate_set_support THE FOLLOWING EXTERNAL ENTRIES ARE CALLED BY THIS PROGRAM. signal_ THE FOLLOWING EXTERNAL VARIABLES ARE USED BY THIS PROGRAM. error_table_$bad_conversion LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC LINE LOC 13 000161 59 000204 60 000205 62 000206 65 000232 66 000234 68 000261 70 000263 71 000266 73 000267 74 000276 75 000300 76 000304 77 000305 78 000306 79 000310 80 000311 81 000315 82 000316 83 000317 85 000320 87 000321 88 000323 89 000333 90 000346 91 000353 92 000355 94 000361 97 000365 100 000372 101 000375 107 000376 108 000400 175 000403 177 000405 178 000411 180 000413 186 000417 187 000422 188 000425 189 000427 190 000431 191 000433 192 000440 194 000443 195 000446 196 000447 197 000451 198 000453 199 000455 200 000467 201 000514 250 000520 110 000524 126 000525 127 000530 128 000544 129 000545 130 000552 131 000555 132 000557 134 000571 136 000605 137 000615 139 000616 142 000623 144 000631 145 000636 146 000642 147 000644 149 000645 151 000667 152 000673 153 000675 154 000676 156 000677 161 000710 162 000715 163 000720 165 000721 167 000725 168 000730 169 000736 170 000741 173 000742 204 000743 207 000744 208 000760 209 000761 210 000764 212 000765 213 000771 214 001005 215 001006 216 001011 218 001012 219 001016 221 001017 223 001020 226 001021 227 001023 228 001026 231 001027 233 001030 238 001032 240 001036 243 001041 245 001043 ----------------------------------------------------------- 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