maketar.pl
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:2k
源码类别:

Windows CE

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # Yes, I know about Archive::Tar. No, I don't want to use it here.
  3. use strict;
  4. my $dir_time;
  5. my $top_input_dir = '';
  6. my $top_tar_dir;
  7. sub write_entry($$$$$) {
  8. my ($filename, $data, $type, $mode, $mtime) = @_;
  9. my $header = pack 'a100a8a8a8a12a12',
  10. $top_tar_dir . $filename,
  11. '0000' . $mode, '0000000', '0000000',
  12. sprintf('%011o', length($data)), sprintf('%011o', $mtime);
  13. print $header;
  14. printf '%06o', 256 + 48 + $type + unpack '%16C*', $header;
  15. print " ", $type, v0 x 355, $data, v0 x (-length($data) & 511);
  16. }
  17. sub write_dir($$) {
  18. my ($sub_dir, $r) = @_;
  19. write_entry($sub_dir, '', 5, '755', $dir_time);
  20. for (grep !ref($r->{$_}), sort keys %$r) {
  21. my $filename = "$top_input_dir$sub_dir$_";
  22. my $type = $r->{$_};
  23. my $data;
  24. my $mtime;
  25. open INPUT, $filename
  26. and binmode INPUT
  27. and read INPUT, $data, 1_000_000
  28. and $mtime = (stat INPUT)[9]
  29. and close INPUT
  30. or die "maketar.pl: $filename: $!n";
  31. $data =~ s/rn/n/g if $type =~ y/ts//;
  32. write_entry($sub_dir . $_, $data, 0, $type =~ y/sx// ? '755' : '644', $mtime);
  33. }
  34. for (grep ref($r->{$_}), sort keys %$r) {
  35. write_dir("$sub_dir$_/", $r->{$_});
  36. }
  37. }
  38. if (@ARGV < 4 || $ARGV[0] ne '-d' || $ARGV[2] !~ /^-[tbsx]$/) {
  39. die "Usage: perl maketar.pl -d dir_in_tar -t text_files -b binary_files -s executable_text_files -x executable_binary_filesn";
  40. }
  41. shift;
  42. $top_tar_dir = shift() . '/';
  43. my $type;
  44. my %input;
  45. for (@ARGV) {
  46. if (/^-([tbsx])$/) {
  47. $type = $1;
  48. next;
  49. }
  50. $type or die "maketar.pl: $_: Unspecified file typen";
  51. my $r = %input;
  52. $r = %{$r->{$1}} while m!(.+?)[/\]!gc;
  53. /(.+)/g;
  54. $r->{$1} = $type;
  55. }
  56. my $r = %input;
  57. while (%$r == 1) {
  58. my ($k) = keys %$r;
  59. ref($r->{$k}) or last;
  60. $top_input_dir .= "$k/";
  61. $r = $r->{$k};
  62. }
  63. $dir_time = (stat '.')[9] or die "maketar.pl: Cannot stat '.'n";
  64. binmode STDOUT;
  65. write_dir('', $r);
  66. print "" x 1024;