ploticusЕсть такая программа, предназначенная для создания графиков различных видов из командной строки, называется ploticus. Программа сама по себе достаточно удобная --- потому что иногда очень полезно автоматизировать генерацию различных графических отчетов, а тут без командной строки и вызова программ из скриптов не обойтись. Нет, таких программ великое множество, но ploticus отличается от них, как это мне сегодня объяснили, очень удобным преимуществом: он "глупый". То есть, его можно, например, заставить разместить надпись на рисунке с точностью до пикселя... иногда это нужно. Но разговор не об удобстве этой программы. Просто "нам" (в смысле, конторе, где я сейчас работаю), потребовалось нечто подобное. Было решено использовать ploticus, но при этом немного доработанный напильником. Программист, который этим напильником орудовал, сегодня пребывал в особенно веселом настроении... почему --- ниже. Сначала немного лирики. Ploticus, для того, что бы построить график, читает некоторый файл, в котором находится определение этого самого графика (скрипт, так сказать). Этот файл обладает очень простой грамматикой. Мало того, ploticus умеет организовывать программный канал (хотя, кто этого не умеет?) и читать данные оттуда, как результат выполнения другой программы. Так вот о чтении этого файла я и хочу немного рассказать. Просто, программиста, который занимается работой с ploticus'ом, настолько поразила организация этого "счастья", что он сегодня к концу рабочего дня был уже совсем "не в себе" и занимался тем, что показывал избранные куски кода проходящим мимо людям. Итак, подпрограммы чтения данных в ploticus разбиты на некоторые логические блоки, исходя из структуры самого файла с данными. Ну это понятно и логично. Не особенно понятно другое: каждая подпрограмма (парсер) на вход воспринимает название файла, в котором находится содержимое. В итоге, основная подпрограмма сначала разбивает файл на блоки, содержимое этих файлов копирует (!) во временные файлы (!!), которые подсовывает на вход другим подпрограммам. Это, конечно, уже достаточно оригинально, хотя задумка автора ясна --- он хотел сделать так, что бы в этих местах на вход подпрограммам чтения данных можно было бы подсунуть имя программы, которая эти данные бы сгенерировала. Тем не менее, можно было бы сделать значительно красивее, чем создавать кучу временных текстовых файлов. Эти "подпарсеры" реализованы... аналогичным образом. Т.е., автор не смущаясь разбивает подсунутые файлы еще на кусочки и записывает их в другие временные файлы, которые потом читает. В принципе, все эти места как раз и требовали вмешательства напильника, потому что хотелось иметь программный интерфейс ко всему этому хозяйству и, желательно, что бы данные не покидали оперативной памяти. Все написанное выше уже смешно. Но кусочек кода, который я сейчас приведу, довел программиста до истерического смеха. Вот он (с купюрами):
/*
* ...
*/
else if( stricmp( attr, "data" )==0 ) {
FILE *tfp;
sprintf( datafile, "%s_D", Tmpname );
getmultiline( "data", lineval, fp, MAXBIGBUF, Bigbuf );
tfp = fopen( datafile, "w" );
if( tfp == NULL ) return( Eerr( 294, "Cannot open tmp data file", datafile ));
fprintf( tfp, "%s", Bigbuf );
fclose( tfp );
}
/*
* ...
*/
Это как раз и есть выделение секции с данными и запись ее во временный файл. Вообще, использование
/*
* ...
*/
if( standardinput || strcmp( datafile, "-" ) ==0 )
{ /* a file of "-" means read from stdin */
dfp = stdin;
goto PT1;
}
if( strlen( datafile ) > 0 ) sprintf( command, "cat %s", datafile );
if( strlen( command ) > 0 ) {
dfp = popen( command, "r" );
if( dfp == NULL ) {
Skipout = 1;
return( Eerr( 401, "Cannot open", command ) );
}
PT1:
/*
* ...
*/
Прошу обратить внимание на строчку: if( strlen( datafile ) > 0 ) sprintf( command, "cat %s", datafile ); и следующую за ней dfp = popen( command, "r" );
Честно говоря, это впечатляет. Очень впечатляет... при этом, совершено не понятно что
мешало использовать обычный dfp = stdin; goto PT1;
В общем, дикость. Если кто-то не понял, то объясняю то, что происходит,
на пальцах: читается секция "data" и ее содержимое записывается в файл,
название которого содержится в Вам это не смешно? РезюмеИногда лучше всего не заглядывать внутрь используемых программ... что бы не расстраиваться.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
© 2000-2008, Andrey L. Kalinin mailto:andrey@kalinin.ru |
|