Memory *1

Сегодня понадобилась программа которая выдернет из лога определённую строчку или несколько строк. Конечно я полез искать grep у себя на компьютере. И тогда я вспомнил, что ещё на заре цивилизации писал простенькую программку именно для таких целей.

В те стародавние времена я был фидошником (пользователем некоммерческой сети fido) и активно пользовался одной из наших городских ББС – ROVS BBS, для которой собрал из нескольких программ пакет (опишу об этом в одном из Memory *), а одну из них пришлось довольно долго исправлять и дописывать. Тогда я C/C++ вообще не знал, хотя и сегодня я его тоже не знаю :)

Собственно память меня не подвела и я быстро нашёл рабочий файл finder.exe именно там, где его тогда и использовал. Запустил и получил однозначный ответ в консольном окне, мол – «нет строчки для поиска» (ес-но на EN языке). Глянув внутрь файла не нашёл возможные используемые ключи для поиска и задался целью найти исходник. Конечно первым делом я начал свои поиски с переписки на ROVS BBS. Быстрым движением обоих рук и прикладной программой Total Commander обнаружил файл где имеется упоминание finder. На всё ушло не более 10 минут, но каково вспомнить историю из жизни более 4-ох летней давности.

Вот то самое письмо сохранённое средствами GoldEd из пакета GoldBlue написанного специально для ROVS BBS

= rovs.public (2:5057/69.2) ===================================================
Msg  : 18608 of 45747                      Snt Loc
From : Alexander Fedorov                   2:5057/21.950   18 Сен 04 11:35:56
To   : Topper Harley
Subj : http://www.knhp.ru/cgi-bin/forum/forum.php
===============================================================================
Привет *Topper*

18 Сен 04 09:30, */Topper Harley/* ·•-> */Alex Fedorov/*

TH>  *[цитата сокращена]*
SK>>> пpавило, на массового пользователя.
AF>> гады 8(
AF>> вот сидел я пару дней и писал малюсенькую прогу (консольную) на
AF>> паскале. Описывал тут уже. вот я море удовольствия получил – кайФ!
TH> Когда мы ее увидим?
на, зырь на это чудовище ;) ))))

/===/ Hачало finder.pas /===/
uses sysutils;

{—Функция LowwerCase с поддержкой руского языка для OEM (DOS) кодировки—}

function CSf ( inStr: string ): string;

var
i: integer;

begin
for i := 1 to length( inStr ) do
begin
case ord( inStr[i] ) of
65..90,128..143 : inStr[i] := chr( ord( inStr[i] ) + 32);
144..159 : inStr[i] := chr( ord( inStr[i] ) + 80 );
240 : inStr[i] := chr( ord( inStr[i] ) + 1 );
end;
end;
CSf := inStr;
end;

{————–Функция перекодировки ANSI (Win)->OEM (DOS)——————}

> эту функцию я честно спиздил, точнее мне её рекомендовали впихнуть в
> исходники торнады, чтоб решить один их её багов. Hу я ей и тут применение
> нашёл.

function Win2Dos ( inStr: String ): String;

var
i: integer;

begin
for i := 1 to length( inStr ) do
begin
case ord( inStr[i] ) of
192..239 : inStr[i] := chr( ord( inStr[i] ) – 64 );
240..255 : inStr[i] := chr( ord( inStr[i] ) – 16 );
end;
end;
Win2Dos := inStr;
end;

{————————————main———————————–}

var
i, n:     integer;
fi, fo:   text;
s, s1, p: string;
wd, cs:   boolean;

begin
n := 1;
if paramCount > 0 Then
begin

if ( LowerCase( paramStr(1) ) = ‘-d’ ) or ( LowerCase( paramStr(2) ) = ‘-d’
) then
begin
wd := true;
n := n + 1;
writeln( ‘inpit file with OEM charset’ );
end;

if ( LowerCase( paramStr(1) ) = ‘-c’ ) or ( LowerCase( paramStr(2) ) = ‘-c’
) then
begin
cs := true;
n := n + 1;
writeln( ‘search without case-sensitivity’ );
end;

if paramCount < (n + 2) then
begin
writeln( ‘no string(s) for search’ );
exit;
end;

if not FileExists( paramStr(n) ) then
begin
writeln( ‘input file not found’ );
exit;
end;

assign( fi, paramStr(n) );
assign( fo, paramStr(n + 1) );
rewrite( fo );
{$I-}
reset( fi );
reset( fo );
{$I+}

if IOResult = 0 then
begin
Append( fo );
while not EOF( fi ) do

begin
readln( fi,s );
for i := (n + 2) to paramCount do

begin
p := paramStr( i );
if cs = true then

begin
p := CSf( p );
s1 := CSf( s );
end;

if wd = true then
p := Win2Dos( p );

if ( Pos(p, s) > 0 ) or ( (cs = true) and ( Pos(p, s1) > 0 ) ) then
Writeln( fo, s );
end;
end;
end;

Close( fi );
Close( fo );
end
else
begin
writeln( ‘The Finder version 0.5.Win32/16.09.2004′ );
writeln( ‘deeF Copyright (C) 2003-2004 (2:5057/18.220@FidoNet)’ );
writeln( ‘Alexander Fedorov aka repeat’ );
writeln( » );
writeln( ‘Search in first file string(s) and place it into second file’ );
writeln( » );
writeln( ‘ Syntax: finder [options] in_file out_file str1 [Str2 Str3 ...]‘
);
writeln( ‘ Options:’ );
writeln( ‘   -C            – search without case-sensitivity’ );
writeln( ‘   -D            – in_file in OEM charset’ );
writeln( » );
end;
end.
/===/ Конец finder.pas /===/

… [GoldBlue] = [GoldEd 1.1.5-040120] + [hpt 1.4-sta] + [Surf/Blue 0.12b]
— [deeF BBS] Working: 23:30-08:00 (xxxx) xx-xx-xx (2:5057/18.220)

Leave a Reply