mirror of
https://github.com/KevinMidboe/linguist.git
synced 2026-05-07 14:09:18 +00:00
Merge pull request #2180 from pchaigno/inc-extension
.inc file extension
This commit is contained in:
@@ -226,6 +226,7 @@ Assembly:
|
||||
extensions:
|
||||
- .asm
|
||||
- .a51
|
||||
- .inc
|
||||
- .nasm
|
||||
tm_scope: source.asm.x86
|
||||
ace_mode: assembly_x86
|
||||
@@ -412,6 +413,7 @@ C++:
|
||||
- .hh
|
||||
- .hpp
|
||||
- .hxx
|
||||
- .inc
|
||||
- .inl
|
||||
- .ipp
|
||||
- .tcc
|
||||
@@ -1270,6 +1272,7 @@ HTML:
|
||||
- .html
|
||||
- .htm
|
||||
- .html.hl
|
||||
- .inc
|
||||
- .st
|
||||
- .xht
|
||||
- .xhtml
|
||||
@@ -2380,6 +2383,7 @@ PHP:
|
||||
- .aw
|
||||
- .ctp
|
||||
- .fcgi
|
||||
- .inc
|
||||
- .php3
|
||||
- .php4
|
||||
- .php5
|
||||
@@ -2467,6 +2471,7 @@ Pascal:
|
||||
- .pas
|
||||
- .dfm
|
||||
- .dpr
|
||||
- .inc
|
||||
- .lpr
|
||||
- .pp
|
||||
ace_mode: pascal
|
||||
@@ -2986,6 +2991,7 @@ SQL:
|
||||
- .sql
|
||||
- .cql
|
||||
- .ddl
|
||||
- .inc
|
||||
- .prc
|
||||
- .tab
|
||||
- .udf
|
||||
@@ -3184,6 +3190,7 @@ SourcePawn:
|
||||
- sourcemod
|
||||
extensions:
|
||||
- .sp
|
||||
- .inc
|
||||
- .sma
|
||||
tm_scope: source.sp
|
||||
ace_mode: text
|
||||
|
||||
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
245
samples/Assembly/fp_sqr32_160_comba.inc
Normal file
@@ -0,0 +1,245 @@
|
||||
|
||||
push r2
|
||||
dint
|
||||
nop
|
||||
bis #MPYDLYWRTEN,&MPY32CTL0
|
||||
bic #MPYDLY32,&MPY32CTL0
|
||||
mov #SUMEXT,r13
|
||||
clr r12
|
||||
|
||||
mov @r15+,r4
|
||||
mov @r15+,r5
|
||||
|
||||
mov @r15+,r6
|
||||
mov @r15+,r7
|
||||
|
||||
mov @r15+,r8
|
||||
mov @r15+,r9
|
||||
|
||||
mov @r15+,r10
|
||||
mov @r15+,r11
|
||||
|
||||
sub #2*8,r15
|
||||
|
||||
/* SELF_STEP_FIRST */
|
||||
mov r4,&MPY32L
|
||||
mov r5,&MPY32H
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*0(r14)
|
||||
mov &RES1,2*(0+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
|
||||
/* STEP_1 */
|
||||
mov r4,&MAC32L
|
||||
mov r5,&MAC32H
|
||||
mov r6,&OP2L
|
||||
mov r7,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r6,&OP2L
|
||||
mov r7,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*2(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(2+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* STEP_1 */
|
||||
mov r4,&MAC32L
|
||||
mov r5,&MAC32H
|
||||
mov r8,&OP2L
|
||||
mov r9,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r8,&OP2L
|
||||
mov r9,&OP2H
|
||||
|
||||
/* SELF_STEP */
|
||||
mov r6,&MAC32L
|
||||
mov r7,&MAC32H
|
||||
add @r13,r12
|
||||
mov r6,&OP2L
|
||||
mov r7,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*4(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(4+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* STEP_1 */
|
||||
mov r4,&MAC32L
|
||||
mov r5,&MAC32H
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
|
||||
/* STEP_2MORE */
|
||||
mov r6,&MAC32L
|
||||
mov r7,&MAC32H
|
||||
add @r13,r12
|
||||
mov r8,&OP2L
|
||||
mov r9,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r8,&OP2L
|
||||
mov r9,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*6(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(6+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* STEP_1 */
|
||||
mov r4,&MAC32L
|
||||
mov r5,&MAC32H
|
||||
mov 2*8(r15),&OP2L
|
||||
mov 2*9(r15),&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov 2*8(r15),&OP2L
|
||||
mov 2*9(r15),&OP2H
|
||||
|
||||
/* STEP_2MORE */
|
||||
mov r6,&MAC32L
|
||||
mov r7,&MAC32H
|
||||
add @r13,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
|
||||
/* SELF_STEP */
|
||||
mov r8,&MAC32L
|
||||
mov r9,&MAC32H
|
||||
add @r13,r12
|
||||
mov r8,&OP2L
|
||||
mov r9,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*8(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(8+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
mov 2*8(r15),r4
|
||||
mov 2*(8+1)(r15),r5
|
||||
|
||||
/* STEP_1 */
|
||||
mov r6,&MAC32L
|
||||
mov r7,&MAC32H
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
|
||||
/* STEP_2MORE */
|
||||
mov r8,&MAC32L
|
||||
mov r9,&MAC32H
|
||||
add @r13,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*10(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(10+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* STEP_1 */
|
||||
mov r8,&MAC32L
|
||||
mov r9,&MAC32H
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
|
||||
/* SELF_STEP */
|
||||
mov r10,&MAC32L
|
||||
mov r11,&MAC32H
|
||||
add @r13,r12
|
||||
mov r10,&OP2L
|
||||
mov r11,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*12(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(12+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* STEP_1 */
|
||||
mov r10,&MAC32L
|
||||
mov r11,&MAC32H
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
add &SUMEXT,r12
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*14(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(14+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* SELF_STEP_1 */
|
||||
mov r4,&MAC32L
|
||||
mov r5,&MAC32H
|
||||
mov r4,&OP2L
|
||||
mov r5,&OP2H
|
||||
|
||||
/* COLUMN_END */
|
||||
mov &RES0,2*16(r14)
|
||||
add @r13,r12
|
||||
mov &RES1,2*(16+1)(r14)
|
||||
mov &RES2,&RES0
|
||||
mov &RES3,&RES1
|
||||
mov r12,&RES2
|
||||
clr &RES3
|
||||
clr r12
|
||||
|
||||
/* END */
|
||||
mov &RES0,2*18(r14)
|
||||
mov &RES1,2*(18+1)(r14)
|
||||
pop r2
|
||||
eint
|
||||
170
samples/Assembly/lib.inc
Normal file
170
samples/Assembly/lib.inc
Normal file
@@ -0,0 +1,170 @@
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 显示 AL 中的数字
|
||||
; ------------------------------------------------------------------------
|
||||
DispAL:
|
||||
push ecx
|
||||
push edx
|
||||
push edi
|
||||
|
||||
mov edi, [dwDispPos]
|
||||
|
||||
mov ah, 0Fh ; 0000b: 黑底 1111b: 白字
|
||||
mov dl, al
|
||||
shr al, 4
|
||||
mov ecx, 2
|
||||
.begin:
|
||||
and al, 01111b
|
||||
cmp al, 9
|
||||
ja .1
|
||||
add al, '0'
|
||||
jmp .2
|
||||
.1:
|
||||
sub al, 0Ah
|
||||
add al, 'A'
|
||||
.2:
|
||||
mov [gs:edi], ax
|
||||
add edi, 2
|
||||
|
||||
mov al, dl
|
||||
loop .begin
|
||||
;add edi, 2
|
||||
|
||||
mov [dwDispPos], edi
|
||||
|
||||
pop edi
|
||||
pop edx
|
||||
pop ecx
|
||||
|
||||
ret
|
||||
; DispAL 结束-------------------------------------------------------------
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 显示一个整形数
|
||||
; ------------------------------------------------------------------------
|
||||
DispInt:
|
||||
mov eax, [esp + 4]
|
||||
shr eax, 24
|
||||
call DispAL
|
||||
|
||||
mov eax, [esp + 4]
|
||||
shr eax, 16
|
||||
call DispAL
|
||||
|
||||
mov eax, [esp + 4]
|
||||
shr eax, 8
|
||||
call DispAL
|
||||
|
||||
mov eax, [esp + 4]
|
||||
call DispAL
|
||||
|
||||
mov ah, 07h ; 0000b: 黑底 0111b: 灰字
|
||||
mov al, 'h'
|
||||
push edi
|
||||
mov edi, [dwDispPos]
|
||||
mov [gs:edi], ax
|
||||
add edi, 4
|
||||
mov [dwDispPos], edi
|
||||
pop edi
|
||||
|
||||
ret
|
||||
; DispInt 结束------------------------------------------------------------
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 显示一个字符串
|
||||
; ------------------------------------------------------------------------
|
||||
DispStr:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
push ebx
|
||||
push esi
|
||||
push edi
|
||||
|
||||
mov esi, [ebp + 8] ; pszInfo
|
||||
mov edi, [dwDispPos]
|
||||
mov ah, 0Fh
|
||||
.1:
|
||||
lodsb
|
||||
test al, al
|
||||
jz .2
|
||||
cmp al, 0Ah ; 是回车吗?
|
||||
jnz .3
|
||||
push eax
|
||||
mov eax, edi
|
||||
mov bl, 160
|
||||
div bl
|
||||
and eax, 0FFh
|
||||
inc eax
|
||||
mov bl, 160
|
||||
mul bl
|
||||
mov edi, eax
|
||||
pop eax
|
||||
jmp .1
|
||||
.3:
|
||||
mov [gs:edi], ax
|
||||
add edi, 2
|
||||
jmp .1
|
||||
|
||||
.2:
|
||||
mov [dwDispPos], edi
|
||||
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
pop ebp
|
||||
ret
|
||||
; DispStr 结束------------------------------------------------------------
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 换行
|
||||
; ------------------------------------------------------------------------
|
||||
DispReturn:
|
||||
push szReturn
|
||||
call DispStr ;printf("\n");
|
||||
add esp, 4
|
||||
|
||||
ret
|
||||
; DispReturn 结束---------------------------------------------------------
|
||||
|
||||
|
||||
; ------------------------------------------------------------------------
|
||||
; 内存拷贝,仿 memcpy
|
||||
; ------------------------------------------------------------------------
|
||||
; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);
|
||||
; ------------------------------------------------------------------------
|
||||
MemCpy:
|
||||
push ebp
|
||||
mov ebp, esp
|
||||
|
||||
push esi
|
||||
push edi
|
||||
push ecx
|
||||
|
||||
mov edi, [ebp + 8] ; Destination
|
||||
mov esi, [ebp + 12] ; Source
|
||||
mov ecx, [ebp + 16] ; Counter
|
||||
.1:
|
||||
cmp ecx, 0 ; 判断计数器
|
||||
jz .2 ; 计数器为零时跳出
|
||||
|
||||
mov al, [ds:esi] ; ┓
|
||||
inc esi ; ┃
|
||||
; ┣ 逐字节移动
|
||||
mov byte [es:edi], al ; ┃
|
||||
inc edi ; ┛
|
||||
|
||||
dec ecx ; 计数器减一
|
||||
jmp .1 ; 循环
|
||||
.2:
|
||||
mov eax, [ebp + 8] ; 返回值
|
||||
|
||||
pop ecx
|
||||
pop edi
|
||||
pop esi
|
||||
mov esp, ebp
|
||||
pop ebp
|
||||
|
||||
ret ; 函数结束,返回
|
||||
; MemCpy 结束-------------------------------------------------------------
|
||||
|
||||
321
samples/Assembly/macros.inc
Normal file
321
samples/Assembly/macros.inc
Normal file
@@ -0,0 +1,321 @@
|
||||
BLARGG_MACROS_INCLUDED = 1
|
||||
|
||||
; Allows extra error checking with modified version
|
||||
; of ca65. Otherwise acts like a constant of 0.
|
||||
ADDR = 0
|
||||
|
||||
; Switches to Segment and places Line there.
|
||||
; Line can be an .align directive, .res, .byte, etc.
|
||||
; Examples:
|
||||
; seg_data BSS, .align 256
|
||||
; seg_data RODATA, {message: .byte "Test",0}
|
||||
.macro seg_data Segment, Line
|
||||
.pushseg
|
||||
.segment .string(Segment)
|
||||
Line
|
||||
.popseg
|
||||
.endmacro
|
||||
|
||||
; Reserves Size bytes in Segment for Name.
|
||||
; If Size is omitted, reserves one byte.
|
||||
.macro seg_res Segment, Name, Size
|
||||
.ifblank Size
|
||||
seg_data Segment, Name: .res 1
|
||||
.else
|
||||
seg_data Segment, Name: .res Size
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
; Shortcuts for zeropage, bss, and stack
|
||||
.define zp_res seg_res ZEROPAGE,
|
||||
.define nv_res seg_res NVRAM,
|
||||
.define bss_res seg_res BSS,
|
||||
.define sp_res seg_res STACK,
|
||||
.define zp_byte zp_res
|
||||
|
||||
; Copies byte from Src to Addr. If Src begins with #,
|
||||
; it sets Addr to the immediate value.
|
||||
; Out: A = byte copied
|
||||
; Preserved: X, Y
|
||||
.macro mov Addr, Src
|
||||
lda Src
|
||||
sta Addr
|
||||
.endmacro
|
||||
|
||||
; Copies word from Src to Addr. If Src begins with #,
|
||||
; it sets Addr the immediate value.
|
||||
; Out: A = high byte of word
|
||||
; Preserved: X, Y
|
||||
.macro movw Addr, Src
|
||||
.if .match( .left( 1, {Src} ), # )
|
||||
lda #<(.right( .tcount( {Src} )-1, {Src} ))
|
||||
sta Addr
|
||||
lda #>(.right( .tcount( {Src} )-1, {Src} ))
|
||||
sta 1+(Addr)
|
||||
.else
|
||||
lda Src
|
||||
sta Addr
|
||||
lda 1+(Src)
|
||||
sta 1+(Addr)
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
; Increments 16-bit value at Addr.
|
||||
; Out: EQ/NE based on resulting 16-bit value
|
||||
; Preserved: A, X, Y
|
||||
.macro incw Addr
|
||||
.local @Skip
|
||||
inc Addr
|
||||
bne @Skip
|
||||
inc 1+(Addr)
|
||||
@Skip:
|
||||
.endmacro
|
||||
|
||||
; Adds Src to word at Addr.
|
||||
; Out: A = high byte of result, carry set appropriately
|
||||
; Preserved: X, Y
|
||||
.macro addw Addr, Src
|
||||
.if .match( .left( 1, {Src} ), # )
|
||||
addw_ Addr,(.right( .tcount( {Src} )-1, {Src} ))
|
||||
.else
|
||||
lda Addr
|
||||
clc
|
||||
adc Src
|
||||
sta Addr
|
||||
|
||||
lda 1+(Addr)
|
||||
adc 1+(Src)
|
||||
sta 1+(Addr)
|
||||
.endif
|
||||
.endmacro
|
||||
.macro addw_ Addr, Imm
|
||||
lda Addr
|
||||
clc
|
||||
adc #<Imm
|
||||
sta Addr
|
||||
|
||||
;.if (Imm >> 8) <> 0
|
||||
lda 1+(Addr)
|
||||
adc #>Imm
|
||||
sta 1+(Addr)
|
||||
;.else
|
||||
; .local @Skip
|
||||
; bcc @Skip
|
||||
; inc 1+(Addr)
|
||||
;@Skip:
|
||||
;.endif
|
||||
.endmacro
|
||||
|
||||
; Splits list of words into tables of low and high bytes
|
||||
; Example: split_words foo, {$1234, $5678}
|
||||
; expands to:
|
||||
; foo_l: $34, $78
|
||||
; foo_h: $12, $56
|
||||
; foo_count = 2
|
||||
.macro split_words Label, Words
|
||||
.ident (.concat (.string(Label), "_l")): .lobytes Words
|
||||
.ident (.concat (.string(Label), "_h")): .hibytes Words
|
||||
.ident (.concat (.string(Label), "_count")) = * - .ident (.concat (.string(Label), "_h"))
|
||||
.endmacro
|
||||
|
||||
.macro SELECT Bool, True, False, Extra
|
||||
.ifndef Bool
|
||||
False Extra
|
||||
.elseif Bool <> 0
|
||||
True Extra
|
||||
.else
|
||||
False Extra
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
.macro DEFAULT Name, Value
|
||||
.ifndef Name
|
||||
Name = Value
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
.ifp02
|
||||
; 6502 doesn't define these alternate names
|
||||
.define blt bcc
|
||||
.define bge bcs
|
||||
.endif
|
||||
.define jlt jcc
|
||||
.define jge jcs
|
||||
|
||||
; Jxx Target = Bxx Target, except it can go farther than
|
||||
; 128 bytes. Implemented via branch around a JMP.
|
||||
|
||||
; Don't use ca65's longbranch, because they fail for @labels
|
||||
;.macpack longbranch
|
||||
|
||||
.macro jeq Target
|
||||
bne *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jne Target
|
||||
beq *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jmi Target
|
||||
bpl *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jpl Target
|
||||
bmi *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jcs Target
|
||||
bcc *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jcc Target
|
||||
bcs *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jvs Target
|
||||
bvc *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
.macro jvc Target
|
||||
bvs *+5
|
||||
jmp Target
|
||||
.endmacro
|
||||
|
||||
|
||||
; Passes constant data to routine in addr
|
||||
; Preserved: A, X, Y
|
||||
.macro jsr_with_addr routine,data
|
||||
.local Addr
|
||||
pha
|
||||
lda #<Addr
|
||||
sta addr
|
||||
lda #>Addr
|
||||
sta addr+1
|
||||
pla
|
||||
jsr routine
|
||||
seg_data RODATA,{Addr: data}
|
||||
.endmacro
|
||||
|
||||
; Calls routine multiple times, with A having the
|
||||
; value 'start' the first time, 'start+step' the
|
||||
; second time, up to 'end' for the last time.
|
||||
.macro for_loop routine,start,end,step
|
||||
.local @for_loop
|
||||
lda #start
|
||||
@for_loop:
|
||||
pha
|
||||
jsr routine
|
||||
pla
|
||||
clc
|
||||
adc #step
|
||||
cmp #<((end)+(step))
|
||||
bne @for_loop
|
||||
.endmacro
|
||||
|
||||
; Calls routine n times. The value of A in the routine
|
||||
; counts from 0 to n-1.
|
||||
.macro loop_n_times routine,n
|
||||
for_loop routine,0,n-1,+1
|
||||
.endmacro
|
||||
|
||||
; Same as for_loop, except uses 16-bit value in YX.
|
||||
; -256 <= step <= 255
|
||||
.macro for_loop16 routine,start,end,step
|
||||
.if (step) < -256 || (step) > 255
|
||||
.error "Step must be within -256 to 255"
|
||||
.endif
|
||||
.local @for_loop_skip
|
||||
.local @for_loop
|
||||
ldy #>(start)
|
||||
lda #<(start)
|
||||
@for_loop:
|
||||
tax
|
||||
pha
|
||||
tya
|
||||
pha
|
||||
jsr routine
|
||||
pla
|
||||
tay
|
||||
pla
|
||||
clc
|
||||
adc #step
|
||||
.if (step) > 0
|
||||
bcc @for_loop_skip
|
||||
iny
|
||||
.else
|
||||
bcs @for_loop_skip
|
||||
dey
|
||||
.endif
|
||||
@for_loop_skip:
|
||||
cmp #<((end)+(step))
|
||||
bne @for_loop
|
||||
cpy #>((end)+(step))
|
||||
bne @for_loop
|
||||
.endmacro
|
||||
|
||||
; Stores byte at addr
|
||||
; Preserved: X, Y
|
||||
.macro setb addr, byte
|
||||
lda #byte
|
||||
sta addr
|
||||
.endmacro
|
||||
|
||||
; Stores word at addr
|
||||
; Preserved: X, Y
|
||||
.macro setw addr, word
|
||||
lda #<(word)
|
||||
sta addr
|
||||
lda #>(word)
|
||||
sta addr+1
|
||||
.endmacro
|
||||
|
||||
; Loads XY with 16-bit immediate or value at address
|
||||
.macro ldxy Arg
|
||||
.if .match( .left( 1, {Arg} ), # )
|
||||
ldy #<(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||
ldx #>(.right( .tcount( {Arg} )-1, {Arg} ))
|
||||
.else
|
||||
ldy (Arg)
|
||||
ldx (Arg)+1
|
||||
.endif
|
||||
.endmacro
|
||||
|
||||
; Increments XY as 16-bit register, in CONSTANT time.
|
||||
; Z flag set based on entire result.
|
||||
; Preserved: A
|
||||
; Time: 7 clocks
|
||||
.macro inxy
|
||||
iny ; 2
|
||||
beq *+4 ; 3
|
||||
; -1
|
||||
bne *+3 ; 3
|
||||
; -1
|
||||
inx ; 2
|
||||
.endmacro
|
||||
|
||||
; Negates A and adds it to operand
|
||||
.macro subaf Operand
|
||||
eor #$FF
|
||||
sec
|
||||
adc Operand
|
||||
.endmacro
|
||||
|
||||
; Initializes CPU registers to reasonable values
|
||||
; Preserved: A, Y
|
||||
.macro init_cpu_regs
|
||||
sei
|
||||
cld ; unnecessary on NES, but might help on clone
|
||||
ldx #$FF
|
||||
txs
|
||||
.ifndef BUILD_NSF
|
||||
inx
|
||||
stx PPUCTRL
|
||||
.endif
|
||||
.endmacro
|
||||
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
57
samples/C++/ClasspathVMSystemProperties.inc
Normal file
@@ -0,0 +1,57 @@
|
||||
//===- ClasspathVMSystem/Properties.cpp -----------------------------------===//
|
||||
//===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===//
|
||||
//
|
||||
// The VMKit project
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#include "types.h"
|
||||
|
||||
#include "Classpath.h"
|
||||
#include "JavaArray.h"
|
||||
#include "JavaClass.h"
|
||||
#include "JavaObject.h"
|
||||
#include "JavaThread.h"
|
||||
#include "JavaUpcalls.h"
|
||||
#include "Jnjvm.h"
|
||||
|
||||
#include "SetProperties.inc"
|
||||
|
||||
using namespace j3;
|
||||
|
||||
extern "C" {
|
||||
|
||||
|
||||
JNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(
|
||||
#ifdef NATIVE_JNI
|
||||
JNIEnv *env,
|
||||
jclass clazz,
|
||||
#endif
|
||||
JavaObject* prop) {
|
||||
|
||||
llvm_gcroot(prop, 0);
|
||||
|
||||
BEGIN_NATIVE_EXCEPTION(0)
|
||||
|
||||
setProperties(prop);
|
||||
|
||||
END_NATIVE_EXCEPTION
|
||||
}
|
||||
|
||||
extern "C" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) {
|
||||
|
||||
llvm_gcroot(prop, 0);
|
||||
|
||||
BEGIN_NATIVE_EXCEPTION(0)
|
||||
|
||||
setCommandLineProperties(prop);
|
||||
|
||||
END_NATIVE_EXCEPTION
|
||||
}
|
||||
|
||||
}
|
||||
2764
samples/C++/initClasses.inc
Normal file
2764
samples/C++/initClasses.inc
Normal file
File diff suppressed because it is too large
Load Diff
34
samples/C++/instances.inc
Normal file
34
samples/C++/instances.inc
Normal file
@@ -0,0 +1,34 @@
|
||||
#include "QPBO.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning(disable: 4661)
|
||||
#endif
|
||||
|
||||
// Instantiations
|
||||
|
||||
template class QPBO<int>;
|
||||
template class QPBO<float>;
|
||||
template class QPBO<double>;
|
||||
|
||||
template <>
|
||||
inline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)
|
||||
{
|
||||
type_name = "int";
|
||||
type_format = "d";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)
|
||||
{
|
||||
type_name = "float";
|
||||
type_format = "f";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)
|
||||
{
|
||||
type_name = "double";
|
||||
type_format = "Lf";
|
||||
}
|
||||
|
||||
|
||||
31
samples/HTML/rpanel.inc
Normal file
31
samples/HTML/rpanel.inc
Normal file
@@ -0,0 +1,31 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" charset="UTF-8" type="text/css" href="main.css">
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<div id="panel_header_main_form">
|
||||
<p id="panel_header_main_form_title">Поддержка:</p>
|
||||
</div>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<p>Москва:</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>+7-902-7-800-807</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>Регионы:</p>
|
||||
</td>
|
||||
<td>
|
||||
<p>+7-902-7-800-807</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
5
samples/HTML/tailDel.inc
Normal file
5
samples/HTML/tailDel.inc
Normal file
@@ -0,0 +1,5 @@
|
||||
</UL>
|
||||
<P><A HREF="devices.html">Supported Targets</A></P>
|
||||
</BODY>
|
||||
</HEAD>
|
||||
|
||||
142
samples/PHP/file_display.inc
Normal file
142
samples/PHP/file_display.inc
Normal file
@@ -0,0 +1,142 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Plugins are described by creating a $plugin array which will be used
|
||||
* by the system that includes this file.
|
||||
*/
|
||||
$plugin = array(
|
||||
'single' => TRUE,
|
||||
'title' => t('File display'),
|
||||
'description' => t('Displays the file with a configurable style.'),
|
||||
'required context' => new ctools_context_required(t('File'), 'entity:file'),
|
||||
'category' => t('File'),
|
||||
'defaults' => array(
|
||||
'displays' => array(),
|
||||
),
|
||||
);
|
||||
|
||||
/**
|
||||
* Render the node content.
|
||||
*/
|
||||
function file_entity_file_display_content_type_render($subtype, $conf, $panel_args, $context) {
|
||||
if (!empty($context) && empty($context->data)) {
|
||||
return;
|
||||
}
|
||||
$file = isset($context->data) ? clone($context->data) : NULL;
|
||||
$block = new stdClass();
|
||||
$block->module = 'file_entity';
|
||||
$block->delta = $file->fid;
|
||||
|
||||
if (empty($file)) {
|
||||
$block->delta = 'placeholder';
|
||||
$block->title = t('File display');
|
||||
$block->content = t('File display goes here.');
|
||||
}
|
||||
else {
|
||||
if (!empty($conf['identifier'])) {
|
||||
$file->ctools_template_identifier = $conf['identifier'];
|
||||
}
|
||||
|
||||
$block->title = $file->filename;
|
||||
$block->content = file_view_file($file, $conf['displays']);
|
||||
}
|
||||
|
||||
if (!empty($conf['link']) && $file) {
|
||||
$block->title_link = entity_uri('file', $file);
|
||||
}
|
||||
|
||||
return $block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit form for this plugin.
|
||||
*/
|
||||
function file_entity_file_display_content_type_edit_form($form, &$form_state) {
|
||||
$conf = $form_state['conf'];
|
||||
$form['#tree'] = TRUE;
|
||||
$form['#attached']['js'][] = drupal_get_path('module', 'file_entity') . '/file_entity.admin.js';
|
||||
|
||||
// Retrieve available formatters for this file. We can load all file types
|
||||
// since we don't know which type the file is at this point.
|
||||
$formatters = file_info_formatter_types();
|
||||
|
||||
// Formatter status.
|
||||
$form['displays']['status'] = array(
|
||||
'#type' => 'item',
|
||||
'#title' => t('Enabled displays'),
|
||||
'#prefix' => '<div id="file-displays-status-wrapper">',
|
||||
'#suffix' => '</div>',
|
||||
);
|
||||
$i=0;
|
||||
foreach ($formatters as $name => $formatter) {
|
||||
$form['displays']['status'][$name] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => check_plain($formatter['label']),
|
||||
'#default_value' => !empty($conf['displays'][$name]['status']),
|
||||
'#description' => isset($formatter['description']) ? filter_xss($formatter['description']) : NULL,
|
||||
'#parents' => array('displays', $name, 'status'),
|
||||
'#weight' => (isset($formatter['weight']) ? $formatter['weight'] : 0) + ($i / 1000),
|
||||
);
|
||||
$i++;
|
||||
}
|
||||
// Formatter order (tabledrag).
|
||||
$form['displays']['order'] = array(
|
||||
'#type' => 'item',
|
||||
'#title' => t('Display precedence order'),
|
||||
'#theme' => 'file_entity_file_display_order',
|
||||
);
|
||||
foreach ($formatters as $name => $formatter) {
|
||||
$form['displays']['order'][$name]['label'] = array(
|
||||
'#markup' => check_plain($formatter['label']),
|
||||
);
|
||||
$form['displays']['order'][$name]['weight'] = array(
|
||||
'#type' => 'weight',
|
||||
'#title' => t('Weight for @title', array('@title' => $formatter['label'])),
|
||||
'#title_display' => 'invisible',
|
||||
'#delta' => 50,
|
||||
'#default_value' => isset($conf['displays'][$name]['weight']) ? $conf['displays'][$name]['weight'] : 0,
|
||||
'#parents' => array('displays', $name, 'weight'),
|
||||
);
|
||||
$form['displays']['order'][$name]['#weight'] = $form['displays']['order'][$name]['weight']['#default_value'];
|
||||
}
|
||||
|
||||
// Formatter settings.
|
||||
$form['display_settings_title'] = array(
|
||||
'#type' => 'item',
|
||||
'#title' => t('Display settings'),
|
||||
);
|
||||
$form['display_settings'] = array(
|
||||
'#type' => 'vertical_tabs',
|
||||
);
|
||||
$i=0;
|
||||
foreach ($formatters as $name => $formatter) {
|
||||
if (isset($formatter['settings callback']) && ($function = $formatter['settings callback']) && function_exists($function)) {
|
||||
$defaults = !empty($formatter['default settings']) ? $formatter['default settings'] : array();
|
||||
$settings = !empty($conf['displays'][$name]['settings']) ? $conf['displays'][$name]['settings'] : array();
|
||||
$settings += $defaults;
|
||||
$settings_form = $function($form, $form_state, $settings, $name, $file_type, $view_mode);
|
||||
if (!empty($settings_form)) {
|
||||
$form['displays']['settings'][$name] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => check_plain($formatter['label']),
|
||||
'#parents' => array('displays', $name, 'settings'),
|
||||
'#group' => 'display_settings',
|
||||
'#weight' => (isset($formatter['weight']) ? $formatter['weight'] : 0) + ($i / 1000),
|
||||
) + $settings_form;
|
||||
}
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
return $form;
|
||||
}
|
||||
|
||||
function file_entity_file_display_content_type_edit_form_submit($form, &$form_state) {
|
||||
// Copy everything from our defaults.
|
||||
foreach (array_keys($form_state['plugin']['defaults']) as $key) {
|
||||
$form_state['conf'][$key] = $form_state['values'][$key];
|
||||
}
|
||||
}
|
||||
|
||||
function file_entity_file_display_content_type_admin_title($subtype, $conf, $context) {
|
||||
return t('"@s" content', array('@s' => $context->identifier));
|
||||
}
|
||||
37
samples/Pascal/image_url.inc
Normal file
37
samples/Pascal/image_url.inc
Normal file
@@ -0,0 +1,37 @@
|
||||
function GetUnixMangaImageURL: Boolean;
|
||||
var
|
||||
i: Integer;
|
||||
l: TStringList;
|
||||
s: String;
|
||||
begin
|
||||
l := TStringList.Create;
|
||||
s := manager.container.PageContainerLinks[workCounter];
|
||||
Result := GetPage(TObject(l), s , manager.container.Manager.retryConnect);
|
||||
|
||||
if Self.Terminated then
|
||||
begin
|
||||
l.Free;
|
||||
parse.Free;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
parse := TStringList.Create;
|
||||
Parser := THTMLParser.Create(PChar(l.Text));
|
||||
Parser.OnFoundTag := OnTag;
|
||||
Parser.OnFoundText := OnText;
|
||||
Parser.Exec;
|
||||
Parser.Free;
|
||||
l.Free;
|
||||
if parse.Count > 0 then
|
||||
begin
|
||||
for i := 0 to parse.Count - 1 do
|
||||
begin
|
||||
if (Pos('STYLE="border', parse[i]) > 0) and (Pos('<IMG', parse[i]) > 0) then
|
||||
begin
|
||||
manager.container.PageLinks[workCounter] := Trim(GetVal(parse[i], 'SRC'));
|
||||
Break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
parse.Free;
|
||||
end;
|
||||
56
samples/Pascal/libc.inc
Normal file
56
samples/Pascal/libc.inc
Normal file
@@ -0,0 +1,56 @@
|
||||
{
|
||||
This file is part of the Free Component Library (FCL)
|
||||
Copyright (c) 1999-2002 by the Free Pascal development team
|
||||
|
||||
BIOS functions unit for Nintendo DS
|
||||
Copyright (c) 2006 by Francesco Lombardi
|
||||
|
||||
See the file COPYING.FPC, included in this distribution,
|
||||
for details about the copyright.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
*****************************************************************************}
|
||||
|
||||
function __errno: plongint; cdecl; export;
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
|
||||
function S_ISBLK(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFBLK;
|
||||
end;
|
||||
|
||||
function S_ISCHR(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFCHR;
|
||||
end;
|
||||
|
||||
function S_ISDIR(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFDIR;
|
||||
end;
|
||||
|
||||
function S_ISFIFO(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFIFO;
|
||||
end;
|
||||
|
||||
function S_ISREG(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFREG;
|
||||
end;
|
||||
|
||||
function S_ISLNK(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFLNK;
|
||||
end;
|
||||
|
||||
function S_ISSOCK(m: longint): boolean; inline;
|
||||
begin
|
||||
result := (m and _IFMT) = _IFSOCK;
|
||||
end;
|
||||
502
samples/Pascal/vmops_impl.inc
Normal file
502
samples/Pascal/vmops_impl.inc
Normal file
@@ -0,0 +1,502 @@
|
||||
operator+(a, b: TVector)res: TVector;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, rn);
|
||||
for i := 0 to rn - 1 do res[i] := a[i mod an] + b[i mod bn];
|
||||
end;
|
||||
|
||||
operator+(a: TVector; b: Double)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] + b;
|
||||
end;
|
||||
|
||||
operator+(a: Double; b: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a + b[i];
|
||||
end;
|
||||
|
||||
operator-(a: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := -a[i];
|
||||
end;
|
||||
|
||||
operator-(a, b: TVector)res: TVector;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, rn);
|
||||
for i := 0 to rn - 1 do res[i] := a[i mod an] - b[i mod bn];
|
||||
end;
|
||||
|
||||
operator-(a: TVector; b: Double)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] - b;
|
||||
end;
|
||||
|
||||
operator-(a: Double; b: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a - b[i];
|
||||
end;
|
||||
|
||||
operator*(a, b: TVector)res: TVector;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, rn);
|
||||
for i := 0 to rn - 1 do res[i] := a[i mod an] * b[i mod bn];
|
||||
end;
|
||||
|
||||
operator*(a: TVector; b: Double)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] * b;
|
||||
end;
|
||||
|
||||
operator*(a: Double; b: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a * b[i];
|
||||
end;
|
||||
|
||||
operator/(a, b: TVector)res: TVector;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, rn);
|
||||
for i := 0 to rn - 1 do res[i] := a[i mod an] / b[i mod bn];
|
||||
end;
|
||||
|
||||
operator/(a: TVector; b: Double)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] / b;
|
||||
end;
|
||||
|
||||
operator/(a: Double; b: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a / b[i];
|
||||
end;
|
||||
|
||||
operator**(a, b: Double)res: Double;
|
||||
begin
|
||||
if IsNan(a) or IsNan(b) then res := NaN
|
||||
else if b = Infinity then begin
|
||||
if a = NegInfinity then res := NaN
|
||||
else case sign(a) of
|
||||
1: res := Infinity;
|
||||
0: res := 0;
|
||||
-1: res := NegInfinity;
|
||||
end;
|
||||
end else if b = NegInfinity then begin
|
||||
if a = NegInfinity then res := NaN
|
||||
else case sign(a) of
|
||||
1: res := 0;
|
||||
0: res := Infinity;
|
||||
-1: res := 0;
|
||||
end;
|
||||
end else res := power(a, b);
|
||||
end;
|
||||
|
||||
operator**(a, b: TVector)res: TVector;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, rn);
|
||||
for i := 0 to rn - 1 do res[i] := a[i mod an] ** b[i mod bn];
|
||||
end;
|
||||
|
||||
operator**(a: TVector; b: Double)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] ** b;
|
||||
end;
|
||||
|
||||
operator**(a: Double; b: TVector)res: TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a ** b[i];
|
||||
end;
|
||||
|
||||
operator><(a: TVector; b: TVector)res: TMatrix;
|
||||
var
|
||||
i, an, bn, rn: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
bn := Length(b);
|
||||
if an * bn = 0 then Exit(nil);
|
||||
rn := math.max(an, bn);
|
||||
SetLength(res, 1);
|
||||
SetLength(res[0], 1);
|
||||
res[0][0] := 0;
|
||||
for i := 0 to rn - 1 do res[0][0] := res[0][0] + a[i mod an] * b[i mod bn];
|
||||
end;
|
||||
|
||||
operator+(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, an: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
SetLength(res, an);
|
||||
for i := 0 to an - 1 do res[i] := a[i] + b[i];
|
||||
end;
|
||||
|
||||
operator+(a: TMatrix; b: Double)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] + b;
|
||||
end;
|
||||
|
||||
operator+(a: Double; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a + b[i];
|
||||
end;
|
||||
|
||||
operator+(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a + matrix(b, Length(a), Length(a[0]));
|
||||
end;
|
||||
|
||||
operator+(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := b + matrix(a, Length(b), Length(b[0]));
|
||||
end;
|
||||
|
||||
operator-(a: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := -a[i];
|
||||
end;
|
||||
|
||||
operator-(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, an: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
SetLength(res, an);
|
||||
for i := 0 to an - 1 do res[i] := a[i] - b[i];
|
||||
end;
|
||||
|
||||
operator-(a: TMatrix; b: Double)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] - b;
|
||||
end;
|
||||
|
||||
operator-(a: Double; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a - b[i];
|
||||
end;
|
||||
|
||||
operator-(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a - matrix(b, Length(a), Length(a[0]));
|
||||
end;
|
||||
|
||||
operator-(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := b - matrix(a, Length(b), Length(b[0]));
|
||||
end;
|
||||
|
||||
operator*(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, an: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
SetLength(res, an);
|
||||
for i := 0 to an - 1 do res[i] := a[i] * b[i];
|
||||
end;
|
||||
|
||||
operator*(a: TMatrix; b: Double)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] * b;
|
||||
end;
|
||||
|
||||
operator*(a: Double; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a * b[i];
|
||||
end;
|
||||
|
||||
operator*(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a * matrix(b, Length(a), Length(a[0]));
|
||||
end;
|
||||
|
||||
operator*(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := b * matrix(a, Length(b), Length(b[0]));
|
||||
end;
|
||||
|
||||
operator/(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, an: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
SetLength(res, an);
|
||||
for i := 0 to an - 1 do res[i] := a[i] / b[i];
|
||||
end;
|
||||
|
||||
operator/(a: TMatrix; b: Double)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] / b;
|
||||
end;
|
||||
|
||||
operator/(a: Double; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a / b[i];
|
||||
end;
|
||||
|
||||
operator/(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a / matrix(b, Length(a), Length(a[0]));
|
||||
end;
|
||||
|
||||
operator/(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := b / matrix(a, Length(b), Length(b[0]));
|
||||
end;
|
||||
|
||||
operator**(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, an: Integer;
|
||||
begin
|
||||
an := Length(a);
|
||||
SetLength(res, an);
|
||||
for i := 0 to an - 1 do res[i] := a[i] ** b[i];
|
||||
end;
|
||||
|
||||
operator**(a: TMatrix; b: Double)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a[i] ** b;
|
||||
end;
|
||||
|
||||
operator**(a: Double; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(b);
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do res[i] := a ** b[i];
|
||||
end;
|
||||
|
||||
operator**(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a ** matrix(b, Length(a), Length(a[0]));
|
||||
end;
|
||||
|
||||
operator**(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := b ** matrix(a, Length(b), Length(b[0]));
|
||||
end;
|
||||
|
||||
operator><(a: TMatrix; b: TMatrix)res: TMatrix;
|
||||
var
|
||||
i, j, n, m: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
m := Length(b);
|
||||
if (n = 1) and (m = 1) then Exit(vector(a) >< vector(b));
|
||||
SetLength(res, n);
|
||||
for i := 0 to n - 1 do begin
|
||||
j := 0;
|
||||
res[i] := a[i][j] * b[j];
|
||||
for j := 1 to m - 1 do res[i] := res[i] + a[i][j] * b[j];
|
||||
end;
|
||||
end;
|
||||
|
||||
operator><(a: TMatrix; b: TVector)res: TMatrix;
|
||||
begin
|
||||
res := a >< matrix(b, 1, Length(b));
|
||||
end;
|
||||
|
||||
operator><(a: TVector; b: TMatrix)res: TMatrix;
|
||||
begin
|
||||
res := matrix(a, 1, Length(a)) >< b;
|
||||
end;
|
||||
|
||||
function vector(a: array of const): TVector;
|
||||
var
|
||||
i, n: Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
SetLength(Result, n);
|
||||
for i := 0 to n - 1 do case a[i].VType of
|
||||
vtInteger: Result[i] := a[i].VInteger;
|
||||
vtExtended: Result[i] := a[i].VExtended^;
|
||||
vtCurrency: Result[i] := a[i].VCurrency^;
|
||||
vtInt64: Result[i] := a[i].VInt64^;
|
||||
end;
|
||||
end;
|
||||
|
||||
function vector(a: TMatrix): TVector; inline;
|
||||
var
|
||||
i, j, n, m : Integer;
|
||||
begin
|
||||
n := Length(a);
|
||||
if n = 0 then Exit(nil);
|
||||
m := Length(a[0]);
|
||||
if m = 0 then Exit(nil);
|
||||
SetLength(Result, m * n);
|
||||
for i := 0 to m - 1 do
|
||||
for j := 0 to n - 1 do
|
||||
Result[i * n + j] := a[j][i];
|
||||
end;
|
||||
|
||||
function matrix(data: TVector; nrow, ncol: Integer; byrow: Boolean): TMatrix;
|
||||
var
|
||||
i, j, n, c: Integer;
|
||||
begin
|
||||
n := Length(data);
|
||||
if n = 0 then Exit(nil);
|
||||
if (nrow = 0) and (ncol = 0) then ncol := 1;
|
||||
if nrow = 0 then nrow := (n div ncol) + sign(n mod ncol);
|
||||
if ncol = 0 then ncol := (n div nrow) + sign(n mod nrow);
|
||||
SetLength(Result, nrow);
|
||||
for i := 0 to nrow - 1 do begin
|
||||
SetLength(Result[i], ncol);
|
||||
for j := 0 to ncol - 1 do begin
|
||||
if byrow then c := i * ncol + j else c := j * nrow + i;
|
||||
Result[i][j] := data[c mod n];
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function matrix(data: TMatrix; nrow, ncol: Integer; byrow: Boolean): TMatrix;
|
||||
begin
|
||||
Result := matrix(vector(data), nrow, ncol, byrow);
|
||||
end;
|
||||
|
||||
function rep(data: TVector; times: TVector): TVector;
|
||||
var
|
||||
i, j, n, m, s, c: Integer;
|
||||
begin
|
||||
Result := nil;
|
||||
n := Length(data);
|
||||
m := Length(times);
|
||||
if n * m = 0 then Exit;
|
||||
s := 0;
|
||||
for i := 0 to n - 1 do begin
|
||||
c := trunc(times[i mod m]);
|
||||
if c > 0 then s += c;
|
||||
end;
|
||||
SetLength(Result, s);
|
||||
c := 0;
|
||||
for i := 0 to n - 1 do begin
|
||||
s := trunc(times[i mod m]);
|
||||
for j := 1 to s do begin
|
||||
Result[c] := data[i];
|
||||
Inc(c);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function rep(data: TVector; len: Integer): TVector;
|
||||
var
|
||||
i, j, n: Integer;
|
||||
begin
|
||||
n := Length(data);
|
||||
SetLength(Result, n * len);
|
||||
if n = 0 then Exit;
|
||||
for i := 0 to len - 1 do
|
||||
for j := 0 to n - 1 do
|
||||
Result[i * n + j] := data[j];
|
||||
end;
|
||||
|
||||
function rep(data: Double; len: Integer): TVector;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
SetLength(Result, len);
|
||||
for i := 0 to len - 1 do Result[i] := data;
|
||||
end;
|
||||
23
samples/SQL/hostcache_set_state.inc
Normal file
23
samples/SQL/hostcache_set_state.inc
Normal file
@@ -0,0 +1,23 @@
|
||||
# Helper for hostcache_*.test
|
||||
|
||||
# Set a known initial state for the test
|
||||
|
||||
flush status;
|
||||
flush hosts;
|
||||
flush user_resources;
|
||||
flush privileges;
|
||||
|
||||
# Print critical setup
|
||||
|
||||
select @@global.debug;
|
||||
select @@global.max_connect_errors;
|
||||
select @@global.max_user_connections;
|
||||
select @@global.max_connections;
|
||||
|
||||
# Make sure there are no remaining records that can change the test outcome
|
||||
|
||||
select `User`, `Host` from mysql.`user` where `host` like '%\\%%';
|
||||
select `User`, `Host` from mysql.`user` where `user` like '192.%';
|
||||
select `User`, `Host` from mysql.`user` where `user` like '2001:%';
|
||||
select `User`, `Host` from mysql.`user` where `user` like 'santa.claus.%';
|
||||
|
||||
246
samples/SourcePawn/Check.inc
Normal file
246
samples/SourcePawn/Check.inc
Normal file
@@ -0,0 +1,246 @@
|
||||
// Checkpoint Manager
|
||||
// (c) João Pedro Lopes, All right's reserved
|
||||
//
|
||||
// Feel free to change any line above, as long as you post the 'fix' / 'patch' at the forum
|
||||
// and send a copy to jplopes@live.com.pt
|
||||
|
||||
/* natives
|
||||
native CreateCheckpoint(ownerid, chpid, Float:posX, Float:posY, Float:posZ, Float:size); // Creates a checkpoint
|
||||
native SetCheckpointInterior(chpid, interiorid); // Changes the checkpoint interior
|
||||
native SetCheckpointVirtualWorld(chpid, VirtualWorldID); // Changes the Checkpoint vWorld
|
||||
native ToggleCheckpointActive(chpid, bool:active); // Deactivates / Activates the checkpoint
|
||||
native ChangeCheckpointOwner(chpid, owner); // Change the checkpoint owner
|
||||
native RemoveCheckpoint(chpid); // Removes the specified checkpoint
|
||||
native StartCheckpointSeeking(); // Starts seeking for each individual
|
||||
native StopCheckpointSeeking(); // Stops the system
|
||||
native VerifyCheckpoint(playerid); // Place this at OnPlayerEnterCheckpoint
|
||||
*/
|
||||
|
||||
// Function Forwards
|
||||
forward public OnCheckpointEnter(playerid, checkpointid);
|
||||
|
||||
#if defined _CHECKPOINT_MANAGER_INCLUDED
|
||||
#endinput
|
||||
#endif
|
||||
|
||||
#define _CHECKPOINT_MANAGER_INCLUDED
|
||||
#pragma library CheckpointManager
|
||||
|
||||
#include <a_samp>
|
||||
|
||||
#define MAX_CHECKPOINTS 200
|
||||
#define CHECKPOINT_SEEKER_DELAY 300
|
||||
|
||||
#define GLOBAL_OWNER_ID -1
|
||||
|
||||
|
||||
// CHECKPOINT ENUMERATION
|
||||
enum _checkpointEnum{
|
||||
_chp_populated, // Is this slot of the memory populated?
|
||||
|
||||
_chp_id, // The ID of the checkpoint
|
||||
_chp_owner, // The ID of the player who this checkpoint is visible too
|
||||
|
||||
Float:_chp_posX, // The X position of this checkpoint
|
||||
Float:_chp_posY, // The Y position of this checkpoint
|
||||
Float:_chp_posZ, // The Z position of this checkpoint
|
||||
Float:_chp_size, // The checkpoint size
|
||||
Float:_chp_viewDistance, // The checkpoint view distance
|
||||
|
||||
bool:_chp_active, // Is this checkpoint active?
|
||||
|
||||
_chp_interior_id, // The interior id of this checkpoint
|
||||
_chp_world_id // The world id of this checkpoint
|
||||
};
|
||||
|
||||
// DATA ARRAYS
|
||||
new _checkpoints[MAX_CHECKPOINTS][_checkpointEnum];
|
||||
new _p_VisibleCheckpoint[MAX_PLAYERS];
|
||||
new _chp_manager_timer_id;
|
||||
|
||||
// DATA VARIABLES
|
||||
new _totalCheckpoints;
|
||||
|
||||
// --------------------------------------------------------------------------------------------------------
|
||||
// Creates a new checkpoint with some initial data
|
||||
stock CreateCheckpoint(__ownerid, __chpid, Float:__posX, Float:__posY, Float:__posZ, Float:__size){
|
||||
// Max checkpoint reached?
|
||||
if(_totalCheckpoints == MAX_CHECKPOINTS) return 0;
|
||||
|
||||
// First checkpoint? Setting everything to unpopulated
|
||||
if(!_totalCheckpoints){
|
||||
for(new i; i < MAX_PLAYERS; i++) _p_VisibleCheckpoint[i] = -1;
|
||||
for(new i; i < MAX_CHECKPOINTS; i++){
|
||||
_checkpoints[i][_chp_populated] = false;
|
||||
}
|
||||
|
||||
// Sending the Initialization Info
|
||||
printf("[Checkpoint Manager : Version 0.1.1b] System Initialized...", __chpid);
|
||||
}
|
||||
|
||||
// Getting the first open slot
|
||||
new _slot;
|
||||
for(new i = 0; i < MAX_CHECKPOINTS; i++){
|
||||
if(!_checkpoints[i][_chp_populated]){
|
||||
_slot = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Adding the new checkpoint
|
||||
_checkpoints[_slot][_chp_populated] = true;
|
||||
_checkpoints[_slot][_chp_id] = __chpid;
|
||||
_checkpoints[_slot][_chp_owner] = __ownerid;
|
||||
_checkpoints[_slot][_chp_posX] = __posX;
|
||||
_checkpoints[_slot][_chp_posY] = __posY;
|
||||
_checkpoints[_slot][_chp_posZ] = __posZ;
|
||||
_checkpoints[_slot][_chp_size] = __size;
|
||||
_checkpoints[_slot][_chp_viewDistance] = 50.0;
|
||||
_checkpoints[_slot][_chp_active] = true;
|
||||
_checkpoints[_slot][_chp_interior_id] = 0;
|
||||
_checkpoints[_slot][_chp_world_id] = 0;
|
||||
|
||||
printf("[Checkpoint Manager] Checkpoint created (%d) at slot %d", __chpid, _slot);
|
||||
printf("Checkpoint Position: { %f, %f, %f }", _checkpoints[_slot][_chp_posX], _checkpoints[_slot][_chp_posY], _checkpoints[_slot][_chp_posZ]);
|
||||
|
||||
_totalCheckpoints++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------
|
||||
stock SetCheckpointInterior(__chpid, __interiorid){
|
||||
new _slot = __ChpSlotByID(__chpid);
|
||||
if(_slot > -1){
|
||||
// Valid slot?
|
||||
_checkpoints[_slot][_chp_interior_id] = __interiorid;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------
|
||||
stock SetCheckpointVirtualWorld(__chpid, __virtual_world_id){
|
||||
new _slot = __ChpSlotByID(__chpid);
|
||||
if(_slot > -1){
|
||||
_checkpoints[_slot][_chp_world_id] = __virtual_world_id;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
stock ToggleCheckpointActive(__chpid, bool:__active){
|
||||
new _slot = __ChpSlotByID(__chpid);
|
||||
if(_slot > -1){
|
||||
_checkpoints[_slot][_chp_active] = __active;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
stock ChangeCheckpointOwner(__chpid, __owner){
|
||||
new _slot = __ChpSlotByID(__chpid);
|
||||
if(_slot > -1){
|
||||
_checkpoints[_slot][_chp_owner] = __owner;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
stock RemoveCheckpoint(__chpid){
|
||||
new _slot = __ChpSlotByID(__chpid);
|
||||
if(_slot > -1){
|
||||
// Deleting the checkpoint
|
||||
_checkpoints[_slot][_chp_populated] = false;
|
||||
_checkpoints[_slot][_chp_id] = -1;
|
||||
_checkpoints[_slot][_chp_owner] = 255;
|
||||
_checkpoints[_slot][_chp_posX] = -1;
|
||||
_checkpoints[_slot][_chp_posY] = -1;
|
||||
_checkpoints[_slot][_chp_posZ] = -1;
|
||||
_checkpoints[_slot][_chp_size] = -1;
|
||||
_checkpoints[_slot][_chp_viewDistance] = -1;
|
||||
_checkpoints[_slot][_chp_active] = false;
|
||||
_checkpoints[_slot][_chp_interior_id] = -1;
|
||||
_checkpoints[_slot][_chp_world_id] = -1;
|
||||
_totalCheckpoints--;
|
||||
printf("\n[Checkpoint Manager] Checkpoint removed (ID: %d)", __chpid);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------
|
||||
// Gets the checkpoint slot by id
|
||||
stock __ChpSlotByID(__chpid){
|
||||
for(new i; i < MAX_CHECKPOINTS; i++){
|
||||
if(_checkpoints[i][_chp_id] == __chpid) return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
forward CheckpointSeeker();
|
||||
stock StartCheckpointSeeking(){
|
||||
_chp_manager_timer_id = SetTimer("CheckpointSeeker", CHECKPOINT_SEEKER_DELAY, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock StopCheckpointSeeking(){
|
||||
KillTimer(_chp_manager_timer_id);
|
||||
return 1;
|
||||
}
|
||||
|
||||
public CheckpointSeeker(){
|
||||
new Float:__posX, Float:__posY, Float:__posZ;
|
||||
new __interior;
|
||||
new __virtualWorld;
|
||||
for(new i; i < MAX_PLAYERS; i++)
|
||||
{
|
||||
if(!IsPlayerConnected(i)) continue;
|
||||
|
||||
GetPlayerPos(i, Float:__posX, Float:__posY, Float:__posZ);
|
||||
// Is the player near a checkpoint?
|
||||
if(_p_VisibleCheckpoint[i] > -1)
|
||||
{
|
||||
// If the player is no longer near that point
|
||||
if(__posX < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
|
||||
|| __posX > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posX] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
|
||||
|| __posY < (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] - _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])
|
||||
|| __posY > (_checkpoints[_p_VisibleCheckpoint[i]][_chp_posY] + _checkpoints[_p_VisibleCheckpoint[i]][_chp_viewDistance])){
|
||||
DisablePlayerCheckpoint(i);
|
||||
_p_VisibleCheckpoint[i] = -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Getting the player Interior and virtual world
|
||||
__interior = GetPlayerInterior(i);
|
||||
__virtualWorld = GetPlayerVirtualWorld(i);
|
||||
|
||||
// Looking for a new checkpoint
|
||||
for(new j = 0; j < MAX_CHECKPOINTS; j++){
|
||||
if(!_checkpoints[j][_chp_populated]) continue;
|
||||
if((_checkpoints[j][_chp_owner] != i) && (_checkpoints[j][_chp_owner] != -1)) continue;
|
||||
if(_checkpoints[j][_chp_interior_id] != __interior) continue;
|
||||
if(_checkpoints[j][_chp_world_id] != __virtualWorld) continue;
|
||||
|
||||
if(__posX > (_checkpoints[j][_chp_posX] - _checkpoints[j][_chp_viewDistance])
|
||||
&& __posX < (_checkpoints[j][_chp_posX] + _checkpoints[j][_chp_viewDistance])
|
||||
&& __posY > (_checkpoints[j][_chp_posY] - _checkpoints[j][_chp_viewDistance])
|
||||
&& __posY < (_checkpoints[j][_chp_posY] + _checkpoints[j][_chp_viewDistance])){
|
||||
SetPlayerCheckpoint(i, _checkpoints[j][_chp_posX], _checkpoints[j][_chp_posY], _checkpoints[j][_chp_posZ], _checkpoints[j][_chp_size]);
|
||||
_p_VisibleCheckpoint[i] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock VerifyCheckpoint(__playerid){
|
||||
if(_p_VisibleCheckpoint[__playerid] >= 0){
|
||||
OnCheckpointEnter(__playerid, _checkpoints[_p_VisibleCheckpoint[__playerid]][_chp_id]);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
91
samples/SourcePawn/fixed.inc
Normal file
91
samples/SourcePawn/fixed.inc
Normal file
@@ -0,0 +1,91 @@
|
||||
/* Fixed point arithmetic
|
||||
*
|
||||
* (c) Copyright 1998-2011, ITB CompuPhase
|
||||
* This file is provided as is (no warranties).
|
||||
*/
|
||||
#pragma library Fixed
|
||||
|
||||
const fround_method: {
|
||||
fround_round = 0,
|
||||
fround_floor,
|
||||
fround_ceil,
|
||||
fround_tozero,
|
||||
fround_unbiased
|
||||
}
|
||||
|
||||
native Fixed:fixed(value);
|
||||
native Fixed:strfixed(const string[]);
|
||||
native Fixed:fmul(Fixed:oper1, Fixed:oper2);
|
||||
native Fixed:fdiv(Fixed:dividend, Fixed:divisor);
|
||||
native Fixed:ffract(Fixed:value);
|
||||
native fround(Fixed:value, fround_method:method=fround_round);
|
||||
native Fixed:fpower(Fixed:value, exponent);
|
||||
native Fixed:fsqroot(Fixed:value);
|
||||
native Fixed:fabs(Fixed:value);
|
||||
|
||||
#pragma rational Fixed(3)
|
||||
|
||||
/* user defined operators */
|
||||
native Fixed:operator*(Fixed:oper1, Fixed:oper2) = fmul;
|
||||
native Fixed:operator/(Fixed:oper1, Fixed:oper2) = fdiv;
|
||||
native Fixed:operator=(oper) = fixed;
|
||||
|
||||
stock Fixed:operator++(Fixed:oper)
|
||||
return oper + fixed(1);
|
||||
|
||||
stock Fixed:operator--(Fixed:oper)
|
||||
return oper - fixed(1);
|
||||
|
||||
stock Fixed:operator*(Fixed:oper1, oper2)
|
||||
return Fixed: (_:oper1 * oper2); /* "*" is commutative */
|
||||
|
||||
stock Fixed:operator/(Fixed:oper1, oper2)
|
||||
return oper1 / fixed(oper2);
|
||||
|
||||
stock Fixed:operator/(oper1, Fixed:oper2)
|
||||
return fdiv(fixed(oper1), oper2);
|
||||
|
||||
stock Fixed:operator+(Fixed:oper1, oper2)
|
||||
return oper1 + fixed(oper2); /* "+" is commutative */
|
||||
|
||||
stock Fixed:operator-(Fixed:oper1, oper2)
|
||||
return oper1 - fixed(oper2);
|
||||
|
||||
stock Fixed:operator-(oper1, Fixed:oper2)
|
||||
return fixed(oper1) - oper2;
|
||||
|
||||
stock bool:operator>(Fixed:oper1, oper2)
|
||||
return oper1 > fixed(oper2);
|
||||
|
||||
stock bool:operator>(oper1, Fixed:oper2)
|
||||
return fixed(oper1) > oper2;
|
||||
|
||||
stock bool:operator>=(Fixed:oper1, oper2)
|
||||
return oper1 >= fixed(oper2);
|
||||
|
||||
stock bool:operator>=(oper1, Fixed:oper2)
|
||||
return fixed(oper1) >= oper2;
|
||||
|
||||
stock bool:operator<(Fixed:oper1, oper2)
|
||||
return oper1 < fixed(oper2);
|
||||
|
||||
stock bool:operator<(oper1, Fixed:oper2)
|
||||
return fixed(oper1) < oper2;
|
||||
|
||||
stock bool:operator<=(Fixed:oper1, oper2)
|
||||
return oper1 <= fixed(oper2);
|
||||
|
||||
stock bool:operator<=(oper1, Fixed:oper2)
|
||||
return fixed(oper1) <= oper2;
|
||||
|
||||
stock bool:operator==(Fixed:oper1, oper2) /* "==" is commutative */
|
||||
return oper1 == fixed(oper2);
|
||||
|
||||
stock bool:operator!=(Fixed:oper1, oper2) /* "!=" is commutative */
|
||||
return oper1 != fixed(oper2);
|
||||
|
||||
/* forbidden operations */
|
||||
forward operator%(Fixed:oper1, Fixed:oper2);
|
||||
forward operator%(Fixed:oper1, oper2);
|
||||
forward operator%(oper1, Fixed:oper2);
|
||||
|
||||
289
samples/SourcePawn/mfile.inc
Normal file
289
samples/SourcePawn/mfile.inc
Normal file
@@ -0,0 +1,289 @@
|
||||
/* mFile 1.1 by Minokon
|
||||
*
|
||||
* (c) Copyright by Minokon 2010
|
||||
* (c) y_files Copyright by Y_Less 2010
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined _mfile_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _mfile_included
|
||||
|
||||
//Defines
|
||||
#define MAX_LINE_SIZE 80 //Max lenght of one line in file
|
||||
#define MAX_KEY_SIZE 50 //Max lenght of key in line (to =)
|
||||
#define MAX_VALUE_SIZE 50 //Max lenght of value in line (past =)
|
||||
#define TMP_FILE "tmpfile.txt"
|
||||
|
||||
//Natives
|
||||
/*
|
||||
native mCreateFile(const file[]);
|
||||
native mRemoveFile(const file[]);
|
||||
native mClearFile(const file[]);
|
||||
native bool:mFileExist(const file[]);
|
||||
native mRenameFile(const file[], const newname[]);
|
||||
native mFindFile(const name[], dest[], &index, sizename=sizeof dest);
|
||||
native mCreateDir(const name[]);
|
||||
native mRenameDir(const dir[], const newname[]);
|
||||
native mFindDir(const name[], dest[], &index, sizename=sizeof dest);
|
||||
native mHowLines(const file[]);
|
||||
native mRemoveNewLine(string[]); //removes "\n" from string
|
||||
native mGetString(const file[], const key[], bool:ignorecase=false);
|
||||
native mGetInt(const file[], const key[], bool:ignorecase=false);
|
||||
native mGetFloat(const file[], const key[], &Float:value);
|
||||
native mSetString(const file[], const key[], const new_value[]);
|
||||
native mSetInt(const file[], const key[], new_value);
|
||||
native mSetFloat(const file[], const key[], Float:new_value);
|
||||
native mIsSet(const file[], const key[], bool:ignorecase=false);
|
||||
native mUnSet(const file[], const key[]);
|
||||
native mIsFileEmpty(const file[]);
|
||||
native y_files
|
||||
*/
|
||||
//y_files by Y_Less Functions
|
||||
native ffind(const pattern[], filename[], len, &idx);
|
||||
native frename(const oldname[], const newname[]);
|
||||
native dfind(const pattern[], filename[], len, &idx);
|
||||
native dcreate(const name[]);
|
||||
native drename(const oldname[], const newname[]);
|
||||
|
||||
//Forwards
|
||||
forward OnFileCreated(file[]);
|
||||
forward OnFileRemoved(file[]);
|
||||
forward OnFileCleared(file[]);
|
||||
forward OnFileRenamed(oldname[], newname[]);
|
||||
forward OnDirCreated(dir[]);
|
||||
forward OnDirRenamed(oldname[], newname[]);
|
||||
|
||||
stock mCreateFile(const file[])
|
||||
{
|
||||
if(fexist(file)) fremove(file);
|
||||
new File:mfile = fopen(file, io_write);
|
||||
fclose(mfile);
|
||||
CallLocalFunction("OnFileCreated", "s", file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock mRemoveFile(const file[])
|
||||
{
|
||||
CallLocalFunction("OnFileRemoved", "s", file);
|
||||
return fremove(file);
|
||||
}
|
||||
|
||||
stock mClearFile(const file[])
|
||||
{
|
||||
if(!fremove(file)) return 0;
|
||||
new File:mfile = fopen(file, io_write);
|
||||
fclose(mfile);
|
||||
CallLocalFunction("OnFileCleared", "s", file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock bool:mFileExist(const file[])
|
||||
if(fexist(file)) return true; //dla ciekawych: fexist nie zwraca booleanu
|
||||
else return false;
|
||||
|
||||
stock mRenameFile(const file[], const newname[])
|
||||
{
|
||||
CallLocalFunction("OnFileRenamed", "ss", file, newname);
|
||||
return frename(file, newname);
|
||||
}
|
||||
|
||||
stock mFindFile(const name[], dest[], &index, sizename=sizeof dest)
|
||||
return ffind(name, dest, sizename, index);
|
||||
|
||||
stock mCreateDir(const name[])
|
||||
{
|
||||
CallLocalFunction("OnDirCreated", "s", name);
|
||||
return dcreate(name);
|
||||
}
|
||||
|
||||
stock mRenameDir(const dir[], const newname[])
|
||||
{
|
||||
CallLocalFunction("OnDirRenamed", "ss", dir, newname);
|
||||
return drename(dir, newname);
|
||||
}
|
||||
|
||||
stock mFindDir(const name[], dest[], &index, sizename=sizeof dest)
|
||||
return dfind(name, dest, sizename, index);
|
||||
|
||||
stock mHowLines(const file[])
|
||||
{
|
||||
new lines, str[MAX_LINE_SIZE];
|
||||
new File:mfile = fopen(file, io_read);
|
||||
while(fread(mfile, str)) lines++;
|
||||
fclose(mfile);
|
||||
return lines;
|
||||
}
|
||||
|
||||
stock mRemoveNewLine(string[])
|
||||
{
|
||||
new pos = strfind(string, "\n");
|
||||
if(pos != -1)
|
||||
{
|
||||
strdel(string, pos, pos+2);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
stock mGetString(const file[], const key[], bool:ignorecase=false)
|
||||
{
|
||||
//Create file if not exists
|
||||
if(!fexist(file))
|
||||
{
|
||||
new File:created = fopen(file, io_write);
|
||||
fclose(created);
|
||||
}
|
||||
new //Variables
|
||||
File:mfile = fopen(file, io_read), //Open file
|
||||
str[MAX_LINE_SIZE],
|
||||
str2[MAX_KEY_SIZE],
|
||||
str3[MAX_VALUE_SIZE],
|
||||
pos;
|
||||
//Find key in file
|
||||
while(fread(mfile, str))
|
||||
{
|
||||
pos = strfind(str, "=", ignorecase);
|
||||
strmid(str2, str, 0, pos);
|
||||
if(!strcmp(str2, key, ignorecase, strlen(key)+1))
|
||||
{
|
||||
strmid(str3, str, pos+1, strlen(str));
|
||||
mRemoveNewLine(str3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(mfile);
|
||||
return str3;
|
||||
}
|
||||
|
||||
stock mGetInt(const file[], const key[], bool:ignorecase=false)
|
||||
return strval(mGetString(file, key, ignorecase));
|
||||
|
||||
stock mGetFloat(const file[], const key[], &Float:value, bool:ignorecase=false)
|
||||
value = floatstr(mGetString(file, key, ignorecase));
|
||||
|
||||
stock mSetString(const file[], const key[], const new_value[])
|
||||
{
|
||||
//Create file if not exists
|
||||
if(!fexist(file))
|
||||
{
|
||||
new File:created = fopen(file, io_write);
|
||||
fclose(created);
|
||||
}
|
||||
new //Variables
|
||||
str[MAX_LINE_SIZE],
|
||||
str2[MAX_KEY_SIZE],
|
||||
str3[MAX_LINE_SIZE],
|
||||
bool:lFinded = false;
|
||||
//Open file
|
||||
new File:mfile = fopen(file, io_read);
|
||||
//Create cache file
|
||||
new File:tmpfile = fopen(TMP_FILE, io_write);
|
||||
fclose(tmpfile);
|
||||
//Open cache file
|
||||
tmpfile = fopen(TMP_FILE, io_append);
|
||||
format(str3, sizeof str3, "%s=%s\n", key, new_value);
|
||||
while(fread(mfile, str))
|
||||
{
|
||||
strmid(str2, str, 0, strfind(str, "="));
|
||||
if(!strcmp(str2, key))
|
||||
{
|
||||
fwrite(tmpfile, str3);
|
||||
lFinded = true;
|
||||
}
|
||||
else
|
||||
fwrite(tmpfile, str);
|
||||
}
|
||||
if(!lFinded) //if line not found
|
||||
fwrite(tmpfile, str3);
|
||||
//Close and remove old file
|
||||
fclose(mfile);
|
||||
fremove(file);
|
||||
//Close cache file and rename it
|
||||
fclose(tmpfile);
|
||||
frename(TMP_FILE, file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock mSetInt(const file[], const key[], new_value)
|
||||
{
|
||||
new str[MAX_VALUE_SIZE];
|
||||
valstr(str, new_value);
|
||||
mSetString(file, key, str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock mSetFloat(const file[], const key[], Float:new_value)
|
||||
{
|
||||
new str[MAX_VALUE_SIZE];
|
||||
format(str, sizeof str, "%f", new_value);
|
||||
return mSetString(file, key, str);
|
||||
}
|
||||
|
||||
stock bool:mIsSet(const file[], const key[], bool:ignorecase=false)
|
||||
{
|
||||
//If fexists return false
|
||||
if(!fexist(file)) return false;
|
||||
new //Variables
|
||||
File:mfile = fopen(file, io_read), //Open file
|
||||
str[MAX_LINE_SIZE],
|
||||
str2[MAX_KEY_SIZE],
|
||||
bool:finded = false;
|
||||
//Find key in file
|
||||
while(fread(mfile, str))
|
||||
{
|
||||
strmid(str2, str, 0, strfind(str, "="));
|
||||
if(!strcmp(str2, key, ignorecase, strlen(key)+1))
|
||||
{
|
||||
finded = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(mfile);
|
||||
return finded;
|
||||
}
|
||||
|
||||
stock mUnSet(const file[], const key[])
|
||||
{
|
||||
if(!fexist(file)) return 0;
|
||||
new //Variables
|
||||
str[MAX_LINE_SIZE],
|
||||
str2[MAX_KEY_SIZE];
|
||||
//Open file
|
||||
new File:mfile = fopen(file, io_read);
|
||||
//Create cache file
|
||||
new File:tmpfile = fopen(TMP_FILE, io_write);
|
||||
fclose(tmpfile);
|
||||
//Open cache file
|
||||
tmpfile = fopen(TMP_FILE, io_append);
|
||||
while(fread(mfile, str))
|
||||
{
|
||||
strmid(str2, str, 0, strfind(str, "="));
|
||||
if(strcmp(str2, key) != 0)
|
||||
fwrite(tmpfile, str);
|
||||
}
|
||||
//Close and remove old file
|
||||
fclose(mfile);
|
||||
fremove(file);
|
||||
//Close cache file and rename it
|
||||
fclose(tmpfile);
|
||||
frename(TMP_FILE, file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
stock bool:mIsFileEmpty(const file[])
|
||||
{
|
||||
if(!fexist(file)) return true;
|
||||
new File:mfile = fopen(file, io_read);
|
||||
if(flength(mfile) <= 1)
|
||||
{
|
||||
fclose(mfile);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
fclose(mfile);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
633
samples/SourcePawn/y_testing.inc
Normal file
633
samples/SourcePawn/y_testing.inc
Normal file
@@ -0,0 +1,633 @@
|
||||
/**--------------------------------------------------------------------------**\
|
||||
====================================
|
||||
y_testing - Run unit tests easilly
|
||||
====================================
|
||||
Description:
|
||||
Runs any functions named as tests when the Testing_Run function is called.
|
||||
Legal:
|
||||
Version: MPL 1.1
|
||||
|
||||
The contents of this file are subject to the Mozilla Public License Version
|
||||
1.1 (the "License"); you may not use this file except in compliance with
|
||||
the License. You may obtain a copy of the License at
|
||||
http://www.mozilla.org/MPL/
|
||||
|
||||
Software distributed under the License is distributed on an "AS IS" basis,
|
||||
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
for the specific language governing rights and limitations under the
|
||||
License.
|
||||
|
||||
The Original Code is the YSI testing include.
|
||||
|
||||
The Initial Developer of the Original Code is Alex "Y_Less" Cole.
|
||||
Portions created by the Initial Developer are Copyright (C) 2011
|
||||
the Initial Developer. All Rights Reserved.
|
||||
|
||||
Contributors:
|
||||
ZeeX, koolk, JoeBullet/Google63, g_aSlice/Slice
|
||||
|
||||
Thanks:
|
||||
JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
|
||||
ZeeX - Very productive conversations.
|
||||
koolk - IsPlayerinAreaEx code.
|
||||
TheAlpha - Danish translation.
|
||||
breadfish - German translation.
|
||||
Fireburn - Dutch translation.
|
||||
yom - French translation.
|
||||
50p - Polish translation.
|
||||
Zamaroht - Spanish translation.
|
||||
Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes
|
||||
for me to strive to better.
|
||||
Pixels^ - Running XScripters where the idea was born.
|
||||
Matite - Pestering me to release it and using it.
|
||||
|
||||
Very special thanks to:
|
||||
Thiadmer - PAWN, whose limits continue to amaze me!
|
||||
Kye/Kalcor - SA:MP.
|
||||
SA:MP Team past, present and future - SA:MP.
|
||||
|
||||
Version:
|
||||
1.0
|
||||
Changelog:
|
||||
16/02/12:
|
||||
Added better error reporting (less verbose passes).
|
||||
Removed "Tests:".
|
||||
Added player requiring tests.
|
||||
25/10/10:
|
||||
Integrated in to YSI.
|
||||
06/08/10:
|
||||
First version
|
||||
</remarks>
|
||||
\**--------------------------------------------------------------------------**/
|
||||
|
||||
/*#if defined _inc_a_samp || defined _samp_included || defined _inc_y_version
|
||||
#error y_testing must be the VERY FIRST include in your mode if being used.
|
||||
#endif
|
||||
|
||||
// Now we redefined "native" to do something clever!
|
||||
// "IsPlayerAttachedObjectSlotUsed" is an issue for us...
|
||||
|
||||
// "y_renative" allows native functions to be declared without constantly trying
|
||||
// to redefine it.
|
||||
#include "internal\y_renative"
|
||||
|
||||
#define native%0(%1); _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0@|||%1|||%0>_YSI_RE_STOCK<%0|||%1|||_:%0@>
|
||||
|
||||
//stock%0(%1){printf(_:_YSI_NO_SQUARE:"native "#%0" called");return _:%0@(%1);}
|
||||
|
||||
#define _YSI_RE_STOCK<%0|||%1|||%2> stock%0(%1){print(_:_YSI_NO_SQUARE:"native "#%0" called");return %2(%1);}
|
||||
|
||||
#define _YSI_NO_SQUARE:%0);%1(%2[%3]%4);} _YSI_NO_SQUARE:%0);%1(%2%4);}
|
||||
|
||||
//#define _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0:%1|||%2|||%3:%4>%5{%6;%7:%8:%9} _YSI_RE_NATIVE<%1|||%2|||%4>%5{%6;return%8:%9}
|
||||
#define _YSI_NO_TAG_NATIVE:_YSI_RE_NATIVE<%0:%1|||%2|||%3:%4>_YSI_RE_STOCK<%5:%6|||%7|||_:%8:%9> _YSI_RE_NATIVE<%1|||%2|||%4>_YSI_RE_STOCK<%5:%6|||%7|||%8:%9>*/
|
||||
|
||||
#include <a_samp>
|
||||
|
||||
#if defined YSI_TESTS
|
||||
#if defined INCLUDE_TESTS
|
||||
#error Incompatible testing options (YSI_TESTS + INCLUDE_TESTS)
|
||||
#endif
|
||||
#if !defined RUN_TESTS
|
||||
#define RUN_TESTS
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined INCLUDE_TESTS
|
||||
#define RUN_TESTS
|
||||
#define Debug_PrintT va_printf
|
||||
#elseif defined RUN_TESTS
|
||||
#define _AUTO_RUN_TESTS
|
||||
#define Debug_PrintT va_printf
|
||||
#else
|
||||
#if _DEBUG > 0 || defined _YSI_SPECIAL_DEBUG
|
||||
#define RUN_TESTS
|
||||
#define _AUTO_RUN_TESTS
|
||||
//#if defined _YSI_SPECIAL_DEBUG
|
||||
// #define TP printf
|
||||
// //#define TC(%0); %0
|
||||
#define Debug_PrintT va_printf
|
||||
//#else
|
||||
// //#define TP P:0
|
||||
// //#define TC C:0
|
||||
//#endif
|
||||
#else
|
||||
#define Debug_PrintT(%0);
|
||||
// #define Tests:%1() stock bool:Tests_@%1()
|
||||
// #define Test:%1() stock bool:Test_@%1()
|
||||
// #define TestInit:%1() stock Init_@%1()
|
||||
// #define TestClose:%1() stock Shut_@%1()
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define Y_TESTING_DIALOG_ID (0x7974) // "yt"
|
||||
|
||||
#define TEST_TRUE(%0) Testing_Test(!!%0)
|
||||
#define TEST_FALSE(%0) Testing_Test(!%0)
|
||||
#define TEST_NULL(%0) Testing_Test(0 == %0)
|
||||
#define TEST_NOT_NULL(%0) Testing_Test(0 != %0)
|
||||
#define TEST_N(%0,%1) Testing_Test(%1 == %0)
|
||||
|
||||
#define TEST_TRUE_EX(%0,%2) Testing_Test(bool:(%0), (%2))
|
||||
#define TEST_FALSE_EX(%0,%2) Testing_Test(!(%0), (%2))
|
||||
#define TEST_NULL_EX(%0,%2) Testing_Test((%0) == 0, (%2))
|
||||
#define TEST_N_EX(%0,%1,%2) Testing_Test((%0) == (%1), (%2))
|
||||
|
||||
#define TEST_MSG "\2\2\2\2\2"
|
||||
#define TEST_FAILED "FAIL:"
|
||||
#define TEST_PASSED "PASS!"
|
||||
//#define TEST_FAILED "*** Test Failed:"
|
||||
//#define TEST_PASSED "*** Test Passed:"
|
||||
|
||||
#define _Y_TESTEQ(%0) "\"%0\"")
|
||||
#define _Y_TESTDQ:_Y_TESTEQ(%0"%1"%2) _Y_TESTDQ:_Y_TESTEQ(%0\x22;%1\x22;%2)
|
||||
//#define _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)%1) _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\x29;%1)
|
||||
#define _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)%1) _Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\x29;%1)
|
||||
#define _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0(%1) _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0\x28;%1)
|
||||
|
||||
#define ASSERT(%0) Testing_Test(%0,TEST_MSG" %s", _Y_TESTOB:_Y_TESTCB:_Y_TESTDQ:_Y_TESTEQ(%0)
|
||||
#define ASSERT_TRUE(%0) ASSERT(!!%0) //Testing_Test(!!%0,__name)
|
||||
#define ASSERT_FALSE(%0) ASSERT(!%0) //Testing_Test(!%0,__name)
|
||||
#define ASSERT_NULL(%0) ASSERT(0 == %0) //Testing_Test(0==%0,__name)
|
||||
#define ASSERT_N:%1(%0) ASSERT(%1 == %0) //Testing_Test(%1==%0,__name)
|
||||
|
||||
#define ASK(%0) Testing_Ask(playerid,%0)
|
||||
|
||||
static stock
|
||||
YSI_g_sFailMessage[512],
|
||||
YSI_g_sPlayer = cellmax,
|
||||
bool:YSI_g_sAsked,
|
||||
YSI_g_sTests,
|
||||
YSI_g_sFails;
|
||||
|
||||
#if defined RUN_TESTS
|
||||
#define Test:%1() forward bool:Tezt_@%1(); public bool:Tezt_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
#define TestInit:%1() forward Init_@%1(); public Init_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
#define TestClose:%1() forward Shut_@%1(); public Shut_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
|
||||
#define PTest:%1(%2) forward bool:Tezp_@%1(%2); public bool:Tezp_@%1(%2) for(new string:__name[]=#%1,bool:__once=(printf("*** Player Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
#define PTestInit:%1(%2) forward Inip_@%1(%2); public Inip_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
#define PTestClose:%1(%2) forward Shup_@%1(%2); public Shup_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
#else
|
||||
#define Test:%1() stock bool:Test_@%1()
|
||||
#define TestInit:%1() stock Init_@%1()
|
||||
#define TestClose:%1() stock Shut_@%1()
|
||||
|
||||
#define PTest:%1(%2) stock bool:Test_@%1(%2)
|
||||
#define PTestInit:%1(%2) stock Init_@%1(%2)
|
||||
#define PTestClose:%1(%2) stock Shut_@%1(%2)
|
||||
#endif
|
||||
|
||||
// These all need to come AFTER the types are defined in case the have tests.
|
||||
#include "internal\y_version"
|
||||
|
||||
#include "y_amx"
|
||||
#include "internal\y_shortfunc"
|
||||
#include "y_debug"
|
||||
|
||||
#include "internal\y_natives"
|
||||
|
||||
#include "y_va"
|
||||
|
||||
/**--------------------------------------------------------------------------**\
|
||||
<summary>Testing_Ask</summary>
|
||||
<param name="playerid">Player to ask a question to.</param>
|
||||
<param name="str[]">What to ask.</param>
|
||||
<param name="va_args<>">Additional data.</param>
|
||||
<returns>
|
||||
-
|
||||
</returns>
|
||||
<remarks>
|
||||
Calls a dialog to ask the player if the given test actually passed.
|
||||
</remarks>
|
||||
\**--------------------------------------------------------------------------**/
|
||||
|
||||
stock Testing_Ask(playerid, str[] = "", va_args<>)
|
||||
{
|
||||
va_format(YSI_g_sFailMessage, sizeof (YSI_g_sFailMessage), str, va_start<2>);
|
||||
ShowPlayerDialog(playerid, Y_TESTING_DIALOG_ID, DIALOG_STYLE_MSGBOX, "Did the test pass?", YSI_g_sFailMessage, "Yes", "No");
|
||||
YSI_g_sAsked = true;
|
||||
}
|
||||
|
||||
stock Testing_Test(bool:x, str[] = "", va_args<>)
|
||||
{
|
||||
P:3("Testing_Test called: %i, \"%s\"", x, str);
|
||||
++YSI_g_sTests;
|
||||
if (!x)
|
||||
{
|
||||
++YSI_g_sFails;
|
||||
if (numargs() == 2)
|
||||
{
|
||||
P:T(TEST_FAILED " %s", va_start<1>);
|
||||
//printf("*** Test failed: %s", str);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (str[0] == '\2')
|
||||
{
|
||||
strunpack(str, !TEST_FAILED, 6);
|
||||
str[5] = ' ';
|
||||
}
|
||||
P:T(str, va_start<2>);
|
||||
}
|
||||
}
|
||||
#if defined TEST_SHOW_PASSES
|
||||
else /*if (numargs() == 2)
|
||||
{
|
||||
P:T(TEST_PASSED " %s", va_start<1>);
|
||||
}
|
||||
else
|
||||
{
|
||||
P:T(str, va_start<2>);
|
||||
if (str[0] == '\2')
|
||||
{
|
||||
strunpack(str, !TEST_PASSED, 17);
|
||||
str[16] = ' ';
|
||||
}
|
||||
printf(str);
|
||||
P:T(str, va_start<2>);*/
|
||||
{
|
||||
P:T(TEST_PASSED, va_start<2>);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**--------------------------------------------------------------------------**\
|
||||
<summary>Testing_Run</summary>
|
||||
<param name="&tests">Number of tests run.</param>
|
||||
<param name="&fails">Number of tests which failed.</param>
|
||||
<param name="buffer[33]">The name of the first test which failed.</param>
|
||||
<returns>
|
||||
Wether all tests were sucessful or not.
|
||||
</returns>
|
||||
<remarks>
|
||||
-
|
||||
|
||||
native Testing_Run(&tests, &fails, buffer[33] = "");
|
||||
|
||||
</remarks>
|
||||
\**--------------------------------------------------------------------------**/
|
||||
|
||||
stock bool:Testing_Run(&tests, &fails, lastfail[33] = "", bool:p = false)
|
||||
{
|
||||
P:3("bool:Testing_Run called: %i, %i, \"%s\", %i", tests, fails, lastfail, p);
|
||||
#pragma unused p, lastfail
|
||||
#if defined RUN_TESTS
|
||||
P:2("Testing_Run() called");
|
||||
new
|
||||
idx,
|
||||
buffer[32];
|
||||
while ((idx = AMX_GetPublicName(idx, buffer, "Tezt_@")))
|
||||
{
|
||||
strunpack(buffer, buffer);
|
||||
//++YSI_g_sTests;
|
||||
// Call the setup function if there is one.
|
||||
buffer[0] = 'I';
|
||||
buffer[1] = 'n';
|
||||
buffer[2] = 'i';
|
||||
buffer[3] = 't';
|
||||
CallLocalFunction(buffer, "");
|
||||
// Call the test.
|
||||
buffer[0] = 'T';
|
||||
buffer[1] = 'e';
|
||||
buffer[2] = 'z';
|
||||
buffer[3] = 't';
|
||||
fails = YSI_g_sFails;
|
||||
P:5("Testing_Run(): Calling %s", buffer[6]);
|
||||
CallLocalFunction(buffer, "");
|
||||
#if !defined TEST_SHOW_PASSES
|
||||
if (YSI_g_sFails == fails)
|
||||
{
|
||||
printf(TEST_PASSED);
|
||||
printf(" ");
|
||||
}
|
||||
#endif
|
||||
/*if (YSI_g_sFails != fails)
|
||||
{
|
||||
if (YSI_g_sFails)
|
||||
{
|
||||
++YSI_g_sFails;
|
||||
}
|
||||
else
|
||||
{
|
||||
fails = 0;
|
||||
// Copy the string over.
|
||||
while ((lastfail[fails] = buffer[fails + 6])) ++fails;
|
||||
YSI_g_sFails = 1;
|
||||
}
|
||||
//C:1(if (p) printf("*** Test failed: %s", buffer[fails + 6]););
|
||||
}*/
|
||||
// Call the shutdown function if there is one.
|
||||
buffer[0] = 'S';
|
||||
buffer[1] = 'h';
|
||||
buffer[2] = 'u';
|
||||
buffer[3] = 't';
|
||||
CallLocalFunction(buffer, "");
|
||||
}
|
||||
tests = YSI_g_sTests;
|
||||
fails = YSI_g_sFails;
|
||||
return fails == 0;
|
||||
#else
|
||||
#pragma unused tests, fails, lastfail
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**--------------------------------------------------------------------------**\
|
||||
<summary>Testing_Player</summary>
|
||||
<param name="playerid">Player to test on.</param>
|
||||
<param name="&idx">Next test to run.</param>
|
||||
<param name="&tests">Number of tests run.</param>
|
||||
<param name="&fails">Number of tests which failed.</param>
|
||||
<param name="buffer[33]">The name of the first test which failed.</param>
|
||||
<returns>
|
||||
Wether all tests were sucessful or not.
|
||||
</returns>
|
||||
<remarks>
|
||||
-
|
||||
|
||||
native Testing_Run(&tests, &fails, buffer[33] = "");
|
||||
|
||||
</remarks>
|
||||
\**--------------------------------------------------------------------------**/
|
||||
|
||||
stock bool:Testing_Player(playerid, &idx, &tests, &fails, lastfail[33] = "", bool:p = false)
|
||||
{
|
||||
P:3("bool:Testing_Player called: %i, %i, %i, %i, \"%s\", %i", playerid, idx, tests, fails, lastfail, p);
|
||||
#pragma unused p
|
||||
#if defined RUN_TESTS
|
||||
P:2("Testing_Player() called");
|
||||
new
|
||||
//idx,
|
||||
buffer[32];
|
||||
//while ((idx = AMX_GetPublicName(idx, buffer, "Tezt_@")))
|
||||
if ((idx = AMX_GetPublicName(idx, buffer, "Tezp_@")))
|
||||
{
|
||||
strunpack(buffer, buffer);
|
||||
//++YSI_g_sTests;
|
||||
// Call the setup function if there is one.
|
||||
buffer[0] = 'I';
|
||||
buffer[1] = 'n';
|
||||
buffer[2] = 'i';
|
||||
buffer[3] = 'p';
|
||||
CallLocalFunction(buffer, "");
|
||||
// Call the test.
|
||||
buffer[0] = 'T';
|
||||
buffer[1] = 'e';
|
||||
buffer[2] = 'z';
|
||||
buffer[3] = 'p';
|
||||
fails = YSI_g_sFails;
|
||||
P:5("Testing_Player(): Calling %s", buffer[6]);
|
||||
CallLocalFunction(buffer, "");
|
||||
#if !defined TEST_SHOW_PASSES
|
||||
if (YSI_g_sFails == fails)
|
||||
{
|
||||
printf(TEST_PASSED);
|
||||
printf(" ");
|
||||
}
|
||||
#endif
|
||||
/*if (YSI_g_sFails != fails)
|
||||
{
|
||||
if (YSI_g_sFails)
|
||||
{
|
||||
++YSI_g_sFails;
|
||||
}
|
||||
else
|
||||
{
|
||||
fails = 0;
|
||||
// Copy the string over.
|
||||
while ((lastfail[fails] = buffer[fails + 6])) ++fails;
|
||||
YSI_g_sFails = 1;
|
||||
}
|
||||
//C:1(if (p) printf("*** Test failed: %s", buffer[fails + 6]););
|
||||
}*/
|
||||
// Call the shutdown function if there is one.
|
||||
//buffer[0] = 'S';
|
||||
//buffer[1] = 'h';
|
||||
//buffer[2] = 'u';
|
||||
//buffer[3] = 'p';
|
||||
//CallLocalFunction(buffer, "");
|
||||
}
|
||||
tests = YSI_g_sTests;
|
||||
fails = YSI_g_sFails;
|
||||
return fails == 0;
|
||||
#else
|
||||
#pragma unused tests, fails, lastfail
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined RUN_TESTS
|
||||
/*#define Test:%1() forward bool:Tezt_@%1(); public bool:Tezt_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
#define TestInit:%1() forward Init_@%1(); public Init_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
#define TestClose:%1() forward Shut_@%1(); public Shut_@%1() for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
|
||||
#define PTest:%1(%2) forward bool:Tezp_@%1(%2); public bool:Tezp_@%1(%2) for(new string:__name[]=#%1,bool:__once=(printf("*** Player Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
//#define Tests:%1() forward bool:Test_@%1(); public bool:Test_@%1() for(new string:__name[]=#%1,bool:__once=(printf("*** Test %s start", __name) || TRUE);__once;__once=(printf(" ") && FALSE))
|
||||
#define PTestInit:%1(%2) forward Inip_@%1(%2); public Inip_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))
|
||||
#define PTestClose:%1(%2) forward Shup_@%1(%2); public Shup_@%1(%2) for(new string:__name[]=#%1,bool:__once=TRUE;__once;__once=(printf(" ", __name) && FALSE))*/
|
||||
|
||||
#if defined _AUTO_RUN_TESTS
|
||||
#if !defined FILTERSCRIPT
|
||||
// Hook main in gamemodes.
|
||||
main()
|
||||
{
|
||||
// Disable error messages (as we're likely to generate them).
|
||||
state ysi_debug : off;
|
||||
CallLocalFunction("Testing_main", "");
|
||||
new
|
||||
tests,
|
||||
fails;
|
||||
printf(" ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" || STARTING TESTS... || ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" ");
|
||||
Testing_Run(tests, fails, _, true);
|
||||
printf("*** Tests: %d, Fails: %d", tests, fails);
|
||||
if (!fails)
|
||||
{
|
||||
printf(" ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" || ALL TESTS PASSED! || ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" ");
|
||||
}
|
||||
state ysi_debug : on;
|
||||
}
|
||||
|
||||
#define main forward Testing_main(); public Testing_main
|
||||
|
||||
Testing_Next(playerid)
|
||||
{
|
||||
new
|
||||
buffer[32];
|
||||
for ( ; ; )
|
||||
{
|
||||
new
|
||||
fails = YSI_g_sFails;
|
||||
// Get the last test (nicely fails for cellmax).
|
||||
if ((YSI_g_sPlayer = AMX_GetPublicName(YSI_g_sPlayer, buffer, "Tezp_@")))
|
||||
{
|
||||
strunpack(buffer, buffer);
|
||||
// Call the shutdown function if there is one.
|
||||
buffer[0] = 'S';
|
||||
buffer[1] = 'h';
|
||||
buffer[2] = 'u';
|
||||
buffer[3] = 'p';
|
||||
CallLocalFunction(buffer, "i", playerid);
|
||||
}
|
||||
// Get the new test, but don't store the index.
|
||||
if (AMX_GetPublicName(YSI_g_sPlayer, buffer, "Tezp_@"))
|
||||
{
|
||||
YSI_g_sAsked = false;
|
||||
//++YSI_g_sTests;
|
||||
strunpack(buffer, buffer);
|
||||
// Call the setup function if there is one.
|
||||
buffer[0] = 'I';
|
||||
buffer[1] = 'n';
|
||||
buffer[2] = 'i';
|
||||
buffer[3] = 'p';
|
||||
CallLocalFunction(buffer, "i", playerid);
|
||||
// Call the test.
|
||||
buffer[0] = 'T';
|
||||
buffer[1] = 'e';
|
||||
buffer[2] = 'z';
|
||||
buffer[3] = 'p';
|
||||
P:5("Testing_Next(): Calling %s", buffer[6]);
|
||||
CallLocalFunction(buffer, "i", playerid);
|
||||
}
|
||||
else
|
||||
{
|
||||
YSI_g_sAsked = true;
|
||||
// No more tests.
|
||||
printf("*** Tests: %d, Fails: %d", YSI_g_sTests, YSI_g_sFails);
|
||||
if (!YSI_g_sFails)
|
||||
{
|
||||
printf(" ");
|
||||
printf(" ||==========================|| ");
|
||||
printf(" || ALL PLAYER TESTS PASSED! || ");
|
||||
printf(" ||==========================|| ");
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
// If the test needs a player but doesn't ask them anything
|
||||
// then we can't wait for "OnDialogResponse" to run the next
|
||||
// one.
|
||||
if (YSI_g_sAsked)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if (fails == YSI_g_sFails)
|
||||
{
|
||||
printf(TEST_PASSED);
|
||||
}
|
||||
}
|
||||
//while (!YSI_g_sAsked);
|
||||
}
|
||||
|
||||
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
|
||||
{
|
||||
if (dialogid == Y_TESTING_DIALOG_ID)
|
||||
{
|
||||
++YSI_g_sTests;
|
||||
if (response)
|
||||
{
|
||||
// Pass.
|
||||
printf(TEST_PASSED);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fail.
|
||||
printf(TEST_FAILED " %s", YSI_g_sFailMessage);
|
||||
++YSI_g_sFails;
|
||||
}
|
||||
Testing_Next(playerid);
|
||||
return 1;
|
||||
}
|
||||
#if defined Testing_OnDialogResponse
|
||||
return Testing_OnDialogResponse(playerid, dialogid, response, listitem, inputtext);
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined _ALS_OnDialogResponse
|
||||
#undef OnDialogResponse
|
||||
#else
|
||||
#define _ALS_OnDialogResponse
|
||||
#endif
|
||||
#define OnDialogResponse Testing_OnDialogResponse
|
||||
#if defined Testing_OnDialogResponse
|
||||
forward Testing_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]);
|
||||
#endif
|
||||
|
||||
public OnPlayerSpawn(playerid)
|
||||
{
|
||||
if (YSI_g_sPlayer == cellmax && !IsPlayerNPC(playerid))
|
||||
{
|
||||
printf(" ");
|
||||
printf(" ||==========================|| ");
|
||||
printf(" || STARTING PLAYER TESTS... || ");
|
||||
printf(" ||==========================|| ");
|
||||
printf(" ");
|
||||
YSI_g_sTests = 0;
|
||||
YSI_g_sFails = 0;
|
||||
Testing_Next(playerid);
|
||||
}
|
||||
#if defined Testing_OnPlayerSpawn
|
||||
return Testing_OnPlayerSpawn(playerid);
|
||||
#else
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined _ALS_OnPlayerSpawn
|
||||
#undef OnPlayerSpawn
|
||||
#else
|
||||
#define _ALS_OnPlayerSpawn
|
||||
#endif
|
||||
#define OnPlayerSpawn Testing_OnPlayerSpawn
|
||||
#if defined Testing_OnPlayerSpawn
|
||||
forward Testing_OnPlayerSpawn(playerid);
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
Testing_RunAll()
|
||||
{
|
||||
// Disable error messages (as we're likely to generate them).
|
||||
state ysi_debug : off;
|
||||
new
|
||||
tests,
|
||||
fails;
|
||||
printf(" ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" || STARTING TESTS... || ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" ");
|
||||
Testing_Run(tests, fails, _, true);
|
||||
printf("*** Tests: %d, Fails: %d", tests, fails);
|
||||
if (!fails)
|
||||
{
|
||||
printf(" ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" || ALL TESTS PASSED! || ");
|
||||
printf(" ||===================|| ");
|
||||
printf(" ");
|
||||
}
|
||||
state ysi_debug : on;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
//#define Tests:%1() stock bool:Tests_@%1()
|
||||
/*#define Test:%1() stock bool:Test_@%1()
|
||||
#define TestInit:%1() stock Init_@%1()
|
||||
#define TestClose:%1() stock Shut_@%1()
|
||||
|
||||
#define PTest:%1(%2) stock bool:Test_@%1(%2)
|
||||
#define PTestInit:%1(%2) stock Init_@%1(%2)
|
||||
#define PTestClose:%1(%2) stock Shut_@%1(%2)*/
|
||||
#endif
|
||||
Reference in New Issue
Block a user