/[suikacvs]/markup/html/html5/spec-ja/common.pl
Suika

Diff of /markup/html/html5/spec-ja/common.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by wakaba, Sun Aug 10 06:15:00 2008 UTC revision 1.10 by wakaba, Sun Oct 26 07:08:12 2008 UTC
# Line 2  use strict; Line 2  use strict;
2    
3  my $data_suffix = q[.dat];  my $data_suffix = q[.dat];
4  my $data_dir_name = q[data/];  my $data_dir_name = q[data/];
5    my $data2_dir_name = q[data2/];
6    my $data2_suffix = q[.dat];
7    my $lock_suffix = q[.lock];
8    my $fallback_file_name = $data2_dir_name . 'fallback' . $data2_suffix;
9    
10    our $UseCVS //= 1;
11    
12  sub normalize ($) {  sub normalize ($) {
13    my $s = shift;    my $s = shift;
# Line 11  sub normalize ($) { Line 17  sub normalize ($) {
17    return $s;    return $s;
18  } # normalize  } # normalize
19    
20    sub get_hash ($) {
21      require Digest::MD5;
22      return Digest::MD5::md5_hex (normalize ($_[0]));
23    } # get_hash
24    
25  sub create_pattern1 ($) {  sub create_pattern1 ($) {
26    my $s = quotemeta shift;    my $s = quotemeta shift;
27    $s =~ s/\\\*/(.+)/g;    $s =~ s/\\\*/(.+)/g;
# Line 55  sub for_each_data_file ($) { Line 66  sub for_each_data_file ($) {
66    }    }
67  } # for_each_data_file  } # for_each_data_file
68    
69    sub read_data_file ($) {
70      my $file_name = shift;
71      if (-f $file_name) {
72        warn "Loading $file_name...\n";
73        return do $file_name;
74      } else {
75        warn "File $file_name not found\n";
76        return {};
77      }
78    } # read_data_file
79    
80    sub write_data_file ($$) {
81      my ($file_name, $data) = @_;
82    
83      require Data::Dumper;
84      local $Data::Dumper::Sortkeys = 1;
85    
86      my $had_file = -f $file_name;
87      open my $file, '>:encoding(utf8)', $file_name or die "$0: $file_name: $!";
88      print $file Data::Dumper::Dumper ($data);
89      close $file;
90      unless ($had_file) {
91        system_ ('cvs', 'add', $file_name) if $UseCVS;
92      }
93    } # write_data_file
94    
95    sub hash_to_file_name ($) {
96      return $data2_dir_name . substr ($_[0], 0, 2) . $data2_suffix;
97    } # hash_to_file_name
98    
99    my $Entry = {};
100    
101    sub get_entry ($) {
102      my $hash = shift;
103      
104      my $file_name = hash_to_file_name ($hash);
105      unless ($Entry->{$file_name}) {
106        $Entry->{$file_name} = read_data_file ($file_name);
107      }
108      
109      if ($Entry->{$file_name}->{exact}->{$hash}) {
110        return (0, $Entry->{$file_name}->{exact}->{$hash});
111      } elsif ($Entry->{$file_name}->{pattern}->{$hash}) {
112        return (1, $Entry->{$file_name}->{pattern}->{$hash});
113      } else {
114        return (undef, undef);
115      }
116    } # get_entry
117    
118    sub set_entry ($$$) {
119      my ($hash, $is_pattern, $value) = @_;
120      
121      my $file_name = hash_to_file_name ($hash);
122      unless ($Entry->{$file_name}) {
123        $Entry->{$file_name} = read_data_file ($file_name);    
124      }
125    
126      unless ($value) {
127        delete $Entry->{$file_name}->{exact}->{$hash};
128        delete $Entry->{$file_name}->{pattern}->{$hash};
129      } elsif ($is_pattern) {
130        delete $Entry->{$file_name}->{exact}->{$hash};
131        $Entry->{$file_name}->{pattern}->{$hash} = $value;
132      } else {
133        $Entry->{$file_name}->{exact}->{$hash} = $value;
134        delete $Entry->{$file_name}->{pattern}->{$hash};
135      }
136      $Entry->{$file_name}->{modified} = 1;
137    } # set_entry
138    
139    use Fcntl ':flock';
140    my $Lock;
141    
142    sub lock_entry ($) {
143      if ($Lock) {
144        die "$0: lock_entry: Another entry is locked";
145      }
146    
147      my $hash = shift;
148      my $file_name = hash_to_file_name ($hash) . $lock_suffix;
149      open $Lock, '>', $file_name or die "$0: $file_name: $!";
150      flock $Lock, LOCK_EX;
151    } # lock_entry
152    
153    sub commit_entries ($) {
154      for my $file_name (keys %{$Entry}) {
155        if ($Entry->{$file_name}->{modified}) {
156          write_data_file ($file_name => $Entry->{$file_name});
157        }
158      }
159    
160      my $msg = shift // $0;
161      system_ ('cvs', 'commit', -m => $msg, $data2_dir_name) if $UseCVS;
162    } # commit_entries
163    
164    sub get_all_entries () {
165      opendir my $dir, $data2_dir_name or die "$0: $data2_dir_name: $!";
166      for (readdir $dir) {
167        next unless /\Q$data2_suffix\E$/;
168        my $file_name = $data2_dir_name . $_;
169        next if $Entry->{$file_name};
170    
171        $Entry->{$file_name} = read_data_file ($file_name);
172      }
173    
174      return $Entry;
175    } # get_all_entries
176    
177    my $FallbackEntry;
178    sub get_fallback_entry ($) {
179      my $hash = shift;
180      unless (defined $FallbackEntry) {
181        $FallbackEntry = read_data_file ($fallback_file_name);
182      }
183      return $FallbackEntry->{$hash} // {};
184    } # get_fallback_entry
185    
186    sub set_fallback_entry ($$) {
187      my ($hash, $value) = @_;
188      unless (defined $FallbackEntry) {
189        $FallbackEntry = read_data_file ($fallback_file_name);
190      }
191      $FallbackEntry->{$hash} = $value;
192    } # set_fallback_entry
193    
194    sub clear_fallback_entries () {
195      $FallbackEntry = {};
196    } # clear_fallback_entries
197    
198    sub save_fallback_entries () {
199      write_data_file ($fallback_file_name => $FallbackEntry)
200          if defined $FallbackEntry;
201    } # save_fallback_entries
202    
203    sub htescape ($) {
204      my $s = shift;
205      $s =~ s/&/&/g;
206      $s =~ s/</&lt;/g;
207      $s =~ s/"/&quot;/g;
208      return $s;
209    } # htescape
210    
211    sub system_ (@) {
212      (system join (' ', map {quotemeta $_} @_) . " > /dev/null") == 0
213          or die "$0: $?";
214    } # system_
215    
216  1;  1;
217    

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.10

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24