! Generate Dylan C-FFI declarations corresponding to a C header file. ! Copyright (C) 1999 Functional Objects, Inc. ! Copyright (C) 2005 Daniel Brockman ! This file defines a set of text transformation rules for `gema'. ! These patterns support the common functionality needed for ! the header files related to GTK+ 2.0. They are not by far ! expected to handle the full C language. @set-switch{t;1}@set-switch{w;1} @set-syntax{L;\-\.\(\)} @set-switch{match;1} ! Command-line option for name of module. ARGV:\N-module \n=@set{heading;Module\: $1\n\n} ! Command-line option for file of names to be excluded. ARGV:\N-exclude \n=@load-obsolete{@read{$1}} ! Command-line option for file of names to be renamed. ARGV:\N-rename \n=@load-renamings{@read{$1}} ! Command-line option for literal names to be excluded. ARGV:\N-omit *\n=@load-obsolete{$1} load-obsolete:\I=@define{relevant-name\:$1\=\@fail}\ @define{bad-struct\:_$1\=\$0\@end} load-obsolete:\J\J=@define{relevant-name\:@quote{$0}\=\@fail}\ @define{relevant-name\:@quote{$0}\\I\=\@fail} load-obsolete:<-A0>=@define{relevant-name\:@quote{$1$3}\=\@fail}\ @define{bad-struct\:@quote{_$1$3}\=\$0\@end} load-obsolete:=@define{relevant-name\:@quote{$1}\=\@fail} load-obsolete:\S=;,= load-obsolete:\/\/*\n= load-obsolete:\/\*\*\/= load-obsolete:= @err{\N"@file" line @line, unrecognized: $1\n} load-renamings:\==@define{relevant-name\:$1\=$2\@end} load-renamings:\S=;,= load-renamings:\/\/*\n= load-renamings:\/\*\*\/= load-renamings:= @err{\N"@file" line @line, unrecognized: $1\n} ! Command-line option to specify that only those names listed in ! a file are to be translated. ARGV:\N-only \n=@set-switch{t;0}\ @load-only{@read{$1}}@undefine{relevant-name\:\}\ @define{bad-struct\:\_\\\I\=\@fail}\ @define{bad-struct\:tag\\\I\=\$0\@fail}\ @define{nogood\:\\W\\=\$1\@fail} ! Additional identifiers to be included (after -only file). ARGV:\N-add *\n=@load-only{$1} load-only:\I=@define{relevant-name\:$1\=\$0\@end} ! load-only:\J\J=\ ! @define{relevant-name\:$0\\\I\=\$0\@end} ! load-only:\J_\J\I=\ ! @define{relevant-constant\:$1$2_\\\\I\=\$0\@end}\ ! @define{relevant-name\:$0\=\$0\@end} load-only:=@define{relevant-name\:$1\\I\=\$0\@end} load-only:\S=;,= load-only:\/\/*\n= load-only:\/\*\*\/= load-only:= @err{\N"@file" line @line, unrecognized: $1\n} ! Optional name of generated export file. ARGV:\N-exports \n=@set{-exports;$1} wildcard:\*<-I>=@fail wildcard:\?<-I>=@fail wildcard:\J\*=@quote{$1}\\J\$2 wildcard:\J\?=@quote{$1}\\J\$2\\I wildcard:=@terminate wildcard:=@terminate morewild:=\\J@quote{$1} morewild:=@end morewild:=@end ! Change underscores to hyphens, except for leading underscores. map-name:\_*=_@map-name{*} map-name:\<*\>=\<@map-name{*}\> map-name:=@map-name2{$1} map-name2:\J_\J=-;?=? @set-wrap{78;\ \ \ \ } ! Use variable x to avoid duplication of Foo for FooA and FooW @set{x;} export:\A$x\Z=$x export:*=@set{x;@map-name{$1}}$x\ @write{${export-file};${export-head}@wrap{ $x}}\ @set{export-head;\,}@set{export-tail;\;\n} export-end:=@write{${export-file};${export-tail;}}\ @set{export-head; export}@set{export-tail;} \B=@var{heading;@err{Missing -module\n}}@bind{heading;}\ @set{O;@outpath}\ \/\/ This file is automatically generated from \`@file\'\; do not edit.\n\n\ @bind{export-file;@var{-exports;@mergepath{@outpath;@file;.exp}}}\ @bind{export-head; export}@bind{export-tail;}\ @write{${export-file};\n\ \ \/\/ Names from @file\:\n} close-export:=@export-end{}\ @cmps{${-exports;};${export-file};@close{${export-file}};;}\ @unbind{export-file}@unbind{export-head}@unbind{export-tail} \E=\N\n${defer;}@set{defer;}@close-export{}@unbind{heading} ! Hack to keep export list from getting too long. \N\/\*\n

\n\*\/\n=@export-end{} \n\n\n=@export-end{} \n\n\Ptypedef=@export-end{} \/\/\n\/\/\L

\n\G\/\/\n=@export-end{} ! \B\W\/\*\n

\*\/=\n\/\/ Adapted from\:\n$0\n ! header:\L\CCopyright*\n=\N \/\J\/*\n= \/\J\*\*\J\/= comment:\/\J\*\*\J\/= comment:\/\J\/\P\L*\*\J\/=\/\ \/ ! To fix BUG 395 ! Optional space. space:\/\J\/*\n= $0 space:\/\J\*\*\J\/= $0 ; space:=$1 space:\N\W\#*\n=$0 space:=@end \"\"= string:\\?=\\? \'\'= char:\\?=\\?@end;?=?@end matchparen:(#)=(#) matchparen:\{#\}=\{#\} matchparen:\/\J\*\*\J\/= matchparen:\/\J\/*\n= matchparen:\#if\J*\n\G\#e\J*\n=$0 matchparen:\P\)=@end matchparen:\P\}=@end ! This one preserves comments. matchparen2:\/\J\*\*\J\/=$0 matchparen2:\/\J\/*\n=$0 matchparen2::matchparen ! ---- data types ---- type:struct _\J\W\W=@resolve-type{$2$1}@end ! type:struct tag\J\W\W=@resolve-type{$2$1}@end type:struct \W\W=@resolve-type{$2$1}@failed{error type struct $1}@end type:struct=@fail type:const\I\W= \/\* const \*\/ $1@end ! type:CONST = \/\* const \*\/ $1@end type:G_CONST_RETURN\I\W= \/\* const \*\/ $1@end type:int=\@end type:unsigned long long=\@end type:signed long long=\@end type:unsigned long=\@end type:signed long=\@end type:signed short=\@end type:unsigned short=\@end type:unsigned char=\@end type:signed char=\@end type:signed int=\@end type:unsigned int=\@end type:unsigned=\@end type:long long int=\@end type:long long=\@end type:long int=\@end type:long=\@end type:short int=\@end type:short=\@end type:float=\@end type:double=\@end type:char\W\*=\@end type:gchar\W\*=\@end type:wchar_t\W\*=\@end type:char=\@end type:void=\@end ! type:0\J=@fail! 0xFFL is not an identifier type:=@resolve-type{$2$1}@end type:\/\*\*\/\W= type:=@fail stars:\*=\* stars:const= stars:G_CONST_RETURN= stars:\S= stars:volatile= stars:\/\*\*\/\W= stars:=@end resolve-type:\A\ \/\**\*\/\W=\I\/\**\*\/\ \< resolve-type:\A=\< resolve-type:\Z=\> resolve-type:\J_\J=- resolve-type:\*=$1 ! resolve-type:\*=$2@map-name{$3}\* resolve-type:\*=@map-name{$2}\*$1 resolve-type:\/\**\*\/= resolve-type:=$1 resolve-type:\S= resolve-type:?=@failed{error resolve-type $0}@end ptr-type:\S=\S ptr-type:\/\**\*\/=$0 ptr-type:=@fail ! Function types: typedef (\*\W)(\W)\;=\N\ define constant @export{\<$3\>} \=\ \\;\n ! General type equivalence: typedef \G\W\G\W,\;=\ @{typedef $1\I$2$3\;typedef $1\I$4\;} typedef \G\W\;=@do-typedef{$3\d@type{$1$2}} typedef \W\G\W\;=@do-typedef{$2\d$1} typedef \W\(\*\)\G\W\(*\)\;=\ @do-typedef{$2\d\} typedef struct \W\W\;=@do-typedef{$2\d\<$1\>} typedef union \W\W\;=@do-typedef{$2\d\<$1\>} do-typedef:*\d*=\N\ define C-pointer-type @export{\<@map-ptr-name{$1}\>} \=\>\ @type{$1}\;\n\ define C-pointer-type @export{\<@map-ptr-name{@map-ptr-name{$1}}\>} \=\>\ \ \<@map-ptr-name{$1}\>\;\n\ @append{defer;define inline constant @export{@type{$1}} \= $2\;\n} ctype:\Cconst\W=$0 ctype:struct =$0@end ctype:struct=@fail ctype:=\I$1@end ctype:\S=\I;=@fail optstars:\*=\* optstars:\CNEAR= optstars:\CFAR= optstars:\S=\I optstars:=@end typelist:\W=$1 typelist:,=,\s;\S=;=@failed{error typelist $1}@fail typelist:\A\)=@fail ! ---- constants ---- plus-one:=@add{$1;1}@end plus-one:*\ +\ =$1 + @add{$2;1}@end plus-one:*=$1 + 1@end typedefenum \{\}\;= typedefenum\W\{\W\}\W=\ \n\/\/ enum $5\:\n@do-typedef{@map-name{$5}\d\}$4\ @set{next;0}@cmps{$5;;;;@define{type\:$5\=\\@end}} enumbody:\/\/*\n= enumbody:\/\*\*\/= enumbody:= enumbody:\W\=\W=\ define inline-only constant @export{\$$1} \= $2\;\n\ @set{next;@plus-one{$2}} enumbody:\W\=\W\'\'=\ define inline-only constant @export{\$$1} \= \ as(\, \'$2\')\;\n\ @set{next;as(\, \'$2\') + 1} enumbody:\W\=\W=\ define inline-only constant @export{\$$1} \= @map-name{\$$2}\;\n\ @set{next;\$@map-name{$1} + 1} enumbody:\W=\ define inline-only constant @export{\$$1} \= @map-name{\$$2}\;\n\ @set{next;\$@map-name{$1} + 1} enumbody:=\ define inline-only constant @export{\$$1} \= ${next;0}\;\n\ @set{next;@plus-one{${next;0}}} enumbody:,= enumbody:=@failed{error enumbody $1} term:,=@end;\P\;=@end;\P\}=@end;\P\)=@end;\S=;=@fail number:\W\<\<\W=ash($1,$2)@end number:(int)\W=$1@end number:0x0\J\I=\#x0$1@end number:\C0xFFFFFFFF\J\I=\$FFFFFFFF@end number:0x\J\I=as(\, \#x$1)@end !number:(DWORD)= !number:(WORD)= !number:(SHORT)= !number:(u_long)= !number:(WCHAR)\W=as(\,$1)@end !number:(BYTE)\W=logand($1,\#xFF)@end number:(\W\|)=logior(@number{$1},$2)@end !number:(H\J)\W=make(\, address\: $2)@end !number:MAKEINTRESOURCE()=MAKEINTRESOURCE($1)@end number:()\W=as($1,$2)@end number:(\W)=@fail number:(\W\W)=$1@end number:(\W\W)\W/[-+*]/\W=$1 $2 $3@end number:-\W=-$1@end number:\~\W=lognot($1)@end number:0x\J\I=\#x$1@end number:0\J\I=\#o$1@end number:\I=$1@end number:\W/[-+*]/\W=\$@map-name{$1} $2 $3@end !number:\J=@fail! not for function names number:\W\P=\$@map-name{$1}@end number:=@fail optL:\C\JU\J= optL:\C\JL\J= optL:=@end signed-number:\C0xFFFFFFFF\J\I=lognot(0)@end signed-number:(\W#\W)=$1@end signed-number::number or-args:\|=, or-args:\S= or-args:\\\n= or-args:=\S$1 or-args:=@fail termchar:,=@end;\;=@end;\]=@end;\)=@end;\}=@end;\#=@end;\|=@end;=@fail ! ignore function aliasing ! \L\#define $1\J/[AW]/= ! \L\#define DECLSPEC_IMPORT= \L\#define =\ @define{link\:\\I$1\\I\=@quote{$2}\@end} ! Try to avoid forward references. ! Use `\J_\J' to avoid matching function names. \L\#define \G \J_\J\W=@append{defer;\ define inline-only constant @export{\$$1} @tab{42}\=\ @wrap{\s\$@map-name{$2_$3}\;}\n} \L\#define \G \J_\J\W=@append{defer;\ define inline-only constant @export{\$$2} @tab{42}\=\ @wrap{\s\$@map-name{$3$4}\;}\n} ! General case for numeric constants. \L\#define \G \W=\N\ define inline-only constant @export{\$$1} @tab{60}\=\ @wrap{\ @right{4;$2}\;}\n \L\#define \G \W=\N\ define inline-only constant @export{\$$2} @tab{60}\=\ @wrap{\ @right{4;$3}\;}\n ! string constants in COMMDLG.H and COMMCTRL.H ! \L\#define \JA \"\"=\ ! \Ndefine constant @export{\$$1} @tab{32} \=@wrap{\ \"$2\"\;}\n ! \L\#define \JA \"\"=\ ! \Ndefine constant @export{\$$2} @tab{32} \=@wrap{\ \"$3\"\;}\n relevant-constant:NULL\I=@fail relevant-constant:TRUE\I=@fail relevant-constant:FALSE\I=@fail relevant-constant::relevant-name relevant-name:FLOAT=@fail! don't try to redefine Dylan relevant-name:=$1@end relevant-name:=@fail endline:\/\/*\n=@end endline:\/\*\*\/= endline:\n=@end endline:^M^J=@end endline:\s=;\t= endline:=@fail ! ---- functions ---- \W\W\G()\G\;=\ \N\ndefine inline-only C-function @export{$3}\n$4\N\ @result{$1}\ \ c-name\: \"$3\"@wrap{$2}\;\n\ end\;\n function-attributes:\S= function-attributes:G_GNUC_CONST= function-attributes:=@end link:__stdcall=, c-modifiers\: "__stdcall"@end link:__cdecl=, c-modifiers\: "__cdecl"@end link:=@end reqlink:=$1@terminate putparm:,*=parameter @argname{$1} @tab{34}\:\: $2\;\n putparm:,*=parameter @argname{$1} @tab{34}\:\: $1\;\n args:,=;\S= args:...=\ \ varargs \;\n@fail! C-FFI doesn't implement this yet ??? args:va_list=@fail! don't know how to handle this yet ??? args:\W=\ \ @putparm{$2,$1} args:\W=\ \ @putparm{$2,$1} args:void\P\W)=@end !args:VOID\P\W)=@end args:\/\J\*\*\J\/= args:\/\J\/*\n= args:*\,=@failed{error args $0}@fail args:*\P\)=@failed{error args $0}@fail ! argdimensions:= argname:\/\*\*\/= argname:\*=P argname:=@downcase{$1} argname:\\G\W\*\W=@outparm{$1\* $2} ! outparm:\W=\ \ output @putparm{$2,$1} ! outparm:*=@failed{error outparm *} ! Some of the newly added declarations have started using this convention. !args:IN OUT \W=\ \ input output @putparm{$2,$1} !args:IN \W=\ \ input @putparm{$2,$1} !args:OUT \W=\ \ output @putparm{$2,$1} !args:OPTIONAL\I\W<-I0>= failed:\Cerror\W=@exit-status{1} failed:\Cwarning\W= failed: =\ @err{\N"@file" line @line, failed match for $1\: $2$3...\n}@end failed: *=\ @err{\N"@file" line @line, failed match for $1\: $2\N}@end result:\= result:*=\ \ result value @tab{34}\:\: $1\;\n ! ---- structures ---- ! don't want these typedefstruct \{\}\;= typedef union \{\}\;= bad-struct:=$1@fail bad-struct:=@end bad-struct:=@fail nogood:=@end @set{packing;} \#pragma pack()=@set{packing;\ \ pack\:\ $1\;\n} \#pragma pack(push,)=@push{packing;\ \ pack\:\ $1\;\n} \#pragma pack(push)=@push{packing;${packing}} \#pragma pack(pop)=@pop{packing} \#include \Cpshpack\J\.h=@push{packing;\ \ pack\:\ $2\;\n} \#include \Cpoppack.h=@pop{packing} map-ptr-name:*=@map-name{*}\* struct\I\W\{\}\;=\ @bind{aggregate-name;@map-name{$1}}@bind{fields;@fields{$3}}\N\n\ define C-struct @export{\<${aggregate-name}\>}\n${fields}\N${packing}\ @define{ptr-type\:\\J@quote{$1}\=\ @quote{@map-ptr-name{${aggregate-name}}}}\ \ \ pointer-type-name\: \ @export-ptr{\<@map-ptr-name{${aggregate-name}}\>}\;\n\ @cmps{$1;;;;\ \ c-name\: \"struct $1\"\;\n}\ end\;\n\ @unbind{fields}@unbind{aggregate-name} typedefstruct\I\W\{\}\W*\;=\ @bind{aggregate-name;@map-name{$5}}@bind{fields;@fields{$4}}\N\n\ define C-struct @export{\<${aggregate-name}\>}\n${fields}\N${packing}\ @define{ptr-type\:\\J@quote{$5}\=\ @quote{@map-ptr-name{${aggregate-name}}}}\ \ \ pointer-type-name\: \ @export-ptr{\<@map-ptr-name{${aggregate-name}}\>}\;\n\ @cmps{$2;;;;\ \ c-name\: \"struct $2\"\;\n}\ end\;\n\ @styps{*}\N@unbind{aggregate-name}@unbind{fields} union\I\W\{\}\;=\ @bind{aggregate-name;@map-name{$1}}@bind{fields;@fields{$3}}\N\n\ define C-union @export{\<${aggregate-name}\>}\n${fields}\N${packing}\ end\;\n\ @unbind{aggregate-name} typedef union\I\W\{\}\W*\;=\ @bind{aggregate-name;@map-name{$4}}@bind{fields;@fields{$3}}\N\n\ define C-union @export{\<${aggregate-name}\>}\n${fields}\N${packing}\ end\;\n\ @styps{*}\N@unbind{aggregate-name} fields:\S= fields:volatile= fields:\/\J\/*\n= fields:\/\J\*\*\J\/\W= !fields: \[\W\]\;=\ ! \ \ sealed inline-only array slot @export{$2-array} @tab{42}\:\:\ ! @wrap{\ @type{$1},}\n\ ! \ \ \ \ length\: $3,\n\ ! @ignore{@export{$2-array-setter}}\ ! \ \ \ \ address-getter\: @export{$2-value}\;\n !fields:\W\*\[\W\]\;=\ ! \ \ sealed inline-only array slot\ \ ! @export-slot{$2-array} @tab{42}\:\:\ ! @wrap{\ @type{$1\*},}\n\ ! \ \ \ \ length\: $3,\n\ ! \ \ \ \ address-getter\: @export-slot{$2}\;\n fields:\G\W\W\[\]\;=\ \ \ sealed inline-only array slot @export-slot{$2-array} @tab{42}\:\:\ @wrap{\ $1,}\n\ \ \ \ \ length\: $3,\n\ \ \ \ \ address-getter\: @export{@getter-name{$2}}\;\n fields:\G\W\W\;=\ \ \ sealed inline-only array slot @export-slot{$2-array} @tab{42}\:\:\ @wrap{\ $1,}\n\ \ \ \ \ length\: \#\($3\),\n\ \ \ \ \ address-getter\: @export{@getter-name{$2}}\;\n dimensions:\[\G\]=$1@end dimensions:=@fail dimensions2:\S= dimensions2:\]\W\[=,\s dimensions2:=$0 dimensions2:=@end ! a 1-bit field will never need to be a . !fields:DWORD \W\:\W\;=\ ! \ \ sealed bitfield slot @export-slot{$1} @tab{40}\:\:\ ! @wrap{\ \,\n\ ! \ \ \ \ width\: $2\;}\n fields:\G\W\W\:\W\;=\ \ \ sealed bitfield slot @export-slot{$2} @tab{42}\:\:\ @wrap{\ $1,\n\ \ \ \ \ width\: $3\;}\n fields:\G\W\;=\ \ \ sealed inline-only slot @export-slot{$2} @tab{42}\:\: $1\;\n fields:\G\W(\*)(*)\;=\ \ \ sealed inline-only slot @export-slot{$2} @tab{42}\:\: \ \\;\n fields:\#if\I\W=@fields{$4} fields:\#if\I\W=@fields{$3} fields:\#ifdef =@fields{$3} fields:\#ifdef =@fields{$4} fields:\#ifndef =@fields{$4} fields:\#ifndef =@fields{$3} @set{gencount;0} fields:union\I\W\W\{\}\W\;=@incr{gencount}\ @out{define C-union \<$1\%${gencount}\>\n$2\N${packing}\ @cmps{$1;;;;\ \ c-name\: \"union $1\"\;\n}\ end\;\n}\ \ \ sealed inline-only slot @export-slot{$1} @tab{42}\:\:\ \ \<$1\%${gencount}\>\;\n fields:union\I\W\W\{\}\W\;=@incr{gencount}\ @out{define C-union \<$3\%${gencount}\>\n$2\N${packing}\ @cmps{$1;;;;\ \ c-name\: \"union $1\"\;\n}\ end\;\n}\ \ \ sealed inline-only slot @export-slot{$3} @tab{42}\:\:\ \ \<$3\%${gencount}\>\;\n fields:struct\{\}\W\;=@incr{gencount}\ @out{define C-struct \<$2\%${gencount}\>\n$1\N${packing}end\;\n}\ \ \ sealed inline-only slot @export{$2-value} @tab{42}\:\:\ \ \<$2\%${gencount}\>, setter\: \#f\;\n fields:union\{\}\G\;=@incr{gencount}\ @out{define C-union \\n$1\N${packing}end\;\n}\ \ \ sealed inline-only slot @export-slot{u} @tab{42}\:\:\ \ \\;\n fields:struct\{\}\G\;=@incr{gencount}\ @out{define C-struct \\n$1\N${packing}end\;\n}\ \ \ sealed inline-only slot @export-slot{u} @tab{42}\:\:\ \ \\;\n fields:*\n=@failed{warning fields *}@fail without-underscore:\_*=*@end without-underscore:*=* getter-name:*=@without-underscore{${aggregate-name}}-* setter-name:*=@without-underscore{${aggregate-name}}-*-setter export-slot:*=@export{@getter-name{$1}}\ @ignore{@export{@setter-name{$1}}}@end export-ptr:*=@export{$1}@append{defer;\ define sealed domain make (singleton($1))\;\n\ define sealed domain initialize ($1)\;\n} ignore:=@end make-list:\W\W\Z=\#($1) make-list:*=list(*) styps:\S= ! styps:NEAR\W\*\WNP\J= ! styps:\CNEAR=;\CFAR= styps:=define inline constant @export{\<$1\>} \= \ \<${aggregate-name}\>\;\n styps:\*=@do-typedef{$1\d\<${aggregate-name}\>} styps:\,= strip-angle-brackets:\<\>=$1 ! ---- variables --- ! ---- conditionals ---- elsepart:\#endif=@end elsepart:\#else\#endif=$1@end elsepart:\#elif=$3@end elsepart:\#elif\P\#e\J= elsepart:=@fail \#ifdef =@{$3} \#ifdef =@{$4} \#ifndef =@{$4} \#ifndef =@{$3} ! use strict data typing: ! def-flag:STRICT=@end def-flag:_STDCALL_SUPPORTED=@end def-flag:G_DISABLE_DEPRECATED=@end def-flag:GTK_DISABLE_DEPRECATED=@end def-flag:GDK_DISABLE_DEPRECATED=@end def-flag:GDK_PIXBUF_DISABLE_DEPRECATED=@end def-flag:=@fail ARGV:\N-D\J\W\n=@define{def-flag\:$1\=\@end} ! @undefine{undef-flag\:$1} undef-flag:=@fail undef-flag:=@end \#if\I\W=@{$3} \#if\I\W=@{$4} ! false-flag:0=$0@end ! false-flag:FALSE=$0@end ! false-flag:defined(\W)=$1 ! false-flag:\!defined(\W)=$1 ! false-flag:\!(\L\W)=$0 ! false-flag:(#)=$1 ! false-flag:()\&\&(\W)=$0 ! false-flag:\&\&\L=@end ! false-flag:\|\|=$0 ! false-flag:\L= ! false-flag:=@terminate ! ! true-flag:defined(\W)=$1 ! true-flag:\!defined(\W)=$1 ! true-flag:\!(\L\W)=$0 ! true-flag:()\|\|=$2 ! true-flag:(#)=$1 ! true-flag:\|\|\L=@end ! true-flag:\&\&=$0 ! true-flag:\L= ! true-flag:=@terminate false-flag:=@fail false-flag:\L*=@end true-flag:\Ldefined\W(\W)= true-flag:\L\!\Wdefined\W(\W)= true-flag:\L\!(\W)= true-flag:()\|\|= true-flag:(#)= true-flag:\L\|\|=@end true-flag:\&\&= true-flag:\L= true-flag:1= true-flag:=@terminate matchparenline:\P\n=@end matchparenline::matchparen ! undef-flag:_MIPS_=@end ! undef-flag:_PPC_=@end ! undef-flag:_MPPC_=@end ! undef-flag:_ALPHA_=@end ! undef-flag:_MAC=@end ! undef-flag:_68K_=@end ! undef-flag:UNICODE=@end ! undef-flag:__cplusplus=@end ! undef-flag:MIDL_PASS=@end ! undef-flag:GNUC=@end ! undef-flag:__OPTIMIZE__=@end ! ! undef-flag:G_CAN_INLINE=@end ! undef-flag:USE_OLD_IOCHANNELS=@end ! undef-flag:__GLIB_H__=@end ! undef-flag:__GDK_H__=@end ! undef-flag:__GDK_I18N_H__=@end ! undef-flag:__GDK_INPUT_H__=@end ! undef-flag:__GDK_PRIVATE_H__=@end ! undef-flag:__GDK_RGB_H__=@end ! undef-flag:__GDK_TYPES_H__=@end ! undef-flag:__GDK_X_H__=@end ! undef-flag:__GTK_H__=@end ! undef-flag:=@end ! ARGV:\N-U\J\W\n=@define{undef-flag\:$1\=\$0\@end}@undefine{def-flag\:$1} matchcond:\#if\J*\n\G\W=$0 matchcond:\P\#endif=@end matchcond:\P\#else=@end matchcond:\P\#elif=@end matchcond:\#elif\W= matchcond:\#*\n=$0 elsecond:\#endif=$0\n@end elsecond:\#else \#endif=$0\n@end elsecond:\#elif\W=$3@end elsecond:=@fail ! ---- defaults ---- \#define\L = oneline:\\\n=;\n=@end;?= \N\W\#*\n= typedef \;= = \S=