;Copyright (C) 1999 Dmitry Bakhvalov
;
;$Id: strings.asm,v 1.3 2000/04/07 18:36:01 konst Exp $
;
;hackers' strings
;
;0.01: 18-Oct-1999 initial release
;0.02: 19-Oct-1999 size optimizations
;
;syntax: strings [option] [file, file, file...]
; The only supported option by now is -n.
; See strings manpage to find out more about this cool option :)
;
; If no file is given stdin is used.
;
; returns -1 on error, 0 on success
;
; If someone really feels like he needs more of the original GNU strings'
; options - just ask me or better yet add 'em yourself :)
;
; Send me any feedback,suggestions,additional code, etc.
;
%include "system.inc"
CODESEG
START:
pop eax ; get argc
dec eax
jz set_filehandle ; read from stdin (eax=0)
pop eax ; get argv[0]
get_next_arg:
pop ebx
test ebx,ebx
jz near no_more_args
cmp word [ebx],"-n"
jnz just_open_it
pop esi
call ascii_to_bin
mov [n],eax
jmp get_next_arg
just_open_it:
sys_open EMPTY,O_RDONLY
test eax,eax
js near error
set_filehandle:
mov ebp,eax
read_file:
sys_read ebp,buf,buf_size
test eax,eax
js near error
jz get_next_arg
mov esi,ecx ; esi=ecx=buf
mov ecx,eax ; ecx=bites read
xor edx,edx ; edx will hold a number of
; printable chars
xor eax,eax
next_char:
lodsb
cmp al,' '
jl not_an_ascii
cmp al,'~'
jg not_an_ascii
test ah,ah
jnz inc_counter
inc ah
mov [pointer],esi
inc_counter:
inc edx
loop next_char
jmp read_file
not_an_ascii:
test ah,ah
jz near count_this_char
cmp edx,[n]
jl reset_flags
push ecx ; save counter
mov ecx,[pointer]
dec ecx
sys_write STDOUT
sys_write STDOUT, cr, 1
pop ecx ; restore counter
reset_flags:
xor eax,eax ; reset ascii flag (ah)
xor edx,edx ; reset ascii counter
count_this_char:
dec ecx
jnz near next_char
jmp read_file
error:
xor ebx,ebx
dec ebx
jmp do_exit
no_more_args:
xor ebx,ebx
do_exit:
sys_exit
; esi = string
; eax = bin number
ascii_to_bin:
xor eax,eax
xor ebx,ebx
.next_digit:
lodsb
test al,al
jz .done
sub al,'0'
imul ebx,10
add ebx,eax
jmp .next_digit
.done:
xchg ebx,eax
ret
DATASEG
cr: db 10
n: dd 4
UDATASEG
pointer: resd 1
buf: resb 4096
buf_size equ $-buf
END