to pass command-line arguments like -x and -E to it), and fails
when mixed with come-from-gerund and next-from-gerund.
+7) (AIS) Something is seriously wrong with the profiler. Figure out
+ what it is.
+
TO DO
1. (ESR) Add more optimization templates, esp. idioms for +, -, *, /.
./etc/IFFI/IFFI.h
./etc/IFFI.spec
./etc/intercal.el
+./etc/intercal.vim
./etc/temp
./MANIFEST
./NEWS
Release 0.29 (by Alex Smith)
-Bugs reported by Arvid Norlander
+Bugs reported and changes patched by Arvid Norlander
1. Fixed a typo in the perpet.c version of the help information.
4. Fixed some nonsense in the -@ help screen that was generated by an errant
search-and-replace.
+5. Made several changes to bring the new Befunge-98 interface code (see
+ below) in line with changes in the Befunge-98 interpreter in use.
+
+6. Added consts and statics in the code, hopefully to make bugs easier to
+ notice.
+
+7. Refactored main(). It neeeded it, badly.
+
Bugs reported by Elliott Hird
-5. Fixed the configure script to work with the default Debian shell dash.
+8. Fixed the configure script to work with the default Debian shell dash.
(also reported independently by Debian)
-6. Actually fixed unlambda.i; the fix was meant to be in 0.28, and is
+9. Actually fixed unlambda.i; the fix was meant to be in 0.28, and is
described in its changelog, but for some reason never made it to
the distributed tarball.
-7. The -F option again works. (AIS: I accidentally broke it in the preceding
+10. The -F option again works. (AIS: I accidentally broke it in the preceding
version, making it basically a no-op by mistake.)
-8. The build now succeeds (with warnings) when lex or yacc are missing,
+11. The build now succeeds (with warnings) when lex or yacc are missing,
rather than failing with mysterious error messages that seem to have
nothing to do with the problems. (The success is made possible by using
the prebuilt versions; see change 11 of version 0.26, this is finishing
what that started.)
-Changes by Joris Huizer
+Bugs reported, changes requested, and patches by Joris Huizer
-9. The [xoritself] optimiser idiom has been generalised to handle some
+12. The [xoritself] optimiser idiom has been generalised to handle some
situations where the redundant XOR operands are on different grouping
levels; this helps to optimise some heavily inlined greater-than tests.
-10. Fixed unary operators applied to constants (AIS: it seems that my patch to
+13. Fixed unary operators applied to constants (AIS: it seems that my patch to
solve this issue earlier was itself buggy).
-11. The -g option now causes optimisation of the output compiled C to be
+14. The -g option now causes optimisation of the output compiled C to be
turned off, and adds comments to the output file the same way -c does.
-12. Added more optimiser idioms: [cxorand16], [cxorand32], [cfoldintoorinand],
+15. Added more optimiser idioms: [cxorand16], [cxorand32], [cfoldintoorinand],
[or16and], [xor16and], [lshift32half], [rshiftoutofneg], [andoutofneg];
also generalised the idiom-matching code to compare 16-bit and 32-bit
constants as equal if they have the same value, and fixed some typos in
the current 16-bit complement idioms.
-13. ABSTAINING or REINSTATING are now a lot more efficient, taking an amount
+16. ABSTAINING or REINSTATING are now a lot more efficient, taking an amount
of time proportional to the number of commands effected, rather than the
number of commands in the program. (AIS: I implemented this with the
algorithm in the patch Joris provided, but with different code, to make it
easier to maintain.)
-Bugs reported by the Debian autobuilders and Joey Hess
+Changes by Stefan O'Rear
-14. The build of the optimiser idioms is now split over many files, to reduce
+17. Added INTERCAL syntax highlighting information for vim. Why should Emacs
+ have all the fun?
+
+Changes reported by the Debian autobuilders and Joey Hess
+
+18. The build of the optimiser idioms is now split over many files, to reduce
the memory usage of gcc when it tries to compile the giant output C file.
This was a problem on ia64. (The ulimit method of preventing thrashing has
been removed, as this method works better; likewise, the optimiser
optimisation now works again.)
-Changes by Alex Smith
+Changes patched by Alex Smith
-15. The build system has been completely redone, again; it now uses automake
+19. The build system has been completely redone, again; it now uses automake
as well as a much newer version of autoconf. This means that there is now
one build system that works the same way on all systems, and that all
sorts of clever tricks like out-of-tree builds, a self-rebuilding build
still there, but now there's prebuilt instead of temp, an extra directory
buildaux, and bin, lib and include have disappeared.
-16. The distribution now comes in compressed pax format. (Before anyone
+20. The distribution now comes in compressed pax format. (Before anyone
complains that they have no idea what that is, or that I'm using something
strange and nonstandard, I'd like to point out that tar is no longer part
of POSIX, but that pax is. (See man 5 tar on a recent Linux system for
so tar readers should be able to read it just fine, if you can't get your
hands on a pax reader.)
-17. convickt can now produce its output as INTERCAL initialisation of a tail
+21. convickt can now produce its output as INTERCAL initialisation of a tail
array. (This doesn't auto-offset between the different characters; it is
therefore mostly useful for producing Baudot arrays for CLC-INTERCAL-style
IO.)
-18. The function clock_gettime is now supported by the yuk profiler as an
+22. The function clock_gettime is now supported by the yuk profiler as an
alternative method of getting a high-resolution clock for profiling (it
is available on at least Linux).
-19. Added support for computed CREATE (the computation is done at create-time,
+23. Added support for computed CREATE (the computation is done at create-time,
rather than when the unknown statement is encountered); partly because
this was rather easy, but mostly because it can be used to simulate a
computed NEXT, thus making the example expansion library compunex (which I
features of NEXT, anyway, rather than the small subset COMPUNEX could
manage.)
-20. Plugged a couple of small memory leaks; however, there are still several
+24. Plugged a couple of small memory leaks; however, there are still several
much bigger memory leaks that could do with being fixed.
-21. Added support for CREATING operators, with similar syntax to the CREATION
+25. Added support for CREATING operators, with similar syntax to the CREATION
of commands. This requires the -ea options to be set to work properly.
-22. More file extensions are now supported by the external calls system. The
+26. More file extensions are now supported by the external calls system. The
.c99 extension indicates a C99 (rather than C89) file; all .c99 files are
preprocessed as C99, and if any C99 files are used the final compilation
which compiles and links everything will be done as C99 rather than C89
locations instead of the current directory.) Other .a files can be linked
in from the current directory.
-23. Fixed the handling of division by zero in the syslibc expansion library.
+27. Fixed the handling of division by zero in the syslibc expansion library.
(The Revamped Manual states 'In all cases, division by 0 returns 0'.)
-24. Made several changes to the documentation, including fixes for some rather
+28. Made several changes to the documentation, including fixes for some rather
nasty typos (two of the worst were specifying variables as IGNORED by
default, and stating that select acts like OR in TriIntercal!).
-25. Fixed a bug in the external calls system that made it impossible to write
+29. Fixed a bug in the external calls system that made it impossible to write
a COME FROM in more than one file at a time whilst still having the
resulting program work reliably.
-26. Added support for external calls to Befunge-98 programs; however, this
+30. Added support for external calls to Befunge-98 programs; however, this
distribution does not ship with a Funge-98 interpreter, so in order to use
this feature you will first have to compile a Funge-98 interpreter into a
library for use with C-INTERCAL (see README.txt or the Revamped Manual for
information on this). Also added a test program for this to the pit.
-27. Fixed some bugs in the go-away command in interfunge.i.
+31. Fixed some bugs in the go-away command in interfunge.i.
Release 0.28 (by Alex Smith) 1 Apr 2008
prebuilt/oil-oil.c -- Prebuilt OIL compiler (again, for bisonless systems)
etc/intercal.el -- elisp for editing INTERCAL code under GNU Emacs
+etc/intercal.vim -- INTERCAL syntax higlighting information for vim
etc/cftoec.sh -- script to convert cfunge to a library (see below)
etc/IFFI* -- input to that script
etc/cfunge.patch -- more input to that script
during an @ical{} program; if you want to process higher numbers, you
have to figure out a different way of storing them.
+@ieanchor E553
+@cindex buffer overflow
+@quotation
+BETTER LATE THAN NEVER
+@end quotation
+Oops! The compiler just noticed that it had a buffer overflow.
+(Normally programs catch buffer overflows before they happen;
+C-INTERCAL catches them just afterwards instead.) This only happens
+on systems which don't have a modern C standard library. Try using
+shorter or fewer filenames on the command line, to reduce the risk of
+such an overflow.
+
@ieanchor E555
@cindex @code{COME FROM}, ambiguity
@quotation
--- /dev/null
+" Vim syntax file
+" Language: INTERCAL
+" Maintainer: Stefan O'Rear <stefanor@cox.net>
+" Last Change: 2008 Nov 29
+" Remark: Use the Power of Vim to turn your INTERCAL programs into angry
+" fruit salad.
+"
+" How to use this:
+" * Put levdes.vim (this file) under ~/.vim/syntax (or similar directory for
+" your system - usually C:\Program Files\Vim\vimfiles\syntax on Windows).
+" * In your .vimrc, add this line:
+" au BufRead,BufNewFile *.i set syntax=intercal
+" Thereafter, any .i files you edit in (g)vim will use syntax highlighting.
+
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = 'ick'
+endif
+
+
+syn match ickIdentifier /DO\|PLEASE/
+
+syn region ickComment start=/\(PLEASE\s*DO\s*\|PLEASE\s*\|DO\s*\|\)N\s*['O]\s*T/ end=/\(([ 0-9]*[0-9])\s*\)\?\(DO\|PLEASE\)/me=s-1
+
+syn match ickKeyword /F\s*O\s*R\s*G\s*E\s*T/
+syn match ickKeyword /G\s*I\s*V\s*E\s*U\s*P/
+syn match ickKeyword /I\s*G\s*N\s*O\s*R\s*E/
+syn match ickKeyword /N\s*E\s*X\s*T/
+syn match ickKeyword /R\s*E\s*I\s*N\s*S\s*T\s*A\s*T\s*E/
+syn match ickKeyword /R\s*E\s*M\s*E\s*M\s*B\s*E\s*R/
+syn match ickKeyword /R\s*E\s*S\s*U\s*M\s*E/
+syn match ickKeyword /R\s*E\s*T\s*R\s*I\s*E\s*V\s*E/
+syn match ickKeyword /S\s*T\s*A\s*S\s*H/
+syn match ickKeyword /W\s*R\s*I\s*T\s*E\s*I\s*N/
+syn match ickKeywordAIS /A\s*G\s*A\s*I\s*N/
+syn match ickKeywordAIS /G\s*O\s*A\s*H\s*E\s*A\s*D/
+syn match ickKeywordAIS /G\s*O\s*B\s*A\s*C\s*K/
+syn match ickKeywordAIS /M\s*A\s*Y\s*B\s*E/
+syn match ickKeywordAIS /O\s*N\s*C\s*E/
+syn match ickKeywordAIS /P\s*I\s*N/
+syn match ickKeywordAIS /T\s*R\s*Y\s*A\s*G\s*A\s*I\s*N/
+syn match ickKeywordAISGrn /G\s*O\s*I\s*N\s*G\s*A\s*H\s*E\s*A\s*D/
+syn match ickKeywordAISGrn /G\s*O\s*I\s*N\s*G\s*B\s*A\s*C\s*K/
+syn match ickKeywordAISGrn /N\s*E\s*X\s*T\s*I\s*N\s*G\s*F\s*R\s*O\s*M/
+syn match ickKeywordAISGrn /P\s*I\s*N\s*N\s*I\s*N\s*G/
+syn match ickKeywordAISGrn /T\s*R\s*Y\s*I\s*N\s*G\s*A\s*G\s*A\s*I\s*N/
+syn match ickKeywordCLC /C\s*R\s*E\s*A\s*T\s*E/
+syn match ickKeywordCLC /N\s*E\s*X\s*T\s*F\s*R\s*O\s*M/
+syn match ickKeywordCLCExp /W\s*H\s*I\s*L\s*E/
+syn match ickKeywordCLCGrn /C\s*O\s*M\s*M\s*E\s*N\s*T/
+syn match ickKeywordCLCGrn /C\s*O\s*M\s*M\s*E\s*N\s*T\s*I\s*N\s*G/
+syn match ickKeywordCLCGrn /C\s*O\s*M\s*M\s*E\s*N\s*T\s*S/
+syn match ickKeywordCLCGrn /C\s*R\s*E\s*A\s*T\s*I\s*N\s*G/
+syn match ickKeywordCLCGrn /C\s*R\s*E\s*A\s*T\s*I\s*O\s*N/
+syn match ickKeywordCLCGrn /L\s*O\s*O\s*P\s*I\s*N\s*G/
+syn match ickKeywordCLCGrn /W\s*H\s*I\s*L\s*I\s*N\s*G/
+syn match ickKeywordESR /C\s*O\s*M\s*E\s*F\s*R\s*O\s*M/
+syn match ickKeywordESRGrn /C\s*O\s*M\s*I\s*N\s*G\s*F\s*R\s*O\s*M/
+syn match ickKeywordExp /B\s*Y/
+syn match ickKeywordExp /S\s*U\s*B/
+syn match ickKeywordGrn /R\s*E\s*M\s*E\s*M\s*B\s*E\s*R\s*I\s*N\s*G/
+syn match ickKeywordGrn /R\s*E\s*I\s*N\s*S\s*T\s*A\s*T\s*I\s*N\s*G/
+syn match ickKeyword /A\s*B\s*S\s*T\s*A\s*I\s*N\s*F\s*R\s*O\s*M/
+syn match ickKeywordGrn /A\s*B\s*S\s*T\s*A\s*I\s*N\s*I\s*N\s*G/
+syn match ickKeywordGrn /C\s*A\s*L\s*C\s*U\s*L\s*A\s*T\s*I\s*N\s*G/
+syn match ickKeywordGrn /F\s*O\s*R\s*G\s*E\s*T\s*T\s*I\s*N\s*G/
+syn match ickKeywordGrn /I\s*G\s*N\s*O\s*R\s*I\s*N\s*G/
+syn match ickKeywordGrn /R\s*E\s*A\s*D\s*I\s*N\s*G\s*O\s*U\s*T/
+syn match ickKeyword /R\s*E\s*A\s*D\s\+O\s*U\s*T/
+syn match ickKeywordGrn /N\s*E\s*X\s*T\s*I\s*N\s*G/
+syn match ickKeywordGrn /R\s*E\s*S\s*U\s*M\s*I\s*N\s*G/
+syn match ickKeywordGrn /R\s*E\s*T\s*R\s*I\s*E\s*V\s*I\s*N\s*G/
+syn match ickKeywordGrn /S\s*T\s*A\s*S\s*H\s*I\s*N\s*G/
+syn match ickKeywordGrn /W\s*R\s*I\s*T\s*I\s*N\s*G\s*I\s*N/
+
+syn match ickKeywordExp /<\s*-/
+
+syn match ickVariable /[!.:]\s*\(\s\|\d\)*\d/ contains=ickUnaryVar
+syn match ickArrayVar /[,;][0-9 ]*[0-9]/
+syn match ickConstant /#[0-9 ]*[0-9]/
+syn match ickUnaryVar /[&|?^]\|[2-5]\?@/ contained
+
+syn match ickLabel /([0-9 ]*[0-9][9-9 ]*)/
+
+hi link ickLabel Tag
+hi link ickUnaryVar Normal
+hi link ickVariable Identifier
+hi link ickArrayVar Special
+hi link ickConstant Constant
+hi link ickIdentifier PreProc
+hi link ickComment Comment
+
+hi link ickKeywordGrn Type
+hi link ickKeywordExp Operator
+hi link ickKeyword Keyword
+
+hi link ickKeywordAISGrn ickKeywordGrn
+hi link ickKeywordAISExp ickKeywordExp
+hi link ickKeywordAIS ickKeyword
+
+hi link ickKeywordCLCGrn ickKeywordGrn
+hi link ickKeywordCLCExp ickKeywordExp
+hi link ickKeywordCLC ickKeyword
+
+hi link ickKeywordESRGrn ickKeywordGrn
+hi link ickKeywordESRExp ickKeywordExp
+hi link ickKeywordESR ickKeyword
+
+syn sync minlines=45
+
+let b:current_syntax="intercal"
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 34
+#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
#define UINT32_MAX (4294967295U)
#endif
+#endif /* ! C99 */
+
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
#define unput(c) yyunput( c, (yytext_ptr) )
-/* The following is because we cannot portably get our hands on size_t
- * (without autoconf's help, which isn't available because we want
- * flex-generated scanners to compile on their own).
- * Given that the standard has decreed that size_t exists since 1989,
- * I guess we can afford to depend on it. Manoj.
- */
-
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
ick_bool re_send_token = ick_FALSE;
int lexer(void);
-static int myatoi(char *text);
+static int myatoi(const char *text);
+void yyerror(const char *errtype);
#define SETLINENO \
{if (stbeginline == 0) stbeginline = iyylineno;\
} \
}
-#line 1116 "lexer.c"
+#line 1111 "lexer.c"
#define INITIAL 0
static int yy_init_globals (void );
+/* Accessor methods to globals.
+ These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy (void );
+
+int yyget_debug (void );
+
+void yyset_debug (int debug_flag );
+
+YY_EXTRA_TYPE yyget_extra (void );
+
+void yyset_extra (YY_EXTRA_TYPE user_defined );
+
+FILE *yyget_in (void );
+
+void yyset_in (FILE * in_str );
+
+FILE *yyget_out (void );
+
+void yyset_out (FILE * out_str );
+
+int yyget_leng (void );
+
+char *yyget_text (void );
+
+int yyget_lineno (void );
+
+void yyset_lineno (int line_number );
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- int n; \
+ size_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
register char *yy_cp, *yy_bp;
register int yy_act;
-#line 225 "lexer.l"
+#line 226 "lexer.l"
-#line 1272 "lexer.c"
+#line 1296 "lexer.c"
if ( !(yy_init) )
{
case 1:
/* rule 1 can match eol */
YY_RULE_SETUP
-#line 227 "lexer.l"
+#line 228 "lexer.l"
{yylval.numval = myatoi(yytext); return(NUMBER);}
YY_BREAK
case 2:
YY_RULE_SETUP
-#line 228 "lexer.l"
+#line 229 "lexer.l"
{return(NOSPOT);}
YY_BREAK
case 3:
YY_RULE_SETUP
-#line 229 "lexer.l"
+#line 230 "lexer.l"
{return(ick_ONESPOT);}
YY_BREAK
case 4:
YY_RULE_SETUP
-#line 230 "lexer.l"
+#line 231 "lexer.l"
{return(ick_TWOSPOT);}
YY_BREAK
case 5:
YY_RULE_SETUP
-#line 231 "lexer.l"
+#line 232 "lexer.l"
{return(ick_TAIL);}
YY_BREAK
case 6:
YY_RULE_SETUP
-#line 232 "lexer.l"
+#line 233 "lexer.l"
{return(ick_HYBRID);}
YY_BREAK
case 7:
YY_RULE_SETUP
-#line 233 "lexer.l"
+#line 234 "lexer.l"
{return(MESH);}
YY_BREAK
case 8:
-#line 236 "lexer.l"
-case 9:
#line 237 "lexer.l"
+case 9:
+#line 238 "lexer.l"
case 10:
YY_RULE_SETUP
-#line 237 "lexer.l"
+#line 238 "lexer.l"
{return(MINGLE); /* AIS: CLC-INTERCAL ick_mingle symbols.
The \xBD is ISO-8859-1 for cent. */}
YY_BREAK
case 11:
-#line 240 "lexer.l"
-case 12:
#line 241 "lexer.l"
-case 13:
+case 12:
#line 242 "lexer.l"
-case 14:
+case 13:
#line 243 "lexer.l"
-case 15:
+case 14:
#line 244 "lexer.l"
-case 16:
+case 15:
#line 245 "lexer.l"
-case 17:
+case 16:
#line 246 "lexer.l"
-case 18:
+case 17:
#line 247 "lexer.l"
-case 19:
+case 18:
#line 248 "lexer.l"
-case 20:
+case 19:
#line 249 "lexer.l"
-case 21:
+case 20:
#line 250 "lexer.l"
-case 22:
+case 21:
#line 251 "lexer.l"
-case 23:
+case 22:
#line 252 "lexer.l"
-case 24:
+case 23:
#line 253 "lexer.l"
-case 25:
+case 24:
#line 254 "lexer.l"
-case 26:
+case 25:
#line 255 "lexer.l"
-case 27:
+case 26:
#line 256 "lexer.l"
-case 28:
+case 27:
#line 257 "lexer.l"
-case 29:
+case 28:
#line 258 "lexer.l"
-case 30:
+case 29:
#line 259 "lexer.l"
-case 31:
+case 30:
#line 260 "lexer.l"
-case 32:
+case 31:
#line 261 "lexer.l"
+case 32:
+#line 262 "lexer.l"
case 33:
YY_RULE_SETUP
-#line 261 "lexer.l"
+#line 262 "lexer.l"
{return(MINGLE);}
YY_BREAK
case 34:
YY_RULE_SETUP
-#line 263 "lexer.l"
+#line 264 "lexer.l"
{return(SELECT);}
YY_BREAK
case 35:
YY_RULE_SETUP
-#line 265 "lexer.l"
+#line 266 "lexer.l"
{return(SLAT); /* AIS: Operand overloading */}
YY_BREAK
case 36:
YY_RULE_SETUP
-#line 266 "lexer.l"
+#line 267 "lexer.l"
{return(BACKSLAT); /* ditto */}
YY_BREAK
case 37:
YY_RULE_SETUP
-#line 268 "lexer.l"
+#line 269 "lexer.l"
{yylval.numval = AND; return(UNARY);}
YY_BREAK
case 38:
YY_RULE_SETUP
-#line 269 "lexer.l"
+#line 270 "lexer.l"
{yylval.numval = OR; return(UNARY);}
YY_BREAK
case 39:
-#line 271 "lexer.l"
-case 40:
#line 272 "lexer.l"
-case 41:
+case 40:
#line 273 "lexer.l"
+case 41:
+#line 274 "lexer.l"
case 42:
YY_RULE_SETUP
-#line 273 "lexer.l"
+#line 274 "lexer.l"
{yylval.numval = XOR; return(UNARY);
/* AIS: CLC-INTERCAL uses \xBE, ISO-8859-1 for yen;
for some reason, \xA5 is what was detected by the compiler
YY_BREAK
case 43:
YY_RULE_SETUP
-#line 277 "lexer.l"
+#line 278 "lexer.l"
{if(clclex) yylval.numval = WHIRL;
else yylval.numval = XOR; return(UNARY);
/* AIS: ? is a unary operator in both C-INTERCAL and
CLC-INTERCAL, but with different meanings. */}
YY_BREAK
case 44:
-#line 282 "lexer.l"
+#line 283 "lexer.l"
case 45:
YY_RULE_SETUP
-#line 282 "lexer.l"
+#line 283 "lexer.l"
{yylval.numval = FIN; return(UNARY); /* AIS: | is CLC */}
YY_BREAK
case 46:
YY_RULE_SETUP
-#line 283 "lexer.l"
+#line 284 "lexer.l"
{if(clclex) return(NOSPOT); /* AIS: a C/CLC ambiguity */
else {yylval.numval = WHIRL; return(UNARY);}}
YY_BREAK
case 47:
/* rule 47 can match eol */
YY_RULE_SETUP
-#line 285 "lexer.l"
+#line 286 "lexer.l"
{yylval.numval = WHIRL + myatoi(yytext) - 1; return(UNARY);}
YY_BREAK
case 48:
YY_RULE_SETUP
-#line 287 "lexer.l"
+#line 288 "lexer.l"
{char temp = sparkearsstack[sparkearslev/32]&1;
STACKSPARKEARS(0); /* AIS: I added all mentions of
STACKSPARKEARS, OPEN\(SPARK\|EARS\),
YY_BREAK
case 49:
YY_RULE_SETUP
-#line 293 "lexer.l"
+#line 294 "lexer.l"
{char temp = sparkearsstack[sparkearslev/32]&1;
STACKSPARKEARS(1);
return(temp?CLOSEEARS:OPENEARS);}
case 50:
/* rule 50 can match eol */
YY_RULE_SETUP
-#line 297 "lexer.l"
+#line 298 "lexer.l"
{SETLINENO; yylval.numval = myatoi(yytext); return(LABEL);}
YY_BREAK
case 51:
YY_RULE_SETUP
-#line 299 "lexer.l"
+#line 300 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; return(DO);}
YY_BREAK
case 52:
YY_RULE_SETUP
-#line 300 "lexer.l"
+#line 301 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; return(DO);}
YY_BREAK
case 53:
YY_RULE_SETUP
-#line 301 "lexer.l"
+#line 302 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(DO);}
YY_BREAK
case 54:
YY_RULE_SETUP
-#line 302 "lexer.l"
+#line 303 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(DO);}
YY_BREAK
case 55:
/* rule 55 can match eol */
YY_RULE_SETUP
-#line 303 "lexer.l"
+#line 304 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(DO);}
YY_BREAK
case 56:
/* rule 56 can match eol */
YY_RULE_SETUP
-#line 304 "lexer.l"
+#line 305 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(DO);}
YY_BREAK
case 57:
YY_RULE_SETUP
-#line 305 "lexer.l"
+#line 306 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; return(MAYBE);}
YY_BREAK
case 58:
/* rule 58 can match eol */
YY_RULE_SETUP
-#line 306 "lexer.l"
+#line 307 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; return(MAYBE);}
YY_BREAK
case 59:
/* rule 59 can match eol */
YY_RULE_SETUP
-#line 307 "lexer.l"
+#line 308 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(MAYBE);}
YY_BREAK
case 60:
/* rule 60 can match eol */
YY_RULE_SETUP
-#line 308 "lexer.l"
+#line 309 "lexer.l"
{SETLINENO; CLEARSPARKEARSTACK; politesse++; return(MAYBE);
/* AIS: I added all the MAYBE cases. It seems that MAYBE
has no simple Latin synonym. */}
YY_BREAK
case 61:
YY_RULE_SETUP
-#line 312 "lexer.l"
+#line 313 "lexer.l"
{return(NOT);}
YY_BREAK
case 62:
YY_RULE_SETUP
-#line 313 "lexer.l"
+#line 314 "lexer.l"
{return(NOT);}
YY_BREAK
case 63:
YY_RULE_SETUP
-#line 314 "lexer.l"
+#line 315 "lexer.l"
{return(NOT);}
YY_BREAK
case 64:
YY_RULE_SETUP
-#line 315 "lexer.l"
+#line 316 "lexer.l"
{return(NOT); /* AIS: CLC-INTERCAL again, this time it's
ISO-8859-1 for the logical NOT symbol... */}
YY_BREAK
case 65:
YY_RULE_SETUP
-#line 317 "lexer.l"
+#line 318 "lexer.l"
{return(NOT); /* ... but my computer translates it to \xAC */}
YY_BREAK
case 66:
YY_RULE_SETUP
-#line 319 "lexer.l"
+#line 320 "lexer.l"
{return(ONCE);}
YY_BREAK
case 67:
YY_RULE_SETUP
-#line 320 "lexer.l"
+#line 321 "lexer.l"
{return(ONCE);}
YY_BREAK
case 68:
YY_RULE_SETUP
-#line 321 "lexer.l"
+#line 322 "lexer.l"
{return(AGAIN);}
YY_BREAK
case 69:
YY_RULE_SETUP
-#line 322 "lexer.l"
+#line 323 "lexer.l"
{return(AGAIN);}
YY_BREAK
case 70:
/* rule 70 can match eol */
YY_RULE_SETUP
-#line 324 "lexer.l"
+#line 325 "lexer.l"
{yylval.numval = myatoi(yytext);
if (yylval.numval && yylval.numval < 100)
return(OHOHSEVEN);
YY_BREAK
case 71:
YY_RULE_SETUP
-#line 329 "lexer.l"
+#line 330 "lexer.l"
{return(SUB);}
YY_BREAK
case 72:
/* rule 72 can match eol */
-#line 331 "lexer.l"
+#line 332 "lexer.l"
case 73:
/* rule 73 can match eol */
YY_RULE_SETUP
-#line 331 "lexer.l"
+#line 332 "lexer.l"
{return(BY);}
YY_BREAK
case 74:
YY_RULE_SETUP
-#line 333 "lexer.l"
+#line 334 "lexer.l"
{return(GETS);}
YY_BREAK
case 75:
-#line 335 "lexer.l"
+#line 336 "lexer.l"
case 76:
YY_RULE_SETUP
-#line 335 "lexer.l"
+#line 336 "lexer.l"
{yylval.numval = GETS; return(GERUND);}
YY_BREAK
case 77:
-#line 338 "lexer.l"
+#line 339 "lexer.l"
case 78:
YY_RULE_SETUP
-#line 338 "lexer.l"
+#line 339 "lexer.l"
{return(FORGET);}
YY_BREAK
case 79:
-#line 340 "lexer.l"
+#line 341 "lexer.l"
case 80:
YY_RULE_SETUP
-#line 340 "lexer.l"
+#line 341 "lexer.l"
{yylval.numval = FORGET; return(GERUND);}
YY_BREAK
case 81:
-#line 342 "lexer.l"
+#line 343 "lexer.l"
case 82:
YY_RULE_SETUP
-#line 342 "lexer.l"
+#line 343 "lexer.l"
{return(RESUME);}
YY_BREAK
case 83:
-#line 344 "lexer.l"
+#line 345 "lexer.l"
case 84:
YY_RULE_SETUP
-#line 344 "lexer.l"
+#line 345 "lexer.l"
{yylval.numval = RESUME; return(GERUND);}
YY_BREAK
case 85:
-#line 346 "lexer.l"
+#line 347 "lexer.l"
case 86:
YY_RULE_SETUP
-#line 346 "lexer.l"
+#line 347 "lexer.l"
{return(STASH);}
YY_BREAK
case 87:
-#line 348 "lexer.l"
+#line 349 "lexer.l"
case 88:
YY_RULE_SETUP
-#line 348 "lexer.l"
+#line 349 "lexer.l"
{yylval.numval = STASH; return(GERUND);}
YY_BREAK
case 89:
-#line 350 "lexer.l"
+#line 351 "lexer.l"
case 90:
YY_RULE_SETUP
-#line 350 "lexer.l"
+#line 351 "lexer.l"
{return(RETRIEVE);}
YY_BREAK
case 91:
-#line 352 "lexer.l"
+#line 353 "lexer.l"
case 92:
YY_RULE_SETUP
-#line 352 "lexer.l"
+#line 353 "lexer.l"
{yylval.numval = RETRIEVE; return(GERUND);}
YY_BREAK
case 93:
-#line 354 "lexer.l"
+#line 355 "lexer.l"
case 94:
YY_RULE_SETUP
-#line 354 "lexer.l"
+#line 355 "lexer.l"
{return(IGNORE);}
YY_BREAK
case 95:
-#line 356 "lexer.l"
+#line 357 "lexer.l"
case 96:
YY_RULE_SETUP
-#line 356 "lexer.l"
+#line 357 "lexer.l"
{yylval.numval = IGNORE; return(GERUND);}
YY_BREAK
case 97:
-#line 358 "lexer.l"
+#line 359 "lexer.l"
case 98:
YY_RULE_SETUP
-#line 358 "lexer.l"
+#line 359 "lexer.l"
{return(REMEMBER);}
YY_BREAK
case 99:
-#line 360 "lexer.l"
+#line 361 "lexer.l"
case 100:
YY_RULE_SETUP
-#line 360 "lexer.l"
+#line 361 "lexer.l"
{yylval.numval = REMEMBER; return(GERUND);}
YY_BREAK
case 101:
-#line 362 "lexer.l"
+#line 363 "lexer.l"
case 102:
YY_RULE_SETUP
-#line 362 "lexer.l"
+#line 363 "lexer.l"
{return(ABSTAIN);}
YY_BREAK
case 103:
-#line 364 "lexer.l"
+#line 365 "lexer.l"
case 104:
YY_RULE_SETUP
-#line 364 "lexer.l"
+#line 365 "lexer.l"
{yylval.numval = ABSTAIN; return(GERUND);}
YY_BREAK
case 105:
-#line 366 "lexer.l"
+#line 367 "lexer.l"
case 106:
YY_RULE_SETUP
-#line 366 "lexer.l"
+#line 367 "lexer.l"
{return(REINSTATE);}
YY_BREAK
case 107:
-#line 368 "lexer.l"
+#line 369 "lexer.l"
case 108:
YY_RULE_SETUP
-#line 368 "lexer.l"
+#line 369 "lexer.l"
{yylval.numval = REINSTATE; return(GERUND);}
YY_BREAK
case 109:
/* rule 109 can match eol */
-#line 370 "lexer.l"
+#line 371 "lexer.l"
case 110:
/* rule 110 can match eol */
YY_RULE_SETUP
-#line 370 "lexer.l"
+#line 371 "lexer.l"
{return(READ_OUT);}
YY_BREAK
case 111:
-#line 372 "lexer.l"
+#line 373 "lexer.l"
case 112:
/* rule 112 can match eol */
YY_RULE_SETUP
-#line 372 "lexer.l"
+#line 373 "lexer.l"
{yylval.numval = READ_OUT; return(GERUND);}
YY_BREAK
case 113:
/* rule 113 can match eol */
-#line 374 "lexer.l"
+#line 375 "lexer.l"
case 114:
/* rule 114 can match eol */
YY_RULE_SETUP
-#line 374 "lexer.l"
+#line 375 "lexer.l"
{return(WRITE_IN);}
YY_BREAK
case 115:
-#line 376 "lexer.l"
+#line 377 "lexer.l"
case 116:
/* rule 116 can match eol */
YY_RULE_SETUP
-#line 376 "lexer.l"
+#line 377 "lexer.l"
{yylval.numval = WRITE_IN; return(GERUND);}
YY_BREAK
case 117:
-#line 378 "lexer.l"
-case 118:
#line 379 "lexer.l"
-case 119:
+case 118:
#line 380 "lexer.l"
+case 119:
+#line 381 "lexer.l"
case 120:
YY_RULE_SETUP
-#line 380 "lexer.l"
+#line 381 "lexer.l"
{yylval.numval = UNKNOWN; return(GERUND);
/* AIS: An idea stolen from CLC-INTERCAL.
The Latin means literally 'remind' or 'mention'. */}
YY_BREAK
case 121:
YY_RULE_SETUP
-#line 383 "lexer.l"
+#line 384 "lexer.l"
{/* By AIS. I can't find a Latin translation for this. */
return(PIN);}
YY_BREAK
case 122:
YY_RULE_SETUP
-#line 385 "lexer.l"
+#line 386 "lexer.l"
{/* By AIS */ yylval.numval = PIN; return(GERUND);}
YY_BREAK
case 123:
/* rule 123 can match eol */
-#line 387 "lexer.l"
+#line 388 "lexer.l"
case 124:
/* rule 124 can match eol */
YY_RULE_SETUP
-#line 387 "lexer.l"
+#line 388 "lexer.l"
{/* AIS */ yylval.numval = myatoi(yytext);
return(NEXTFROMLABEL);}
YY_BREAK
case 125:
/* rule 125 can match eol */
-#line 390 "lexer.l"
+#line 391 "lexer.l"
case 126:
/* rule 126 can match eol */
YY_RULE_SETUP
-#line 390 "lexer.l"
+#line 391 "lexer.l"
{/* AIS: 'next' is not a verb, so the Latin is invented */
return(NEXTFROMEXPR);}
YY_BREAK
case 127:
-#line 393 "lexer.l"
+#line 394 "lexer.l"
case 128:
/* rule 128 can match eol */
YY_RULE_SETUP
-#line 393 "lexer.l"
+#line 394 "lexer.l"
{/* AIS */ yylval.numval = NEXTFROMLABEL; return(GERUND);}
YY_BREAK
case 129:
/* rule 129 can match eol */
-#line 395 "lexer.l"
+#line 396 "lexer.l"
case 130:
/* rule 130 can match eol */
YY_RULE_SETUP
-#line 395 "lexer.l"
+#line 396 "lexer.l"
{/* AIS */ yylval.numval = myatoi(yytext);
return(COME_FROM);}
YY_BREAK
case 131:
/* rule 131 can match eol */
-#line 398 "lexer.l"
+#line 399 "lexer.l"
case 132:
/* rule 132 can match eol */
YY_RULE_SETUP
-#line 398 "lexer.l"
+#line 399 "lexer.l"
{/* AIS */ return(COMPUCOME);}
YY_BREAK
case 133:
-#line 400 "lexer.l"
+#line 401 "lexer.l"
case 134:
/* rule 134 can match eol */
YY_RULE_SETUP
-#line 400 "lexer.l"
+#line 401 "lexer.l"
{yylval.numval = COME_FROM; return(GERUND);}
YY_BREAK
case 135:
-#line 402 "lexer.l"
+#line 403 "lexer.l"
case 136:
YY_RULE_SETUP
-#line 402 "lexer.l"
+#line 403 "lexer.l"
{stbeginline = 0; return(NEXT);}
YY_BREAK
case 137:
-#line 404 "lexer.l"
+#line 405 "lexer.l"
case 138:
YY_RULE_SETUP
-#line 404 "lexer.l"
+#line 405 "lexer.l"
{yylval.numval = NEXT; return(GERUND);}
YY_BREAK
case 139:
YY_RULE_SETUP
-#line 405 "lexer.l"
+#line 406 "lexer.l"
{return(FROM); /* AIS: Latin is 'A', which confuses the rest
of the parser */}
YY_BREAK
case 140:
-#line 408 "lexer.l"
-case 141:
#line 409 "lexer.l"
+case 141:
+#line 410 "lexer.l"
case 142:
/* rule 142 can match eol */
YY_RULE_SETUP
-#line 409 "lexer.l"
+#line 410 "lexer.l"
{return(GIVE_UP);}
YY_BREAK
case 143:
/* rule 143 can match eol */
-#line 411 "lexer.l"
+#line 412 "lexer.l"
case 144:
/* rule 144 can match eol */
YY_RULE_SETUP
-#line 411 "lexer.l"
+#line 412 "lexer.l"
{return(TRY_AGAIN);}
YY_BREAK
case 145:
YY_RULE_SETUP
-#line 412 "lexer.l"
+#line 413 "lexer.l"
{return(WHILE); /* AIS. Latin for this is needed. */}
YY_BREAK
case 146:
-#line 414 "lexer.l"
+#line 415 "lexer.l"
case 147:
YY_RULE_SETUP
-#line 414 "lexer.l"
+#line 415 "lexer.l"
{yylval.numval = WHILE; return(GERUND);}
YY_BREAK
case 148:
/* rule 148 can match eol */
YY_RULE_SETUP
-#line 415 "lexer.l"
+#line 416 "lexer.l"
{yylval.numval = TRY_AGAIN; return(GERUND);}
YY_BREAK
case 149:
/* rule 149 can match eol */
-#line 417 "lexer.l"
+#line 418 "lexer.l"
case 150:
/* rule 150 can match eol */
YY_RULE_SETUP
-#line 417 "lexer.l"
+#line 418 "lexer.l"
{return(GO_BACK);}
YY_BREAK
case 151:
/* rule 151 can match eol */
-#line 419 "lexer.l"
+#line 420 "lexer.l"
case 152:
/* rule 152 can match eol */
YY_RULE_SETUP
-#line 419 "lexer.l"
+#line 420 "lexer.l"
{yylval.numval = GO_BACK; return(GERUND);}
YY_BREAK
case 153:
/* rule 153 can match eol */
-#line 421 "lexer.l"
+#line 422 "lexer.l"
case 154:
/* rule 154 can match eol */
YY_RULE_SETUP
-#line 421 "lexer.l"
+#line 422 "lexer.l"
{return(GO_AHEAD);}
YY_BREAK
case 155:
/* rule 155 can match eol */
YY_RULE_SETUP
-#line 422 "lexer.l"
+#line 423 "lexer.l"
{yylval.numval = GO_AHEAD; return(GERUND);
/* AIS: I'm having a few deponent troubles with the Latin, so
there are no Latin gerunds around here. Besides, the Latin
YY_BREAK
case 156:
/* rule 156 can match eol */
-#line 428 "lexer.l"
+#line 429 "lexer.l"
case 157:
/* rule 157 can match eol */
YY_RULE_SETUP
-#line 428 "lexer.l"
+#line 429 "lexer.l"
{yylval.numval = myatoi(yytext); return(CREATE);}
YY_BREAK
case 158:
-#line 430 "lexer.l"
+#line 431 "lexer.l"
case 159:
YY_RULE_SETUP
-#line 430 "lexer.l"
+#line 431 "lexer.l"
{return(COMPUCREATE);}
YY_BREAK
case 160:
-#line 432 "lexer.l"
-case 161:
#line 433 "lexer.l"
+case 161:
+#line 434 "lexer.l"
case 162:
YY_RULE_SETUP
-#line 433 "lexer.l"
+#line 434 "lexer.l"
{yylval.numval = CREATE; return(GERUND);}
YY_BREAK
case 163:
YY_RULE_SETUP
-#line 435 "lexer.l"
+#line 436 "lexer.l"
{return(INTERSECTION);}
YY_BREAK
case 164:
/* rule 164 can match eol */
YY_RULE_SETUP
-#line 437 "lexer.l"
+#line 438 "lexer.l"
;
YY_BREAK
case 165:
YY_RULE_SETUP
-#line 438 "lexer.l"
+#line 439 "lexer.l"
{/* AIS */ yylval.numval = *yytext; return(UNKNOWNID);}
YY_BREAK
case 166:
YY_RULE_SETUP
-#line 439 "lexer.l"
+#line 440 "lexer.l"
{/* AIS */ yylval.numval = yytext[0]*256 + yytext[3];
if(yytext[0] > yytext[3])
yylval.numval = yytext[0] + yytext[3]*256;
YY_BREAK
case 167:
YY_RULE_SETUP
-#line 443 "lexer.l"
+#line 444 "lexer.l"
{yylval.numval = yytext[0]; /* AIS: The line below for debug */
if(yydebug) fprintf(stdout, "yylex: bad char %#x\n",(unsigned char)yytext[0]);
return(BADCHAR);}
YY_BREAK
case 168:
YY_RULE_SETUP
-#line 448 "lexer.l"
+#line 449 "lexer.l"
ECHO;
YY_BREAK
-#line 2058 "lexer.c"
+#line 2082 "lexer.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
#define YYTABLES_NAME "yytables"
-#line 448 "lexer.l"
+#line 449 "lexer.l"
return(tok);
}
-static int myatoi(char *text) /* AIS */
+static int myatoi(const char *text) /* AIS */
{
#define MAXTEXT 100
static char buf[MAXTEXT];
return atoi(thinbuf);
}
-void yyerror(char *errtype)
+void yyerror(const char *errtype)
{
#ifdef MAIN
(void) printf("lextest: lexer error: %s.\n", errtype);
/* Define strdup if it isn't available */
#ifndef HAVE_STRDUP
-char* strdup(char* s)
+char* strdup(const char* s)
{
char* t=malloc(strlen(s)+1);
if(t) strcpy(t,s);
sequence of lvals (=0) or rvals (=1) this is from the
root; depth bits from the end are relevant, and the
bit nearest the root is least significant */
- char* condition; /* Points to a constant string; the condition to generate
+ const char* condition; /* Points to a constant string; the condition to generate
on that node. Could also point to something the lexer
mallocs, but then the lexer has to keep track of being
able to free it again. If this is NULL, it means that
there isn't a condition other than maybe mustbemesh */
- char* nodetypename; /* The name of the type of node this condition matches,
+ const char* nodetypename; /* The name of the type of node this condition matches,
or NULL for a LEXERLEAF */
mybool usec; /* Whether to append the value of c to the condition */
mybool mustbemesh; /* Must this node be a mesh or mesh32? */
typedef struct ickstype *YYSTYPE;
-void splitend();
-void splitstart();
+void splitend(void);
+void splitstart(void);
void treedepthup(YYSTYPE, mybool);
void treefree(YYSTYPE);
return c;
}
-void splitstart()
+void splitstart(void)
{
static char fname[]="oilout00.c";
if(filenumber>255)
" node *tp;\n", filenumber);
}
-void splitend()
+void splitend(void)
{
/* Disabling warnings about unused variables. gcc will optimize this right
out, and in any case the raise(SIGSEGV) will be unreachable (but will
#include "feh.h"
#include "ick_lose.h"
-extern int yyerror(char*);
+extern int yyerror(const char*);
/* Intervene our ick_first-stage lexer. */
extern int lexer(void);
/* A COME FROM statement references a non-existent line label. */
#define IE444 "444 IT CAME FROM BEYOND SPACE\n\
ON THE WAY TO %d\n"
+/* (AIS) We just buffer-overflowed. (Detecting this /before/ the overflow
+ happens is probably more secure, but harder and less fun. As long as we
+ don't return from any functions, it's probably safe in theory, but don't
+ rely on this. */
+#define IE553 "553 BETTER LATE THAN NEVER\n\
+ ON THE WAY TO %d\n"
/* More than one COME FROM references the same label. */
#define IE555 "555 FLOW DIAGRAM IS EXCESSIVELY CONNECTED\n\
ON THE WAY TO %d\n"
else if(c=='\n' && jlb) {jlb = 0; continue;}
else if(c=='\n') {x=0; y++; jlb = 0;}
else x++;
- fprintf(of,"\\x%x",c);
+ fprintf(of,"\\x%x",(unsigned int)c);
if(!x) fprintf(of,"\"\n\"");
}
fprintf(of,"\";\n\nint ick_iffi_markercount=%d;\n"
markerposns[markercount][1]);
fprintf(of,"};\n");
- fclose(of);
+ (void) fclose(of);
/* Put the libraries and .cio file in the command line. */
ick_snprintf_or_die(libbuf+strlen(libbuf),libbuf_size - strlen(libbuf),
* @param cooptsh Path to coopt.sh
* @param binaryname The output binary filename.
*/
-static void run_coopt(/*@observer@*/ /*@null@*/ const char* cooptsh,
- /*@observer@*/ const char* binaryname)
+static void run_coopt(/*@observer@*/ /*@null@*/ /*@unused@*/ const char* cooptsh,
+ /*@observer@*/ /*@unused@*/ const char* binaryname)
{
- char commandlinebuf[BUFSIZ];
+ /* Note: Params are marked unused because they may not be used if sh isn't supported. */
#ifdef HAVE_PROG_SH
# ifdef HAVE_SYS_INTERPRETER
if(coopt) /* AIS */
WRITE IN. Double-oh-sevens screw this up, too. */
if(cooptsh)
{
+ char commandlinebuf[BUFSIZ];
(void) ick_snprintf_or_die(commandlinebuf, sizeof commandlinebuf,
"sh %s %s", cooptsh, binaryname);
ICK_SYSTEM(commandlinebuf); /* replaces the output executable if
#endif
oldoptind=optind; /* AIS */
- *libbuf = 0; /* AIS */
+ *libbuf = '\0'; /* AIS */
/* Begin file loop */
for (firstfile = ick_TRUE; optind < argc; optind++, firstfile = ick_FALSE)
{
it instead adds a space and the filename to libbuf. */
handle_archive(libbuf, sizeof libbuf,
argv[optind] /* Archive name without extension. */);
- *argv[optind]=0;
+ *argv[optind]='\0';
continue;
}
retval = vsnprintf(str, size, format, ap);
#else
retval = vsprintf(str, format, ap);
- /* TODO: Replace with some nice ick_lose(). */
if (retval >= size)
- abort();
+ ick_lose(IE553, iyylineno, (const char*)NULL);
#endif
va_end(ap);
return retval;