Skip to content

Commit 7c68348

Browse files
feat: improve design display in emulator script
1 parent 9c8205a commit 7c68348

2 files changed

Lines changed: 82 additions & 11 deletions

File tree

‎emulator.sh‎

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/bin/bash
22

3+
TOP_MARGIN=6
34
BLUE='\033[36m'
45
NC='\033[0m'
56

@@ -34,37 +35,105 @@ ERRORS=(
3435
"stack_overflow"
3536
)
3637

38+
visible_len() {
39+
local line="$1"
40+
41+
line=$(echo -e "$line" | sed -E 's/\x1B\[[0-9;]*[mK]//g')
42+
43+
printf "%s" "$line" | wc -m
44+
}
45+
46+
get_max_width() {
47+
local text="$1"
48+
local max=0
49+
50+
while IFS= read -r line; do
51+
local len
52+
len=$(visible_len "$line")
53+
54+
if (( len > max )); then
55+
max=$len
56+
fi
57+
done <<< "$text"
58+
59+
echo "$max"
60+
}
61+
62+
get_left_padding() {
63+
local text="$1"
64+
local terminal_width
65+
local text_width
66+
local padding
67+
68+
terminal_width=$(tput cols)
69+
text_width=$(get_max_width "$text")
70+
71+
padding=$(( (terminal_width - text_width) / 2 ))
72+
73+
if (( padding < 0 )); then
74+
padding=0
75+
fi
76+
77+
echo "$padding"
78+
}
79+
80+
print_with_padding() {
81+
local text="$1"
82+
local padding="$2"
83+
84+
while IFS= read -r line; do
85+
printf "%*s%b\n" "$padding" "" "$line"
86+
done <<< "$text"
87+
}
88+
3789
while true; do
38-
clear
39-
echo -e "${BLUE}${asciiart}${NC}"
90+
clear
91+
92+
for ((i = 0; i < TOP_MARGIN; i++)); do
93+
echo
94+
done
95+
96+
PADDING=$(get_left_padding "$asciiart")
97+
98+
print_with_padding "${BLUE}${asciiart}${NC}" "$PADDING"
4099
echo
100+
41101
for i in "${!ERRORS[@]}"; do
42-
printf " %2d) %s\n" "$((i+1))" "${ERRORS[$i]}"
102+
printf "%*s%2d) %s\n" "$PADDING" "" "$((i+1))" "${ERRORS[$i]}"
43103
done
44-
echo " q) Sair"
45-
read -p "Sua escolha: " ESCOLHA
104+
105+
printf "%*s q) Sair\n" "$PADDING" ""
46106
echo
47-
107+
108+
printf "%*sSua escolha: " "$PADDING" ""
109+
read -r ESCOLHA
110+
echo
111+
48112
case "$ESCOLHA" in
49113
q|Q)
50114
break
51115
;;
52116
*)
53117
if [[ "$ESCOLHA" =~ ^[0-9]+$ ]]; then
54118
INDEX=$((ESCOLHA-1))
119+
55120
if [ -n "${ERRORS[$INDEX]}" ]; then
56121
EXECUTAVEL="${ERRORS[$INDEX]}"
57-
echo "=== Executando '$EXECUTAVEL' ==="
122+
123+
printf "%*s=== Executando '%s' ===\n" "$PADDING" "" "$EXECUTAVEL"
58124
echo
59125
./"$EXECUTAVEL"
60126
else
61-
echo "Opção inválida."
127+
printf "%*sOpção inválida.\n" "$PADDING" ""
62128
fi
63129
else
64-
echo "Opção inválida."
130+
printf "%*sOpção inválida.\n" "$PADDING" ""
65131
echo
66132
fi
67-
read -p "Pressione Enter para continuar..."
133+
134+
echo
135+
printf "%*sPressione Enter para continuar..." "$PADDING" ""
136+
read -r
68137
;;
69138
esac
70139
done

‎src/stack_overflow.cpp‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include <iostream>
2-
#include <csignal>
2+
#include <signal.h>
33
#include <cstdlib>
4+
#include <cstring> // Adiciona para sigemptyset
5+
#include <sys/types.h>
46

57
// aloca memória para a pilha de emergência (tamanho recomendado pelo sistema).
68
static char* alternate_stack = new char[SIGSTKSZ];

0 commit comments

Comments
 (0)