From a5f7f103c046b334a19110576c01b3cd5f61b7b3 Mon Sep 17 00:00:00 2001 From: german Date: Thu, 5 Mar 2026 17:42:19 +0400 Subject: [PATCH] Data types --- asm-savers.h | 97 +++++++++++++++++++++++++++++++++++++++++++++++---- ntsys | Bin 27008 -> 27160 bytes out.exe | Bin 0 -> 4 bytes 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/asm-savers.h b/asm-savers.h index eb7fc80..22c8d1c 100644 --- a/asm-savers.h +++ b/asm-savers.h @@ -1,8 +1,9 @@ #if (!defined(NTSYS__S_ASSEMBLER_H___)) #define NTSYS__S_ASSEMBLER_H___ +#define ntsys_exit_if_error(parser) if (!ntsys_asm_arg_new((parser)->string, (parser)->cache)) #define ntsys_run_asm_parser(ss) __ntsys_arg_function_loader(&(ss)) -#define create_ntsys_asm_parser(cache, fp, str, table, table_size, labels) ((ntsys_argument_parser_t){(cache), (fp), (str), (table), (table_size), (labels), (labels)}) +#define create_ntsys_asm_parser(cache, fp, str, table, table_size, labels) ((ntsys_argument_parser_t){(cache), (fp), (str), (table), (table_size), (labels)}) #define create_ntsys_asm_save(ss) ((ntsys_asm_save_t){(ss), (ss)}) #define create_ntsys_asm_cache(ss) ((ntsys_asm_cache_t)&(ss)) #define ntsys_asm_arg_new(str, __cache) ((ntsys_get_arg((__cache))) && ((str) = __cache->string)) @@ -138,11 +139,91 @@ typedef struct { } ntsys_argument_parser_t; static void __input_datatype(ntsys_argument_parser_t* parser, byte_t* mode) { + ntsys_exit_if_error(parser) { + ntsys_error("Cannot find argument!"); + return; + } + byte_t data_type = 0x01; + char* str = parser->string; + if (strcmp(str, "byte") == 0) { + data_type = 0x01; + } else if (strcmp(str, "word") == 0) { + data_type = 0x02; + } else if (strcmp(str, "dword") == 0) { + data_type = 0x04; + } else if (strcmp(str, "qword") == 0) { + data_type = 0x08; + } else if (strcmp(str, "sbyte") == 0) { + data_type = 0xF1; + } else if (strcmp(str, "sword") == 0) { + data_type = 0xF2; + } else if (strcmp(str, "sdword") == 0) { + data_type = 0xF4; + } else if (strcmp(str, "sqword") == 0) { + data_type = 0xF8; + } else if (strcmp(str, "db") == 0) { + data_type = 0xBC; + } else { + ntsys_error("Incorrect datatype!"); + return; + } + if (data_type == 0xBC) fputc((__e_byte_t)0x02, parser->fp); + else fputc((__e_byte_t)data_type, parser->fp); + *mode = data_type; +} + +static void __write_label(ntsys_argument_parser_t* parser) { } static void __input_data(ntsys_argument_parser_t* parser, byte_t* mode) { - + ntsys_exit_if_error(parser) { + ntsys_error("Cannot find argument!"); + return; + } + byte_t data_type = *mode; + char* str = parser->string; + if (str[0] >= '0' && str[0] <= '9') { + int count_system = 10; + if (str[1] == 'x') { + count_system = 16; + } else if (str[1] == 'b') { + count_system = 2; + } else { + ntsys_error("Unknown number system!"); + return; + } + if (count_system != 10) { + str += 2; + } + long cnt = strtol(str, NULL, count_system); + FILE* fp = parser->fp; + switch (data_type) { + case 0x01: fwrite((__e_byte_t*)((byte_t*)&cnt), 1, sizeof(byte_t), fp); + break; + case 0x02: fwrite((__e_byte_t*)((word_t*)&cnt), 1, sizeof(word_t), fp); + break; + case 0x04: fwrite((__e_byte_t*)((dword_t*)&cnt), 1, sizeof(dword_t), fp); + break; + case 0x08: fwrite((__e_byte_t*)((qword_t*)&cnt), 1, sizeof(qword_t), fp); + break; + case 0xF1: fwrite((__e_byte_t*)((sbyte_t*)&cnt), 1, sizeof(sbyte_t), fp); + break; + case 0xF2: fwrite((__e_byte_t*)((sword_t*)&cnt), 1, sizeof(sword_t), fp); + break; + case 0xF4: fwrite((__e_byte_t*)((sdword_t*)&cnt), 1, sizeof(sdword_t), fp); + break; + case 0xF8: fwrite((__e_byte_t*)((sqword_t*)&cnt), 1, sizeof(sqword_t), fp); + break; + } + } else { + if (data_type != 0xBC) { + ntsys_error("Incorrect datatype! For jump to label please use db type!"); + return; + } + __write_label(parser); + } + } static int __arg_writer(char* str, ntsys_argument_parser_t* parser, byte_t mode) { @@ -159,8 +240,13 @@ static int __arg_writer(char* str, ntsys_argument_parser_t* parser, byte_t mode) return EXIT_SUCCESS; } -static int select_argument(char* str, ntsys_argument_parser_t* parser) { +static int select_argument(ntsys_argument_parser_t* parser) { size_t i = 0; + char* str = parser->string; + if (str[strlen(str) - 1] == ':') { + /* TODO: Добавить метки */ + return EXIT_SUCCESS; + } char buf[64]; char** table = parser->table; while (i < parser->table_length) { @@ -194,9 +280,8 @@ static int select_argument(char* str, ntsys_argument_parser_t* parser) { } int __ntsys_arg_function_loader(ntsys_argument_parser_t* parser) { - char* str = parser->string; - while (ntsys_asm_arg_new(str, parser->cache)) { - if (select_argument(str, parser) == EXIT_FAILURE) return EXIT_FAILURE; + while (ntsys_asm_arg_new(parser->string, parser->cache)) { + if (select_argument(parser) == EXIT_FAILURE) return EXIT_FAILURE; } return EXIT_SUCCESS; } diff --git a/ntsys b/ntsys index 56fdf2d1868345c4f3fa19ffa8773169e64548c3..b733fdb9fc94e0091d87f27b752e4fefe67c7070 100755 GIT binary patch literal 27160 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 Zt7far-DKzDVM)(6s#2Cn{`QOP{{j0TSsVZW diff --git a/out.exe b/out.exe index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a1d6348a3968aa15c4ca409d0418062fef54a207 100644 GIT binary patch literal 4 LcmZQzWMBdS00{sD literal 0 HcmV?d00001