This commit is contained in:
Kimapr 2024-04-04 22:18:10 +05:00
parent f7dd2dd766
commit 07c7f6df35
3 changed files with 42 additions and 6 deletions

View file

@ -1 +1,15 @@
int entry(char* regex, char** output); // int entry(...)
//
// Parse regex. Find matching string.
// If found:
// call callback(
// matched string (only valid before callback return),
// length of the string including NUL delimiter,
// data passed in the data argument
// )
// return 0
// Else:
// return 1
typedef void (entry_callback)(char* match, int size, void* data);
int entry(char* regex, entry_callback *callback, void *data);

22
meow.s
View file

@ -10,11 +10,11 @@ _start:
pop %rax pop %rax
mov %rax,argv(%rip) mov %rax,argv(%rip)
cmp $1,%rdi cmp $1,%rdi
jg endif jg _start_endif
mov $1,%rdi mov $1,%rdi
call usage call usage
jmp _exit jmp _exit
endif: _start_endif:
mov $0,%rdi mov $0,%rdi
jmp _exit jmp _exit
@ -58,17 +58,33 @@ write:
mov $1,%rdi mov $1,%rdi
syscall syscall
ret ret
help0: help0:
.ascii "Usage: " .ascii "Usage: "
.set help0l, .-help0 .set help0l, .-help0
help1: help1:
.ascii " regex0 [regex1 ...]\nstdout: NUL-separated list of matching strings\n" .ascii " regex0 [regex1 ...]\nstdout: NUL-separated list of matching strings\n"
.set help1l, .-help1 .set help1l, .-help1
# rdi - exit code
_exit: _exit:
mov $0x3c,%rax mov $0x3c,%rax
syscall syscall
ret ret
entry: entry:
push %r12
sub $8,%r12
mov %rsp,%r12
entry_parse_begin:
test %rdi,%rdi
jnz entry_parse_end
mov %rdi,%rcx
inc %rdi
entry_parse_end:
mov %r12,%rsp
add $8,%r12
pop %r12
ret ret
.bss .bss
@ -76,5 +92,3 @@ argc:
.zero 8 .zero 8
argv: argv:
.zero 8 .zero 8
buf:
.zero 65536

10
test.c
View file

@ -1,9 +1,17 @@
#include <amogus.h> #include <amogus.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <memory.h>
void callback(char* str, int size, void* data) {
char** out = (char**)data;
*out = (char*)malloc(size);
memcpy(str, *out, size);
}
int main() { int main() {
char* match; char* match;
if(!entry("meow.*|m(r(r(p..*)))",&match)) if(!entry("meow.*|m(r(r(p..*)))",callback,&match))
return 1; return 1;
printf("%s",match); printf("%s",match);
} }