Частина 20 - Дебагування Вхідних Даних

Сьогодні ми дебагуватимемо нашу функцію вхідних даних. Давайте переглянемо свій код.

Перегляньте файл input.c наступним чином.

#include <stdio.h>
#include <string.h>
#include "pico/stdlib.h"

#define ZERO 0x30
#define NINE 0x39
#define PERIOD 0x2e
#define CAPITAL_A 0x41
#define LOWER_CASE_Z 0x7a
#define BACKSPACE 0x08
#define DEL 0x7f

void input_proc(char type, char* p_usb_char, char* p_usb_string, const int* p_USB_STRING_SIZE)
{
  *p_usb_char = '\0';
  *p_usb_char = getchar_timeout_us(0);
  if(*p_usb_char == BACKSPACE || *p_usb_char == DEL)
  {
    if(p_usb_string[0]!= '\0')
    {
      printf("\b");
      printf(" ");
      printf("\b");
      p_usb_string[strlen(p_usb_string)-1] = '\0';
    }
  }
  if(type == 'f')
  { 
    char* period;
    while((*p_usb_char >= ZERO && *p_usb_char <= NINE) || *p_usb_char == PERIOD)
    {
      if(*p_usb_char == PERIOD)
        period = strchr(p_usb_string, '.');
      if(period == NULL) 
      {
        if(strlen(p_usb_string) < *p_USB_STRING_SIZE)
        {
          putchar(*p_usb_char);
          strncat(p_usb_string, p_usb_char, 1);
        }
        *p_usb_char = '\0';
      }
      else
        break;
    }
  }
  else if(type == 'd')
  { 
    while(*p_usb_char >= ZERO && *p_usb_char <= NINE)
    {
      if(strlen(p_usb_string) < *p_USB_STRING_SIZE)
      {
        putchar(*p_usb_char);
        strncat(p_usb_string, p_usb_char, 1);
      }
      *p_usb_char = '\0';
    }
  }
  else if(type == 's')
  { 
    while(*p_usb_char >= CAPITAL_A && *p_usb_char <= LOWER_CASE_Z)
    {
      if(strlen(p_usb_string) < *p_USB_STRING_SIZE)
      {
        putchar(*p_usb_char);
        strncat(p_usb_string, p_usb_char, 1);
      }
      *p_usb_char = '\0';
    }
  }
}

void flush_input(char* p_usb_string)
{
  p_usb_string[0] = '\0';
}

Перегляньте файл print.c наступним чином.

#include <stdio.h>
#include "pico/stdlib.h"
#include "input.h"

#define RETURN 0x0d

void print_proc(char* p_usb_char, char* p_usb_string)
{
  if(*p_usb_char == RETURN)
  {
    if(p_usb_string[0] == '\0')
      printf("\n");
    else
      printf("\n%s\n", p_usb_string);
    flush_input(p_usb_string);
  }
}

Перегляньте файл main.c наступним чином.

#include <stdio.h>
#include "pico/stdlib.h"
#include "print.h"
#include "input.h"

int main()
{
  stdio_init_all();

  const int USB_STRING_SIZE = 100;
  char usb_char;
  usb_char = '\0';
  char usb_string[USB_STRING_SIZE];
  usb_string[0] = '\0';
  
  while(1)
  {   
    input_proc('f', &usb_char, usb_string, &USB_STRING_SIZE);
    print_proc(&usb_char, usb_string);
  }

  return 0;
}

Давайте запустимо наш дебагер.

radare2 -w arm -b 16 main.elf

Давайте зробимо аналіз автоматично.

aaaa

Давайте перейдемо до головної частини програми.

s main

Давайте перейдемо до візуального режиму, натиснувши V і потім p двічі, щоб потрапити до хорошого режиму дебагування.

Спочатку ми переглядаємо main.

Ми бачимо наш stdio_init_all call, який встановлює IO, і бачимо 0x64 в r3, який є нашим кроком 100 десятичним, щоб встановити USB_STRING_SIZE, і встановлюємо наш _usb_char значення і ініціалізуємо його до 0, а потім usb_string і ініціалізуємо його до 0.

Давайте переглянемо нашу функцію print_proc.

Спочатку ми перевіримо, чи наш вказівник на usb_char або p_usb_char рівний клавіші RETURN або 0xd, і якщо так, то здійснюємо перехід.

Далі ми ітеруємося по p_usb_string, поки не досягнемо кінця рядка, і потім call нашу функцію _printf, яка, як ми бачимо тут, є обгорткою навколо функції c printf.

Нарешті, ми flush_input..

Наша функція input_proc трохи складніша.

У цьому випадку ми використовуємо функцію getchar_timeout_us і обробляємо клавіші BACKSPACE і DELETE.

Далі ми call нашу функцію putchar проти 0 і 9 і перевіряємо strlen і належним чином будуємо наш рядок з strncat.

Далі ми належним чином обробляємо нашу логіку PERIOD щоб забезпечити, що тільки один PERIOD вводиться, оскільки десяткова частина не може обробляти 2 періоди.

Далі ми належним чином обробляємо наш цикл.

Нарешті, ми маємо нашу функцію flush_input.

У цьому випадку ми просто очищаємо буфер вхідних даних, встановлюючи p_usb_string на нульовий символ.

Це була більша сесія дебагування, тому будь ласка, візьміть свій час і порівняйте збірку з джерелом, щоб глибше зрозуміти кожен абзац, який я тут описую.

Це закінчує нашу початкову навчальну подорож. У цій подорожі ми здійснили 197 кроків разом через кілька різних архітектур. Тепер ваш чергова черга взяти цю навчальну матеріал на практику і зробити великі речі!

Цей книга буде вашою посилкою, коли ви зустрінете виклики, але нічого не зупинить вас!

results matching ""

    No results matching ""