annotate enum.pm @ 1:4f6952e0af48 default tip

CREST - add crest.loc.sample
author Jim Johnson <jj@umn.edu>
date Wed, 08 Feb 2012 16:08:01 -0600
parents acc8d8bfeb9a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1 package enum;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
2 use strict;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
3 no strict 'refs'; # Let's just make this very clear right off
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
4
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
5 use Carp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
6 use vars qw($VERSION);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
7 $VERSION = do { my @r = (q$Revision: 1.16 $ =~ /\d+/g); sprintf '%d.%03d'.'%02d' x ($#r-1), @r};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
8
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
9 my $Ident = '[^\W_0-9]\w*';
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
10
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
11 sub ENUM () { 1 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
12 sub BITMASK () { 2 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
13
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
14 sub import {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
15 my $class = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
16 @_ or return; # Ignore 'use enum;'
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
17 my $pkg = caller() . '::';
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
18 my $prefix = ''; # default no prefix
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
19 my $index = 0; # default start index
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
20 my $mode = ENUM; # default to enum
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
21
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
22 ## Pragmas should be as fast as they can be, so we inline some
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
23 ## pieces.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
24 foreach (@_) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
25 ## Plain tag is most common case
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
26 if (/^$Ident$/o) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
27 my $n = $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
28
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
29 if ($mode == ENUM) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
30 $index++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
31 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
32 elsif ($mode == BITMASK) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
33 $index ||= 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
34 $index *= 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
35 if ( $index & ($index - 1) ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
36 croak (
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
37 "$index is not a valid single bitmask "
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
38 . " (Maybe you overflowed your system's max int value?)"
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
39 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
40 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
41 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
42 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
43 confess qq(Can't Happen: mode $mode invalid);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
44 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
45
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
46 *{"$pkg$prefix$_"} = sub () { $n };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
47 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
48
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
49 ## Index change
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
50 elsif (/^($Ident)=(-?)(.+)$/o) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
51 my $name= $1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
52 my $neg = $2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
53 $index = $3;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
54
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
55 ## Convert non-decimal numerics to decimal
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
56 if ($index =~ /^0x[\da-f]+$/i) { ## Hex
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
57 $index = hex $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
58 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
59 elsif ($index =~ /^0\d/) { ## Octal
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
60 $index = oct $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
61 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
62 elsif ($index !~ /[^\d_]/) { ## 123_456 notation
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
63 $index =~ s/_//g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
64 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
65
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
66 ## Force numeric context, but only in numeric context
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
67 if ($index =~ /\D/) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
68 $index = "$neg$index";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
69 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
70 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
71 $index = "$neg$index";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
72 $index += 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
73 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
74
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
75 my $n = $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
76
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
77 if ($mode == BITMASK) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
78 ($index & ($index - 1))
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
79 and croak "$index is not a valid single bitmask";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
80 $index *= 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
81 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
82 elsif ($mode == ENUM) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
83 $index++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
84 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
85 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
86 confess qq(Can't Happen: mode $mode invalid);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
87 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
88
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
89 *{"$pkg$prefix$name"} = sub () { $n };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
90 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
91
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
92 ## Prefix/option change
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
93 elsif (/^([A-Z]*):($Ident)?(=?)(-?)(.*)/) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
94 ## Option change
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
95 if ($1) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
96 if ($1 eq 'ENUM') { $mode = ENUM; $index = 0 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
97 elsif ($1 eq 'BITMASK') { $mode = BITMASK; $index = 1 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
98 else { croak qq(Invalid enum option '$1') }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
99 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
100
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
101 my $neg = $4;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
102
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
103 ## Index change too?
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
104 if ($3) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
105 if (length $5) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
106 $index = $5;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
107
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
108 ## Convert non-decimal numerics to decimal
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
109 if ($index =~ /^0x[\da-f]+$/i) { ## Hex
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
110 $index = hex $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
111 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
112 elsif ($index =~ /^0\d/) { ## Oct
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
113 $index = oct $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
114 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
115 elsif ($index !~ /[^\d_]/) { ## 123_456 notation
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
116 $index =~ s/_//g;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
117 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
118
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
119 ## Force numeric context, but only in numeric context
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
120 if ($index =~ /\D/) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
121 $index = "$neg$index";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
122 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
123 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
124 $index = "$neg$index";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
125 $index += 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
126 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
127
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
128 ## Bitmask mode must check index changes
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
129 if ($mode == BITMASK) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
130 ($index & ($index - 1))
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
131 and croak "$index is not a valid single bitmask";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
132 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
133 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
134 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
135 croak qq(No index value defined after "=");
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
136 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
137 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
138
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
139 ## Incase it's a null prefix
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
140 $prefix = defined $2 ? $2 : '';
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
141 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
142
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
143 ## A..Z case magic lists
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
144 elsif (/^($Ident)\.\.($Ident)$/o) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
145 ## Almost never used, so check last
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
146 foreach my $name ("$1" .. "$2") {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
147 my $n = $index;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
148
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
149 if ($mode == BITMASK) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
150 ($index & ($index - 1))
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
151 and croak "$index is not a valid single bitmask";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
152 $index *= 2;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
153 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
154 elsif ($mode == ENUM) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
155 $index++;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
156 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
157 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
158 confess qq(Can't Happen: mode $mode invalid);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
159 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
160
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
161 *{"$pkg$prefix$name"} = sub () { $n };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
162 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
163 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
164
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
165 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
166 croak qq(Can't define "$_" as enum type (name contains invalid characters));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
167 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
168 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
169 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
170
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
171 1;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
172
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
173 __END__
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
174
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
175
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
176 =head1 NAME
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
177
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
178 enum - C style enumerated types and bitmask flags in Perl
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
179
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
180 =head1 SYNOPSIS
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
181
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
182 use enum qw(Sun Mon Tue Wed Thu Fri Sat);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
183 # Sun == 0, Mon == 1, etc
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
184
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
185 use enum qw(Forty=40 FortyOne Five=5 Six Seven);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
186 # Yes, you can change the start indexs at any time as in C
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
187
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
188 use enum qw(:Prefix_ One Two Three);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
189 ## Creates Prefix_One, Prefix_Two, Prefix_Three
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
190
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
191 use enum qw(:Letters_ A..Z);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
192 ## Creates Letters_A, Letters_B, Letters_C, ...
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
193
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
194 use enum qw(
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
195 :Months_=0 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
196 :Days_=0 Sun Mon Tue Wed Thu Fri Sat
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
197 :Letters_=20 A..Z
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
198 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
199 ## Prefixes can be changed mid list and can have index changes too
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
200
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
201 use enum qw(BITMASK:LOCK_ SH EX NB UN);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
202 ## Creates bitmask constants for LOCK_SH == 1, LOCK_EX == 2,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
203 ## LOCK_NB == 4, and LOCK_UN == 8.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
204 ## NOTE: This example is only valid on FreeBSD-2.2.5 however, so don't
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
205 ## actually do this. Import from Fnctl instead.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
206
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
207 =head1 DESCRIPTION
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
208
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
209 Defines a set of symbolic constants with ordered numeric values ala B<C> B<enum> types.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
210
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
211 Now capable of creating creating ordered bitmask constants as well. See the B<BITMASKS>
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
212 section for details.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
213
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
214 What are they good for? Typical uses would be for giving mnemonic names to indexes of
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
215 arrays. Such arrays might be a list of months, days, or a return value index from
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
216 a function such as localtime():
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
217
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
218 use enum qw(
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
219 :Months_=0 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
220 :Days_=0 Sun Mon Tue Wed Thu Fri Sat
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
221 :LC_=0 Sec Min Hour MDay Mon Year WDay YDay Isdst
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
222 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
223
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
224 if ((localtime)[LC_Mon] == Months_Jan) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
225 print "It's January!\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
226 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
227 if ((localtime)[LC_WDay] == Days_Fri) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
228 print "It's Friday!\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
229 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
230
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
231 This not only reads easier, but can also be typo-checked at compile time when
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
232 run under B<use strict>. That is, if you misspell B<Days_Fri> as B<Days_Fry>,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
233 you'll generate a compile error.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
234
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
235 =head1 BITMASKS, bitwise operations, and bitmask option values
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
236
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
237 The B<BITMASK> option allows the easy creation of bitmask constants such as
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
238 functions like flock() and sysopen() use. These are also very useful for your
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
239 own code as they allow you to efficiently store many true/false options within
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
240 a single integer.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
241
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
242 use enum qw(BITMASK: MY_ FOO BAR CAT DOG);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
243
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
244 my $foo = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
245 $foo |= MY_FOO;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
246 $foo |= MY_DOG;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
247
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
248 if ($foo & MY_DOG) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
249 print "foo has the MY_DOG option set\n";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
250 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
251 if ($foo & (MY_BAR | MY_DOG)) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
252 print "foo has either the MY_BAR or MY_DOG option set\n"
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
253 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
254
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
255 $foo ^= MY_DOG; ## Turn MY_DOG option off (set its bit to false)
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
256
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
257 When using bitmasks, remember that you must use the bitwise operators, B<|>, B<&>, B<^>,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
258 and B<~>. If you try to do an operation like C<$foo += MY_DOG;> and the B<MY_DOG> bit
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
259 has already been set, you'll end up setting other bits you probably didn't want to set.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
260 You'll find the documentation for these operators in the B<perlop> manpage.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
261
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
262 You can set a starting index for bitmasks just as you can for normal B<enum> values,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
263 but if the given index isn't a power of 2 it won't resolve to a single bit and therefor
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
264 will generate a compile error. Because of this, whenever you set the B<BITFIELD:>
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
265 directive, the index is automatically set to 1. If you wish to go back to normal B<enum>
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
266 mode, use the B<ENUM:> directive. Similarly to the B<BITFIELD> directive, the B<ENUM:>
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
267 directive resets the index to 0. Here's an example:
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
268
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
269 use enum qw(
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
270 BITMASK:BITS_ FOO BAR CAT DOG
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
271 ENUM: FALSE TRUE
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
272 ENUM: NO YES
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
273 BITMASK: ONE TWO FOUR EIGHT SIX_TEEN
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
274 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
275
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
276 In this case, B<BITS_FOO, BITS_BAR, BITS_CAT, and BITS_DOG> equal 1, 2, 4 and
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
277 8 respectively. B<FALSE and TRUE> equal 0 and 1. B<NO and YES> also equal
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
278 0 and 1. And B<ONE, TWO, FOUR, EIGHT, and SIX_TEEN> equal, you guessed it, 1,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
279 2, 4, 8, and 16.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
280
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
281 =head1 BUGS
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
282
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
283 Enum names can not be the same as method, function, or constant names. This
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
284 is probably a Good Thing[tm].
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
285
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
286 No way (that I know of) to cause compile time errors when one of these enum names get
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
287 redefined. IMHO, there is absolutely no time when redefining a sub is a Good Thing[tm],
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
288 and should be taken out of the language, or at least have a pragma that can cause it
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
289 to be a compile time error.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
290
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
291 Enumerated types are package scoped just like constants, not block scoped as some
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
292 other pragma modules are.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
293
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
294 It supports A..Z nonsense. Can anyone give me a Real World[tm] reason why anyone would
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
295 ever use this feature...?
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
296
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
297 =head1 HISTORY
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
298
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
299 $Log: enum.pm,v $
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
300 Revision 1.16 1999/05/27 16:00:35 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
301
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
302
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
303 Fixed bug that caused bitwise operators to treat enum types as strings
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
304 instead of numbers.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
305
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
306 Revision 1.15 1999/05/27 15:51:27 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
307
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
308
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
309 Add support for negative values.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
310
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
311 Added stricter hex value checks.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
312
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
313 Revision 1.14 1999/05/13 15:58:18 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
314
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
315
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
316 Fixed bug in hex index code that broke on 0xA.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
317
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
318 Revision 1.13 1999/05/13 10:52:30 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
319
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
320
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
321 Fixed auto-index bugs in new non-decimal numeric support.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
322
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
323 Revision 1.12 1999/05/13 10:00:45 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
324
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
325
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
326 Added support for non-decimal numeric representations ala 0x123, 0644, and
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
327 123_456.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
328
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
329 First version committed to CVS.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
330
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
331
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
332 Revision 1.11 1998/07/18 17:53:05 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
333 -Added BITMASK and ENUM directives.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
334 -Revamped documentation.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
335
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
336 Revision 1.10 1998/06/12 20:12:50 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
337 -Removed test code
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
338 -Released to CPAN
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
339
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
340 Revision 1.9 1998/06/12 00:21:00 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
341 -Fixed -w warning when a null tag is used
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
342
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
343 Revision 1.8 1998/06/11 23:04:53 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
344 -Fixed documentation bugs
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
345 -Moved A..Z case to last as it's not going to be used
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
346 as much as the other cases.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
347
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
348 Revision 1.7 1998/06/10 12:25:04 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
349 -Changed interface to match original design by Tom Phoenix
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
350 as implemented in an early version of enum.pm by Benjamin Holzman.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
351 -Changed tag syntax to not require the 'PREFIX' string of Tom's
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
352 interface.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
353 -Allow multiple prefix tags to be used at any point.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
354 -Allowed index value changes from tags.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
355
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
356 Revision 1.6 1998/06/10 03:37:57 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
357 -Fixed superfulous -w warning
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
358
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
359 Revision 1.4 1998/06/10 01:07:03 byron
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
360 -Changed behaver to closer resemble C enum types
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
361 -Changed docs to match new behaver
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
362
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
363 =head1 AUTHOR
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
364
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
365 Zenin <zenin@archive.rhps.org>
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
366
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
367 aka Byron Brummer <byron@omix.com>.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
368
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
369 Based off of the B<constant> module by Tom Phoenix.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
370
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
371 Original implementation of an interface of Tom Phoenix's
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
372 design by Benjamin Holzman, for which we borrow the basic
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
373 parse algorithm layout.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
374
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
375 =head1 COPYRIGHT
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
376
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
377 Copyright 1998 (c) Byron Brummer.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
378 Copyright 1998 (c) OMIX, Inc.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
379
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
380 Permission to use, modify, and redistribute this module granted under
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
381 the same terms as B<Perl>.
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
382
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
383 =head1 SEE ALSO
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
384
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
385 constant(3), perl(1).
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
386
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
387 =cut