]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - tools/bddb/defs.php
Coding Style cleanup: remove trailing white space
[karo-tx-uboot.git] / tools / bddb / defs.php
1 <?php // php pages made with phpMyBuilder <http://kyber.dk/phpMyBuilder> ?>
2 <?php
3         // (C) Copyright 2001
4         // Murray Jensen <Murray.Jensen@csiro.au>
5         // CSIRO Manufacturing Science and Technology, Preston Lab
6
7         // contains mysql user id and password - keep secret
8         require("config.php");
9
10         if (isset($_REQUEST['logout'])) {
11                 Header("status: 401 Unauthorized");
12                 Header("HTTP/1.0 401 Unauthorized");
13                 Header("WWW-authenticate: basic realm=\"$bddb_label\"");
14
15                 echo "<html><head><title>" .
16                         "Access to '$bddb_label' Denied" .
17                         "</title></head>\n";
18                 echo "<body bgcolor=#ffffff><br></br><br></br><center><h1>" .
19                         "You must be an Authorised User " .
20                         "to access the '$bddb_label'" .
21                         "</h1>\n</center></body></html>\n";
22                 exit;
23         }
24
25         // contents of the various enumerated types - if first item is
26         // empty ('') then the enum is allowed to be null (ie "not null"
27         // is not set on the column)
28
29         // all column names in the database table
30         $columns = array(
31                 'serno','ethaddr','date','batch',
32                 'type','rev','location','comments',
33                 'sdram0','sdram1','sdram2','sdram3',
34                 'flash0','flash1','flash2','flash3',
35                 'zbt0','zbt1','zbt2','zbt3','zbt4','zbt5','zbt6','zbt7',
36                 'zbt8','zbt9','zbta','zbtb','zbtc','zbtd','zbte','zbtf',
37                 'xlxtyp0','xlxtyp1','xlxtyp2','xlxtyp3',
38                 'xlxspd0','xlxspd1','xlxspd2','xlxspd3',
39                 'xlxtmp0','xlxtmp1','xlxtmp2','xlxtmp3',
40                 'xlxgrd0','xlxgrd1','xlxgrd2','xlxgrd3',
41                 'cputyp','cpuspd','cpmspd','busspd',
42                 'hstype','hschin','hschout'
43         );
44
45         // board type
46         $type_vals = array('IO','CLP','DSP','INPUT','ALT-INPUT','DISPLAY');
47
48         // Xilinx fpga types
49         $xlxtyp_vals = array('','XCV300E','XCV400E','XCV600E','XC2V2000','XC2V3000','XC2V4000','XC2V6000','XC2VP2','XC2VP4','XC2VP7','XC2VP20','XC2VP30','XC2VP50','XC4VFX20','XC4VFX40','XC4VFX60','XC4VFX100','XC4VFX140');
50
51         // Xilinx fpga speeds
52         $xlxspd_vals = array('','6','7','8','4','5','9','10','11','12');
53
54         // Xilinx fpga temperatures (commercial or industrial)
55         $xlxtmp_vals = array('','COM','IND');
56
57         // Xilinx fpga grades (normal or engineering sample)
58         $xlxgrd_vals = array('','NORMAL','ENGSAMP');
59
60         // CPU types
61         $cputyp_vals = array('','MPC8260(HIP3)','MPC8260A(HIP4)','MPC8280(HIP7)','MPC8560');
62
63         // CPU/BUS/CPM clock speeds
64         $clk_vals = array('','33MHZ','66MHZ','100MHZ','133MHZ','166MHZ','200MHZ','233MHZ','266MHZ','300MHZ','333MHZ','366MHZ','400MHZ','433MHZ','466MHZ','500MHZ','533MHZ','566MHZ','600MHZ','633MHZ','666MHZ','700MHZ','733MHZ','766MHZ','800MHZ','833MHZ','866MHZ','900MHZ','933MHZ','966MHZ','1000MHZ','1033MHZ','1066MHZ','1100MHZ','1133MHZ','1166MHZ','1200MHZ','1233MHZ','1266MHZ','1300MHZ','1333MHZ');
65
66         // sdram sizes (nbits array is for eeprom config file)
67         $sdram_vals = array('','32M','64M','128M','256M','512M','1G','2G','4G');
68         $sdram_nbits = array(0,25,26,27,28,29,30,31,32);
69
70         // flash sizes (nbits array is for eeprom config file)
71         $flash_vals = array('','4M','8M','16M','32M','64M','128M','256M','512M','1G');
72         $flash_nbits = array(0,22,23,24,25,26,27,28,29,30);
73
74         // zbt ram sizes (nbits array is for write into eeprom config file)
75         $zbt_vals = array('','512K','1M','2M','4M','8M','16M');
76         $zbt_nbits = array(0,19,20,21,22,23,24);
77
78         // high-speed serial attributes
79         $hstype_vals = array('','AMCC-S2064A','Xilinx-Rockets');
80         $hschin_vals = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
81         $hschout_vals = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16');
82
83         // value filters - used when outputting html
84         function rev_filter($num) {
85                 if ($num == 0)
86                         return "001";
87                 else
88                         return sprintf("%03d", $num);
89         }
90
91         function text_filter($str) {
92                 return urldecode($str);
93         }
94
95         mt_srand(time() | getmypid());
96
97         // set up MySQL connection
98         mysql_connect("", $mysql_user, $mysql_pw) || die("cannot connect");
99         mysql_select_db($mysql_db) || die("cannot select db");
100
101         // page header
102         function pg_head($title)
103         {
104                 echo "<html>\n<head>\n";
105                 echo "<link rel=stylesheet href=\"bddb.css\" type=\"text/css\" title=\"style sheet\"></link>\n";
106                 echo "<title>$title</title>\n";
107                 echo "</head>\n";
108                 echo "<body>\n";
109                 echo "<center><h1>$title</h1></center>\n";
110                 echo "<hr></hr>\n";
111         }
112
113         // page footer
114         function pg_foot()
115         {
116                 echo "<hr></hr>\n";
117                 echo "<table width=\"100%\"><tr><td align=left>\n<address>" .
118                         "If you have any problems, email " .
119                         "<a href=\"mailto:Murray.Jensen@csiro.au\">" .
120                         "Murray Jensen" .
121                         "</a></address>\n" .
122                         "</td><td align=right>\n" .
123                         "<a href=\"index.php?logout=true\">logout</a>\n" .
124                         "</td></tr></table>\n";
125                 echo "<p><small><i>Made with " .
126                     "<a href=\"http://kyber.dk/phpMyBuilder/\">" .
127                     "Kyber phpMyBuilder</a></i></small></p>\n";
128                 echo "</body>\n";
129                 echo "</html>\n";
130         }
131
132         // some support functions
133
134         if (!function_exists('array_search')) {
135
136                 function array_search($needle, $haystack, $strict = false) {
137
138                         if (is_array($haystack) && count($haystack)) {
139
140                                 $ntype = gettype($needle);
141
142                                 foreach ($haystack as $key => $value) {
143
144                                         if ($value == $needle && (!$strict ||
145                                             gettype($value) == $ntype))
146                                                 return $key;
147                                 }
148                         }
149
150                         return false;
151                 }
152         }
153
154         if (!function_exists('in_array')) {
155
156                 function in_array($needle, $haystack, $strict = false) {
157
158                         if (is_array($haystack) && count($haystack)) {
159
160                                 $ntype = gettype($needle);
161
162                                 foreach ($haystack as $key => $value) {
163
164                                         if ($value == $needle && (!$strict ||
165                                             gettype($value) == $ntype))
166                                                 return true;
167                                 }
168                         }
169
170                         return false;
171                 }
172         }
173
174         function key_in_array($key, $array) {
175                 return in_array($key, array_keys($array), true);
176         }
177
178         function enum_to_index($name, $vals) {
179                 $index = array_search($GLOBALS[$name], $vals);
180                 if ($vals[0] != '')
181                         $index++;
182                 return $index;
183         }
184
185         // fetch a value from an array - return empty string is not present
186         function get_key_value($key, $array) {
187                 if (key_in_array($key, $array))
188                         return $array[$key];
189                 else
190                         return '';
191         }
192
193         function fprintf() {
194                 $n = func_num_args();
195                 if ($n < 2)
196                         return FALSE;
197                 $a = func_get_args();
198                 $fp = array_shift($a);
199                 $x = "\$s = sprintf";
200                 $sep = '(';
201                 foreach ($a as $z) {
202                         $x .= "$sep'$z'";
203                         $sep = ',';
204                 }
205                 $x .= ');';
206                 eval($x);
207                 $l = strlen($s);
208                 $r = fwrite($fp, $s, $l);
209                 if ($r != $l)
210                         return FALSE;
211                 else
212                         return TRUE;
213         }
214
215         // functions to display (print) a database table and its columns
216
217         function begin_table($ncols) {
218                 global $table_ncols;
219                 $table_ncols = $ncols;
220                 echo "<table align=center width=\"100%\""
221                         . " border=1 cellpadding=4 cols=$table_ncols>\n";
222         }
223
224         function begin_field($name, $span = 0) {
225                 global $table_ncols;
226                 echo "<tr valign=top>\n";
227                 echo "\t<th align=center>$name</th>\n";
228                 if ($span <= 0)
229                         $span = $table_ncols - 1;
230                 if ($span > 1)
231                         echo "\t<td colspan=$span>\n";
232                 else
233                         echo "\t<td>\n";
234         }
235
236         function cont_field($span = 1) {
237                 echo "\t</td>\n";
238                 if ($span > 1)
239                         echo "\t<td colspan=$span>\n";
240                 else
241                         echo "\t<td>\n";
242         }
243
244         function end_field() {
245                 echo "\t</td>\n";
246                 echo "</tr>\n";
247         }
248
249         function end_table() {
250                 echo "</table>\n";
251         }
252
253         function print_field($name, $array, $size = 0, $filt='') {
254
255                 begin_field($name);
256
257                 if (key_in_array($name, $array))
258                         $value = $array[$name];
259                 else
260                         $value = '';
261
262                 if ($filt != '')
263                         $value = $filt($value);
264
265                 echo "\t\t<input name=$name value=\"$value\"";
266                 if ($size > 0)
267                         echo " size=$size maxlength=$size";
268                 echo "></input>\n";
269
270                 end_field();
271         }
272
273         function print_field_multiline($name, $array, $cols, $rows, $filt='') {
274
275                 begin_field($name);
276
277                 if (key_in_array($name, $array))
278                         $value = $array[$name];
279                 else
280                         $value = '';
281
282                 if ($filt != '')
283                         $value = $filt($value);
284
285                 echo "\t\t<textarea name=$name " .
286                         "cols=$cols rows=$rows wrap=off>\n";
287                 echo "$value";
288                 echo "</textarea>\n";
289
290                 end_field();
291         }
292
293         // print a mysql ENUM as an html RADIO INPUT
294         function print_enum($name, $array, $vals, $def = -1) {
295
296                 begin_field($name);
297
298                 if (key_in_array($name, $array))
299                         $chk = array_search($array[$name], $vals, FALSE);
300                 else
301                         $chk = $def;
302
303                 $nval = count($vals);
304
305                 for ($i = 0; $i < $nval; $i++) {
306
307                         $val = $vals[$i];
308                         if ($val == '')
309                                 $pval = "none";
310                         else
311                                 $pval = "$val";
312
313                         printf("\t\t<input type=radio name=$name"
314                                 . " value=\"$val\"%s>$pval</input>\n",
315                                 $i == $chk ? " checked" : "");
316                 }
317
318                 end_field();
319         }
320
321         // print a mysql ENUM as an html SELECT INPUT
322         function print_enum_select($name, $array, $vals, $def = -1) {
323
324                 begin_field($name);
325
326                 echo "\t\t<select name=$name>\n";
327
328                 if (key_in_array($name, $array))
329                         $chk = array_search($array[$name], $vals, FALSE);
330                 else
331                         $chk = $def;
332
333                 $nval = count($vals);
334
335                 for ($i = 0; $i < $nval; $i++) {
336
337                         $val = $vals[$i];
338                         if ($val == '')
339                                 $pval = "none";
340                         else
341                                 $pval = "$val";
342
343                         printf("\t\t\t<option " .
344                                 "value=\"%s\"%s>%s</option>\n",
345                                 $val, $i == $chk ? " selected" : "", $pval);
346                 }
347
348                 echo "\t\t</select>\n";
349
350                 end_field();
351         }
352
353         // print a group of mysql ENUMs (e.g. name0,name1,...) as an html SELECT
354         function print_enum_multi($base, $array, $vals, $cnt, $defs, $grp = 0) {
355
356                 global $table_ncols;
357
358                 if ($grp <= 0)
359                         $grp = $cnt;
360                 $ncell = $cnt / $grp;
361                 $span = ($table_ncols - 1) / $ncell;
362
363                 begin_field($base, $span);
364
365                 $nval = count($vals);
366
367                 for ($i = 0; $i < $cnt; $i++) {
368
369                         if ($i > 0 && ($i % $grp) == 0)
370                                 cont_field($span);
371
372                         $name = sprintf("%s%x", $base, $i);
373
374                         echo "\t\t<select name=$name>\n";
375
376                         if (key_in_array($name, $array))
377                                 $ai = array_search($array[$name], $vals, FALSE);
378                         else {
379                                 if (key_in_array($i, $defs))
380                                         $ai = $defs[$i];
381                                 else
382                                         $ai = 0;
383                         }
384
385                         for ($j = 0; $j < $nval; $j++) {
386
387                                 $val = $vals[$j];
388                                 if ($val == '')
389                                         $pval = "&nbsp;";
390                                 else
391                                         $pval = "$val";
392
393                                 printf("\t\t\t<option " .
394                                         "value=\"%s\"%s>%s</option>\n",
395                                         $val,
396                                         $j == $ai ? " selected" : "",
397                                         $pval);
398                         }
399
400                         echo "\t\t</select>\n";
401                 }
402
403                 end_field();
404         }
405
406         // functions to handle the form input
407
408         // fetch all the parts of an "enum_multi" into a string suitable
409         // for a MySQL query
410         function gather_enum_multi_query($base, $cnt) {
411
412                 $retval = '';
413
414                 for ($i = 0; $i < $cnt; $i++) {
415
416                         $name = sprintf("%s%x", $base, $i);
417
418                         if (isset($_REQUEST[$name])) {
419                                 $retval .= sprintf(", %s='%s'",
420                                         $name, $_REQUEST[$name]);
421                         }
422                 }
423
424                 return $retval;
425         }
426
427         // fetch all the parts of an "enum_multi" into a string suitable
428         // for a display e.g. in an html table cell
429         function gather_enum_multi_print($base, $cnt, $array) {
430
431                 $retval = '';
432
433                 for ($i = 0; $i < $cnt; $i++) {
434
435                         $name = sprintf("%s%x", $base, $i);
436
437                         if ($array[$name] != '') {
438                                 if ($retval != '')
439                                         $retval .= ',';
440                                 $retval .= $array[$name];
441                         }
442                 }
443
444                 return $retval;
445         }
446
447         // fetch all the parts of an "enum_multi" into a string suitable
448         // for writing to the eeprom data file
449         function gather_enum_multi_write($base, $cnt, $vals, $xfrm = array()) {
450
451                 $retval = '';
452
453                 for ($i = 0; $i < $cnt; $i++) {
454
455                         $name = sprintf("%s%x", $base, $i);
456
457                         if ($GLOBALS[$name] != '') {
458                                 if ($retval != '')
459                                         $retval .= ',';
460                                 $index = enum_to_index($name, $vals);
461                                 if ($xfrm != array())
462                                         $retval .= $xfrm[$index];
463                                 else
464                                         $retval .= $index;
465                         }
466                 }
467
468                 return $retval;
469         }
470
471         // count how many parts of an "enum_multi" are actually set
472         function count_enum_multi($base, $cnt) {
473
474                 $retval = 0;
475
476                 for ($i = 0; $i < $cnt; $i++) {
477
478                         $name = sprintf("%s%x", $base, $i);
479
480                         if (isset($_REQUEST[$name]))
481                                 $retval++;
482                 }
483
484                 return $retval;
485         }
486
487         // ethernet address functions
488
489         // generate a (possibly not unique) random vendor ethernet address
490         // (setting bit 6 in the ethernet address - motorola wise i.e. bit 0
491         // is the most significant bit - means it is not an assigned ethernet
492         // address - it is a "locally administered" address). Also, make sure
493         // it is NOT a multicast ethernet address (by setting bit 7 to 0).
494         // e.g. the first byte of all ethernet addresses generated here will
495         // have 2 in the bottom two bits (incidentally, these are the first
496         // two bits transmitted on the wire, since the octets in ethernet
497         // addresses are transmitted LSB first).
498
499         function gen_eth_addr($serno) {
500
501                 $ethaddr_hgh = (mt_rand(0, 65535) & 0xfeff) | 0x0200;
502                 $ethaddr_mid = mt_rand(0, 65535);
503                 $ethaddr_low = mt_rand(0, 65535);
504
505                 return sprintf("%02lx:%02lx:%02lx:%02lx:%02lx:%02lx",
506                         $ethaddr_hgh >> 8, $ethaddr_hgh & 0xff,
507                         $ethaddr_mid >> 8, $ethaddr_mid & 0xff,
508                         $ethaddr_low >> 8, $ethaddr_low & 0xff);
509         }
510
511         // check that an ethernet address is valid
512         function eth_addr_is_valid($ethaddr) {
513
514                 $ethbytes = split(':', $ethaddr);
515
516                 if (count($ethbytes) != 6)
517                         return FALSE;
518
519                 for ($i = 0; $i < 6; $i++) {
520                         $ethbyte = $ethbytes[$i];
521                         if (!ereg('^[0-9a-f][0-9a-f]$', $ethbyte))
522                                 return FALSE;
523                 }
524
525                 return TRUE;
526         }
527
528         // write a simple eeprom configuration file
529         function write_eeprom_cfg_file() {
530
531                 global $sernos, $nsernos, $bddb_cfgdir, $numerrs, $cfgerrs;
532                 global $date, $batch, $type_vals, $rev;
533                 global $sdram_vals, $sdram_nbits;
534                 global $flash_vals, $flash_nbits;
535                 global $zbt_vals, $zbt_nbits;
536                 global $xlxtyp_vals, $xlxspd_vals, $xlxtmp_vals, $xlxgrd_vals;
537                 global $cputyp, $cputyp_vals, $clk_vals;
538                 global $hstype, $hstype_vals, $hschin, $hschout;
539
540                 $numerrs = 0;
541                 $cfgerrs = array();
542
543                 for ($i = 0; $i < $nsernos; $i++) {
544
545                         $serno = sprintf("%010d", $sernos[$i]);
546
547                         $wfp = @fopen($bddb_cfgdir . "/$serno.cfg", "w");
548                         if (!$wfp) {
549                                 $cfgerrs[$i] = 'file create fail';
550                                 $numerrs++;
551                                 continue;
552                         }
553                         set_file_buffer($wfp, 0);
554
555                         if (!fprintf($wfp, "serno=%d\n", $sernos[$i])) {
556                                 $cfgerrs[$i] = 'cfg wr fail (serno)';
557                                 fclose($wfp);
558                                 $numerrs++;
559                                 continue;
560                         }
561
562                         if (!fprintf($wfp, "date=%s\n", $date)) {
563                                 $cfgerrs[$i] = 'cfg wr fail (date)';
564                                 fclose($wfp);
565                                 $numerrs++;
566                                 continue;
567                         }
568
569                         if ($batch != '') {
570                                 if (!fprintf($wfp, "batch=%s\n", $batch)) {
571                                         $cfgerrs[$i] = 'cfg wr fail (batch)';
572                                         fclose($wfp);
573                                         $numerrs++;
574                                         continue;
575                                 }
576                         }
577
578                         $typei = enum_to_index("type", $type_vals);
579                         if (!fprintf($wfp, "type=%d\n", $typei)) {
580                                 $cfgerrs[$i] = 'cfg wr fail (type)';
581                                 fclose($wfp);
582                                 $numerrs++;
583                                 continue;
584                         }
585
586                         if (!fprintf($wfp, "rev=%d\n", $rev)) {
587                                 $cfgerrs[$i] = 'cfg wr fail (rev)';
588                                 fclose($wfp);
589                                 $numerrs++;
590                                 continue;
591                         }
592
593                         $s = gather_enum_multi_write("sdram", 4,
594                                 $sdram_vals, $sdram_nbits);
595                         if ($s != '') {
596                                 $b = fprintf($wfp, "sdram=%s\n", $s);
597                                 if (!$b) {
598                                         $cfgerrs[$i] = 'cfg wr fail (sdram)';
599                                         fclose($wfp);
600                                         $numerrs++;
601                                         continue;
602                                 }
603                         }
604
605                         $s = gather_enum_multi_write("flash", 4,
606                                 $flash_vals, $flash_nbits);
607                         if ($s != '') {
608                                 $b = fprintf($wfp, "flash=%s\n", $s);
609                                 if (!$b) {
610                                         $cfgerrs[$i] = 'cfg wr fail (flash)';
611                                         fclose($wfp);
612                                         $numerrs++;
613                                         continue;
614                                 }
615                         }
616
617                         $s = gather_enum_multi_write("zbt", 16,
618                                 $zbt_vals, $zbt_nbits);
619                         if ($s != '') {
620                                 $b = fprintf($wfp, "zbt=%s\n", $s);
621                                 if (!$b) {
622                                         $cfgerrs[$i] = 'cfg wr fail (zbt)';
623                                         fclose($wfp);
624                                         $numerrs++;
625                                         continue;
626                                 }
627                         }
628
629                         $s = gather_enum_multi_write("xlxtyp", 4, $xlxtyp_vals);
630                         if ($s != '') {
631                                 $b = fprintf($wfp, "xlxtyp=%s\n", $s);
632                                 if (!$b) {
633                                         $cfgerrs[$i] = 'cfg wr fail (xlxtyp)';
634                                         fclose($wfp);
635                                         $numerrs++;
636                                         continue;
637                                 }
638                         }
639
640                         $s = gather_enum_multi_write("xlxspd", 4, $xlxspd_vals);
641                         if ($s != '') {
642                                 $b = fprintf($wfp, "xlxspd=%s\n", $s);
643                                 if (!$b) {
644                                         $cfgerrs[$i] = 'cfg wr fail (xlxspd)';
645                                         fclose($wfp);
646                                         $numerrs++;
647                                         continue;
648                                 }
649                         }
650
651                         $s = gather_enum_multi_write("xlxtmp", 4, $xlxtmp_vals);
652                         if ($s != '') {
653                                 $b = fprintf($wfp, "xlxtmp=%s\n", $s);
654                                 if (!$b) {
655                                         $cfgerrs[$i] = 'cfg wr fail (xlxtmp)';
656                                         fclose($wfp);
657                                         $numerrs++;
658                                         continue;
659                                 }
660                         }
661
662                         $s = gather_enum_multi_write("xlxgrd", 4, $xlxgrd_vals);
663                         if ($s != '') {
664                                 $b = fprintf($wfp, "xlxgrd=%s\n", $s);
665                                 if (!$b) {
666                                         $cfgerrs[$i] = 'cfg wr fail (xlxgrd)';
667                                         fclose($wfp);
668                                         $numerrs++;
669                                         continue;
670                                 }
671                         }
672
673                         if ($cputyp != '') {
674                                 $cputypi = enum_to_index("cputyp",$cputyp_vals);
675                                 $cpuspdi = enum_to_index("cpuspd", $clk_vals);
676                                 $busspdi = enum_to_index("busspd", $clk_vals);
677                                 $cpmspdi = enum_to_index("cpmspd", $clk_vals);
678                                 $b = fprintf($wfp, "cputyp=%d\ncpuspd=%d\n" .
679                                         "busspd=%d\ncpmspd=%d\n",
680                                         $cputypi, $cpuspdi, $busspdi, $cpmspdi);
681                                 if (!$b) {
682                                         $cfgerrs[$i] = 'cfg wr fail (cputyp)';
683                                         fclose($wfp);
684                                         $numerrs++;
685                                         continue;
686                                 }
687                         }
688
689                         if ($hstype != '') {
690                                 $hstypei = enum_to_index("hstype",$hstype_vals);
691                                 $b = fprintf($wfp, "hstype=%d\n" .
692                                         "hschin=%s\nhschout=%s\n",
693                                         $hstypei, $hschin, $hschout);
694                                 if (!$b) {
695                                         $cfgerrs[$i] = 'cfg wr fail (hstype)';
696                                         fclose($wfp);
697                                         $numerrs++;
698                                         continue;
699                                 }
700                         }
701
702                         if (!fclose($wfp)) {
703                                 $cfgerrs[$i] = 'file cls fail';
704                                 $numerrs++;
705                         }
706                 }
707
708                 return $numerrs;
709         }
710 ?>