Mercurial > hg > xemacs-beta
view src/gifrlib.h @ 4677:8f1ee2d15784
Support full Common Lisp multiple values in C.
lisp/ChangeLog
2009-08-11 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el :
Update this file to support full C-level multiple values. This
involves:
-- Four new bytecodes, and special compiler functions to compile
multiple-value-call, multiple-value-list-internal, values,
values-list, and, since it now needs to pass back multiple values
and is a special form, throw.
-- There's a new compiler variable, byte-compile-checks-on-load,
which is a list of forms that are evaluated at the very start of a
file, with an error thrown if any of them give nil.
-- The header is now inserted *after* compilation, giving a chance
for the compilation process to influence what those checks
are. There is still a check done before compilation for non-ASCII
characters, to try to turn off dynamic docstrings if appopriate,
in `byte-compile-maybe-reset-coding'.
Space is reserved for checks; comments describing the version of
the byte compiler generating the file are inserted if space
remains for them.
* bytecomp.el (byte-compile-version):
Update this, we're a newer version of the byte compiler.
* byte-optimize.el (byte-optimize-funcall):
Correct a comment.
* bytecomp.el (byte-compile-lapcode):
Discard the arg with byte-multiple-value-call.
* bytecomp.el (byte-compile-checks-and-comments-space):
New variable, describe how many octets to reserve for checks at
the start of byte-compiled files.
* cl-compat.el:
Remove the fake multiple-value implementation. Have the functions
that use it use the real multiple-value implementation instead.
* cl-macs.el (cl-block-wrapper, cl-block-throw):
Revise the byte-compile properties of these symbols to work now
we've made throw into a special form; keep the byte-compile
properties as anonymous lambdas, since we don't have docstrings
for them.
* cl-macs.el (multiple-value-bind, multiple-value-setq)
(multiple-value-list, nth-value):
Update these functions to work with the C support for multiple
values.
* cl-macs.el (values):
Modify the setf handler for this to call
#'multiple-value-list-internal appropriately.
* cl-macs.el (cl-setf-do-store):
If the store form is a cons, treat it specially as wrapping the
store value.
* cl.el (cl-block-wrapper):
Make this an alias of #'and, not #'identity, since it needs to
pass back multiple values.
* cl.el (multiple-value-apply):
We no longer support this, mark it obsolete.
* lisp-mode.el (eval-interactive-verbose):
Remove a useless space in the docstring.
* lisp-mode.el (eval-interactive):
Update this function and its docstring. It now passes back a list,
basically wrapping any eval calls with multiple-value-list. This
allows multiple values to be printed by default in *scratch*.
* lisp-mode.el (prin1-list-as-multiple-values):
New function, printing a list as multiple values in the manner of
Bruno Haible's clisp, separating each entry with " ;\n".
* lisp-mode.el (eval-last-sexp):
Call #'prin1-list-as-multiple-values on the return value of
#'eval-interactive.
* lisp-mode.el (eval-defun):
Call #'prin1-list-as-multiple-values on the return value of
#'eval-interactive.
* mouse.el (mouse-eval-sexp):
Deal with lists corresponding to multiple values from
#'eval-interactive. Call #'cl-prettyprint, which is always
available, instead of sometimes calling #'pprint and sometimes
falling back to prin1.
* obsolete.el (obsolete-throw):
New function, called from eval.c when #'funcall encounters an
attempt to call #'throw (now a special form) as a function. Only
needed for compatibility with 21.4 byte-code.
man/ChangeLog addition:
2009-08-11 Aidan Kehoe <kehoea@parhasard.net>
* cl.texi (Organization):
Remove references to the obsolete multiple-value emulating code.
src/ChangeLog addition:
2009-08-11 Aidan Kehoe <kehoea@parhasard.net>
* bytecode.c (enum Opcode /* Byte codes */):
Add four new bytecodes, to deal with multiple values.
(POP_WITH_MULTIPLE_VALUES): New macro.
(POP): Modify this macro to ignore multiple values.
(DISCARD_PRESERVING_MULTIPLE_VALUES): New macro.
(DISCARD): Modify this macro to ignore multiple values.
(TOP_WITH_MULTIPLE_VALUES): New macro.
(TOP_ADDRESS): New macro.
(TOP): Modify this macro to ignore multiple values.
(TOP_LVALUE): New macro.
(Bcall): Ignore multiple values where appropriate.
(Breturn): Pass back multiple values.
(Bdup): Preserve multiple values.
Use TOP_LVALUE with most bytecodes that assign anything to
anything.
(Bbind_multiple_value_limits, Bmultiple_value_call,
Bmultiple_value_list_internal, Bthrow): Implement the new
bytecodes.
(Bgotoifnilelsepop, Bgotoifnonnilelsepop, BRgotoifnilelsepop,
BRgotoifnonnilelsepop):
Discard any multiple values.
* callint.c (Fcall_interactively):
Ignore multiple values when calling #'eval, in two places.
* device-x.c (x_IO_error_handler):
* macros.c (pop_kbd_macro_event):
* eval.c (Fsignal):
* eval.c (flagged_a_squirmer):
Call throw_or_bomb_out, not Fthrow, now that the latter is a
special form.
* eval.c:
Make Qthrow, Qobsolete_throw available as symbols.
Provide multiple_value_current_limit, multiple-values-limit (the
latter as specified by Common Lisp.
* eval.c (For):
Ignore multiple values when comparing with Qnil, but pass any
multiple values back for the last arg.
* eval.c (Fand):
Ditto.
* eval.c (Fif):
Ignore multiple values when examining the result of the
condition.
* eval.c (Fcond):
Ignore multiple values when comparing what the clauses give, but
pass them back if a clause gave non-nil.
* eval.c (Fprog2):
Never pass back multiple values.
* eval.c (FletX, Flet):
Ignore multiple when evaluating what exactly symbols should be
bound to.
* eval.c (Fwhile):
Ignore multiple values when evaluating the test.
* eval.c (Fsetq, Fdefvar, Fdefconst):
Ignore multiple values.
* eval.c (Fthrow):
Declare this as a special form; ignore multiple values for TAG,
preserve them for VALUE.
* eval.c (throw_or_bomb_out):
Make this available to other files, now Fthrow is a special form.
* eval.c (Feval):
Ignore multiple values when calling a compiled function, a
non-special-form subr, or a lambda expression.
* eval.c (Ffuncall):
If we attempt to call #'throw (now a special form) as a function,
don't error, call #'obsolete-throw instead.
* eval.c (make_multiple_value, multiple_value_aset)
(multiple_value_aref, print_multiple_value, mark_multiple_value)
(size_multiple_value):
Implement the multiple_value type. Add a long comment describing
our implementation.
* eval.c (bind_multiple_value_limits):
New function, used by the bytecode and by #'multiple-value-call,
#'multiple-value-list-internal.
* eval.c (multiple_value_call):
New function, used by the bytecode and #'multiple-value-call.
* eval.c (Fmultiple_value_call):
New special form.
* eval.c (multiple_value_list_internal):
New function, used by the byte code and
#'multiple-value-list-internal.
* eval.c (Fmultiple_value_list_internal, Fmultiple_value_prog1):
New special forms.
* eval.c (Fvalues, Fvalues_list):
New Lisp functions.
* eval.c (values2):
New function, for C code returning multiple values.
* eval.c (syms_of_eval):
Make our new Lisp functions and symbols available.
* eval.c (multiple-values-limit):
Make this available to Lisp.
* event-msw.c (dde_eval_string):
* event-stream.c (execute_help_form):
* glade.c (connector):
* glyphs-widget.c (glyph_instantiator_to_glyph):
* glyphs.c (evaluate_xpm_color_symbols):
* gui-x.c (wv_set_evalable_slot, button_item_to_widget_value):
* gui.c (gui_item_value, gui_item_display_flush_left):
* lread.c (check_if_suppressed):
* menubar-gtk.c (menu_convert, menu_descriptor_to_widget_1):
* menubar-msw.c (populate_menu_add_item):
* print.c (Fwith_output_to_temp_buffer):
* symbols.c (Fsetq_default):
Ignore multiple values when calling Feval.
* symeval.h:
Add the header declarations necessary for the multiple-values
implementation.
* inline.c:
#include symeval.h, now that it has some inline functions.
* lisp.h:
Update Fthrow's declaration. Make throw_or_bomb_out available to
all files.
* lrecord.h (enum lrecord_type):
Add the multiple_value type here.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sun, 16 Aug 2009 20:55:49 +0100 |
parents | 8e1339255ca7 |
children |
line wrap: on
line source
/****************************************************************************** * In order to make life a little bit easier when using the GIF file format, * * this library was written, and which does all the dirty work... * * * * Written by Gershon Elber, Jun. 1989 * * Hacks by Eric S. Raymond, Sep. 1992 * * and Jareth Hein, Jan. 1998 * ******************************************************************************* * History: * * 14 Jun 89 - Version 1.0 by Gershon Elber. * * 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). * * 15 Sep 90 - Version 2.0 by Eric S. Raymond (Changes to suoport GIF slurp) * * 26 Jun 96 - Version 3.0 by Eric S. Raymond (Full GIF89 support) * * 19 Jan 98 - Version 3.1 by Jareth Hein (Support for user-defined I/O). * ******************************************************************************/ #ifndef INCLUDED_gifrlib_h_ #define INCLUDED_gifrlib_h_ #define GIF_ERROR 0 #define GIF_OK 1 #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif /* NULL */ #define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */ typedef int GifBooleanType; typedef unsigned char GifPixelType; typedef unsigned char * GifRowType; typedef unsigned char GifByteType; #define VoidPtr void * typedef struct GifColorType { GifByteType Red, Green, Blue; } GifColorType; typedef struct ColorMapObject { int ColorCount; int BitsPerPixel; GifColorType *Colors; /* on malloc(3) heap */ } ColorMapObject; typedef struct GifImageDesc { int Left, Top, Width, Height, /* Current image dimensions. */ Interlace; /* Sequential/Interlaced lines. */ ColorMapObject *ColorMap; /* The local color map */ } GifImageDesc; /* I/O operations. If you roll your own, they need to be semantically equivilent to fread/fwrite, with an additional paramater to hold data local to your method. */ typedef Bytecount (*Gif_rw_func)(GifByteType *buffer, Bytecount size, VoidPtr method_data); /* Finish up stream. Non-zero return indicates failure */ typedef int (*Gif_close_func)(VoidPtr close_data); /* Error handling function */ typedef void (*Gif_error_func)(const char *string, VoidPtr error_data); typedef struct GifFileType { int SWidth, SHeight, /* Screen dimensions. */ SColorResolution, /* How many colors can we generate? */ SBackGroundColor; /* I hope you understand this one... */ ColorMapObject *SColorMap; /* NULL if it doesn't exist. */ int ImageCount; /* Number of current image */ GifImageDesc Image; /* Block describing current image */ struct SavedImage *SavedImages; /* Use this to accumulate file state */ VoidPtr Private; /* Don't mess with this! */ VoidPtr GifIO; /* Contains all information for I/O */ } GifFileType; typedef enum { UNDEFINED_RECORD_TYPE, SCREEN_DESC_RECORD_TYPE, IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ EXTENSION_RECORD_TYPE, /* Begin with '!' */ TERMINATE_RECORD_TYPE /* Begin with ';' */ } GifRecordType; /****************************************************************************** * GIF89 extension function codes * ******************************************************************************/ #define COMMENT_EXT_FUNC_CODE 0xfe /* comment */ #define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control */ #define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */ #define APPLICATION_EXT_FUNC_CODE 0xff /* application block */ /****************************************************************************** * IO related routines. Defined in gif_io.c * ******************************************************************************/ GifFileType *GifSetup(void); void GifFree(GifFileType *GifFile); void GifSetReadFunc (GifFileType *GifFile, Gif_rw_func func, VoidPtr data); void GifSetWriteFunc(GifFileType *GifFile, Gif_rw_func func, VoidPtr data); void GifSetCloseFunc(GifFileType *GifFile, Gif_close_func func, VoidPtr data); /****************************************************************************** * O.K., here are the routines one can access in order to decode GIF file: * ******************************************************************************/ void DGifOpenFileName(GifFileType *GifFile, const char *GifFileName); void DGifOpenFileHandle(GifFileType *GifFile, int GifFileHandle); void DGifInitRead(GifFileType *GifFile); void DGifSlurp(GifFileType *GifFile); void DGifGetScreenDesc(GifFileType *GifFile); void DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); void DGifGetImageDesc(GifFileType *GifFile); void DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); void DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); void DGifGetComment(GifFileType *GifFile, char *GifComment); void DGifGetExtension(GifFileType *GifFile, int *GifExtCode, GifByteType **GifExtension); void DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); void DGifGetCode(GifFileType *GifFile, int *GifCodeSize, GifByteType **GifCodeBlock); void DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); void DGifGetLZCodes(GifFileType *GifFile, int *GifCode); int DGifCloseFile(GifFileType *GifFile); #define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ #define D_GIF_ERR_READ_FAILED 102 #define D_GIF_ERR_NOT_GIF_FILE 103 #define D_GIF_ERR_NO_SCRN_DSCR 104 #define D_GIF_ERR_NO_IMAG_DSCR 105 #define D_GIF_ERR_NO_COLOR_MAP 106 #define D_GIF_ERR_WRONG_RECORD 107 #define D_GIF_ERR_DATA_TOO_BIG 108 #define GIF_ERR_NOT_ENOUGH_MEM 109 #define D_GIF_ERR_NOT_ENOUGH_MEM 109 #define D_GIF_ERR_CLOSE_FAILED 110 #define D_GIF_ERR_NOT_READABLE 111 #define D_GIF_ERR_IMAGE_DEFECT 112 #define D_GIF_ERR_EOF_TOO_SOON 113 /****************************************************************************** * O.K., here are the error routines * ******************************************************************************/ extern void GifSetErrorFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data); extern void GifSetWarningFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data); DECLARE_DOESNT_RETURN (GifInternError(GifFileType *GifFile, int errnum)); extern void GifInternWarning(GifFileType *GifFile, int errnum); DECLARE_DOESNT_RETURN (GifError(GifFileType *GifFile, const char *err_str)); extern void GifWarning(GifFileType *GifFile, const char *err_str); /***************************************************************************** * * Everything below this point is new after version 1.2, supporting `slurp * mode' for doing I/O in two big belts with all the image-bashing in core. * *****************************************************************************/ /****************************************************************************** * Support for the in-core structures allocation (slurp mode). * ******************************************************************************/ /* This is the in-core version of an extension record */ typedef struct { int ByteCount; GifByteType *Bytes; /* on malloc(3) heap */ } ExtensionBlock; /* This holds an image header, its unpacked raster bits, and extensions */ typedef struct SavedImage { GifImageDesc ImageDesc; GifPixelType *RasterBits; /* on malloc(3) heap */ int Function; int ExtensionBlockCount; ExtensionBlock *ExtensionBlocks; /* on malloc(3) heap */ } SavedImage; extern void ApplyTranslation(SavedImage *Image, GifPixelType Translation[]); extern void MakeExtension(SavedImage *New, int Function); extern int AddExtensionBlock(SavedImage *New, int Length, GifByteType *data); extern void FreeExtension(SavedImage *Image); extern SavedImage *MakeSavedImage(GifFileType *GifFile, SavedImage *CopyFrom); extern void FreeSavedImages(GifFileType *GifFile); /* Common defines used by encode/decode functions */ #define COMMENT_EXT_FUNC_CODE 0xfe /* Extension function code for comment. */ #define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */ #define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1 #define GIF_VERSION_POS 3 /* Version first character in stamp. */ #define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */ #define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */ #define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ #define LZ_BITS 12 #define FILE_STATE_READ 0x01 #define FILE_STATE_WRITE 0x01 #define FILE_STATE_SCREEN 0x02 #define FILE_STATE_IMAGE 0x04 #define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ #define FIRST_CODE 4097 /* Impossible code, to signal first. */ #define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ #define IS_READABLE(Private) (!(Private->FileState & FILE_STATE_READ)) #define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE) typedef struct GifFilePrivateType { int FileState, BitsPerPixel, /* Bits per pixel (Codes uses at list this + 1). */ ClearCode, /* The CLEAR LZ code. */ EOFCode, /* The EOF LZ code. */ RunningCode, /* The next code algorithm can generate. */ RunningBits,/* The number of bits required to represent RunningCode. */ MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ LastCode, /* The code before the current code. */ CrntCode, /* Current algorithm code. */ StackPtr, /* For character stack (see below). */ CrntShiftState; /* Number of bits in CrntShiftDWord. */ unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */ unsigned long PixelCount; /* Number of pixels in image. */ GifByteType Buf[256]; /* Compressed input is buffered here. */ GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ GifByteType Suffix[LZ_MAX_CODE+1]; /* So we can trace the codes. */ unsigned int Prefix[LZ_MAX_CODE+1]; } GifFilePrivateType; typedef struct GifIODataType { Gif_rw_func ReadFunc, WriteFunc; /* Pointers to the functions that will do the I/O */ Gif_close_func CloseFunc; VoidPtr ReadFunc_data; /* data to be passed to the read function */ VoidPtr WriteFunc_data; /* data to be passed to the write function */ VoidPtr CloseFunc_data; /* data to be passed to the close function */ Gif_error_func ErrorFunc; /* MUST NOT RETURN (use lng_jmp or exit)! */ Gif_error_func WarningFunc; /* For warning messages (can be ignored) */ VoidPtr ErrorFunc_data; VoidPtr WarningFunc_data; } GifIODataType; typedef struct GifStdIODataType { FILE *File; int FileHandle; } GifStdIODataType; /* Install StdIO funcs on FILE into GifFile */ void GifStdIOInit(GifFileType *GifFile, FILE *file, int filehandle); /* Error checking reads, writes and closes */ void GifRead(GifByteType *buf, Bytecount size, GifFileType *GifFile); void GifWrite(GifByteType *buf, Bytecount size, GifFileType *GifFile); int GifClose(GifFileType *GifFile); /* The default Read and Write functions for files */ Bytecount GifStdRead(GifByteType *buf, Bytecount size, VoidPtr method_data); Bytecount GifStdWrite(GifByteType *buf, Bytecount size, VoidPtr method_data); int GifStdFileClose(VoidPtr method_data); ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap); void FreeMapObject(ColorMapObject *Object); #endif /* INCLUDED_gifrlib_h_ */