mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			504 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			504 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
 | 
						|
; flat assembler interface for Win32
 | 
						|
; Copyright (c) 1999-2014, Tomasz Grysztar.
 | 
						|
; All rights reserved.
 | 
						|
 | 
						|
CREATE_NEW	       = 1
 | 
						|
CREATE_ALWAYS	       = 2
 | 
						|
OPEN_EXISTING	       = 3
 | 
						|
OPEN_ALWAYS	       = 4
 | 
						|
TRUNCATE_EXISTING      = 5
 | 
						|
 | 
						|
FILE_SHARE_READ        = 1
 | 
						|
FILE_SHARE_WRITE       = 2
 | 
						|
FILE_SHARE_DELETE      = 4
 | 
						|
 | 
						|
GENERIC_READ	       = 80000000h
 | 
						|
GENERIC_WRITE	       = 40000000h
 | 
						|
 | 
						|
STD_INPUT_HANDLE       = 0FFFFFFF6h
 | 
						|
STD_OUTPUT_HANDLE      = 0FFFFFFF5h
 | 
						|
STD_ERROR_HANDLE       = 0FFFFFFF4h
 | 
						|
 | 
						|
MEM_COMMIT	       = 1000h
 | 
						|
MEM_RESERVE	       = 2000h
 | 
						|
MEM_DECOMMIT	       = 4000h
 | 
						|
MEM_RELEASE	       = 8000h
 | 
						|
MEM_FREE	       = 10000h
 | 
						|
MEM_PRIVATE	       = 20000h
 | 
						|
MEM_MAPPED	       = 40000h
 | 
						|
MEM_RESET	       = 80000h
 | 
						|
MEM_TOP_DOWN	       = 100000h
 | 
						|
 | 
						|
PAGE_NOACCESS	       = 1
 | 
						|
PAGE_READONLY	       = 2
 | 
						|
PAGE_READWRITE	       = 4
 | 
						|
PAGE_WRITECOPY	       = 8
 | 
						|
PAGE_EXECUTE	       = 10h
 | 
						|
PAGE_EXECUTE_READ      = 20h
 | 
						|
PAGE_EXECUTE_READWRITE = 40h
 | 
						|
PAGE_EXECUTE_WRITECOPY = 80h
 | 
						|
PAGE_GUARD	       = 100h
 | 
						|
PAGE_NOCACHE	       = 200h
 | 
						|
 | 
						|
init_memory:
 | 
						|
	xor	eax,eax
 | 
						|
	mov	[memory_start],eax
 | 
						|
	mov	eax,esp
 | 
						|
	and	eax,not 0FFFh
 | 
						|
	add	eax,1000h-10000h
 | 
						|
	mov	[stack_limit],eax
 | 
						|
	mov	eax,[memory_setting]
 | 
						|
	shl	eax,10
 | 
						|
	jnz	allocate_memory
 | 
						|
	push	buffer
 | 
						|
	call	[GlobalMemoryStatus]
 | 
						|
	mov	eax,dword [buffer+20]
 | 
						|
	mov	edx,dword [buffer+12]
 | 
						|
	cmp	eax,0
 | 
						|
	jl	large_memory
 | 
						|
	cmp	edx,0
 | 
						|
	jl	large_memory
 | 
						|
	shr	eax,2
 | 
						|
	add	eax,edx
 | 
						|
	jmp	allocate_memory
 | 
						|
    large_memory:
 | 
						|
	mov	eax,80000000h
 | 
						|
    allocate_memory:
 | 
						|
	mov	edx,eax
 | 
						|
	shr	edx,2
 | 
						|
	mov	ecx,eax
 | 
						|
	sub	ecx,edx
 | 
						|
	mov	[memory_end],ecx
 | 
						|
	mov	[additional_memory_end],edx
 | 
						|
	push	PAGE_READWRITE
 | 
						|
	push	MEM_COMMIT
 | 
						|
	push	eax
 | 
						|
	push	0
 | 
						|
	call	[VirtualAlloc]
 | 
						|
	or	eax,eax
 | 
						|
	jz	not_enough_memory
 | 
						|
	mov	[memory_start],eax
 | 
						|
	add	eax,[memory_end]
 | 
						|
	mov	[memory_end],eax
 | 
						|
	mov	[additional_memory],eax
 | 
						|
	add	[additional_memory_end],eax
 | 
						|
	ret
 | 
						|
    not_enough_memory:
 | 
						|
	mov	eax,[additional_memory_end]
 | 
						|
	shl	eax,1
 | 
						|
	cmp	eax,4000h
 | 
						|
	jb	out_of_memory
 | 
						|
	jmp	allocate_memory
 | 
						|
 | 
						|
exit_program:
 | 
						|
	movzx	eax,al
 | 
						|
	push	eax
 | 
						|
	mov	eax,[memory_start]
 | 
						|
	test	eax,eax
 | 
						|
	jz	do_exit
 | 
						|
	push	MEM_RELEASE
 | 
						|
	push	0
 | 
						|
	push	eax
 | 
						|
	call	[VirtualFree]
 | 
						|
    do_exit:
 | 
						|
	call	[ExitProcess]
 | 
						|
 | 
						|
get_environment_variable:
 | 
						|
	mov	ecx,[memory_end]
 | 
						|
	sub	ecx,edi
 | 
						|
	cmp	ecx,4000h
 | 
						|
	jbe	buffer_for_variable_ok
 | 
						|
	mov	ecx,4000h
 | 
						|
    buffer_for_variable_ok:
 | 
						|
	push	ecx
 | 
						|
	push	edi
 | 
						|
	push	esi
 | 
						|
	call	[GetEnvironmentVariable]
 | 
						|
	add	edi,eax
 | 
						|
	cmp	edi,[memory_end]
 | 
						|
	jae	out_of_memory
 | 
						|
	ret
 | 
						|
 | 
						|
open:
 | 
						|
	push	0
 | 
						|
	push	0
 | 
						|
	push	OPEN_EXISTING
 | 
						|
	push	0
 | 
						|
	push	FILE_SHARE_READ
 | 
						|
	push	GENERIC_READ
 | 
						|
	push	edx
 | 
						|
	call	[CreateFile]
 | 
						|
	cmp	eax,-1
 | 
						|
	je	file_error
 | 
						|
	mov	ebx,eax
 | 
						|
	clc
 | 
						|
	ret
 | 
						|
    file_error:
 | 
						|
	stc
 | 
						|
	ret
 | 
						|
create:
 | 
						|
	push	0
 | 
						|
	push	0
 | 
						|
	push	CREATE_ALWAYS
 | 
						|
	push	0
 | 
						|
	push	FILE_SHARE_READ
 | 
						|
	push	GENERIC_WRITE
 | 
						|
	push	edx
 | 
						|
	call	[CreateFile]
 | 
						|
	cmp	eax,-1
 | 
						|
	je	file_error
 | 
						|
	mov	ebx,eax
 | 
						|
	clc
 | 
						|
	ret
 | 
						|
write:
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	ecx
 | 
						|
	push	edx
 | 
						|
	push	ebx
 | 
						|
	call	[WriteFile]
 | 
						|
	or	eax,eax
 | 
						|
	jz	file_error
 | 
						|
	clc
 | 
						|
	ret
 | 
						|
read:
 | 
						|
	mov	ebp,ecx
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	ecx
 | 
						|
	push	edx
 | 
						|
	push	ebx
 | 
						|
	call	[ReadFile]
 | 
						|
	or	eax,eax
 | 
						|
	jz	file_error
 | 
						|
	cmp	ebp,[bytes_count]
 | 
						|
	jne	file_error
 | 
						|
	clc
 | 
						|
	ret
 | 
						|
close:
 | 
						|
	push	ebx
 | 
						|
	call	[CloseHandle]
 | 
						|
	ret
 | 
						|
lseek:
 | 
						|
	movzx	eax,al
 | 
						|
	push	eax
 | 
						|
	push	0
 | 
						|
	push	edx
 | 
						|
	push	ebx
 | 
						|
	call	[SetFilePointer]
 | 
						|
	ret
 | 
						|
 | 
						|
display_string:
 | 
						|
	push	[con_handle]
 | 
						|
	call	[GetStdHandle]
 | 
						|
	mov	ebp,eax
 | 
						|
	mov	edi,esi
 | 
						|
	or	ecx,-1
 | 
						|
	xor	al,al
 | 
						|
	repne	scasb
 | 
						|
	neg	ecx
 | 
						|
	sub	ecx,2
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	ecx
 | 
						|
	push	esi
 | 
						|
	push	ebp
 | 
						|
	call	[WriteFile]
 | 
						|
	ret
 | 
						|
display_character:
 | 
						|
	push	ebx
 | 
						|
	mov	[character],dl
 | 
						|
	push	[con_handle]
 | 
						|
	call	[GetStdHandle]
 | 
						|
	mov	ebx,eax
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	1
 | 
						|
	push	character
 | 
						|
	push	ebx
 | 
						|
	call	[WriteFile]
 | 
						|
	pop	ebx
 | 
						|
	ret
 | 
						|
display_number:
 | 
						|
	push	ebx
 | 
						|
	mov	ecx,1000000000
 | 
						|
	xor	edx,edx
 | 
						|
	xor	bl,bl
 | 
						|
      display_loop:
 | 
						|
	div	ecx
 | 
						|
	push	edx
 | 
						|
	cmp	ecx,1
 | 
						|
	je	display_digit
 | 
						|
	or	bl,bl
 | 
						|
	jnz	display_digit
 | 
						|
	or	al,al
 | 
						|
	jz	digit_ok
 | 
						|
	not	bl
 | 
						|
      display_digit:
 | 
						|
	mov	dl,al
 | 
						|
	add	dl,30h
 | 
						|
	push	ecx
 | 
						|
	call	display_character
 | 
						|
	pop	ecx
 | 
						|
      digit_ok:
 | 
						|
	mov	eax,ecx
 | 
						|
	xor	edx,edx
 | 
						|
	mov	ecx,10
 | 
						|
	div	ecx
 | 
						|
	mov	ecx,eax
 | 
						|
	pop	eax
 | 
						|
	or	ecx,ecx
 | 
						|
	jnz	display_loop
 | 
						|
	pop	ebx
 | 
						|
	ret
 | 
						|
 | 
						|
display_user_messages:
 | 
						|
	mov	[displayed_count],0
 | 
						|
	call	show_display_buffer
 | 
						|
	cmp	[displayed_count],1
 | 
						|
	jb	line_break_ok
 | 
						|
	je	make_line_break
 | 
						|
	mov	ax,word [last_displayed]
 | 
						|
	cmp	ax,0A0Dh
 | 
						|
	je	line_break_ok
 | 
						|
	cmp	ax,0D0Ah
 | 
						|
	je	line_break_ok
 | 
						|
      make_line_break:
 | 
						|
	mov	word [buffer],0A0Dh
 | 
						|
	push	[con_handle]
 | 
						|
	call	[GetStdHandle]
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	2
 | 
						|
	push	buffer
 | 
						|
	push	eax
 | 
						|
	call	[WriteFile]
 | 
						|
      line_break_ok:
 | 
						|
	ret
 | 
						|
display_block:
 | 
						|
	add	[displayed_count],ecx
 | 
						|
	cmp	ecx,1
 | 
						|
	ja	take_last_two_characters
 | 
						|
	jb	block_displayed
 | 
						|
	mov	al,[last_displayed+1]
 | 
						|
	mov	ah,[esi]
 | 
						|
	mov	word [last_displayed],ax
 | 
						|
	jmp	block_ok
 | 
						|
      take_last_two_characters:
 | 
						|
	mov	ax,[esi+ecx-2]
 | 
						|
	mov	word [last_displayed],ax
 | 
						|
      block_ok:
 | 
						|
	push	ecx
 | 
						|
	push	[con_handle]
 | 
						|
	call	[GetStdHandle]
 | 
						|
	pop	ecx
 | 
						|
	push	0
 | 
						|
	push	bytes_count
 | 
						|
	push	ecx
 | 
						|
	push	esi
 | 
						|
	push	eax
 | 
						|
	call	[WriteFile]
 | 
						|
      block_displayed:
 | 
						|
	ret
 | 
						|
 | 
						|
fatal_error:
 | 
						|
	mov	[con_handle],STD_ERROR_HANDLE
 | 
						|
	mov	esi,error_prefix
 | 
						|
	call	display_string
 | 
						|
	pop	esi
 | 
						|
	call	display_string
 | 
						|
	mov	esi,error_suffix
 | 
						|
	call	display_string
 | 
						|
	mov	al,0FFh
 | 
						|
	jmp	exit_program
 | 
						|
assembler_error:
 | 
						|
	mov	[con_handle],STD_ERROR_HANDLE
 | 
						|
	call	display_user_messages
 | 
						|
	push	dword 0
 | 
						|
	mov	ebx,[current_line]
 | 
						|
      get_error_lines:
 | 
						|
	mov	eax,[ebx]
 | 
						|
	cmp	byte [eax],0
 | 
						|
	je	get_next_error_line
 | 
						|
	push	ebx
 | 
						|
	test	byte [ebx+7],80h
 | 
						|
	jz	display_error_line
 | 
						|
	mov	edx,ebx
 | 
						|
      find_definition_origin:
 | 
						|
	mov	edx,[edx+12]
 | 
						|
	test	byte [edx+7],80h
 | 
						|
	jnz	find_definition_origin
 | 
						|
	push	edx
 | 
						|
      get_next_error_line:
 | 
						|
	mov	ebx,[ebx+8]
 | 
						|
	jmp	get_error_lines
 | 
						|
      display_error_line:
 | 
						|
	mov	esi,[ebx]
 | 
						|
	call	display_string
 | 
						|
	mov	esi,line_number_start
 | 
						|
	call	display_string
 | 
						|
	mov	eax,[ebx+4]
 | 
						|
	and	eax,7FFFFFFFh
 | 
						|
	call	display_number
 | 
						|
	mov	dl,']'
 | 
						|
	call	display_character
 | 
						|
	pop	esi
 | 
						|
	cmp	ebx,esi
 | 
						|
	je	line_number_ok
 | 
						|
	mov	dl,20h
 | 
						|
	call	display_character
 | 
						|
	push	esi
 | 
						|
	mov	esi,[esi]
 | 
						|
	movzx	ecx,byte [esi]
 | 
						|
	inc	esi
 | 
						|
	call	display_block
 | 
						|
	mov	esi,line_number_start
 | 
						|
	call	display_string
 | 
						|
	pop	esi
 | 
						|
	mov	eax,[esi+4]
 | 
						|
	and	eax,7FFFFFFFh
 | 
						|
	call	display_number
 | 
						|
	mov	dl,']'
 | 
						|
	call	display_character
 | 
						|
      line_number_ok:
 | 
						|
	mov	esi,line_data_start
 | 
						|
	call	display_string
 | 
						|
	mov	esi,ebx
 | 
						|
	mov	edx,[esi]
 | 
						|
	call	open
 | 
						|
	mov	al,2
 | 
						|
	xor	edx,edx
 | 
						|
	call	lseek
 | 
						|
	mov	edx,[esi+8]
 | 
						|
	sub	eax,edx
 | 
						|
	jz	line_data_displayed
 | 
						|
	push	eax
 | 
						|
	xor	al,al
 | 
						|
	call	lseek
 | 
						|
	mov	ecx,[esp]
 | 
						|
	mov	edx,[additional_memory]
 | 
						|
	lea	eax,[edx+ecx]
 | 
						|
	cmp	eax,[additional_memory_end]
 | 
						|
	ja	out_of_memory
 | 
						|
	call	read
 | 
						|
	call	close
 | 
						|
	pop	ecx
 | 
						|
	mov	esi,[additional_memory]
 | 
						|
      get_line_data:
 | 
						|
	mov	al,[esi]
 | 
						|
	cmp	al,0Ah
 | 
						|
	je	display_line_data
 | 
						|
	cmp	al,0Dh
 | 
						|
	je	display_line_data
 | 
						|
	cmp	al,1Ah
 | 
						|
	je	display_line_data
 | 
						|
	or	al,al
 | 
						|
	jz	display_line_data
 | 
						|
	inc	esi
 | 
						|
	loop	get_line_data
 | 
						|
      display_line_data:
 | 
						|
	mov	ecx,esi
 | 
						|
	mov	esi,[additional_memory]
 | 
						|
	sub	ecx,esi
 | 
						|
	call	display_block
 | 
						|
      line_data_displayed:
 | 
						|
	mov	esi,cr_lf
 | 
						|
	call	display_string
 | 
						|
	pop	ebx
 | 
						|
	or	ebx,ebx
 | 
						|
	jnz	display_error_line
 | 
						|
	mov	esi,error_prefix
 | 
						|
	call	display_string
 | 
						|
	pop	esi
 | 
						|
	call	display_string
 | 
						|
	mov	esi,error_suffix
 | 
						|
	call	display_string
 | 
						|
	mov	al,2
 | 
						|
	jmp	exit_program
 | 
						|
 | 
						|
make_timestamp:
 | 
						|
	push	buffer
 | 
						|
	call	[GetSystemTime]
 | 
						|
	movzx	ecx,word [buffer]
 | 
						|
	mov	eax,ecx
 | 
						|
	sub	eax,1970
 | 
						|
	mov	ebx,365
 | 
						|
	mul	ebx
 | 
						|
	mov	ebp,eax
 | 
						|
	mov	eax,ecx
 | 
						|
	sub	eax,1969
 | 
						|
	shr	eax,2
 | 
						|
	add	ebp,eax
 | 
						|
	mov	eax,ecx
 | 
						|
	sub	eax,1901
 | 
						|
	mov	ebx,100
 | 
						|
	div	ebx
 | 
						|
	sub	ebp,eax
 | 
						|
	mov	eax,ecx
 | 
						|
	xor	edx,edx
 | 
						|
	sub	eax,1601
 | 
						|
	mov	ebx,400
 | 
						|
	div	ebx
 | 
						|
	add	ebp,eax
 | 
						|
	movzx	ecx,word [buffer+2]
 | 
						|
	mov	eax,ecx
 | 
						|
	dec	eax
 | 
						|
	mov	ebx,30
 | 
						|
	mul	ebx
 | 
						|
	add	ebp,eax
 | 
						|
	cmp	ecx,8
 | 
						|
	jbe	months_correction
 | 
						|
	mov	eax,ecx
 | 
						|
	sub	eax,7
 | 
						|
	shr	eax,1
 | 
						|
	add	ebp,eax
 | 
						|
	mov	ecx,8
 | 
						|
      months_correction:
 | 
						|
	mov	eax,ecx
 | 
						|
	shr	eax,1
 | 
						|
	add	ebp,eax
 | 
						|
	cmp	ecx,2
 | 
						|
	jbe	day_correction_ok
 | 
						|
	sub	ebp,2
 | 
						|
	movzx	ecx,word [buffer]
 | 
						|
	test	ecx,11b
 | 
						|
	jnz	day_correction_ok
 | 
						|
	xor	edx,edx
 | 
						|
	mov	eax,ecx
 | 
						|
	mov	ebx,100
 | 
						|
	div	ebx
 | 
						|
	or	edx,edx
 | 
						|
	jnz	day_correction
 | 
						|
	mov	eax,ecx
 | 
						|
	mov	ebx,400
 | 
						|
	div	ebx
 | 
						|
	or	edx,edx
 | 
						|
	jnz	day_correction_ok
 | 
						|
      day_correction:
 | 
						|
	inc	ebp
 | 
						|
      day_correction_ok:
 | 
						|
	movzx	eax,word [buffer+6]
 | 
						|
	dec	eax
 | 
						|
	add	eax,ebp
 | 
						|
	mov	ebx,24
 | 
						|
	mul	ebx
 | 
						|
	movzx	ecx,word [buffer+8]
 | 
						|
	add	eax,ecx
 | 
						|
	mov	ebx,60
 | 
						|
	mul	ebx
 | 
						|
	movzx	ecx,word [buffer+10]
 | 
						|
	add	eax,ecx
 | 
						|
	mov	ebx,60
 | 
						|
	mul	ebx
 | 
						|
	movzx	ecx,word [buffer+12]
 | 
						|
	add	eax,ecx
 | 
						|
	adc	edx,0
 | 
						|
	ret
 | 
						|
 | 
						|
error_prefix db 'error: ',0
 | 
						|
error_suffix db '.'
 | 
						|
cr_lf db 0Dh,0Ah,0
 | 
						|
line_number_start db ' [',0
 | 
						|
line_data_start db ':',0Dh,0Ah,0
 |