1######################################################################## 2# # 3# This software is part of the ast package # 4# Copyright (c) 1985-2011 AT&T Intellectual Property # 5# and is licensed under the # 6# Eclipse Public License, Version 1.0 # 7# by AT&T Intellectual Property # 8# # 9# A copy of the License is available at # 10# http://www.eclipse.org/org/documents/epl-v10.html # 11# (with md5 checksum b35adb5213ca9657e911e9befb180842) # 12# # 13# Information and Software Systems Research # 14# AT&T Research # 15# Florham Park NJ # 16# # 17# Glenn Fowler <gsf@research.att.com> # 18# David Korn <dgk@research.att.com> # 19# Phong Vo <kpv@research.att.com> # 20# # 21######################################################################## 22: generate getconf and limits info 23# 24# @(#)conf.sh (AT&T Research) 2011-08-26 25# 26# this script generates these files from the table file in the first arg 27# the remaining args are the C compiler name and flags 28# 29# conflim.h supplemental limits.h definitions 30# conftab.h readonly string table definitions 31# conftab.c readonly string table data 32# 33# you may think it should be simpler 34# but you shall be confused anyway 35# 36 37case $-:$BASH_VERSION in 38*x*:[0123456789]*) : bash set -x is broken :; set +ex ;; 39esac 40 41LC_ALL=C 42export LC_ALL 43 44command=conf 45 46shell=`eval 'x=123&&integer n=\${#x}\${x#1?}&&((n==330/(10)))&&echo ksh' 2>/dev/null` 47 48append=0 49debug= 50extra=0 51keep_call='*' 52keep_name='*' 53trace= 54verbose=0 55while : 56do case $1 in 57 -a) append=1 ;; 58 -c*) keep_call=${1#-?} ;; 59 -d*) debug=$1 ;; 60 -l) extra=1 ;; 61 -n*) keep_name=${1#-?} ;; 62 -t) trace=1 ;; 63 -v) verbose=1 ;; 64 -*) echo "Usage: $command [-a] [-ccall-pattern] [-dN] [-l] [-nname_pattern] [-t] [-v] conf.tab" >&2; exit 2 ;; 65 *) break ;; 66 esac 67 shift 68done 69head='#include "FEATURE/standards" 70#include "FEATURE/common"' 71tail='#include "FEATURE/param"' 72generated="/* : : generated by $command from $1 : : */" 73hdr= 74ifs=${IFS-' 75 '} 76nl=' 77' 78sp=' ' 79ob='{' 80cb='}' 81sym=[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]* 82tmp=conf.tmp 83case $verbose:$debug$trace in 841:?*) echo "$command: debug=$debug trace=$trace keep_call=$keep_call keep_name=$keep_name" >&2 ;; 85esac 86case $trace in 871) PS4='+$LINENO+ '; set -x ;; 88esac 89 90case $# in 910) case $extra in 92 0) echo "$command: table argument expected" >&2 93 exit 1 94 ;; 95 esac 96 tab=/dev/null 97 ;; 98*) tab=$1 99 shift 100 if test ! -f $tab 101 then echo "$command: $tab: cannot read" >&2 102 exit 1 103 fi 104 ;; 105esac 106case $# in 1070) cc=cc ;; 108*) cc=$* ;; 109esac 110 111rm -f $tmp.* 112case $debug in 113'') trap "code=\$?; rm -f $tmp.*; exit \$code" 0 1 2 ;; 114esac 115 116# determine the intmax_t printf format 117 118cat > $tmp.c <<! 119${head} 120int 121main() 122{ 123#if _ast_intmax_long 124 return 1; 125#else 126 return 0; 127#endif 128} 129! 130if $cc -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe 131then LL_format='ll' 132else LL_format='l' 133fi 134 135# determine the intmax_t constant suffix 136 137cat > $tmp.c <<! 138${head} 139int 140main() 141{ 142#if _ast_intmax_long 143 return 1; 144#else 145 _ast_intmax_t s = 0x7fffffffffffffffLL; 146 unsigned _ast_intmax_t u = 0xffffffffffffffffLL; 147 148 return 0; 149#endif 150} 151! 152if $cc -o $tmp.exe $tmp.c >/dev/null 2>&1 153then if ./$tmp.exe 154 then LL_suffix='LL' 155 else LL_suffix='L' 156 fi 157else LL_suffix='' 158fi 159 160cat > $tmp.c <<! 161${head} 162int 163main() 164{ 165 unsigned int u = 1U; 166 unsigned int ul = 1UL; 167 168 return 0; 169} 170! 171if $cc -o $tmp.exe $tmp.c >/dev/null 2>&1 172then U_suffix='U' 173else U_suffix='' 174fi 175 176# set up the names and keys 177 178keys= 179standards= 180 181case $append$extra in 18200) case $verbose in 183 1) echo "$command: read $tab" >&2 ;; 184 esac 185 exec < $tab 186 while : 187 do IFS="" 188 read line 189 eof=$? 190 IFS=$ifs 191 case $eof in 192 0) ;; 193 *) break ;; 194 esac 195 case $line in 196 ""|\#*) ;; 197 *) set x $line 198 shift; name=$1 199 shift; standard=$1 200 shift; call=$1 201 shift; section=$1 202 shift; flags=$1 203 alternates= 204 define= 205 values= 206 script= 207 headers= 208 while : 209 do shift 210 case $# in 211 0) break ;; 212 esac 213 case $1 in 214 ":") shift 215 eval script='$'script_$1 216 break 217 ;; 218 *"{") case $1 in 219 "sh{") script="# $name" ;; 220 *) script= ;; 221 esac 222 shift 223 args="$*" 224 IFS="" 225 while read line 226 do case $line in 227 "}") break ;; 228 esac 229 script=$script$nl$line 230 done 231 IFS=$ifs 232 break 233 ;; 234 *.h) case $shell in 235 ksh) f=${1%.h} ;; 236 *) f=`echo $1 | sed 's,\.h$,,'` ;; 237 esac 238 case " $hdr " in 239 *" $f "*) 240 headers=$headers$nl#include$sp'<'$1'>' 241 ;; 242 *" -$f- "*) 243 ;; 244 *) if iffe -c "$cc" -n - hdr $f | grep _hdr_$f >/dev/null 245 then hdr="$hdr $f" 246 headers=$headers$nl#include$sp'<'$1'>' 247 else hdr="$hdr -$f-" 248 fi 249 ;; 250 esac 251 ;; 252 *) values=$values$sp$1 253 case $1 in 254 $sym) echo "$1" >> $tmp.v ;; 255 esac 256 ;; 257 esac 258 done 259 case " $standards " in 260 *" $standard "*) 261 ;; 262 *) standards="$standards $standard" 263 ;; 264 esac 265 case $name:$flags in 266 *:*S*) ;; 267 VERSION)flags="${flags}S" ;; 268 esac 269 case $name in 270 *VERSION*)key=${standard}${section} ;; 271 *) key= ;; 272 esac 273 case $key in 274 ''|*_) key=${key}${name} ;; 275 *) key=${key}_${name} ;; 276 esac 277 eval sys='$'CONF_call_${key} 278 case $sys in 279 ?*) call=$sys ;; 280 esac 281 case $call in 282 SI) sys=CS ;; 283 *) sys=$call ;; 284 esac 285 key=${sys}_${key} 286 keys="$keys$nl$key" 287 eval CONF_name_${key}='$'name 288 eval CONF_standard_${key}='$'standard 289 eval CONF_call_${key}='$'call 290 eval CONF_section_${key}='$'section 291 eval CONF_flags_${key}='$'flags 292 eval CONF_define_${key}='$'define 293 eval CONF_values_${key}='$'values 294 eval CONF_script_${key}='$'script 295 eval CONF_args_${key}='$'args 296 eval CONF_headers_${key}='$'headers 297 eval CONF_keys_${name}=\"'$'CONF_keys_${name} '$'key\" 298 ;; 299 esac 300 done 301 ;; 302esac 303case $debug in 304-d1) for key in $keys 305 do eval name=\"'$'CONF_name_$key\" 306 case $name in 307 ?*) eval standard=\"'$'CONF_standard_$key\" 308 eval call=\"'$'CONF_call_$key\" 309 eval section=\"'$'CONF_section_$key\" 310 eval flags=\"'$'CONF_flags_$key\" 311 eval define=\"'$'CONF_define_$key\" 312 eval values=\"'$'CONF_values_$key\" 313 eval script=\"'$'CONF_script_$key\" 314 eval args=\"'$'CONF_args_$key\" 315 eval headers=\"'$'CONF_headers_$key\" 316 printf "%29s %35s %8s %2s %1d %5s %s$nl" "$name" "$key" "$standard" "$call" "$section" "$flags" "$define${values:+$sp=$values}${headers:+$sp$headers$nl}${script:+$sp$ob$script$nl$cb}" 317 ;; 318 esac 319 done 320 exit 321 ;; 322esac 323 324systeminfo=' 325#if !defined(SYS_NMLEN) 326#define SYS_NMLEN 9 327#endif 328#include <sys/systeminfo.h>' 329echo "$systeminfo" > $tmp.c 330$cc -E $tmp.c >/dev/null 2>&1 || systeminfo= 331 332# check for native getconf(1) 333 334CONF_getconf= 335CONF_getconf_a= 336for d in /usr/bin /bin /usr/sbin /sbin 337do if test -x $d/getconf 338 then case `$d/getconf --?-version 2>&1` in 339 *"AT&T"*"Research"*) 340 : presumably an implementation also configured from conf.tab 341 ;; 342 *) CONF_getconf=$d/getconf 343 if $CONF_getconf -a >/dev/null 2>&1 344 then CONF_getconf_a=-a 345 fi 346 ;; 347 esac 348 break 349 fi 350done 351export CONF_getconf CONF_getconf_a 352 353case $verbose in 3541) echo "$command: check ${CONF_getconf:+$CONF_getconf(1),}confstr(2),pathconf(2),sysconf(2),sysinfo(2) configuration names" >&2 ;; 355esac 356{ 357 echo "#include <unistd.h>$systeminfo 358int i = 0;" > $tmp.c 359 $cc -E $tmp.c 360} | 361sed \ 362 -e '/^#[^0123456789]*1[ ]*".*".*/!d' \ 363 -e 's/^#[^0123456789]*1[ ]*"\(.*\)".*/\1/' | 364sort -u > $tmp.f 365{ 366sed \ 367 -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789]/ /g' \ 368 -e 's/[ ][ ]*/\n/g' \ 369 `cat $tmp.f` 2>/dev/null | 370 egrep '^(SI|_(CS|PC|SC|SI))_.' 371 case $CONF_getconf_a in 372 ?*) $CONF_getconf $CONF_getconf_a | sed 's,[=: ].*,,' 373 ;; 374 *) case $CONF_getconf in 375 ?*) for v in `strings $CONF_getconf | grep '^[ABCDEFGHIJKLMNOPQRSTUVWXYZ_][ABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789]*$'` 376 do if $CONF_getconf $v >/dev/null 377 then echo $v 378 fi 379 done 380 ;; 381 esac 382 ;; 383 esac 2>/dev/null 384} | 385egrep -v '^_[ABCDEFGHIJKLMNOPQRSTUVWXYZ]+_(COUNT|LAST|N|STR)$' | 386sort -u > $tmp.g 387{ 388 grep '^_' $tmp.g 389 grep '^[^_]' $tmp.g 390} > $tmp.t 391mv $tmp.t $tmp.g 392case $debug in 393-d2) exit ;; 394esac 395 396HOST=`package | sed -e 's,[0123456789.].*,,' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` 397case $HOST in 398'') HOST=SYSTEM ;; 399esac 400 401exec < $tmp.g 402 403while read line 404do flags=F 405 section= 406 underscore= 407 define=$line 408 IFS=_ 409 set $line 410 IFS=$ifs 411 case $1 in 412 '') case $# in 413 0) continue ;; 414 esac 415 shift 416 ;; 417 esac 418 case $1 in 419 CS|PC|SC|SI) 420 call=$1 421 shift 422 standard=$1 423 ;; 424 *) flags=${flags}R 425 standard=$1 426 while : 427 do case $# in 428 0) continue 2 ;; 429 esac 430 shift 431 case $1 in 432 CS|PC|SC|SI) 433 call=$1 434 shift 435 break 436 ;; 437 O|o|OLD|old) 438 continue 2 439 ;; 440 esac 441 standard=${standard}_$1 442 done 443 ;; 444 esac 445 case $1 in 446 SET) continue ;; 447 esac 448 case $standard in 449 _*) standard=`echo $standard | sed 's,^_*,,'` ;; 450 esac 451 case " $standards " in 452 *" $standard "*) 453 ;; 454 *) case $standard in 455 [0123456789]*) 456 section=$standard 457 standard=POSIX 458 ;; 459 *[0123456789]) 460 eval `echo $standard | sed 's,\(.*\)\([0123456789]*\),standard=\1 section=\2,'` 461 ;; 462 esac 463 ;; 464 esac 465 case $flags in 466 *R*) case $call in 467 SI) ;; 468 *) underscore=U ;; 469 esac 470 ;; 471 *) case " $standards " in 472 " C ") shift 473 ;; 474 *" $standard "*) 475 case $call in 476 SI) ;; 477 *) flags=${flags}P 478 underscore=U 479 ;; 480 esac 481 shift 482 ;; 483 *) standard= 484 ;; 485 esac 486 ;; 487 esac 488 case $standard in 489 '') standard=$HOST 490 case $call in 491 SI) ;; 492 *) underscore=U ;; 493 esac 494 case $call in 495 CS|PC|SC) 496 case $define in 497 _${call}_*) 498 standard=POSIX 499 ;; 500 esac 501 ;; 502 esac 503 ;; 504 esac 505 part=$section 506 case $section in 507 '') section=1 508 case $standard in 509 POSIX|XOPEN) part=$section ;; 510 esac 511 ;; 512 esac 513 name= 514 while : 515 do case $# in 516 0) break ;; 517 esac 518 case $name in 519 '') name=$1 ;; 520 *) name=${name}_$1 ;; 521 esac 522 shift 523 done 524 case $name in 525 '') ;; 526 CONFORMANCE|FS_3D|HOSTTYPE|LIBPATH|LIBPREFIX|LIBSUFFIX|PATH_ATTRIBUTES|PATH_RESOLVE|UNIVERSE) 527 ;; 528 *) values= 529 script= 530 args= 531 headers= 532 case $name in 533 V[123456789]_*|V[123456789][0123456789]_*) underscore=VW ;; 534 esac 535 case $call in 536 CS|SI) key=CS ;; 537 *) key=$call ;; 538 esac 539 case $name in 540 *VERSION*)key=${key}_${standard}${part} ;; 541 esac 542 key=${key}_${name} 543 eval x='$'CONF_keys_$name 544 case $x in 545 '') eval x='$'CONF_name_$key 546 case $x in 547 '') case $call in 548 SI) flags=O$flags ;; 549 esac 550 case $underscore in 551 ?*) flags=${flags}${underscore} ;; 552 esac 553 old=QQ 554 case $name in 555 *VERSION*)old=${old}_${standard}${part} ;; 556 esac 557 old=${old}_${name} 558 eval x='$'CONF_name_$old 559 case $x in 560 ?*) eval CONF_name_$old= 561 eval flags='$'flags'$'CONF_flags_$old 562 eval values='$'CONF_values_$old 563 eval script='$'CONF_script_$old 564 eval args='$'CONF_args_$old 565 eval headers='$'CONF_headers_$old 566 ;; 567 esac 568 keys="$keys$nl$key" 569 eval CONF_name_${key}='$'name 570 eval CONF_standard_${key}='$'standard 571 eval CONF_call_${key}='$'call 572 eval CONF_section_${key}='$'section 573 eval CONF_flags_${key}=d'$'flags 574 eval CONF_define_${key}='$'define 575 eval CONF_values_${key}='$'values 576 eval CONF_script_${key}='$'script 577 eval CONF_args_${key}='$'args 578 eval CONF_headers_${key}='$'headers 579 ;; 580 *) eval x='$'CONF_define_$key 581 case $x in 582 ?*) case $call in 583 CS) eval x='$'CONF_call_$key 584 case $x in 585 SI) ;; 586 *) define= ;; 587 esac 588 ;; 589 *) define= 590 ;; 591 esac 592 ;; 593 esac 594 case $define in 595 ?*) eval CONF_define_${key}='$'define 596 eval CONF_call_${key}='$'call 597 eval x='$'CONF_call_${key} 598 case $x in 599 QQ) ;; 600 *) case $flags in 601 *R*) flags=R ;; 602 *) flags= ;; 603 esac 604 ;; 605 esac 606 case $call in 607 SI) flags=O$flags ;; 608 esac 609 eval CONF_flags_${key}=d'$'flags'$'CONF_flags_${key} 610 ;; 611 esac 612 old=QQ 613 case $name in 614 *VERSION*)old=${old}_${standard}${part} ;; 615 esac 616 old=${old}_${name} 617 eval CONF_name_$old= 618 esac 619 ;; 620 *) for key in $x 621 do eval x='$'CONF_call_${key} 622 case $x in 623 XX) eval CONF_call_${key}=QQ 624 eval CONF_flags_${key}=S'$'CONF_flags_${key} 625 ;; 626 esac 627 done 628 esac 629 ;; 630 esac 631done 632 633# sort keys by name 634 635keys=`for key in $keys 636do eval echo '$'CONF_name_$key '$'key 637done | sort -u | sed 's,.* ,,'` 638case $debug in 639-d3) for key in $keys 640 do eval name=\"'$'CONF_name_$key\" 641 case $name in 642 ?*) eval standard=\"'$'CONF_standard_$key\" 643 eval call=\"'$'CONF_call_$key\" 644 eval section=\"'$'CONF_section_$key\" 645 eval flags=\"'$'CONF_flags_$key\" 646 eval define=\"'$'CONF_define_$key\" 647 eval values=\"'$'CONF_values_$key\" 648 eval script=\"'$'CONF_script_$key\" 649 eval headers=\"'$'CONF_headers_$key\" 650 printf "%29s %35s %8s %2s %1d %5s %s$nl" "$name" "$key" "$standard" "$call" "$section" "$flags" "$define${values:+$sp=$values}${headers:+$sp$headers$nl}${script:+$sp$ob$script$nl$cb}" 651 ;; 652 esac 653 done 654 exit 655 ;; 656esac 657 658# mark the dups CONF_PREFIXED 659 660prev_key= 661prev_name= 662for key in $keys 663do eval name=\"'$'CONF_name_$key\" 664 case $name in 665 '') continue 666 ;; 667 $prev_name) 668 eval p='$'CONF_flags_${prev_key} 669 eval c='$'CONF_flags_${key} 670 case $p:$c in 671 *L*:*L*);; 672 *L*:*) c=L${c} ;; 673 *:*L*) p=L${p} ;; 674 *) p=P$p c=P$c ;; 675 esac 676 eval CONF_flags_${prev_key}=$p 677 eval CONF_flags_${key}=$c 678 ;; 679 esac 680 prev_name=$name 681 prev_key=$key 682done 683 684# collect all the macros/enums 685 686for key in $keys 687do eval name=\"'$'CONF_name_$key\" 688 case $name in 689 '') continue ;; 690 $keep_name) ;; 691 *) continue ;; 692 esac 693 eval call=\"'$'CONF_call_$key\" 694 case $call in 695 $keep_call) ;; 696 *) continue ;; 697 esac 698 eval standard=\"'$'CONF_standard_$key\" 699 eval section=\"'$'CONF_section_$key\" 700 eval flags=\"'$'CONF_flags_$key\" 701 eval define=\"'$'CONF_define_$key\" 702 eval values=\"'$'CONF_values_$key\" 703 eval script=\"'$'CONF_script_$key\" 704 eval args=\"'$'CONF_args_$key\" 705 eval headers=\"'$'CONF_headers_$key\" 706 conf_name=$name 707 case $call in 708 QQ) call=XX 709 for c in SC PC CS 710 do case $flags in 711 *S*) case $section in 712 1) eval x='$'CONF_call_${c}_${standard}_${name} ;; 713 *) eval x='$'CONF_call_${c}_${standard}${section}_${name} ;; 714 esac 715 ;; 716 *) eval x='$'CONF_call_${c}_${name} 717 ;; 718 esac 719 case $x in 720 ?*) call=$x 721 break 722 ;; 723 esac 724 done 725 case $call in 726 XX) for c in SC PC CS 727 do echo "_${c}_${name}" 728 case $flags in 729 *S*) case $section in 730 1) echo "_${c}_${standard}_${name}" ;; 731 *) echo "_${c}_${standard}${section}_${name}" ;; 732 esac 733 ;; 734 esac 735 done 736 ;; 737 esac 738 ;; 739 esac 740 case $call in 741 CS|PC|SC|SI|XX) 742 ;; 743 *) echo "$command: $name: $call: invalid call" >&2 744 exit 1 745 ;; 746 esac 747 case $flags in 748 *[ABEGHIJQTYZabcefghijklmnopqrstuvwxyz_123456789]*) 749 echo "$command: $name: $flags: invalid flag(s)" >&2 750 exit 1 751 ;; 752 esac 753 case $section in 754 [01]) ;; 755 *) case $flags in 756 *N*) ;; 757 *) name=${section}_${name} ;; 758 esac 759 standard=${standard}${section} 760 ;; 761 esac 762 case $call in 763 XX) ;; 764 *) case $flags in 765 *d*) conf_op=${define} ;; 766 *O*) conf_op=${call}_${name} ;; 767 *R*) conf_op=_${standard}_${call}_${name} ;; 768 *S*) conf_op=_${call}_${standard}_${name} ;; 769 *) conf_op=_${call}_${name} ;; 770 esac 771 echo "${conf_op}" 772 ;; 773 esac 774 case $standard:$flags in 775 C:*) ;; 776 *:*L*) echo "${conf_name}" 777 echo "_${standard}_${conf_name}" 778 ;; 779 *:*M*) case $section in 780 1) echo "_${standard}_${conf_name}" ;; 781 *) echo "_${standard}${section}_${conf_name}" ;; 782 esac 783 ;; 784 esac 785done > $tmp.q 786sort -u < $tmp.q > $tmp.t 787mv $tmp.t $tmp.q 788sort -u < $tmp.v > $tmp.t 789mv $tmp.t $tmp.v 790case $debug in 791-d4) exit ;; 792esac 793 794# test all the macros in a few batches (some compilers have an error limit) 795 796defined() # list-file 797{ 798 : > $tmp.p 799 while : 800 do { 801 cat <<! 802${head} 803#include <sys/types.h> 804#include <limits.h> 805#include <unistd.h>$systeminfo$headers 806${tail} 807#undef conf 808unsigned int conf[] = { 809! 810 sed 's/$/,/' $1 811 echo "};" 812 } > $tmp.c 813 [ -f $tmp.1.c ] || cp $tmp.c $tmp.1.c 814 if $cc -c $tmp.c > $tmp.e 2>&1 815 then break 816 fi 817 [ -f $tmp.1.e ] || cp $tmp.e $tmp.1.e 818 snl='\ 819' 820 grep 'error:' $tmp.e | sed "s/did you mean.*//" | 821 sed "s/[^_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789][^_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]*/${snl}/g" | 822 grep '^[_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz][_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789]*$' | 823 sort -u > $tmp.n 824 cmp -s $tmp.n $tmp.p && break 825 fgrep -x -v -f $tmp.n $1 > $tmp.y 826 mv $tmp.y $1 827 mv $tmp.n $tmp.p 828 done 829 { 830 cat <<! 831${head} 832#include <sys/types.h> 833#include <limits.h> 834#include <unistd.h>$systeminfo$headers 835${tail} 836#undef conf 837! 838 sed 's/.*/conf "&" = &/' $1 839 } > $tmp.c 840 $cc -E $tmp.c 2>/dev/null | 841 sed -e '/conf[ ]*".*"[ ]*=[ ]*/!d' -e '/[_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789][ ]*(/!d' -e 's/.*"\(.*\)".*/\1/' > $tmp.n 842 if test -s $tmp.n 843 then fgrep -x -v -f $tmp.n $1 > $tmp.y 844 mv $tmp.y $1 845 fi 846} 847 848case $verbose in 8491) echo "$command: check macros/enums as static initializers" >&2 ;; 850esac 851defined $tmp.q 852defined $tmp.v 853case $debug in 854-d5) exit ;; 855esac 856 857# mark the constant macros/enums 858 859exec < $tmp.q 860while read line 861do eval CONF_const_${line}=1 862done 863exec < $tmp.v 864while read line 865do eval CONF_const_${line}=1 866done 867 868# mark the string literal values 869 870{ 871 cat <<! 872${head} 873#include <sys/types.h> 874#include <limits.h> 875#include <unistd.h>$systeminfo$headers 876${tail} 877#undef conf 878! 879 sed 's/.*/conf "&" = &/' $tmp.q 880} > $tmp.c 881$cc -E $tmp.c 2>/dev/null | 882sed -e '/conf[ ]*".*"[ ]*=[ ]*"/!d' -e 's/.*"\([^"]*\)".*/\1/' > $tmp.e 883exec < $tmp.e 884while read line 885do eval CONF_string_${line}=1 886done 887 888# walk through the table 889 890case $shell in 891ksh) integer len name_max ;; 892esac 893name_max=1 894export tmp name standard call cc 895 896exec > $tmp.t 897for key in $keys 898do eval name=\"'$'CONF_name_$key\" 899 case $name in 900 '') continue ;; 901 $keep_name) ;; 902 *) continue ;; 903 esac 904 eval call=\"'$'CONF_call_$key\" 905 case $call in 906 $keep_call) ;; 907 *) continue ;; 908 esac 909 eval standard=\"'$'CONF_standard_$key\" 910 eval section=\"'$'CONF_section_$key\" 911 eval flags=\"'$'CONF_flags_$key\" 912 eval define=\"'$'CONF_define_$key\" 913 eval values=\"'$'CONF_values_$key\" 914 eval script=\"'$'CONF_script_$key\" 915 eval args=\"'$'CONF_args_$key\" 916 eval headers=\"'$'CONF_headers_$key\" 917 conf_name=$name 918 case $call in 919 QQ) call=XX 920 for c in SC PC CS 921 do case $flags in 922 *S*) case $section in 923 1) eval x='$'CONF_call_${c}_${standard}_${name} ;; 924 *) eval x='$'CONF_call_${c}_${standard}${section}_${name} ;; 925 esac 926 ;; 927 *) eval x='$'CONF_call_${c}_${name} 928 ;; 929 esac 930 case $x in 931 ?*) call=$x 932 break 933 ;; 934 esac 935 done 936 case $call in 937 XX) for c in SC PC CS 938 do case $flags in 939 *S*) case $section in 940 1) eval x='$'CONF_const__${c}_${standard}_${name} ;; 941 *) eval x='$'CONF_const__${c}_${standard}${section}_${name} ;; 942 esac 943 ;; 944 *) eval x='$'CONF_const__${c}_${name} 945 ;; 946 esac 947 case $x in 948 1) call=$c 949 break 950 ;; 951 esac 952 done 953 ;; 954 esac 955 case $call in 956 XX) case $standard in 957 C) standard=POSIX ;; 958 esac 959 case $flags in 960 *L*) flags=lFU ;; 961 *) flags=FU ;; 962 esac 963 ;; 964 esac 965 ;; 966 esac 967 case " $standards " in 968 *" $standard "*) 969 ;; 970 *) standards="$standards $standard" 971 ;; 972 esac 973 conf_standard=CONF_${standard} 974 case $call in 975 CS) conf_call=CONF_confstr 976 ;; 977 PC) conf_call=CONF_pathconf 978 ;; 979 SC) conf_call=CONF_sysconf 980 ;; 981 SI) conf_call=CONF_sysinfo 982 ;; 983 XX) conf_call=CONF_nop 984 ;; 985 esac 986 conf_op=-1 987 for s in _${call}_${standard}${section}_${name} _${call}_${standard}_${name} _${call}_${section}_${name} _${call}_${name} ${call}_${name} 988 do eval x='$'CONF_const_${s} 989 case $x in 990 1) conf_op=${s} 991 break 992 ;; 993 esac 994 done 995 conf_section=$section 996 conf_flags=0 997 case $flags in 998 *C*) conf_flags="${conf_flags}|CONF_DEFER_CALL" ;; 999 esac 1000 case $flags in 1001 *D*) conf_flags="${conf_flags}|CONF_DEFER_MM" ;; 1002 esac 1003 case $flags in 1004 *F*) conf_flags="${conf_flags}|CONF_FEATURE" ;; 1005 esac 1006 case $flags in 1007 *L*) conf_flags="${conf_flags}|CONF_LIMIT" ;; 1008 esac 1009 case $flags in 1010 *M*) conf_flags="${conf_flags}|CONF_MINMAX" ;; 1011 esac 1012 case $flags in 1013 *N*) conf_flags="${conf_flags}|CONF_NOSECTION" ;; 1014 esac 1015 case $flags in 1016 *P*) conf_flags="${conf_flags}|CONF_PREFIXED" ;; 1017 esac 1018 case $flags in 1019 *S*) conf_flags="${conf_flags}|CONF_STANDARD" ;; 1020 esac 1021 case $flags in 1022 *U*) conf_flags="${conf_flags}|CONF_UNDERSCORE" ;; 1023 esac 1024 case $flags in 1025 *V*) conf_flags="${conf_flags}|CONF_NOUNDERSCORE" ;; 1026 esac 1027 case $flags in 1028 *W*) conf_flags="${conf_flags}|CONF_PREFIX_ONLY" ;; 1029 esac 1030 case $debug in 1031 ?*) case $standard in 1032 ????) sep=" " ;; 1033 ???) sep=" " ;; 1034 ??) sep=" " ;; 1035 ?) sep=" " ;; 1036 *) sep="" ;; 1037 esac 1038 echo "$command: test: $sep$standard $call $name" >&2 1039 ;; 1040 esac 1041 case $call in 1042 CS|SI) conf_flags="${conf_flags}|CONF_STRING" 1043 string=1 1044 ;; 1045 *) eval string='$'CONF_string_${key} 1046 ;; 1047 esac 1048 conf_limit=0 1049 case $flags in 1050 *[Ll]*) d= 1051 case ${conf_name} in 1052 LONG_MAX|SSIZE_MAX) 1053 x= 1054 ;; 1055 *) eval x='$'CONF_const_${conf_name} 1056 ;; 1057 esac 1058 case $x in 1059 '') for s in ${values} 1060 do case $s in 1061 $sym) eval x='$'CONF_const_${s} 1062 case $x in 1063 1) eval a='$'CONF_const_${standard}_${s} 1064 case $a in 1065 $x) x= ;; 1066 *) x=$s ;; 1067 esac 1068 break 1069 ;; 1070 esac 1071 ;; 1072 [0123456789]*|[-+][0123456789]*) 1073 d=$s 1074 break 1075 ;; 1076 esac 1077 done 1078 case ${x:+1}:$flags:$conf_op in 1079 :*:-1|:*X*:*) 1080 case $verbose in 1081 1) echo "$command: probe for ${conf_name} <limits.h> value" >&2 ;; 1082 esac 1083 x= 1084 case $CONF_getconf in 1085 ?*) if $CONF_getconf $conf_name > $tmp.x 2>/dev/null 1086 then x=`cat $tmp.x` 1087 case $x in 1088 undefined) x= ;; 1089 esac 1090 fi 1091 ;; 1092 esac 1093 case ${x:+1} in 1094 '') case $script in 1095 '#'*) echo "$script" > $tmp.sh 1096 chmod +x $tmp.sh 1097 x=`./$tmp.sh 2>/dev/null` 1098 ;; 1099 '') case $conf_name in 1100 SIZE_*|U*|*_MAX) 1101 f="%${LL_format}u" 1102 t="unsigned _ast_intmax_t" 1103 ;; 1104 *) f="%${LL_format}d" 1105 t="_ast_intmax_t" 1106 ;; 1107 esac 1108 cat > $tmp.c <<! 1109${head} 1110#include <stdio.h> 1111#include <sys/types.h> 1112#include <limits.h> 1113#include <unistd.h>$systeminfo$headers 1114${tail} 1115int 1116main() 1117{ 1118 printf("$f\n", ($t)$conf_name); 1119 return 0; 1120} 1121! 1122 ;; 1123 *) cat > $tmp.c <<! 1124${head} 1125#include <stdio.h> 1126#include <sys/types.h> 1127#include <limits.h> 1128#include <unistd.h>$systeminfo$headers 1129${tail} 1130${script} 1131! 1132 ;; 1133 esac 1134 case $args in 1135 '') set "" ;; 1136 *) eval set '""' '"'$args'"'; shift ;; 1137 esac 1138 for a 1139 do case $script in 1140 '#'*) ./$tmp.sh $a > $tmp.x 2>/dev/null 1141 x=$? 1142 ;; 1143 *) $cc $a -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe > $tmp.x 2>/dev/null 1144 x=$? 1145 ;; 1146 esac 1147 case $x in 1148 0) x=`cat $tmp.x` 1149 case $x in 1150 "-") x=$a ;; 1151 esac 1152 break 1153 ;; 1154 *) x= 1155 ;; 1156 esac 1157 done 1158 ;; 1159 esac 1160 case $x in 1161 '') x=$d ;; 1162 esac 1163 ;; 1164 esac 1165 case ${x:+1}:$flags:$conf_op in 1166 1:*:-1|1:*X*:*) 1167 conf_limit=$x 1168 case $flags in 1169 *L*) ;; 1170 *) conf_flags="${conf_flags}|CONF_LIMIT" ;; 1171 esac 1172 conf_flags="${conf_flags}|CONF_LIMIT_DEF" 1173 case $string:$x in 1174 1:*) cat >> $tmp.l <<! 1175printf("#ifndef ${conf_name}\n"); 1176printf("#define ${conf_name} \"${x}\"\n"); 1177printf("#endif\n"); 1178! 1179 ;; 1180 *:U*) cat >> $tmp.l <<! 1181printf("#ifndef ${conf_name}\n"); 1182printf("#ifndef ${x}\n"); 1183printf("#define ${x} %lu\n", ${x}); 1184printf("#endif\n"); 1185printf("#define ${conf_name} ${x}\n"); 1186printf("#endif\n"); 1187! 1188 ;; 1189 *:$sym) cat >> $tmp.l <<! 1190printf("#ifndef ${conf_name}\n"); 1191printf("#ifndef ${x}\n"); 1192printf("#define ${x} %ld\n", ${x}); 1193printf("#endif\n"); 1194printf("#define ${conf_name} ${x}\n"); 1195printf("#endif\n"); 1196! 1197 ;; 1198 *) cat >> $tmp.l <<! 1199printf("#ifndef ${conf_name}\n"); 1200printf("#define ${conf_name} ${x}\n"); 1201printf("#endif\n"); 1202! 1203 ;; 1204 esac 1205 ;; 1206 esac 1207 ;; 1208 esac 1209 ;; 1210 esac 1211 case $section in 1212 [01]) ;; 1213 *) case $flags in 1214 *N*) ;; 1215 *) name=${section}_${name} ;; 1216 esac 1217 standard=${standard}${section} 1218 ;; 1219 esac 1220 conf_minmax=0 1221 case $call:$standard:$flags in 1222 *:C:*M*)for s in _${standard}_${conf_name} ${values} 1223 do case $s in 1224 $sym) ;; 1225 *) conf_minmax=$s 1226 conf_flags="${conf_flags}|CONF_MINMAX_DEF" 1227 break 1228 ;; 1229 esac 1230 done 1231 ;; 1232 *:C:*) ;; 1233 [CPSX][CSX]:*:*[FM]*) 1234 x= 1235 for s in _${standard}_${conf_name} ${values} 1236 do case $s in 1237 $sym) eval x='$'CONF_const_${s} ;; 1238 *) x=1 ;; 1239 esac 1240 case $x in 1241 1) conf_minmax=$s 1242 case $flags in 1243 *M*) conf_flags="${conf_flags}|CONF_MINMAX_DEF" ;; 1244 esac 1245 case $conf_minmax in 1246 [-+0123456789]*) x= ;; 1247 esac 1248 break 1249 ;; 1250 esac 1251 done 1252 case ${x:+1}:${script:+1} in 1253 :1) case $verbose in 1254 1) echo "$command: probe for _${standard}_${conf_name} minmax value" >&2 ;; 1255 esac 1256 case $CONF_getconf in 1257 ?*) if $CONF_getconf _${standard}_${conf_name} > $tmp.x 2>/dev/null 1258 then x=`cat $tmp.x` 1259 case $x in 1260 undefined) x= ;; 1261 esac 1262 fi 1263 ;; 1264 esac 1265 case $x in 1266 '') case $script in 1267 '#'*) echo "$script" > $tmp.sh 1268 chmod +x $tmp.sh 1269 x=`./$tmp.sh 2>/dev/null` 1270 ;; 1271 *) cat > $tmp.c <<! 1272${head} 1273#include <sys/types.h> 1274#include <limits.h> 1275#include <unistd.h>$systeminfo$headers 1276${tail} 1277${script} 1278! 1279 ;; 1280 esac 1281 case $args in 1282 '') set "" ;; 1283 *) eval set '""' "$args"; shift ;; 1284 esac 1285 for a 1286 do case $script in 1287 '#'*) ./$tmp.sh $a > $tmp.x 2>/dev/null 1288 x=$? 1289 ;; 1290 *) $cc $a -o $tmp.exe $tmp.c >/dev/null 2>&1 && ./$tmp.exe > $tmp.x 2>/dev/null 1291 x=$? 1292 ;; 1293 esac 1294 case $x in 1295 0) x=`cat $tmp.x` 1296 case $x in 1297 "-") x=$a ;; 1298 esac 1299 break 1300 ;; 1301 *) x= 1302 ;; 1303 esac 1304 done 1305 ;; 1306 esac 1307 case $x in 1308 ?*) conf_minmax=$x 1309 case $flags in 1310 *M*) case "|$conf_flags|" in 1311 *'|CONF_MINMAX_DEF|'*) 1312 ;; 1313 *) conf_flags="${conf_flags}|CONF_MINMAX_DEF" 1314 ;; 1315 esac 1316 ;; 1317 esac 1318 ;; 1319 esac 1320 ;; 1321 esac 1322 ;; 1323 esac 1324 case $string in 1325 1) conf_limit="{ 0, $conf_limit }" conf_minmax="{ 0, $conf_minmax }" 1326 ;; 1327 *) case $conf_limit in 1328 0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*) 1329 ;; 1330 *[!0123456789abcdefABCDEF]*) 1331 conf_limit=0 1332 ;; 1333 *[!0123456789]*) 1334 conf_limit=0x$conf_limit 1335 ;; 1336 esac 1337 case $conf_minmax in 1338 0[xX]*|-*|+*|[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]*) 1339 ;; 1340 *[!0123456789abcdefABCDEF]*) 1341 conf_minmax=0 1342 ;; 1343 *[!0123456789]*) 1344 conf_minmax=0x$conf_minmax 1345 ;; 1346 esac 1347 case $conf_limit in 1348 ?*[-+]*|*['()']*) 1349 ;; 1350 *[lLuU]) 1351 case $LL_suffix in 1352 ??) case $conf_limit in 1353 *[!lL][lL]|*[!lL][lL][uU]) 1354 conf_limit=${conf_limit}L 1355 ;; 1356 esac 1357 ;; 1358 esac 1359 ;; 1360 -*[2468]) 1361 case $shell in 1362 ksh) p=${conf_limit%?} 1363 s=${conf_limit#$p} 1364 ((s=s-1)) 1365 ;; 1366 *) eval `echo '' $conf_limit | sed 's/ *\(.*\)\(.\) */p=\1 s=\2/'` 1367 s=`expr $s - 1` 1368 ;; 1369 esac 1370 conf_limit=${p}${s}${LL_suffix}-1${LL_suffix} 1371 ;; 1372 0[xX]*[abcdefABCDEF]) 1373 conf_limit=${conf_limit}${LL_suffix} 1374 ;; 1375 -*[0123456789]) 1376 conf_limit=${conf_limit}${LL_suffix} 1377 ;; 1378 *[0123456789]) 1379 conf_limit=${conf_limit}${U_suffix}${LL_suffix} 1380 ;; 1381 esac 1382 case $conf_minmax in 1383 ?*[-+]*|*['()']*) 1384 ;; 1385 *[lLuU]) 1386 case $LL_suffix in 1387 ??) case $conf_minmax in 1388 *[!lL][lL]|*[!lL][lL][uU]) 1389 conf_minmax=${conf_minmax}L 1390 ;; 1391 esac 1392 ;; 1393 esac 1394 ;; 1395 -*[2468]) 1396 case $shell in 1397 ksh) p=${conf_minmax%?} 1398 s=${conf_minmax#$p} 1399 ((s=s-1)) 1400 ;; 1401 *) eval `echo '' $conf_minmax | sed 's/ *\(.*\)\(.\) */p=\1 s=\2/'` 1402 s=`expr $s - 1` 1403 ;; 1404 esac 1405 conf_minmax=${p}${s}${LL_suffix}-1${LL_suffix} 1406 ;; 1407 0[xX]*[abcdefABCDEF]) 1408 conf_minmax=${conf_minmax}${LL_suffix} 1409 ;; 1410 -*[0123456789]) 1411 conf_minmax=${conf_minmax}${LL_suffix} 1412 ;; 1413 *[0123456789]) 1414 conf_minmax=${conf_minmax}${U_suffix}${LL_suffix} 1415 ;; 1416 esac 1417 conf_limit="{ $conf_limit, 0 }" conf_minmax="{ $conf_minmax, 0 }" 1418 ;; 1419 esac 1420 case $conf_flags in 1421 '0|'*) case $shell in 1422 ksh) conf_flags=${conf_flags#0?} ;; 1423 *) conf_flags=`echo "$conf_flags" | sed 's/^0.//'` ;; 1424 esac 1425 ;; 1426 esac 1427 echo "{ \"$conf_name\", $conf_limit, $conf_minmax, $conf_flags, $conf_standard, $conf_section, $conf_call, $conf_op }," 1428 case $shell in 1429 ksh) len=${#conf_name} 1430 if ((len>=name_max)) 1431 then ((name_max=len+1)) 1432 fi 1433 ;; 1434 *) len=`echo ${conf_name} | wc -c` 1435 if expr \( $len - 1 \) \>= ${name_max} >/dev/null 1436 then name_max=$len 1437 fi 1438 ;; 1439 esac 1440done 1441exec > /dev/null 1442case $debug in 1443-d6) exit ;; 1444esac 1445 1446# conf string table 1447 1448base=conftab 1449case $verbose in 14501) echo "$command: generate ${base}.h string table header" >&2 ;; 1451esac 1452case $shell in 1453ksh) ((name_max=name_max+3)); ((name_max=name_max/4*4)) ;; # bsd /bin/sh ! 1454*) name_max=`expr \( $name_max + 3 \) / 4 \* 4` ;; 1455esac 1456{ 1457cat <<! 1458#ifndef _CONFTAB_H 1459#define _CONFTAB_H 1460$systeminfo 1461 1462${generated} 1463 1464#if !defined(const) && !defined(__STDC__) && !defined(__cplusplus) && !defined(c_plusplus) 1465#define const 1466#endif 1467 1468#define conf _ast_conf_data 1469#define conf_elements _ast_conf_ndata 1470 1471#define prefix _ast_conf_prefix 1472#define prefix_elements _ast_conf_nprefix 1473 1474#define CONF_nop 0 1475#define CONF_confstr 1 1476#define CONF_pathconf 2 1477#define CONF_sysconf 3 1478#define CONF_sysinfo 4 1479 1480! 1481index=0 1482for standard in $standards 1483do echo "#define CONF_${standard} ${index}" 1484 case $shell in 1485 ksh) ((index=index+1)) ;; 1486 *) index=`expr ${index} + 1` ;; 1487 esac 1488done 1489echo "#define CONF_call ${index}" 1490case $CONF_getconf in 1491?*) echo 1492 echo "#define _pth_getconf \"$CONF_getconf\"" 1493 case $CONF_getconf_a in 1494 ?*) echo "#define _pth_getconf_a \"$CONF_getconf_a\"" ;; 1495 esac 1496 ;; 1497esac 1498cat <<! 1499 1500#define CONF_DEFER_CALL 0x0001 1501#define CONF_DEFER_MM 0x0002 1502#define CONF_FEATURE 0x0004 1503#define CONF_LIMIT 0x0008 1504#define CONF_LIMIT_DEF 0x0010 1505#define CONF_MINMAX 0x0020 1506#define CONF_MINMAX_DEF 0x0040 1507#define CONF_NOSECTION 0x0080 1508#define CONF_NOUNDERSCORE 0x0100 1509#define CONF_PREFIX_ONLY 0x0200 1510#define CONF_PREFIXED 0x0400 1511#define CONF_STANDARD 0x0800 1512#define CONF_STRING 0x1000 1513#define CONF_UNDERSCORE 0x2000 1514#define CONF_USER 0x4000 1515 1516struct Conf_s; typedef struct Conf_s Conf_t; 1517 1518typedef struct Value_s 1519{ 1520 intmax_t number; 1521 const char* string; 1522} Value_t; 1523 1524struct Conf_s 1525{ 1526 const char name[${name_max}]; 1527 Value_t limit; 1528 Value_t minmax; 1529 unsigned int flags; 1530 short standard; 1531 short section; 1532 short call; 1533 short op; 1534}; 1535 1536typedef struct Prefix_s 1537{ 1538 const char name[16]; 1539 short length; 1540 short standard; 1541 short call; 1542} Prefix_t; 1543 1544extern const Conf_t conf[]; 1545extern const int conf_elements; 1546 1547extern const Prefix_t prefix[]; 1548extern const int prefix_elements; 1549 1550#endif 1551! 1552} > $tmp.2 1553case $debug in 1554-d7) echo $command: $tmp.2 ${base}.h ;; 1555*) cmp -s $tmp.2 ${base}.h 2>/dev/null || mv $tmp.2 ${base}.h ;; 1556esac 1557 1558case $verbose in 15591) echo "$command: generate ${base}.c string table" >&2 ;; 1560esac 1561{ 1562cat <<! 1563${head} 1564#include <sys/types.h> 1565#include <limits.h> 1566#include <unistd.h>$systeminfo$headers 1567${tail} 1568#include "${base}.h" 1569 1570${generated} 1571 1572/* 1573 * prefix strings -- the first few are indexed by Conf_t.standard 1574 */ 1575 1576const Prefix_t prefix[] = 1577{ 1578! 1579for standard in $standards 1580do case $shell in 1581 ksh) len=${#standard} ;; 1582 *) len=`echo ${standard} | wc -c`; len=`expr $len - 1` ;; 1583 esac 1584 echo " \"${standard}\", ${len}, CONF_${standard}, -1," 1585done 1586cat <<! 1587 "XX", 2, CONF_POSIX, CONF_nop, 1588 "CS", 2, CONF_POSIX, CONF_confstr, 1589 "PC", 2, CONF_POSIX, CONF_pathconf, 1590 "SC", 2, CONF_POSIX, CONF_sysconf, 1591 "SI", 2, CONF_SVID, CONF_sysinfo, 1592}; 1593 1594const int prefix_elements = (int)sizeof(prefix) / (int)sizeof(prefix[0]); 1595 1596/* 1597 * conf strings sorted in ascending order 1598 */ 1599 1600const Conf_t conf[] = 1601{ 1602! 1603cat $tmp.t 1604cat <<! 1605}; 1606 1607const int conf_elements = (int)sizeof(conf) / (int)sizeof(conf[0]); 1608! 1609} > $tmp.4 1610case $debug in 1611-d7) echo $command: $tmp.4 ${base}.c ;; 1612*) cmp -s $tmp.4 ${base}.c 2>/dev/null || mv $tmp.4 ${base}.c ;; 1613esac 1614 1615# limits.h generation code 1616 1617base=conflim 1618case $verbose in 16191) echo "$command: generate ${base}.h supplemental <limits.h> values" >&2 ;; 1620esac 1621{ 1622cat <<! 1623${generated} 1624 1625/* 1626 * supplemental <limits.h> values 1627 */ 1628 1629! 1630test -f $tmp.l && cat $tmp.l 1631} > $tmp.5 1632case $debug in 1633-d7) echo $command: $tmp.5 ${base}.h ;; 1634*) cmp -s $tmp.5 ${base}.h 2>/dev/null || mv $tmp.5 ${base}.h ;; 1635esac 1636exit 0 1637