Перейти к содержанию

[tools] SimbolFix - Проверка текста на ошибки для Fallout 1 & 2.


Slack64

Рекомендуемые сообщения

                     Simbolfix и Nodefix для Fallout & Fallout 2

 

Скрипты для проверки файлов *.msg, находящихся в каталогах Dialog и Game

         Замечание: только для Русского языка в кодировке CP1251 (ANSI)

 

OS Linux - скрипты написаны на языке программирования Perl
OS Windows - скрипты написаны на языке программирования Perl, Masm32

 

Примечание:

если установить на ОС Windows интерпретатор ActivePerl c сайта  https://www.activestate.com/, то можно выполнять Перловый скрипт без компиляции в командной строке

 

 

 

 

 

Symbolfix Perl

 

#!/usr/bin/perl
#------------
# 2018-03-07
#------------
use strict;
 
my (@buffer_in, @buffer_out, $file_msg, $original, $string, $message);
my ($number, $index, $buffer_save) = (0,0,0);
my $NEW_DIR = "msg_error_files";
 
opendir FILE_DIR, ".";
my @file_name_list = sort(grep !/^\.+$/, readdir FILE_DIR);
closedir FILE_DIR;
 
foreach (@file_name_list) {
 $file_msg = $_;
 if ($file_msg =~ /\.msg$/) {
  ++$number;
  print "$number $file_msg\n";
  if (-s $file_msg) {
   open (FILE_IN, "$file_msg");
   @buffer_in = <FILE_IN>;
   close(FILE_IN);
   ++$index;
   &CHECK_STRING;
   if (-e $NEW_DIR) {
   } else {
    mkdir ($NEW_DIR, 0777);
   }
   if ($buffer_save eq 1) {
    open (FILE_OUT, ">$NEW_DIR/$file_msg");
    print FILE_OUT @buffer_out;
    close(FILE_OUT);
   }
   $buffer_save = 0;
   $index = 0;
   undef @buffer_in;
   undef @buffer_out;
}}}
 
if ($number ne 0) {
 print "Data process completed.\n";
} else {
 print "Files *.msg not found.\n";
}
print "Press ENTER to exit...";
 
my $stdin = <STDIN>;
while ($stdin) {
 last if $stdin ne '\n';
}
exit();
 
sub CHECK_STRING {
 foreach (@buffer_in) {
  $original = $_;
  $string = $original;
  $string =~ tr/\r//d;
  if ($string !~ /\n/) {
   $string = "$string\n";
  }
  if (($string =~ /^\s+$/) || ($string =~ /^$/)) {
   ++$index; next;
  }
  if (($string =~ /\{/) || ($string =~ /\}/)) {
   my $bracket_open = () = $string =~ /\{/g;
   my $bracket_close = () = $string =~ /\}/g;
   if (($bracket_open == 3) && ($bracket_close == 3)) {
    &CHECK_TRIAD;
   } else {
    $message = "$index строка содержит неверное количество скобок, или неправильный формат.";
    &SAVE_STRING;
   }
  }
  ++$index;
 }
}
 
sub CHECK_TRIAD {
 if ($string =~ /^\#/) {
 } elsif ($string =~ /^\{\d+\}\{\}\{\}/) {
 } else {
  my ($triad_one, $triad_two, $triad_three) = split("\}", $string);
  $triad_one .= "}"; $triad_two .= "}"; $triad_three .= "}";
  if ($triad_one !~ /^\{\d+\}/) {
    $message = "$index строка содержит неправильный формат в первой группе скобок.";
    &SAVE_STRING;
  }
  elsif (($triad_two !~ /^\{\}/) && ($triad_two !~ /^\{[A-Za-zА-Яа-я0-9]+\}/)) {
    $message = "$index строка содержит неправильный формат во второй группе скобок.";
    &SAVE_STRING;
  }
  elsif ($triad_three !~ /^\{[А-Яа-я0-9\s\~\!\@\#\$\%\^\&\*\(\)\-\=\_\+\|\\\[\]\;\:\'\"\,\.\<\>\/\?…«»№’—°]+\}/) {
    $message = "$index строка содержит английские, или служебные символы, или неверную кодировку, в третьей группе скобок.";
    &SAVE_STRING;
  } else {
   if (($triad_three =~ /\{я/) || ($triad_three =~ /\[я/) || ($triad_three =~ /\(я/)
|| ($triad_three =~ /\'я/) || ($triad_three =~ /\"я/) || ($triad_three =~ /\.я/)
|| ($triad_three =~ /\.Я/)) {
    $message = "$index строка возможно содержит неверный регистр для буквы Я, в третьей группе скобок.";
    &SAVE_STRING;
}}}}
 
sub SAVE_STRING {
 $buffer_save = 1;
 @buffer_out[$index] = "$string$message\n\n";
 $original = '';
 $string = '';
 $message = '';
}
 

Symbolfix Masm32

 

;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;2018-03-07
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\macros\macros.asm

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAXMEM equ 1F4000h
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.data

appName db 'symbolfix',0
msgDone db 'Обработка данных завершена.',0
errFileFound db 'Файлы *.msg не найдены.',0
errOpenDir db 'Ошибка открытия директории.',0
errCreateDir db 'Ошибка создания директории.',0
errAllocMemory db 'Ошибка распределения памяти',0
errReadFile db 'Ошибка чтения файла',0
errWriteFile db 'Ошибка записи файла',0
errBracket db 'строка содержит неверное количество скобок, или неправильный формат.',0
errTriadOne db 'строка содержит неправильный формат в первой группе скобок.',0
errTriadTwo db 'строка содержит неправильный формат во второй группе скобок.',0
errTriadThree db 'строка содержит английские, или служебные символы, или неверную кодировку, в третьей группе скобок.',0
msgCaseSymbol db 'строка возможно содержит неверный регистр для буквы Я, в третьей группе скобок.',0

dataString db 10240 dup (0),0
msgString db 0,0
errString db 0,0
endString db 0,0
validTriad db 0,0
lowSymbol db 0,0
highSymbol db 0,0
bracketCount dd 0
stringNumber dd 0
stringFormat dd 0
stringCount dd 0
groupCount dd 0

fileExt db '*.msg',0
newDir db 'msg_error_files',0
currentDir db 256 dup (0),0
sizeDir = $-currentDir

fileFind WIN32_FIND_DATA <>
fileOpen OFSTRUCT <>

hFileCreate dd 0
hFileFind dd 0
hFileRead dd 0
sizeByte dd 0
byteRead dd 0
byteWrite dd 0
heapFile dd 0
heapBuffer dd 0
sizeBuffer dd MAXMEM

.data?
pageFile dd ?
pageBuffer dd ?
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.code

start:
invoke FindWindow, 0, offset appName
cmp eax, 0
jne _Exit

invoke GetCurrentDirectory, sizeDir, offset currentDir
cmp eax, 0
jne @F
lea esi, errOpenDir
call _MsgPrint
jmp _Exit
@@:
invoke FindFirstFile, offset fileExt, offset fileFind
cmp eax, -1
jne @F
lea esi, errFileFound
call _MsgPrint
jmp _Exit
@@:
mov hFileFind, eax
invoke SetCurrentDirectory, offset newDir
cmp eax, 0
jne @F
invoke CreateDirectory, offset newDir, 0
cmp eax, 0
jne @F
invoke FindClose, hFileFind
lea esi, errCreateDir
call _MsgPrint
jmp _Exit
@@:
;~~~~~~~~~~~~~~
call _MainProc
;~~~~~~~~~~~~~~
lea esi, msgDone
call _MsgPrint
_Exit:
invoke ExitProcess, 0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_MsgPrint proc

invoke MessageBox, 0, esi, offset appName, 40h
ret

_MsgPrint endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_MainProc proc

invoke SetCurrentDirectory, offset currentDir

_FindFile:
cmp fileFind.cFileName, '.'
je _NextFile

invoke OpenFile, offset fileFind.cFileName, offset fileOpen, OF_READ
mov hFileRead, eax
cmp eax, -1
jne @F
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
invoke GetFileSize, hFileRead, 0
cmp eax, 0
jne @F
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
mov sizeByte, eax
invoke GetProcessHeap
mov heapFile, eax
mov eax, sizeByte
add eax, 4
invoke HeapAlloc, heapFile, HEAP_ZERO_MEMORY, eax
cmp eax, 0
jne @F
lea esi, errAllocMemory
call _MsgPrint
jmp _NextFile
@@:
mov pageFile, eax
invoke ReadFile, hFileRead, pageFile, sizeByte, offset byteRead, 0
cmp eax, 0
jne @F
invoke HeapFree, heapFile, 0, pageFile
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
invoke CloseHandle, hFileRead
mov edi, pageFile
mov eax, sizeByte
add edi, eax
invoke lstrcat, pageFile, chr$(0Dh,0Ah)
invoke GetProcessHeap
mov heapBuffer, eax
invoke HeapAlloc, heapBuffer, HEAP_ZERO_MEMORY, sizeBuffer
cmp eax, 0
jne @F
invoke HeapFree, heapFile, 0, pageFile
lea esi, errAllocMemory
call _MsgPrint
jmp _NextFile
@@:
mov pageBuffer, eax
;~~~~~~~~~~~~~~~~~
call _CheckString
;~~~~~~~~~~~~~~~~~
cmp byte ptr [errString], 0
jne @F
jmp _ClearMemory
@@:
invoke SetCurrentDirectory, offset newDir
invoke CreateFile, offset fileFind.cFileName, GENERIC_WRITE, \
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
cmp eax, -1
jne @F
jmp _ClearMemory
@@:
mov hFileCreate, eax
invoke lstrlen, pageBuffer
mov sizeByte, eax
invoke WriteFile, hFileCreate, pageBuffer, sizeByte, offset byteWrite, 0
jne @F
lea esi, errWriteFile
call _MsgPrint
@@:
invoke CloseHandle, hFileCreate

_ClearMemory:
invoke HeapFree, heapBuffer, 0, pageBuffer
invoke HeapFree, heapFile, 0, pageFile
;~~~~~~~~~~~~~~~
call _ClearData
;~~~~~~~~~~~~~~~

_NextFile:
invoke SetCurrentDirectory, offset currentDir
invoke FindNextFile, hFileFind, offset fileFind
or eax, eax
jne _FindFile
invoke FindClose, hFileFind
ret

_MainProc endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_CheckString proc

xor eax, eax
mov edi, pageFile
lea esi, dataString

_FindEndString:
mov al, [edi]
cmp al, 0
jne @F
jmp _CheckStringDone
@@:
mov [esi], al
cmp al, 0Dh
jne @F
mov byte ptr [endString], 1
jmp _EndFindString
@@:
cmp al, 0Ah
jne @F
cmp byte ptr [endString], 1
je _NextSymbol
mov byte ptr [endString], 0
jmp _EndFindString
@@:
cmp al, '{'
je _BracketCount
cmp al, '}'
je _BracketCount
inc esi

_NextSymbol:
inc edi
jmp _FindEndString

_BracketCount:
mov ecx, bracketCount
inc ecx
mov bracketCount, ecx
inc esi
jmp _NextSymbol

_EndFindString:
mov ecx, stringNumber
inc ecx
mov stringNumber, ecx

mov ecx, bracketCount
cmp ecx, 0
je _ClearString
cmp ecx, 6
je @F
mov byte ptr [errString], 1
mov byte ptr [msgString], 0
;~~~~~~~~~~~~~~~~
call _SaveString
;~~~~~~~~~~~~~~~~
jmp _ClearString
@@:
mov byte ptr [validTriad], 0
;~~~~~~~~~~~~~~~~
call _CheckTriad
;~~~~~~~~~~~~~~~~
cmp byte ptr [validTriad], 1
je _ClearString
mov byte ptr [errString], 1
;~~~~~~~~~~~~~~~~
call _SaveString
;~~~~~~~~~~~~~~~~

_ClearString:
xor eax, eax
mov bracketCount, eax
lea esi, dataString
mov ecx, 2800h
@@:
mov [esi], al
dec cl
cmp cl, 0
je @F
inc esi
jmp @B
@@:
lea esi, dataString
jmp _NextSymbol

_CheckStringDone:
ret

_CheckString endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_CheckTriad proc

lea esi, dataString

_FindTriadOne:
mov al, [esi]
cmp al, '{'
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadOne
@@:
cmp al, '}'
jne @F
jmp _EndTriadOne
@@:
cmp al, 30h
jb @F
cmp al, 39h
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadOne
@@:
mov byte ptr [validTriad], 0
mov byte ptr [msgString], 1

_EndTriadOne:
cmp byte ptr [validTriad], 1
jne _CheckTriadDone
inc esi

_FindTriadTwo:
mov al, [esi]
cmp al, '{'
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadTwo
@@:
cmp al, '}'
jne @F
jmp _EndTriadTwo
@@:
cmp al, 30h
jb @F
cmp al, 39h
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadTwo
@@:
cmp al, 41h
jb @F
cmp al, 5Ah
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadTwo
@@:
cmp al, 61h
jb @F
cmp al, 7Ah
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadTwo
@@:
cmp al, 0C0h
jb @F
cmp al, 0FFh
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadTwo
@@:
mov byte ptr [validTriad], 0
mov byte ptr [msgString], 2

_EndTriadTwo:
cmp byte ptr [validTriad], 1
jne _CheckTriadDone
inc esi
mov groupCount, esi

_FindTriadThree:
mov al, [esi]
cmp al, '{'
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, '}'
jne @F
jmp _EndTriadThree
@@:
cmp al, 09h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 20h
jb @F
cmp al, 40h
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 5Bh
jb @F
cmp al, 60h
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 7Ch
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 7Eh
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 85h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 92h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 97h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 0ABh
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 0B0h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 0B9h
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 0BBh
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
cmp al, 0C0h
jb @F
cmp al, 0FFh
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindTriadThree
@@:
mov byte ptr [validTriad], 0
mov byte ptr [msgString], 3

_EndTriadThree:
cmp byte ptr [validTriad], 1
jne _CheckTriadDone
mov esi, groupCount

_FindCaseSymbol:
mov al, [esi]
cmp al, '{'
jne @F
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, '}'
jne @F
jmp _CheckTriadDone
@@:
cmp al, 22h
jne @F
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, 27h
jne @F
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, 28h
jne @F
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, 2Eh
jne @F
mov byte ptr [highSymbol], 1
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, 5Bh
jne @F
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 1
inc esi
jmp _FindCaseSymbol
@@:
cmp al, 0FFh
jne @F
cmp byte ptr [lowSymbol], 1
jne @F
mov byte ptr [validTriad], 0
mov byte ptr [msgString], 4
jmp _CheckTriadDone
@@:
cmp al, 0DFh
jne @F
cmp byte ptr [highSymbol], 1
jne @F
mov byte ptr [validTriad], 0
mov byte ptr [msgString], 4
jmp _CheckTriadDone
@@:
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 0
mov byte ptr [validTriad], 1
inc esi
jmp _FindCaseSymbol

_CheckTriadDone:
ret

_CheckTriad endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_SaveString proc

push edi
mov eax, stringCount
mov edi, pageBuffer
add edi, eax
lea esi, dataString
invoke lstrlen, esi
mov ecx, eax
cld
rep movsb
pop edi

cmp byte ptr [msgString], 1
jne @F
lea esi, errTriadOne
jmp _MsgString
@@:
cmp byte ptr [msgString], 2
jne @F
lea esi, errTriadTwo
jmp _MsgString
@@:
cmp byte ptr [msgString], 3
jne @F
lea esi, errTriadThree
jmp _MsgString
@@:
cmp byte ptr [msgString], 4
jne @F
lea esi, msgCaseSymbol
jmp _MsgString
@@:
lea esi, offset errBracket

_MsgString:
invoke wsprintf, offset stringFormat, chr$(0Dh,0Ah,"%u",20h), stringNumber
invoke lstrcat, pageBuffer, offset stringFormat
invoke lstrcat, pageBuffer, esi
invoke lstrcat, pageBuffer, chr$(0Dh,0Ah,0Dh,0Ah)
invoke lstrlen, pageBuffer
mov stringCount, eax
ret

_SaveString endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_ClearData proc

xor eax, eax
mov bracketCount, eax
mov stringNumber, eax
mov stringNumber, eax
mov stringCount, eax
mov groupCount, eax

mov byte ptr [validTriad], 0
mov byte ptr [highSymbol], 0
mov byte ptr [lowSymbol], 0
mov byte ptr [msgString], 0
mov byte ptr [errString], 0
mov byte ptr [endString], 0

lea esi, dataString
mov ecx, 2800h
@@:
mov [esi], al
dec cl
cmp cl, 0
je @F
inc esi
jmp @B
@@:
ret

_ClearData endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end start

 

Nodefix Perl

 

#!/usr/bin/perl

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 2018-03-07
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use strict;
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my (@buffer_in, @buffer_out, $file_msg, $string);
my ($number, $index) = (0,0);
my $file_sum = "nodesum.txt";
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opendir FILE_DIR, ".";
my @file_name_list = sort(grep !/^\.+$/, readdir FILE_DIR);
closedir FILE_DIR;
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
foreach (@file_name_list) {
 $file_msg = $_;
 if ($file_msg =~ /\.msg$/) {
  ++$number;
  print "$number $file_msg\n";
  if (-s $file_msg) {
   open (FILE_IN, "$file_msg");
   @buffer_in = <FILE_IN>;
   close(FILE_IN);
   &NODE_SUM;
   open (FILE_OUT, ">$file_sum");
   print FILE_OUT @buffer_out;
   close(FILE_OUT);
   $index = 0;
   undef @buffer_in;
}}}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if ($number ne '') {
 print "Data process completed.\n";
} else {
 print "Files *.msg not found.\n";
}
print "Press ENTER to exit...";
 
my $stdin = <STDIN>;
while ($stdin) {
 last if $stdin ne '\n';
}
exit();
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub NODE_SUM {
 foreach (@buffer_in) {
  $string = $_;
  if ($string =~ /^\{\d+\}/) {
   my $bracket_open = () = $string =~ /\{/g;
   my $bracket_close = () = $string =~ /\}/g;
   if (($bracket_open == 3) && ($bracket_close == 3)){
    ++$index;
    $buffer_out[$number] = "$file_msg = $index\n";
}}}}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
Nodefix Masm32
 
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;2018-03-07
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.386
.model flat, stdcall
option casemap :none
 
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\macros\macros.asm
 
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\user32.lib
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.data
 
appName db 'nodefix',0
msgDone db 'Обработка данных завершена.',0
errSearchFile db 'Файлы *.msg не найдены.',0
errCreateFile db 'Ошибка создания файла.',0
errAllocMemory db 'Ошибка распределения памяти',0
errReadFile db 'Ошибка чтения файла',0
errWriteFile db 'Ошибка записи файла',0
 
fileName db 'nodesum.txt',0
fileExt db '*.msg',0
 
stringBuffer db 10240 dup (0),0
dataBuffer db 64 dup (0),0
validTriad db 0,0
endString db 0,0
bracketCount dd 0
stringCount dd 0
stringFormat dd 0
 
fileFind WIN32_FIND_DATA <>
fileOpen OFSTRUCT <>
 
handleFind dd 0
handleCreate dd 0
handleRead dd 0
sizeByte dd 0
byteRead dd 0
byteWrite dd 0
handleHeap dd 0
 
.data?
pageMemory dd ?
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.code
 
start:
invoke FindWindow, 0, offset appName
cmp eax, 0
jne _Exit
 
invoke FindFirstFile, offset fileExt, offset fileFind
cmp eax, -1
jne @F
lea esi, errSearchFile
call _MsgPrint
jmp _Exit
@@:
mov handleFind, eax
invoke CreateFile, offset fileName, GENERIC_WRITE, \
FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
cmp eax, -1
jne @F
invoke FindClose, handleFind
lea esi, errCreateFile
call _MsgPrint
jmp _Exit
@@:
mov handleCreate, eax
;~~~~~~~~~~~~~~
call _MainProc
;~~~~~~~~~~~~~~
lea esi, msgDone
call _MsgPrint
_Exit:
invoke ExitProcess, 0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_MsgPrint proc
 
invoke MessageBox, 0, esi, offset appName, 40h
ret
 
_MsgPrint endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_MainProc proc
 
_FindFile:
cmp fileFind.cFileName, '.'
je _NextFile
 
invoke OpenFile, offset fileFind.cFileName, offset fileOpen, OF_READ
mov handleRead, eax
cmp eax, -1
jne @F
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
invoke GetFileSize, handleRead, 0
cmp eax, 0
jne @F
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
mov sizeByte, eax
invoke GetProcessHeap
mov handleHeap, eax
mov eax, sizeByte
add eax, 4
invoke HeapAlloc, handleHeap, HEAP_ZERO_MEMORY, eax
cmp eax, 0
jne @F
lea esi, errAllocMemory
call _MsgPrint
jmp _NextFile
@@:
mov pageMemory, eax
invoke ReadFile, handleRead, pageMemory, sizeByte, offset byteRead, 0
cmp eax, 0
jne @F
invoke HeapFree, handleHeap, 0, pageMemory
lea esi, errReadFile
call _MsgPrint
jmp _NextFile
@@:
invoke CloseHandle, handleRead
mov edi, pageMemory
mov eax, byteRead
add edi, eax
invoke lstrcat, pageMemory, chr$(0Dh,0Ah)
;~~~~~~~~~~~~~~~~~
call _CheckString
;~~~~~~~~~~~~~~~~~
invoke HeapFree, handleHeap, 0, pageMemory
cmp stringCount, 0
je @F
invoke lstrlen, offset dataBuffer
mov sizeByte, eax
invoke WriteFile, handleCreate, offset dataBuffer, sizeByte, offset byteWrite, 0
cmp eax, 0
jne @F
lea esi, errWriteFile
call _MsgPrint
@@:
;~~~~~~~~~~~~~~~
call _ClearData
;~~~~~~~~~~~~~~~
 
_NextFile:
invoke FindNextFile, handleFind, offset fileFind
or eax, eax
jne _FindFile
invoke FindClose, handleFind
invoke CloseHandle, handleCreate
ret
 
_MainProc endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_CheckString proc
 
xor eax, eax
mov edi, pageMemory
lea esi, stringBuffer
 
_FindEndString:
mov al, [edi]
cmp al, 0
jne @F
jmp _CheckStringDone
@@:
mov [esi], al
mov byte ptr [endString], 0
cmp al, 0Dh
jne @F
mov byte ptr [endString], 1
jmp _EndFindString
@@:
cmp al, 0Ah
jne @F
cmp byte ptr [endString], 1
je _NextSymbol
mov byte ptr [endString], 0
jmp _EndFindString
@@:
cmp al, '{'
je _BracketCount
cmp al, '}'
je _BracketCount
inc esi
 
_NextSymbol:
inc edi
jmp _FindEndString
 
_BracketCount:
mov ecx, bracketCount
inc ecx
mov bracketCount, ecx
inc esi
jmp _NextSymbol
 
_EndFindString:
mov ecx, bracketCount
cmp ecx, 0
je _ClearString
cmp ecx, 6
je @F
jmp _ClearString
@@:
mov byte ptr [validTriad], 0
;~~~~~~~~~~~~~~~~
call _CheckTriad
;~~~~~~~~~~~~~~~~
cmp byte ptr [validTriad], 1
je @F
jmp _ClearString
@@:
mov ecx, stringCount
inc ecx
mov stringCount, ecx
 
_ClearString:
xor eax, eax
mov bracketCount, eax
lea esi, stringBuffer
mov ecx, 2800h
@@:
mov [esi], al
dec cl
cmp cl, 0
je @F
inc esi
jmp @B
@@:
lea esi, stringBuffer
jmp _NextSymbol
 
_CheckStringDone:
invoke lstrcpy, offset dataBuffer, offset fileFind.cFileName
invoke lstrcat, offset dataBuffer, chr$(20h,3Dh,20h)
invoke wsprintf, offset stringFormat, chr$("%u"), stringCount
invoke lstrcat, offset dataBuffer, offset stringFormat
invoke lstrcat, offset dataBuffer, chr$(0Dh,0Ah)
ret
 
_CheckString endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_CheckTriad proc
 
lea esi, stringBuffer
 
_FindDigit:
mov al, [esi]
cmp al, '{'
jne @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindDigit
@@:
cmp al, '}'
jne @F
jmp _CheckTriadDone
@@:
cmp al, 30h
jb @F
cmp al, 39h
ja @F
mov byte ptr [validTriad], 1
inc esi
jmp _FindDigit
@@:
mov byte ptr [validTriad], 0
 
_CheckTriadDone:
ret
 
_CheckTriad endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_ClearData proc
 
xor eax, eax
mov bracketCount, eax
mov stringFormat, eax
mov stringCount, eax
mov byte ptr [validTriad], 0
mov byte ptr [endString], 0
lea esi, stringBuffer
mov ecx, 2800h
@@:
mov [esi], al
dec cl
cmp cl, 0
je @F
inc esi
jmp @B
@@:
lea esi, dataBuffer
mov ecx, 40h
@@:
mov [esi], al
dec ecx
cmp ecx, 0
je @F
inc esi
jmp @B
@@:
ret
 
_ClearData endp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end start
 

 

 

Ссылка на комментарий

NodeFix 15/01/2018

сделал на всякий случай ещё одну утилиту, описание и исходник

внутри архива, ссылка добавлена в подпись.

 

Внимание, эта утилита для опытных пользователей.

Ссылка на комментарий

вопрос к  Foxx, Mr.Сталин, Pyran

нашел одну строку в .msg файле, там строка начинается не с {номер},

а пробел {номер}, это не будет для движка критом, ошибка не выскочит?

конкретно :cmbatai2.msg

{32444}{}{Эй, да у нас тут кровь идет, а?}

 {32445}{}{::::отрыжка!:::::}

Ссылка на комментарий

вопрос к  Foxx, Mr.Сталин, Pyran

нашел одну строку в .msg файле, там строка начинается не с {номер},

а пробел {номер}, это не будет для движка критом, ошибка не выскочит?,

просто поправить и все.

Fallout 2Путеводитель по модам | FAQ | Перевод модов | Путеводитель по RP

Nevada Band: Путеводитель по играм серииFAQ

Fallout Tactics: Путеводитель по модам | FAQ

База Данных: YD\YD\MF

Помогая другим, не забывай о себе =) 

Ссылка на комментарий

а пробел {номер}, это не будет для движка критом, ошибка не выскочит?

нет это не крит, в переписке писал, что за скобками можно писать все что вздумается, двиг это игнорит, главное структура скоб.

 

Нетипичный пример использования скриптов:

Это не нетипичный скрипт, а дурная голова скриптера)

Ссылка на комментарий

SymbolFix 0.1.20, NodeFix 0.1.20

исправления и оптимизация,  архив обновлён 20/01/2018

 

 

ИСПРАВЛЕНИЯ

 

теперь на правильную строку с номером озвучки к примеру {100}{10}{....

не будет выводится сообщение, что она не корректна,

будут выводится сообщения, только в случае  ошибки,  для примера:

 

15 {150}{qw}{ Вы видите Эли.}
 -> This line contains incorrect characters.

18 {200}{2a}{Вы видите привлекательную дикарку. В ее глазах стоят слезы.}
 -> This line contains incorrect characters.
 

так же теперь не будет выводится ложное сообщение на строки такого характера

 

{304}{}{}# +jmйno

 

ОПТИМИЗАЦИЯ

 

выкинул не нужные библиотеки из компилятора )

теперь размер исполняемого файла 480Кб, ранее был 2 Мб

 

освобождаем ресурсы памяти и дисковое пространство )

 

 

Ссылка на комментарий

 

 

ИСПРАВЛЕНИЯ

 

теперь на правильную строку с номером озвучки к примеру {100}{10}{....

не будет выводится сообщение, что она не корректна,

будут выводится сообщения, только в случае  ошибки,  для примера:

 

15 {150}{qw}{ Вы видите Эли.}

 -> This line contains incorrect characters.

{304}{}{}# +jmйno

 

 

 

 

15 {150}{qw}{ Вы видите Эли.} - не знаю что такое 15 в начале строки, но эта строка для движка полностью валидна.

Не вижу смысла проверять что находится во вторых скобках - пусть утилита выводит предупреждение что во вторых скобках что-то написано.

 

{304}{}{}# +jmйno - валидна

{304}{}{}# }+jmйno  - а так уже крит с вылетом

 

 

Ссылка на комментарий
 

15

 

 

15 - это просто указатель номера строки в текстовом редакторе, для удобства поиска,

в архиве текстовый файл, в котором я об этом написал

к примеру в msg файле будет строка в которой нет скобок и номера {1234}

а просто что-то и от чего-то осталось

.абвгд

то утилита выведет номер этой строки, такой же как если открыть в блокноте,

по номеру ведь быстрее и проще найти, чем просматривать весь файл

 

[qw] - то есть во втором поле со скобками не принципиально цифры, или буквы,

если так, то поправлю

 

# }+jmйno  - а так уже крит с вылетом

может быть я не правильно понял, но кажется ранее говорили о том,

что после # движку всё равно что там, главное чтобы были закрыты

основные три поля со скобками, если я ошибаюсь, то верну обратно,

как было ранее, чтобы такие строки отображались

 

 

Ссылка на комментарий
 

такой вариант устраивает?

 

 

{100}{45}{Вы видите красивую дикарку.}

 -> This line contains only information character.

 

 

второе замечание в процессе

 

Согласен с Пиран, лучше ещё раз всё проверит,ь а потом на раздачу,

дату выхода ведь не публиковали )

Ссылка на комментарий

 

 

[qw] - то есть во втором поле со скобками не принципиально цифры, или буквы,

если так, то поправлю

 

может быть я не правильно понял, но кажется ранее говорили о том,

что после # движку всё равно что там, главное чтобы были закрыты

основные три поля со скобками, если я ошибаюсь

 

 

Во вторых скобках может быть любая буквенно-цифровая запись.

Движок не опознает символ #-комментария, это для человека обозначили так, символ # можно и не использовать вовсе. А движок обходит любой текст на наличие скобки, в данном случае закрывающая скобка без открывающей является критом, также если поставить в комментарии(тексте) лишнею пару {} то произойдет сдвиг структуры скоб, что приведет к криту.

 

зы модераторы создайте отдельную тему для V.K. сабжа

Ссылка на комментарий

Во вторых скобках может быть любая буквенно-цифровая запись.

Движок не опознает символ #-комментария, это для человека обозначили так, символ # можно и не использовать вовсе. А движок обходит любой текст на наличие скобки, в данном случае закрывающая скобка без открывающей является критом, также если поставить в комментарии(тексте) лишнею пару {} то произойдет сдвиг структуры скоб, что приведет к криту.

 

зы модераторы создайте отдельную тему для V.K. сабжа

спасибо,

я разобрался, темы не надо.

Вы ведь профи, может быть проще Вам сделать провер. программу, вместо

моего безобразия? 

 

 

 

сделал проверки на скобки трёх вариантов строк

{100}{}{....

{100}{здесь не важно цифра,буква}{....

{100}{}{}......

 

итого получилось уже 35 правил проверок скобок, сделаю обновление

 

но если будет строка

{100}{..{..}{..}..{..{....}...}..}....# .{...{..{....}..}..

то прошу извинить, писать провер. правила на такое не буду,

потому что я не хочу провести остаток дней в психушке

 

 

Ссылка на комментарий

Обновление архива 22/01/18

NodeFix - без изменений

SymbolFix - исправления по замечаниям и доработка

 

 

 

на данный момент сделано 37 правил проверки скобок, но может

что-то упустил, все правила приводить не буду,

только несколько примеров для наглядности

 

{100}{10}{Вы видите {красивую дикарку.}
 -> {100}{10}{Вы видите красивую дикарку.}

{150}{}{Вы {видите Эли.}
 -> {150}{}{Вы видите Эли.}

{200}{}{Вы видите привлекательную дикарку. В ее глазах стоят слезы.{}
 -> {200}{}{Вы видите привлекательную дикарку. В ее глазах стоят слезы.}

{201}{}{ Она без сознания.} #{K textu dalekohledu, pokud ho omrбиil obuљkem
 -> {201}{}{ Она без сознания.} #K textu dalekohledu, pokud ho omrбиil obuљkem

{300}{}{Эли благодарит чужака. Теперь она уйдет.}# MUЋ {
 -> {300}{}{Эли благодарит чужака. Теперь она уйдет.}# MUЋ

{302}{}{Эли хочет побыть одна.}#} na kliknutн
 -> {302}{}{Эли хочет побыть одна.}# na kliknutн

{304}{}{}# {+jmйno
 -> {304}{}{}# +jmйno

{309}{}{Эли некогда говорить. Надо работать.}# na kliknutн}
 -> {309}{}{Эли некогда говорить. Надо работать.}# na kliknutн

{313}{pc}{Чужая должна уйти!}# ЋENA znepшбtelila si{ kmen, na kliknutн
 -> {313}{pc}{Чужая должна уйти!}# ЋENA znepшбtelila si kmen, na kliknutн

 

 

 

 

прошу модераторов удалить прошлые посты по обновлениям

и по моим вопросам относительно скобок, они уже не актуальны

Ссылка на комментарий

хы-хы... Просто подход в проверке выбран не правильный - регулярки это зло)

дело не в регексах, а в Перловке, она как бы изначально была направлена на замену шелла

и на пингвине всё замечательно, а вот с Виндой не дружит, хорошо что в последних

версиях наконец-то решили проблему с крышками, но вот только новые на XP не поставишь,

мне пришлось несколько версий от 5.8 до 5.14 перепробовать, чтобы, на XP скрипт

нормально стал работать, да и то не факт, что всё правильно отработает,

по возможности буду проверять, почему то что работает на пингвине,

не так отрабатывает, или не отрабатывает вообще на XP

Ссылка на комментарий

FO2tweaks: неограниченные напарники, запрет напарникам стрельбы очередями, улучшенные гранаты итп.
Переводы: Fallout Fixt svg-badge.svg, Restoration Project svg-badge.svg, Dangerous Quest! svg-badge.svg

Инструменты: расширение VScode с поддержкой скриптов Fallout.

Информация: документация к sfall, вики по Fallout: Nevada, вики PlayItHardcore.

Если есть вопросы, в личку не пишите, лучше пишите на форум.

Ссылка на комментарий

спасибо, но я не программист,  я технарь, да и верблюда то не очень хорошо знаю,

а Вы мне удава подогнали )

может Вы сделаете прогу для проверки, судя по скрипту, думаю у Вас

гораздо лучше получится

 

я с железками работаю и в основном таким занимаюсь, там всё проще, чем в msg файлах

 

 

 

 

sub _snmp_ {

 my $session = SNMPv2c_Session->open($host,$comm,$port);

 $session->map_table ([[1,3,6,1,2,1,15,3,1,1],

                       [1,3,6,1,2,1,15,3,1,2],

                       [1,3,6,1,2,1,15,3,1,16]],

                      sub ($@) { my ($i0,$i1,$i2,$i3) = @_;

                       grep (defined $_ && ($_ = pretty_print $_),($i1,$i2,$i3));

                       $bgp[$index] = "$tbl[$index] $i0 $i1 $i2 $i3";

                       ++$index;

                      }

                    );

 $session->close();

}

 

 

 

Ссылка на комментарий

Linux, Perl, Python и перекур с Camel))

Да все все знают, но молчат)

Fallout 2Путеводитель по модам | FAQ | Перевод модов | Путеводитель по RP

Nevada Band: Путеводитель по играм серииFAQ

Fallout Tactics: Путеводитель по модам | FAQ

База Данных: YD\YD\MF

Помогая другим, не забывай о себе =) 

Ссылка на комментарий

Linux, Perl, Python и перекур с Camel))

Да все все знают, но молчат)

Camel это не перекур, это Тим О’Райли его на книжку про Перл прилепил

 

если все и всё знают, тогда не понятно почему ты и другие корректоры, переводчики

вручную msg проверяют

 

я уже нашёл несколько багов в своей обновлённой версии, похоже перестарался,

буду исправлять

Ссылка на комментарий

если все и всё знают, тогда не понятно почему ты и другие корректоры, переводчики

вручную msg проверяют

ну, я про названия, а не глубокие познания... я например с детства перловку не люблю))

Fallout 2Путеводитель по модам | FAQ | Перевод модов | Путеводитель по RP

Nevada Band: Путеводитель по играм серииFAQ

Fallout Tactics: Путеводитель по модам | FAQ

База Данных: YD\YD\MF

Помогая другим, не забывай о себе =) 

Ссылка на комментарий

ну, я про названия, а не глубокие познания... я например с детства перловку не люблю))

я это понял, я имел ввиду что те кто как выразился Mr.Сталин кастрюли чинят,

могли бы и тостеры начать чинить )

Ссылка на комментарий

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...