first commit
This commit is contained in:
commit
bca98081ec
6 changed files with 161 additions and 0 deletions
25
.clang-format
Normal file
25
.clang-format
Normal file
|
@ -0,0 +1,25 @@
|
|||
BasedOnStyle: WebKit
|
||||
IndentWidth: 4
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignTrailingComments: true
|
||||
ColumnLimit: 105
|
||||
BreakBeforeBraces: Attach
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: false
|
||||
AllowShortLambdasOnASingleLine: false
|
||||
PointerAlignment: Left
|
||||
SpaceBeforeParens: Never
|
||||
SpacesInParentheses: false
|
||||
SpacesInConditionalStatement: false
|
||||
SpacesInContainerLiterals: false
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeSquareBrackets: false
|
||||
SpacesBeforeTrailingComments: 2
|
||||
PenaltyBreakAssignment: 1000
|
||||
NamespaceIndentation: All
|
||||
|
12
Makefile
Normal file
12
Makefile
Normal file
|
@ -0,0 +1,12 @@
|
|||
CC=riscv64-linux-gnu-gcc
|
||||
FILES=main.c transform.s
|
||||
BINARY=transform
|
||||
|
||||
$(BINARY): $(FILES)
|
||||
$(CC) -o $(BINARY) $(FILES)
|
||||
|
||||
run: $(BINARY)
|
||||
./$(BINARY) 127.0.0.1
|
||||
|
||||
clean:
|
||||
rm $(BINARY)
|
19
main.c
Normal file
19
main.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
#include "transform.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if(argc < 2) {
|
||||
fprintf(stderr, "usage: %s <ip>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
char* result = transform(argv[1]);
|
||||
if(result == NULL) {
|
||||
fprintf(stderr, "Failed to allocate buffer\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("%s\n", result);
|
||||
free(result);
|
||||
}
|
BIN
transform
Executable file
BIN
transform
Executable file
Binary file not shown.
6
transform.h
Normal file
6
transform.h
Normal file
|
@ -0,0 +1,6 @@
|
|||
#ifndef TRANSFORM_H
|
||||
#define TRANSFORM_H
|
||||
|
||||
extern char* transform(char* str);
|
||||
|
||||
#endif
|
99
transform.s
Normal file
99
transform.s
Normal file
|
@ -0,0 +1,99 @@
|
|||
.globl transform
|
||||
.extern strlen
|
||||
.extern malloc
|
||||
|
||||
# this stuff didnt really need to be a macro but whatever
|
||||
.macro begin_func
|
||||
# regs reg size return address 16 byte align padding
|
||||
addi sp, sp, -112 # 12 * 8 + 8 + 8
|
||||
sd ra, 104(sp)
|
||||
sd s0, 96(sp)
|
||||
sd s1, 88(sp)
|
||||
sd s2, 80(sp)
|
||||
sd s3, 72(sp)
|
||||
sd s4, 64(sp)
|
||||
sd s5, 56(sp)
|
||||
sd s6, 48(sp)
|
||||
sd s7, 40(sp)
|
||||
sd s8, 32(sp)
|
||||
sd s9, 24(sp)
|
||||
sd s10, 16(sp)
|
||||
sd s11, 8(sp)
|
||||
.endm
|
||||
|
||||
.macro end_func
|
||||
ld ra, 104(sp)
|
||||
ld s0, 96(sp)
|
||||
ld s1, 88(sp)
|
||||
ld s2, 80(sp)
|
||||
ld s3, 72(sp)
|
||||
ld s4, 64(sp)
|
||||
ld s5, 56(sp)
|
||||
ld s6, 48(sp)
|
||||
ld s7, 40(sp)
|
||||
ld s8, 32(sp)
|
||||
ld s9, 24(sp)
|
||||
ld s10, 16(sp)
|
||||
ld s11, 8(sp)
|
||||
addi sp, sp, 112
|
||||
ret
|
||||
.endm
|
||||
|
||||
.section .text
|
||||
transform:
|
||||
begin_func
|
||||
|
||||
# s0 = input ip pointer
|
||||
# s1 = input length
|
||||
# s2 = buffer length
|
||||
# s3 = buffer pointer
|
||||
mv s0, a0
|
||||
call strlen
|
||||
mv s1, a0
|
||||
|
||||
li t0, 3
|
||||
mul s2, s1, t0 # multiply input length by 3 to get maximum possible output length
|
||||
|
||||
mv a0, s2
|
||||
addi a0, a0, 1 # add space for null terminator
|
||||
call malloc
|
||||
mv s3, a0
|
||||
beq s3, x0, .exit # if allocation failed exit the function
|
||||
|
||||
mv t0, x0 # i
|
||||
mv t1, x0 # out_i
|
||||
.loop_start:
|
||||
bge t0, s1, .loop_end # if i == len finish looping
|
||||
|
||||
add t2, s0, t0 # t2 = ip + i
|
||||
lb t3, 0(t2) # t3 has the char
|
||||
li t5, '.'
|
||||
bne t3, t5, .store_char # if the period isnt present skip adding the [
|
||||
|
||||
add t4, s3, t1 # t4 = buf + out_i
|
||||
li t6, '['
|
||||
sb t6, 0(t4) # *t4 = '['
|
||||
addi t1, t1, 1
|
||||
|
||||
.store_char:
|
||||
add t4, s3, t1 # t4 = buf + out_i
|
||||
sb t3, 0(t4) # *t4 = t3 (the current char)
|
||||
addi t0, t0, 1
|
||||
addi t1, t1, 1
|
||||
|
||||
bne t3, t5, .loop_start # if the period isnt present go back to start of loop
|
||||
|
||||
add t4, s3, t1 # t4 = buf + out_i
|
||||
li t6, ']'
|
||||
sb t6, 0(t4) # *t4 = ']'
|
||||
addi t1, t1, 1
|
||||
|
||||
j .loop_start
|
||||
|
||||
.loop_end:
|
||||
addi t4, t4, 1
|
||||
sb x0, 0(t4) # add null terminator
|
||||
|
||||
.exit:
|
||||
mv a0, s3 # put buffer into return register
|
||||
end_func
|
Loading…
Add table
Reference in a new issue