[devel] Re: Q: split source files

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пт Мар 11 19:13:39 MSK 2005


On Fri, Mar 11, 2005 at 05:53:54PM +0300, Alexey Tourbin wrote:
> Как из файла вырезать все куски, ограниченные `#ifdef HAVE_SMPEG'
> и `#endif'?  И записать их в другой файл, а в первом файле чтобы
> их осталось.  Есть вложенные ifdef'ы.  Файл называется
> SDL_Perl-2.1.2/src/SDL.xs.

А чо-то говорят UNIX для обработки текстов хорошо приспособлен...
Нарисовал grep_ifdef, кое-как работает, мне пока хватает.
Кому интересно -- нужно подумать, что делать с #else.

$ wc -l src/SDL.xs
4188 src/SDL.xs
$ grep_ifdef HAVE_SMPEG src/SDL.xs |wc -l
280
$ grep_ifdef -v HAVE_SMPEG src/SDL.xs |wc -l
3908
$
----------- следующая часть -----------
#!/usr/bin/perl

use 5.006;
use strict;

sub usage ($) {
	require Pod::Usage;
	my $rv = shift;
	Pod::Usage::pod2usage(
		-message => "extract #ifdef'ed chunks from C sources",
		-output => $rv ? \*STDERR : \*STDOUT,
		-exitval => $rv,
		-verbose => 1,
	);
}	

use Getopt::Long qw(GetOptions);
GetOptions "help" => \my $opt_help, "v"	=> \my $opt_v
	or usage 2;
usage 0 if $opt_help;
usage 1 unless @ARGV;
my $SYM = shift;

my $in;
while (<>) {
	undef $in if eof;
	/^#\s*ifdef\s+\Q$SYM/ and $in ||= 1
		or $in and /^#\s*if/ and ++$in;
	print if !!$in ^ !!$opt_v;
	$in and /^#\s*end/ and --$in;
}

__END__

=head1	NAME

grep_ifdef

=head1	SYNOPSIS

B<grep_ifdef> [B<-v>] B<SYMBOL> [I<file>]...

=head1	DESCRIPTION

This script extracts chunks from C source files delimited
by #if/#ifdef and #endif CPP directives.

=head1	OPTIONS

=item	B<-v>

Invert the sense of matching, to select non-matching chunks.

=head1	AUTHOR

Written by Alexey Tourbin <at на altlinux.org>.

=head1	COPYING

Copyright (c) 2005 Alexey Tourbin.

This is free software; you can redistribute it and/or modify it under
the terms of the GNU Library General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20050311/71066a67/attachment-0001.bin>


Подробная информация о списке рассылки Devel