From: DeaDDooMER Date: Thu, 17 Aug 2017 22:52:52 +0000 (+0300) Subject: Исправлена порча памяти. На этот раз точно. X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=ba8ed2cfa675b23cb19cba538f719a07a79ffb7f;p=dsw-obn.git Исправлена порча памяти. На этот раз точно. --- diff --git a/notes b/notes index a07b3b5..dfa95ca 100644 --- a/notes +++ b/notes @@ -1,3 +1,4 @@ +- Не полная реализация модуля SYSTEM - Не полная реализация модуля Strings - Не полная реализация модуля Files - Сделать проверку повторов в CASE. @@ -23,7 +24,6 @@ Нужен другой тип округления? - Нет счёта строк / столбцов (хрен с ними - у меня есть утилита tail!) -- Нет модуля SYSTEM (на жабе он особо и не нужен) - Нужны средства создания биндингов. На данный момент реализуемо как пустые модули. - Любая ошибка фатальна - Нет проверок переполнения в компилтайме. diff --git a/src/oberon.c b/src/oberon.c index 0bbeec1..d6aefad 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -356,23 +356,20 @@ oberon_init_scaner(oberon_context_t * ctx, const char * code) static void oberon_read_ident(oberon_context_t * ctx) { - int len = 0; - int i = ctx -> code_index; + int start = ctx -> code_index; - int c = ctx -> code[i]; - while(isalnum(c)) + oberon_get_char(ctx); + while(isalnum(ctx -> c)) { - i += 1; - len += 1; - c = ctx -> code[i]; + oberon_get_char(ctx); } - char * ident = GC_MALLOC(len + 1); - memcpy(ident, &ctx->code[ctx->code_index], len); - ident[len] = 0; + int end = ctx -> code_index; + + char * ident = GC_MALLOC(end - start + 1); + memcpy(ident, &ctx -> code[start], end - start); + ident[end - start] = 0; - ctx -> code_index = i; - ctx -> c = ctx -> code[i]; ctx -> string = ident; ctx -> token = IDENT; @@ -738,7 +735,7 @@ static void oberon_read_string(oberon_context_t * ctx) char * string = GC_MALLOC(end - start + 1); strncpy(string, &ctx -> code[start], end - start); - string[end] = 0; + string[end - start] = 0; ctx -> token = STRING; ctx -> string = string;