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