369 lines
14 KiB
OpenEdge ABL
369 lines
14 KiB
OpenEdge ABL
pushdef(_prediv,divnum)divert(-1)dnl Redirect output to /dev/null for now
|
|
changecom(`|')
|
|
|------------------------------------------------------------------
|
|
| _upcase: Convert argument to upper case
|
|
| $1: String to convert to upcase
|
|
define(`_upcase',
|
|
`translit(`$1', `abcdefghijklmnopqrstuvwxyz',
|
|
`ABCDEFGHIJKLMNOPQRSTUVWXYZ')')dnl
|
|
|------------------------------------------------------------------
|
|
| For loop definitions, stolen from m4 doc page
|
|
| forloop(`i', 1, 8, `i ') =>1 2 3 4 5 6 7 8
|
|
|
|
|
define(`forloop',`ifelse(eval($2>$3),1,,`pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')')
|
|
define(`_forloop',`$4`'ifelse($1, `$3', ,`define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
|
|
|------------------------------------------------------------------
|
|
| _Next(`a', a) increments `a' by 1.
|
|
|
|
|
define(`_Next', `define(`$1',`eval($2+1)')')
|
|
|------------------------------------------------------------------
|
|
| _Ws: Adds l1 characters of white space.
|
|
| _Ws(l1) => " ",
|
|
| where len(" ")=l1.
|
|
|
|
|
define(`_Ws1',`forloop(`i',0,$1,` ')')
|
|
define(`_Ws', `_Ws1(eval(($1)*eval(($1)>1)))') dnl
|
|
|------------------------------------------------------------------
|
|
| _Cntr Center a string
|
|
| _Cntr(String, Length) => " String "
|
|
|
|
|
define(`_Cntr', `_Ws(($2-len($1))/2)' `$1' `_Ws(($2-len($1))/2)')dnl
|
|
|------------------------------------------------------------------
|
|
| _fmt(X) => "X " where len=45
|
|
|
|
|
define(`_fmt', ``$1'_Ws(45-len($1))')dnl
|
|
|------------------------------------------------------------------
|
|
| Spit out hex formatted variable
|
|
| This implementation of M4 insists on giving me -ve numbers if the MSB is set to 1.
|
|
| Spit out the hi and low word with appropriate shifts and masks
|
|
|
|
|
define(`_msw', `eval((`$1'>>16)&0xffff,16,4)')
|
|
define(`_lsw', `eval(`$1'&0xffff,16,4)')
|
|
define(`_hexout',`0x`'_msw(eval(`$1'))`'_lsw(eval(`$1'))')
|
|
|------------------------------------------------------------------
|
|
| Capitalize a string
|
|
|
|
|
define(`_Capitalize',`_upcase(substr($1,0,1))`'substr($1,1,len($1)-1)')dnl
|
|
|------------------------------------------------------------------
|
|
| Spit out a C macro #define
|
|
|
|
|
define(`_CMacroDef',``#'_fmt(define $1) $2')
|
|
|------------------------------------------------------------------
|
|
| Spit out a C value define
|
|
|
|
|
define(`_C1Define',``#'_fmt(define $1) $2')
|
|
define(`_C2Define',``#'_fmt(define $1) $2 /* $3 */')
|
|
|
|
|
| $1: Text
|
|
| $2: Value
|
|
| $3: Comment
|
|
define(`_CDefine',`ifelse($3,`',_C1Define($1,$2), _C2Define($1,$2,$3))')
|
|
|
|
|
| $1: Text
|
|
| $2: Value
|
|
| $3: Comment
|
|
| $4: Additional Flags that need to be ORed in with the value.
|
|
|
|
|
define(`_CPDefine',`ifelse($4,`',_C1Define($1,$2,$3), _C2Define($1,`($2 |$4)',$3))')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| Formatted C Comment from string
|
|
|
|
|
define(`_CComment', `/*--- _fmt($1) ---*/')
|
|
|------------------------------------------------------------------
|
|
| _CDefGenre: Format the genre defines for C
|
|
| $1: Genre text name
|
|
| $2: Genre code
|
|
| $3: Short Name
|
|
| $4: Description
|
|
|
|
|
define(`_CDefGenre', `_CDefine($1, $2,`' )'
|
|
`;begin_internal'
|
|
`/* @doc EXTERNAL '
|
|
` * @Semantics $3 | '
|
|
` * @normal Genre: <c eval(_THISGENRE,10,2) >'
|
|
` */ '
|
|
`;end_internal'
|
|
)
|
|
|------------------------------------------------------------------
|
|
| _CDefAxs
|
|
| $1: Text: DIAXIS_
|
|
| $2: Semantic name
|
|
| $3: Text description
|
|
| $4: Axis Index
|
|
| $5: Semantic
|
|
define(`_CDefAxs', `_CDefine($1_$2,$5,$3)'
|
|
` /* @normal <c $1_$2>:$5 ;internal'
|
|
` * $3 */;internal')
|
|
|------------------------------------------------------------------
|
|
| _CDefBtn
|
|
| $1: Text DIBUTTON
|
|
| $2: Semantic name
|
|
| $3: Text description
|
|
| $4: Axis Index
|
|
| $5: Semantic
|
|
define(`_CDefBtn', `_CDefine($1_$2,$5,$3)'
|
|
` /* @normal <c $1_$2>:$5 ;internal'
|
|
` * $3 */;internal')
|
|
|------------------------------------------------------------------
|
|
| _CDefPov
|
|
| $1: Text DIPOV
|
|
| $2: Semantic name
|
|
| $3: Text description
|
|
| $4: Axis Index
|
|
| $5: Semantic
|
|
define(`_CDefPov', `_CDefine($1_$2,$5,$3)'
|
|
` /* @normal <c $1_$2>:$5 ;internal'
|
|
` * $3 */;internal')
|
|
|------------------------------------------------------------------
|
|
|
|
|
| _Mask: Create a mask, by specifying bitsz and offset.
|
|
| $1: Number of bits
|
|
| $2: Where does it start
|
|
define(`_Mask',`_hexout(eval((2**(`$1')-1)<<`$2'))') dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Bits1 helper for _Bits
|
|
| $1: Name
|
|
| $2: Starts at bit offset
|
|
| $3: Bitmask
|
|
| Define m4 and C macros in order to get and set values
|
|
| and C defines for each bitmask and shift value
|
|
|
|
|
define(`_1Bits',
|
|
`_CMacroDef(DISEM_$1_SET(x), ( ( (BYTE)(x)<<$2 ) & $3 ))' dnl
|
|
`pushdef(`_Set$1',`ifelse( eval((_$1<<$2 ) & $3 ),eval(_$1<<$2),_hexout((_$1<<$2) & $3 ), ($1:_$1<<$2)&$3)')'
|
|
`_CMacroDef(DISEM_$1_GET(x), ((BYTE)( ( (x) & $3 )>>$2 )))' dnl
|
|
`pushdef(`_Get$1', `eval( (_$1 & $3 ) >>$2 ) ')'
|
|
`_CMacroDef(DISEM_$1_MASK, ( $3 ))'
|
|
`_CMacroDef(DISEM_$1_SHIFT, ( $2 ))' )
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Bits Define a bitfield
|
|
| $1: Name
|
|
| $2: Starts at bit offset
|
|
| $3: Bitmask
|
|
define(`_Bits', `_1Bits(_upcase($1), $2, $3)')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Value1: helper for Value()
|
|
| $1: Type1
|
|
| $2: Type2
|
|
| $3: Value
|
|
define(`_1Value',`define(`_$1_$2', `$3')'dnl
|
|
`define(`_$1',$3)'dnl
|
|
`_CDefine(DISEM_$1_$2, _Set$1,`')')dnl
|
|
|------------------------------------------------------------------
|
|
| _Value: Define a value dependent on "_Bits()" already defined
|
|
| $1: Type1
|
|
| $2: Type2
|
|
| $3: Value
|
|
|define(`_Value', `_1Value(_upcase($1),_upcase($2),$3)')dnl
|
|
|------------------------------------------------------------------
|
|
| _Semantic() Define a semantic value
|
|
| $1: Genre#
|
|
| $2: Control priority
|
|
| $3: Flags (xaxis, etc ..)
|
|
| $4: Control type (button, axis, pov)
|
|
| $5: Group#
|
|
| $6: Control Index
|
|
define(`_Semantic',`define(`_GENRE', `eval($1)')'dnl
|
|
`define(`_PRI', `eval($2)')'dnl
|
|
`define(`_FLAGS', `eval($3)')'dnl
|
|
`define(`_TYPE', `eval($4)')'dnl
|
|
`define(`_GROUP', `eval($5)')'dnl
|
|
`define(`_INDEX', `eval($6)')'dnl
|
|
`_hexout( _SetPHYSICAL | _SetGENRE | _SetFLAGS | _SetPRI | _SetREL | _SetTYPE | _SetGROUP | _SetINDEX )')dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Axis1: Axis semantic helper
|
|
| $1: Flags defining which axis
|
|
| $2: Semantic longer name
|
|
| $3: Group#
|
|
| $4: Text desciption
|
|
define(`_1Axis', `_CDefAxs(DIAXIS,$2,$4,_NAXS,
|
|
_Semantic(`_THISGENRE', `_THISPRI', $1, `_TYPE_AXIS',$3, _NAXS))' )dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Axis Define next available axis semantic
|
|
| $1: Which axis (X,Y,Z,R,U,V,A,B,C,S) ?
|
|
| $2: Semantic short name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
define(`_Axis', `_Next(`_NAXS',_NAXS)'dnl
|
|
`_1Axis(_FLAGS_$1,_upcase(_SzSub`_$2'), $3, $4)' )dnl
|
|
|------------------------------------------------------------------
|
|
| _PAxis: Define axis for a physical device
|
|
| $1: Which axis (X,Y,Z,R,U,V,A,B,C,S) ?
|
|
| $2: Semantic short name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
| $5: Offset ( DIMOFS_*)
|
|
define(`_PAxis',`_CPDefine(`DI'_upcase(_SzSub`_$2'),_Semantic(`_THISGENRE', `_THISPRI', 0x0, `_TYPE_AXIS',$3, 0x0),$4,$5)')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _1Button: Button semantic helper
|
|
| $1: Control Index #
|
|
| $2: Semantic Long name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
| $5: Flags to control fallback axis/pov type
|
|
define(`_1Button', `_CDefBtn(DIBUTTON,$2,$4,_NBTN,
|
|
_Semantic(`_THISGENRE', `_THISPRI', $5, `_TYPE_BUTTON',$3, $1))')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Button: Define next available button semantic
|
|
| $1: Semantic short Name
|
|
| $2: Group#
|
|
| $3: Text description
|
|
define(`_Button',`_Next(`_NBTN',_NBTN)'dnl
|
|
`_1Button(_NBTN,_upcase(_SzSub`_$1'), $2, $3, 0x0)' )dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _ButtonN: Defines a numbered button
|
|
| $1: Control Index # ( Use predefined values BUTTON_*)
|
|
| $2: Semantic short name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
define(`_ButtonN',`_1Button($1,_upcase(_SzSub`_$2'), $3, $4, 0x0)' )
|
|
|------------------------------------------------------------------
|
|
| _ButtonF Fallback buttons for axes and povs
|
|
| $1: Flags to define fallback type axis(X,Y,Z,...) or pov(P)
|
|
| $2: Control Index # ( use defines value BUTTON_*)
|
|
| $3: Semantic short name
|
|
| $4: Group#
|
|
| $5: Text description
|
|
define(`_ButtonF',`_1Button($2,_upcase(_SzSub`_$3')`_LINK', $4, $5, _FLAGS_$1)' )
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _PButtonN: Defines a numbered button for a physical device
|
|
| $1: Control Index #
|
|
| $2: Semantic short name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
| $5: Offset (DIMOFS_* )
|
|
define(`_PButtonN',`_CPDefine(`DI'_upcase(_SzSub`_$2'),_Semantic(`_THISGENRE', `_THISPRI', 0x0, `_TYPE_BUTTON',$3, $1),$4,$5)')dnl
|
|
|------------------------------------------------------------------
|
|
| _1Pov: hatswitch semantic helper
|
|
| $1: Control Index #
|
|
| $2: Semantic long Name
|
|
| $3: Group#
|
|
| $4: Text description
|
|
define(`_1Pov', `_CDefPov(DIHATSWITCH,$2,$4, _NPOV,
|
|
_Semantic(_THISGENRE, _THISPRI, 0x0, _TYPE_POV,$3, $1))') dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Pov: Defines a hatswitch semantic
|
|
| $1: Semantic short Name
|
|
| $2: Group#
|
|
| $3: Text description
|
|
|
|
|
define(`_Pov',`_Next(`_NPOV',_NPOV)'dnl
|
|
`_1Pov(_NPOV,_upcase(_SzSub`_$1'), $2, $3)' )dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _BeginPhysical: Physical device defination
|
|
| $1: Genre text name
|
|
| $2: Shortcut genre text name
|
|
| $3: Short description of genre
|
|
| $4: Verbose desciption of genre
|
|
define(`_BeginPhysical',`_Next(`_PGENRE', _PGENRE)'dnl
|
|
`define(`_PHYSICAL',1)'dnl
|
|
`define(`_THISPRI',0)'dnl
|
|
`define(`_SzSub',`$2')'dnl
|
|
`define(`_NAXS',0x0)'dnl
|
|
`define(`_NBTN',0x0)'dnl
|
|
`define(`_NPOV',0x0)'dnl
|
|
`_CComment($3
|
|
$4,40)'
|
|
`define(`_THISGENRE',_PGENRE)'
|
|
`;begin_internal'
|
|
`_CDefGenre(DIPHYSICAL_$1, `_Semantic(_THISGENRE,0,0,0,0,0)', $3, $4)'
|
|
`;end_internal')dnl
|
|
|
|
|------------------------------------------------------------------
|
|
| _BeginGenre: Start a new genre
|
|
| $1: Genre text name
|
|
| $2: Shortcut genre text name
|
|
| $3: Short description of genre
|
|
| $4: Verbose desciption of genre
|
|
define(`_BeginGenre',`_Next(`_VGENRE', _VGENRE)'dnl
|
|
`define(`_PHYSICAL',0)'dnl
|
|
`define(`_THISPRI',0)'dnl
|
|
`define(`_SzSub',`$2')'dnl
|
|
`define(`_NAXS',0x0)'dnl
|
|
`define(`_NBTN',0x0)'dnl
|
|
`define(`_NPOV',0x0)'dnl
|
|
`_CComment($3
|
|
$4,40)'
|
|
`define(`_THISGENRE',_VGENRE)'dnl
|
|
`_CDefGenre(DIVIRTUAL_$1, `_Semantic(_THISGENRE,0,0,0,0,0)', $3, $4)' )dnl
|
|
|------------------------------------------------------------------
|
|
| _Priority2 semantics
|
|
|
|
|
define(`_Priority2',`_ButtonN(BUTTON_MENU,MENU, 0, Show menu options)'
|
|
`_CComment(Priority 2 controls)'
|
|
`;begin_internal'
|
|
`_CComment(@normal <c Priority2 Commands>)'
|
|
`;end_internal'
|
|
`define(`_THISPRI',1)'dnl
|
|
)
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _EndGenre: End of a genre.
|
|
|
|
|
define(`_EndGenre',`_ButtonN(BUTTON_DEVICE, DEVICE, 0, Show input device and controls)'
|
|
`_ButtonN(BUTTON_PAUSE,PAUSE, 0, Start / Pause / Restart game)')dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _EndPhysical: End of a genre.
|
|
|
|
|
define(`_EndPhysical',`')dnl
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _devType: Given a string for the abbreviated device type "Wheel, Joystick",
|
|
| generate the string "DI8DEVTYPE_WHEEL, DI8DEVTYPE_JOYSTICK"
|
|
|
|
|
define(`_devType', `DI8DEVTYPE_`'_upcase($1),' `ifelse($#, 1, , `_devType(shift($*))')')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _Device: List the best devices for each genre.
|
|
|
|
|
define(`_Device', `;begin_internal'
|
|
``#'define DISEM_DEFAULTDEVICE_`'_THISGENRE {' dnl
|
|
`_devType($*)' `}'
|
|
`;end_internal')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _EndFile: Once all genres are defined, need to generate an array of
|
|
| "best" devices for each genre. This is a part of dinputp.h
|
|
| and is appropriately marked as internal.
|
|
|
|
|
define(`_EndFile',`;begin_internal'
|
|
``#'if (DIRECTINPUT_VERSION >= 0x0800)'
|
|
``#'define DISEM_MAX_GENRE _THISGENRE'
|
|
`static const BYTE DiGenreDeviceOrder[DISEM_MAX_GENRE][DI8DEVTYPE_MAX-DI8DEVTYPE_MIN]={'
|
|
`forloop(i,1,_THISGENRE,`DISEM_DEFAULTDEVICE_`'i,
|
|
')'
|
|
`};'
|
|
``#'endif'
|
|
`;end_internal')
|
|
|
|
|
|------------------------------------------------------------------
|
|
| _InitSemantics: Initialize global m4 variables.
|
|
|
|
|
define(`_InitSemantics', `define(`_THISGENRE', 0)' dnl
|
|
`define(`_THISPRI', 0)' dnl
|
|
`define(`_NAXS', 0)' dnl
|
|
`define(`_NBTN', 0)' dnl
|
|
`define(`_NPOV', 0)' dnl
|
|
`define(`_PGENRE', 0)' dnl
|
|
`define(`_PHYSICAL', 1)' dnl
|
|
`define(`_VGENRE', 0)' dnl
|
|
`define(`_REL', 0)' dnl
|
|
)
|
|
_InitSemantics
|
|
changecom()
|
|
divert(_prediv)popdef(`_prediv')dnl End of macro header file
|
|
|