Не завалялось ли у кого-нибудь такого макроса... Есть дериктива file, которая напрямую втыкает бинарник в exe-шник. В моем случае это текстовый файл. Мне надо чтобы символы окончания строки были заменены нулями, тоесть текст втыкается напрямую, а последовательность 0Dh, 0Ah заменялась одним нулем. Есть ли у кого-нибудь такая штука, или хотя бы похожая, чтобы можно было переписать на основе существующей, т.к. с макроязыком fasm-а я не особо дружу
Зачем из пушки по воробьям стрелять? 1. заменить 0Dh, 0Ah одним нулём. 2. вкличить полученный файл простым file. Поскольку пёрла у тя нет, вот jscript, который выполнит первый пункт (имена текстовых файлов берутся из параметров командной строки) Код (Text): // 0D0A_2_00.js fso = WScript.CreateObject('Scripting.FileSystemObject'); for( names = new Enumerator(WScript.Arguments); !names.atEnd(); names.moveNext() ) { filename = names.item(); if( fso.FileExists(filename) ) { content = fso.OpenTextFile(filename).ReadAll(); fso.CreateTextFile(filename, true).Write(content.replace(/\r\n/g, '\0')); } }
S_T_A_S_ Первый пункт отдельно ничего не решает. Я бы и на сях мог его написать. Хотелось бы чтобы на этапе компиляции проги файлы подключенные через какую-нить собственную директиву, скажем file_da2z, сразу бы парсились и впихивались в exe-шник, при этом на винте естественно оставаясь без изменений. Вот как это сделать?
_DEN_ > ну и написал бы свой препроцессор, если RTFM религия не позволяет Код (Text): macro file_da2z filename { local .size, .2char, .pos virtual at 0 file filename .size = $ end virtual .pos = 0 repeat .size if .pos < .size - 1 virtual file filename: .pos, 2 load .2char word from $-2 end virtual if .2char = 0x0A0D db 0 .pos = .pos + 2 else db .2char and 0xFF .pos = .pos + 1 end if end if end repeat } file_da2z "foo.txt" если файл не заканчивается на "0Dh, 0Ah", то последний байт будет утерян может ещё какие баги есть =)
Я бы не заморачивался макросами в fasm а использовал бы perl Код (Text): #!/usr/bin/perl -w foreach $f (<*.txt>) { open(IN, "$f") or die "Can't open file: $!"; open(OUT, "+>_$f") or die "Can't open file out.html for writing: $!"; while(<IN>) { s/\n/\0/g; print OUT $_; } close(OUT); close(IN); }
Asterix Мне это именно как директива препроцессора нужна. Чтобы сделал и забыл. Т.к. txt-файлы постоянно редактируются и прога постоянно перекомпилируется решает только макрос. S_T_A_S_ если файл не заканчивается на "0Dh, 0Ah", то последний байт будет утерян может ещё какие баги есть =) Дописал твой макрос. Теперь можно заканчивать символами 0Dh, 0Ah, а можно и не заканчивать Код (Text): macro file_da2z filename { local .size, .2char, .pos virtual at 0 file filename .size = $ end virtual .pos = 0 repeat .size if .pos < .size - 1 virtual file filename: .pos, 2 load .2char word from $-2 end virtual if .2char = 0x0A0D db 0 .pos = .pos + 2 else db .2char and 0xFF .pos = .pos + 1 end if end if end repeat if .2char <> 0x0A0D db .2char/256 db 0 end if } Вот только db .2char/256 мне не особо нравится. Можно как-то проще взять старший байт?
_DEN_ > Можно ещё компилировать скриптом, т.е. скрипт сначала конвертит текст, а потом запускает fasm. > Конечно можно Код (Text): db .2char shr 8 ;-)
S_T_A_S_ Ага, еще бы и в RadASM все это встроить Всплыла еще одна бага. Если в последней строке всего один символ и она не заканчивается 0Dh,0Ah, то этот самый символ проглатывается
S_T_A_S_ Пофиксил Конечный вариант: Код (Text): macro file_da2z filename { local .size, .2char, .pos virtual at 0 file filename .size = $ end virtual .pos = 0 repeat .size if .pos < .size - 1 virtual file filename: .pos, 2 load .2char word from $-2 end virtual if .2char = 0x0A0D db 0 .pos = .pos + 2 else db .2char and 0xFF .pos = .pos + 1 end if end if end repeat if .2char <> 0x0A0D db .2char shr 8 db 0 else virtual file filename: .size-2, 2 load .2char word from $-2 end virtual if .2char and 0xFF = 0x0A db .2char shr 8 db 0 end if end if } Не слишком криво?
_DEN_ Можно сделать короче Код (Text): macro file_da2z filename { local .size, .char, .pos, .lastc virtual at 0 file filename .size = $ end virtual .lastc = 0 .pos = 0 repeat .size virtual file filename: .pos, 1 load .char byte from $-1 end virtual if .char = 0x0A if .lastc = 0x0D db 0 end if else if .char <> 0x0D db .char end if .lastc = .char .pos = .pos + 1 end repeat if .char <> 0x0A db 0 end if }
Black_mirror Да, все работает, спасибо Вас Родина тоже не забудет! В связи с последним постом шутка родилась: Только ассемблерщики могут соревноваться "у кого короче" ))
Хм, даже на служебном компютре если файл большой, ети макросы слишком медленные. Я тестил на "equates/user32.inc" и оно компилилось 7 секунд на 2.5GHz ЦПУ. А нельзя ли так: Код (Text): macro file_da2z filename { local ..size, ..data ..data file filename ..size = $ - ..data ..index = ..data repeat ..size load ..char byte from ..index if (..char = $0d) | (..char = $0a) store 0 at ..index else store ..char at ..index end if ..index = ..index + 1 end repeat } Недостаток, что символы $0а не будут вырезаться из файла.
johnfound Это наверно связано с количеством проходов, я получил 5 секунд при трёх проходах на AMD1.2GHz, но в программе кроме моей версии макроса обрабатывающего user32.inc(у меня он 41К весит) практически ничего больше не было.