1#!/usr/bin/perl 2 3BEGIN { 4 if (-f './TestInit.pm') { 5 @INC = '.'; 6 } elsif (-f '../TestInit.pm') { 7 @INC = '..'; 8 } 9} 10use TestInit qw(T); # T is chdir to the top level 11 12use warnings; 13use strict; 14use Config; 15use Data::Dumper; 16require './t/test.pl'; 17 18if ( $Config{usecrosscompile} ) { 19 skip_all( "Not all files are available during cross-compilation" ); 20} 21 22plan('no_plan'); 23 24# --make-exceptions-list outputs the list of strings that don't have 25# perldiag.pod entries to STDERR without TAP formatting, so they can 26# easily be put in the __DATA__ section of this file. This was done 27# initially so as to not create new test failures upon the initial 28# creation of this test file. You probably shouldn't do it again. 29# Just add the documentation instead. 30my $make_exceptions_list = ($ARGV[0]||'') eq '--make-exceptions-list' 31 and shift; 32 33require './regen/embed_lib.pl'; 34 35# Look for functions that look like they could be diagnostic ones. 36my @functions; 37foreach (@{(setup_embed())[0]}) { 38 my $embed= $_->{embed} 39 or next; 40 next unless $embed->{name} =~ /warn|(?<!ov)err|(\b|_)die|croak|deprecate/i; 41 # Skip some known exceptions 42 next if $embed->{name} =~ /croak_kw_unless_class/; 43 # The flag p means that this function may have a 'Perl_' prefix 44 # The flag S means that this function may have a 'S_' prefix 45 push @functions, $embed->{name}; 46 push @functions, 'Perl_' . $embed->{name} if $embed->{flags} =~ /p/; 47 push @functions, 'S_' . $embed->{name} if $embed->{flags} =~ /S/; 48}; 49push @functions, 'Perl_mess'; 50@functions = sort { length($b) <=> length($a) || $a cmp $b } @functions; 51push @functions, 'PERL_DIAG_(?<wrapper>\w+)'; 52 53my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?(?:utf8f)?\b'; 54my $regcomp_re = 55 "(?<routine>ckWARN(?:\\d+)?reg\\w*|vWARN\\d+|$regcomp_fail_re)"; 56my $function_re = join '|', @functions; 57my $source_msg_re = 58 "(?<routine>\\bDIE\\b|$function_re)"; 59my $text_re = '"(?<text>(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"'; 60my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s* 61 \( (?: \s* Perl_form \( )? (?:aTHX_)? \s* 62 (?:packWARN\d*\((?<category>.*?)\),)? \s* 63 (?:(?<category>WARN_DEPRECATED__\w+)\s*,(?:\s*(?<version_string>"[^"]+")\s*,)?)? \s* 64 $text_re /x; 65my $bad_version_re = qr{BADVERSION\([^"]*$text_re}; 66 $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/; 67my $regcomp_call_re = qr/$regcomp_re.*?$text_re/; 68 69my %entries; 70my $data_start_line= 0; 71# Get the ignores that are compiled into this file 72my $reading_categorical_exceptions; 73# reset the DATA point to the top of the file, read until we find __DATA__ 74# so that $. is "correct" for our purposes. 75seek DATA, 0, 0; 76while (<DATA>) { 77 /^__DATA__/ and last; 78} 79while (<DATA>) { 80 chomp; 81 next if /^\s*#/ and !/\S/; 82 $entries{$_}{todo} = 1; 83 $entries{$_}{todo_line}= $data_start_line + $.; 84 $reading_categorical_exceptions and $entries{$_}{cattodo}=1; 85 /__CATEGORIES__/ and ++$reading_categorical_exceptions; 86} 87 88my $pod = "pod/perldiag.pod"; 89my $cur_entry; 90open my $diagfh, "<", $pod 91 or die "Can't open $pod: $!"; 92 93my $category_re = qr/ [a-z0-9_:]+?/; # Note: requires an initial space 94my $severity_re = qr/ . (?: \| . )* /x; # A severity is a single char, but can 95 # be of the form 'S|P|W' 96my @same_descr; 97my $depth = 0; 98while (<$diagfh>) { 99 if (m/^=over/) { 100 $depth++; 101 next; 102 } 103 if (m/^=back/) { 104 $depth--; 105 next; 106 } 107 108 # Stuff deeper than main level is ignored 109 next if $depth != 1; 110 111 if (m/^=item (.*)/) { 112 $cur_entry = $1; 113 114 # Allow multi-line headers 115 while (<$diagfh>) { 116 if (/^\s*$/) { 117 last; 118 } 119 120 $cur_entry =~ s/ ?\z/ $_/; 121 } 122 123 $cur_entry =~ s/\n/ /gs; # Fix multi-line headers if they have \n's 124 $cur_entry =~ s/\s+\z//; 125 $cur_entry =~ s/E<lt>/</g; 126 $cur_entry =~ s/E<gt>/>/g; 127 $cur_entry =~ s,E<sol>,/,g; 128 $cur_entry =~ s/[BCIFS](?:<<< (.*?) >>>|<< (.*?) >>|<(.*?)>)/$+/g; 129 130 if (exists $entries{$cur_entry} && $entries{$cur_entry}{todo} 131 && !$entries{$cur_entry}{cattodo}) { 132 my $data_line= $entries{$cur_entry}{todo_line}; 133 TODO: { 134 local $::TODO = "Remove the TODO entry \"$cur_entry\" from DATA " 135 . "at $0 line $data_line as it is already in $pod near line $."; 136 ok($cur_entry); 137 } 138 } 139 # Make sure to init this here, so an actual entry in perldiag 140 # overwrites one in DATA. 141 # diag("adding '$cur_entry'"); 142 $entries{$cur_entry}{todo} = 0; 143 $entries{$cur_entry}{line_number} = $.; 144 } 145 146 next if ! defined $cur_entry; 147 148 if (! $entries{$cur_entry}{severity}) { 149 if (/^ \( ( $severity_re ) 150 151 # Can have multiple categories separated by commas 152 ( $category_re (?: , $category_re)* )? \) /x) 153 { 154 $entries{$cur_entry}{severity} = $1; 155 $entries{$cur_entry}{category} = 156 $2 && join ", ", sort split " ", $2 =~ y/,//dr; 157 158 # Record it also for other messages sharing the same description 159 @$_{qw<severity category>} = 160 @{$entries{$cur_entry}}{qw<severity category>} 161 for @same_descr; 162 } 163 elsif (! $entries{$cur_entry}{first_line} && $_ =~ /\S/) { 164 165 # Keep track of first line of text if doesn't contain a severity, so 166 # that can later examine it to determine if that is ok or not 167 $entries{$cur_entry}{first_line} = $_; 168 } 169 if (/\S/) { 170 @same_descr = (); 171 } 172 else { 173 push @same_descr, $entries{$cur_entry}; 174 } 175 } 176} 177 178if ($depth != 0) { 179 diag ("Unbalance =over/=back. Fix before proceeding; over - back = " . $depth); 180 exit(1); 181} 182 183foreach my $cur_entry ( keys %entries) { 184 next if $entries{$cur_entry}{todo}; # If in this file, won't have a severity 185 if (! exists $entries{$cur_entry}{severity} 186 187 # If there is no first line, it was two =items in a row, so the 188 # second one is the one with text, not this one. 189 && exists $entries{$cur_entry}{first_line} 190 191 # If the first line refers to another message, no need for severity 192 && $entries{$cur_entry}{first_line} !~ /^See/) 193 { 194 fail($cur_entry); 195 diag( 196 " $pod entry at line $entries{$cur_entry}{line_number}\n" 197 . " \"$cur_entry\"\n" 198 . " is missing a severity and/or category" 199 ); 200 } 201} 202 203# List from perlguts.pod "Formatted Printing of IVs, UVs, and NVs" 204# Convert from internal formats to ones that the readers will be familiar 205# with, while removing any format modifiers, such as precision, the 206# presence of which would just confuse the pod's explanation. 207# Note that the 'S' formats get converted into \"%s\" as they inject 208# double quotes. 209my %specialformats = (IVdf => 'd', 210 UVuf => 'd', 211 UVof => 'o', 212 UVxf => 'x', 213 UVXf => 'X', 214 NVef => 'f', 215 NVff => 'f', 216 NVgf => 'f', 217 HEKf256=>'s', 218 HEKf256_QUOTEDPREFIX => 'S', 219 HEKf => 's', 220 HEKf_QUOTEDPREFIX => 'S', 221 UTF8f=> 's', 222 UTF8f_QUOTEDPREFIX => 'S', 223 SVf256=>'s', 224 SVf32=> 's', 225 SVf => 's', 226 SVf_QUOTEDPREFIX => 'S', 227 PVf_QUOTEDPREFIX => 'S', 228 PNf => 's', 229 HvNAMEf => 's', 230 HvNAMEf_QUOTEDPREFIX => 'S', 231 ); 232 233my $format_modifiers = qr/ [#0\ +-]* # optional flags 234 (?: [1-9][0-9]* | \* )? # optional field width 235 (?: \. \d* )? # optional precision 236 (?: h|l )? # optional length modifier 237 /x; 238 239my $specialformats = 240 join '|', sort { length($b) <=> length($a) || $a cmp $b } keys %specialformats; 241my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*(?:"|\z))?/; 242 243# We skip the bodies of most XS functions, but not within these files 244my @include_xs_files = ( 245 "builtin.c", 246 "class.c", 247 "universal.c", 248); 249 250if (@ARGV) { 251 check_file($_) for @ARGV; 252 exit; 253} 254open my $fh, '<', 'MANIFEST' or die "Can't open MANIFEST: $!"; 255while (my $file = <$fh>) { 256 chomp $file; 257 $file =~ s/\s+.*//; 258 next unless $file =~ /\.(?:c|cpp|h|xs|y)\z/ or $file =~ /^perly\./; 259 # OS/2 extensions have never been migrated to ext/, hence the special case: 260 next if $file =~ m!\A(?:ext|dist|cpan|lib|t|os2/OS2)/! 261 && $file !~ m!\Aext/DynaLoader/!; 262 check_file($file); 263} 264close $fh or die $!; 265 266# Standardize messages with variants into the form that appears 267# in perldiag.pod -- useful for things without a diag_listed_as annotation 268sub standardize { 269 my ($name) = @_; 270 271 if ( $name =~ m/^(Invalid strict version format) \([^\)]*\)/ ) { 272 $name = "$1 (\%s)"; 273 } 274 elsif ( $name =~ m/^(Invalid version format) \([^\)]*\)/ ) { 275 $name = "$1 (\%s)"; 276 } 277 elsif ($name =~ m/^(panic|Usage): /) { 278 $name = "$1: \%s"; 279 } 280 else { 281 $name =~ s/ (*plb:^Function\ ") 282 (\w+) 283 (*pla:"\ not\ implemented\ in\ this\ version\ of\ perl\.) 284 /%s/gx; 285 } 286 287 return $name; 288} 289 290sub check_file { 291 my ($codefn) = @_; 292 293 print "# Checking $codefn\n"; 294 295 open my $codefh, "<", $codefn 296 or die "Can't open $codefn: $!"; 297 298 my $listed_as; 299 my $listed_as_line; 300 my $sub = 'top of file'; 301 while (<$codefh>) { 302 chomp; 303 my $first_line = $.; 304 # Getting too much here isn't a problem; we only use this to skip 305 # errors inside of XS modules, which should get documented in the 306 # docs for the module. 307 if (m<^[^#\s]> and $_ !~ m/^[{}]*$/) { 308 $sub = $_; 309 } 310 next if $sub =~ m/^XS/ and !grep { $_ eq $codefn } @include_xs_files; 311 if (m</\*\s*diag_listed_as: (.*?)\s*\*/>) { 312 $listed_as = $1; 313 $listed_as_line = $.+1; 314 } 315 elsif (m</\*\s*diag_listed_as: (.*?)\s*\z>) { 316 my $new_listed_as = $1; 317 while (<$codefh>) { 318 if (m<\*/>) { 319 $new_listed_as .= $` =~ s/^\s*/ /r =~ s/\s+\z//r; 320 $listed_as_line = $.+1; 321 $listed_as= $new_listed_as; 322 last; 323 } 324 else { 325 $new_listed_as .= s/^\s*/ /r =~ s/\s+\z//r; 326 } 327 } 328 } 329 next if /^#/; 330 331 my $multiline = 0; 332 # Loop to accumulate the message text all on one line. 333 if (m/(?!^)\b(?:$source_msg_re(?:_nocontext)?|$regcomp_re)\s*\((?<tail>(?:[^()]+|\([^()]+\))+\))?/ 334 and !$+{tail} 335 ) { 336 while (not m/\);\s*$/) { 337 my $nextline = <$codefh>; 338 # Means we fell off the end of the file. Not terribly surprising; 339 # this code tries to merge a lot of things that aren't regular C 340 # code (preprocessor stuff, long comments). That's OK; we don't 341 # need those anyway. 342 last if not defined $nextline; 343 chomp $nextline; 344 $nextline =~ s/^\s+//; 345 $_ =~ s/\\$//; 346 # Note that we only want to do this where *both* are true. 347 if ($_ =~ m/"\s*$/ and $nextline =~ m/^"/) { 348 $_ =~ s/"\s*$//; 349 $nextline =~ s/^"//; 350 } 351 $_ .= $nextline; 352 ++$multiline; 353 } 354 } 355 # This should happen *after* unwrapping, or we don't reformat the things 356 # in later lines. 357 358 s/$specialformats_re/"%$specialformats{$1}" . (defined $2 ? '' : '"')/ge; 359 s/\%S/\\"%s\\"/g; # convert an %S into a quoted %s. 360 361 # Remove any remaining format modifiers, but not in %% 362 s/ (?<!%) % $format_modifiers ( [dioxXucsfeEgGp] ) /%$1/xg; 363 364 # The %"foo" thing needs to happen *before* this regex. 365 # diag("$first_line:>$_<"); 366 # DIE is just return Perl_die 367 my ($name, $category, $routine, $wrapper); 368 if (/\b$source_msg_call_re/) { 369 my $version_string; 370 ($name, $category, $routine, $wrapper, $version_string) = 371 ($+{'text'}, $+{'category'}, $+{'routine'}, $+{'wrapper'}, $+{'version_string'}); 372 if ($wrapper) { 373 $category = $wrapper if $wrapper=~/WARN/; 374 $routine = "Perl_warner" if $wrapper=~/WARN/; 375 $routine = "yyerror" if $wrapper=~/DIE/; 376 } 377 if ($routine=~/^deprecate/) { 378 $name .= " is deprecated"; 379 if ($version_string) { 380 like($version_string, qr/"5\.\d+"/, 381 "version string is of the correct form at $codefn line $first_line"); 382 } 383 } 384 # diag(Dumper(\%+,{category=>$category, routine=>$routine, name=>$name})); 385 # Sometimes the regexp will pick up too much for the category 386 # e.g., WARN_UNINITIALIZED), PL_warn_uninit_sv ... up to the next ) 387 $category && $category =~ s/\).*//s; 388 # Special-case yywarn 389 /yywarn/ and $category = 'syntax'; 390 if (/win32_croak_not_implemented\(/) { 391 $name .= " not implemented!" 392 } 393 } 394 elsif (/$bad_version_re/) { 395 ($name, $category) = ($+{'text'}, undef); 396 } 397 elsif (/$regcomp_fail_re/) { 398 # FAIL("foo") -> "foo in regex m/%s/" 399 # vFAIL("foo") -> "foo in regex; marked by <-- HERE in m/%s/" 400 ($name, $category) = ($+{'text'}, undef); 401 $name .= 402 " in regex" . ("; marked by <-- HERE in" x /vFAIL/) . " m/%s/"; 403 } 404 elsif (/$regcomp_call_re/) { 405 # vWARN/ckWARNreg("foo") -> "foo in regex; marked by <-- HERE in m/%s/ 406 ($name, $category, $routine) = ($+{'text'}, undef, $+{'routine'}); 407 $name .= " in regex; marked by <-- HERE in m/%s/"; 408 $category = 'WARN_REGEXP'; 409 if ($routine =~ /dep/) { 410 $category .= ',WARN_DEPRECATED'; 411 } 412 } 413 else { 414 next; 415 } 416 417 # Try to guess what the severity should be. In the case of 418 # Perl_ck_warner and other _ck_ functions, we can tell whether it is 419 # a severe/default warning or no by the _d suffix. In the case of 420 # other warn functions we cannot tell, because Perl_warner may be pre- 421 # ceded by if(ckWARN) or if(ckWARN_d). 422 my $severity = !$routine ? '[PFX]' 423 : $routine =~ /warn.*_d\z/ ? '[DS]' 424 : $routine =~ /ck_warn/ ? 'W' 425 : $routine =~ /warner/ ? '[WDS]' 426 : $routine =~ /warn/ ? 'S' 427 : $routine =~ /ckWARN.*dep/ ? 'D' 428 : $routine =~ /ckWARN\d*reg_d/? 'S' 429 : $routine =~ /ckWARN\d*reg/ ? 'W' 430 : $routine =~ /vWARN\d/ ? '[WDS]' 431 : $routine =~ /^deprecate/ ? '[DS]' 432 : '[PFX]'; 433 my $categories; 434 if (defined $category) { 435 $category =~ s/__/::/g; 436 $categories = 437 join ", ", 438 sort map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $category; 439 } 440 if ($listed_as) { 441 $name = $listed_as; 442 undef $listed_as; 443 } else { 444 # The form listed in perldiag ignores most sorts of fancy printf 445 # formatting, or makes it more perlish. 446 $name =~ s/%%/%/g; 447 $name =~ s/%l[ud]/%d/g; 448 $name =~ s/%\.(\d+|\*)s/\%s/g; 449 $name =~ s/(?:%s){2,}/%s/g; 450 $name =~ s/(\\")|("\s*[A-Z_]+\s*")/$1 ? '"' : '%s'/egg; 451 $name =~ s/\\t/\t/g; 452 $name =~ s/\\n/\n/g; 453 $name =~ s/\s+$//; 454 $name =~ s/(\\)\\/$1/g; 455 } 456 457 # Extra explanatory info on an already-listed error, doesn't 458 # need its own listing. 459 next if $name =~ m/^\t/; 460 461 # Happens fairly often with PL_no_modify. 462 next if $name eq '%s'; 463 464 # Special syntax for magic comment, allows ignoring the fact 465 # that it isn't listed. Only use in very special circumstances, 466 # like this script failing to notice that the Perl_croak call is 467 # inside an #if 0 block. 468 next if $name eq 'SKIPME'; 469 470 next if $name=~/\[TESTING\]/; # ignore these as they are works in progress 471 472 check_message(standardize($name),$codefn,$severity,$categories); 473 } 474} 475 476sub check_message { 477 my($name,$codefn,$severity,$categories,$partial) = @_; 478 my $key = $name =~ y/\n/ /r; 479 my $ret; 480 481 # Try to reduce printf() formats to simplest forms 482 # Really this should be matching %s, etc like diagnostics.pm does 483 484 # Kill flags 485 $key =~ s/%[#0\-+]/%/g; 486 487 # Kill width 488 $key =~ s/\%(\d+|\*)/%/g; 489 490 # Kill precision 491 $key =~ s/\%\.(\d+|\*)/%/g; 492 493 if (exists $entries{$key} and 494 # todo + cattodo means it is not found and it is not in the 495 # regular todo list, either 496 !$entries{$key}{todo} || !$entries{$key}{cattodo}) { 497 $ret = 1; 498 if ( $entries{$key}{seen}++ ) { 499 # no need to repeat entries we've tested 500 } elsif ($entries{$key}{todo}) { 501 TODO: { 502 no warnings 'once'; 503 local $::TODO = 'in DATA'; 504 # diag(Dumper($entries{$key})); 505 # There is no listing, but it is in the list of exceptions. TODO FAIL. 506 fail($key); 507 diag( 508 " Message '$name'\n from $codefn line $. is not listed in $pod\n". 509 " (but it wasn't documented in 5.10 either, so marking it TODO)." 510 ); 511 } 512 } else { 513 # We found an actual valid entry in perldiag.pod for this error. 514 pass($key); 515 516 return $ret 517 if $entries{$key}{cattodo}; 518 519 # Now check the category and severity 520 521 # Cache our severity qr thingies 522 use feature 'state'; 523 state %qrs; 524 my $qr = $qrs{$severity} ||= qr/$severity/; 525 526 my $pod_line = $entries{$key}{line_number} // ""; 527 528 if ($pod_line) { 529 $pod_line = ", at perldiag.pod line $pod_line"; 530 } 531 532 like($entries{$key}{severity}, $qr, 533 ($severity =~ /\[/ 534 ? "severity is one of $severity" 535 : "severity is $severity") . " for '$name' at $codefn line $.$pod_line") 536 or do { 537 if ($severity=~/D/ and $entries{$key}{severity}=~/W/) { 538 diag("You should change W to D if this is a deprecation"); 539 } 540 }; 541 542 is($entries{$key}{category}, $categories, 543 ($categories ? "categories are [$categories]" : "no category") 544 . " for '$name' at $codefn line $.$pod_line"); 545 } 546 } elsif ($partial) { 547 # noop 548 } else { 549 my $ok; 550 if ($name =~ /\n/) { 551 $ok = 1; 552 check_message($_,$codefn,$severity,$categories,1) or $ok = 0, last 553 for split /\n/, $name; 554 } 555 if ($ok) { 556 # noop 557 } elsif ($make_exceptions_list) { 558 # We're making an updated version of the exception list, to 559 # stick in the __DATA__ section. I honestly can't think of 560 # a situation where this is the right thing to do, but I'm 561 # leaving it here, just in case one of my descendents thinks 562 # it's a good idea. 563 print STDERR "$key\n"; 564 } else { 565 # No listing found, and no excuse either. 566 # Find the correct place in perldiag.pod, and add a stanza beginning =item $name. 567 fail($name); 568 diag(" Message '$name'\n from $codefn line $. is not listed in $pod"); 569 } 570 # seen it, so only fail once for this message 571 $entries{$name}{seen}++; 572 } 573 574 die if $name =~ /%$/; 575 return $ret; 576} 577 578# The DATA section includes two types of entries, in two sets separated by a 579# blank line. 580# 581# The first set are entries whose text we think is fully explanatory and don't 582# need further elaboration in perldiag. This set should consist of very few 583# entries. 584# 585# The second set, after the blank line, consists of TODO entries. (There are 586# actually two subsets described below.) This list should basically be just 587# those entries that otherwise would have generated an error upon inauguration 588# of this program, so we didn't have to go from "meh" to perfect all at once. 589# The only valid reason we can think of to add to the list is for cases where 590# this program is not smart enough to recognize the message is something that 591# actually is in perldiag. Otherwise, DO NOT ADD TO THIS LIST. Instead, 592# write an entry in pod/perldiag.pod for your new (warning|error). 593# 594# This second set has a subcategory, after the line marked __CATEGORIES__ . 595# These are entries that are in perldiag but fail the severity/category test. 596 597__DATA__ 598Function "%s" not implemented in this version of perl. 599QUITing... 600Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?) 601System V IPC is not implemented on this machine 602Terminating on signal SIG%s(%d) 603This version of OS/2 does not support %s.%s 604Usage: %s 605 606Cannot apply "%s" in non-PerlIO perl 607Can't find DLL name for the module `%s' by the handle %d, rc=%u=%x 608Can't find string terminator %c%s%c anywhere before EOF 609Can't get short module name from a handle 610Can't load DLL `%s', possible problematic module `%s' 611Can't locate %s: %s 612Can't pipe "%s": %s 613Can't set type on DOS 614Can't spawn: %s 615Can't spawn "%s": %s 616Can't %s script `%s' with ARGV[0] being `%s' 617Can't %s "%s": %s 618Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found) 619Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use 620Character(s) in '%c' format wrapped in %s 621clear %s 622Code missing after '/' in pack 623Code missing after '/' in unpack 624Could not find version 2.0 of winsock dll 625'%c' outside of string in pack 626Debug leaking scalars child failed%s with errno %d: %s 627detach of a thread which could not start 628detach on an already detached thread 629detach on a thread with a waiter 630Empty array reference given to mod2fname 631endhostent not implemented! 632endnetent not implemented! 633endprotoent not implemented! 634endservent not implemented! 635Error loading module '%s': %s 636Error reading "%s": %s 637EVAL without pos change exceeded limit in regex 638Filehandle opened only for %sput 639Filehandle %s opened only for %sput 640file_type not implemented on DOS 641filter_del can only delete in reverse order (currently) 642fork() not available 643fork() not implemented! 644YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET! FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP! 645free %s 646Free to wrong pool %p not %p 647get %s %p %p %p 648gethostent not implemented! 649getnetbyaddr not implemented! 650getnetbyname not implemented! 651getnetent not implemented! 652getprotoent not implemented! 653getpwnam returned invalid UIC %o for user "%s" 654getservent not implemented! 655glob failed (can't start child: %s) 656glob failed (child exited with status %d%s) 657Got an error from DosAllocMem: %i 658Goto undefined subroutine 659Goto undefined subroutine &%s 660Got signal %d 661()-group starts with a count in %s 662Illegal octal digit '%c' ignored 663INSTALL_PREFIX too long: `%s' 664Invalid argument to sv_cat_decode 665Invalid range "%c-%c" in transliteration operator 666Invalid separator character %c%c%c in PerlIO layer specification %s 667ioctl implemented only on sockets 668join with a thread with a waiter 669Looks like we have no PM; will not load DLL %s without $ENV{PERL_ASIF_PM} 670Malformed integer in [] in %s 671Malformed %s 672Malformed UTF-8 character (fatal) 673Missing (suid) fd script name 674More than one argument to open 675More than one argument to open(,':%s') 676No message queue 677No %s allowed while running setgid 678No %s allowed with (suid) fdscript 679Not an XSUB reference 680Not a reference given to mod2fname 681Not array reference given to mod2fname 682Operator or semicolon missing before %c%s 683Out of memory during list extend 684panic queryaddr 685Parse error 686POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/ 687ptr wrong %p != %p fl=%x nl=%p e=%p for %d 688recursion detected in %s 689Reversed %c= operator 690%s: Can't parse EXE/DLL name: '%s' 691%s(%f) failed 692%s: Error stripping dirs from EXE/DLL/INSTALLDIR name 693sethostent not implemented! 694setnetent not implemented! 695setprotoent not implemented! 696set %s %p %p %p 697setservent not implemented! 698%s free() ignored (RMAGIC, PERL_CORE) 699%s has too many errors. 700SIG%s handler "%s" not defined. 701%s in %s 702Size magic not implemented 703%s: name `%s' too long 704%s not implemented! 705%s number > %s non-portable 706%srealloc() %signored 707%s on %s %s 708%s: %s 709Starting Full Screen process with flag=%d, mytype=%d 710Starting PM process with flag=%d, mytype=%d 711switching effective gid is not implemented 712switching effective uid is not implemented 713This perl was compiled without taint support. Cowardly refusing to run with -t or -T flags 714Too deeply nested ()-groups in %s 715Too many args on %s line of "%s" 716U0 mode on a byte string 717unable to find VMSPIPE.COM for i/o piping 718Unable to locate winsock library! 719Unexpected program mode %d when morphing back from PM 720Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d 721Unstable directory path, current directory changed unexpectedly 722Unterminated compressed integer in unpack 723utf8 "\x%X" does not map to Unicode 724Value of logical "%s" too long. Truncating to %i bytes 725waitpid: process %x is not a child of process %x 726Wide character 727Wide character in $/ 728Within []-length '*' not allowed in %s 729Within []-length '%c' not allowed in %s 730Wrong size of loadOrdinals array: expected %d, actual %d 731Wrong syntax (suid) fd script name "%s" 732'X' outside of string in %s 733'X' outside of string in unpack 734 735__CATEGORIES__ 736 737# This is a warning, but is currently followed immediately by a croak (toke.c) 738Illegal character \%o (carriage return) 739 740# Because uses WARN_MISSING as a synonym for WARN_UNINITIALIZED (sv.c) 741Missing argument in %s 742 743# This message can be both fatal and non- 744False [] range "%s" in regex; marked by <-- HERE in m/%s/ 745