3 require "readvaluesfile.pl";
8 %no_xname = (RELATED=>1,RANGE=>1,RSVP=>1,XLICERRORTYPE=>1,XLICCOMPARETYPE=>1);
10 %params = read_parameters_file($ARGV[0]);
13 # Write the file inline by copying everything before a demarcation
14 # line, and putting the generated data after the demarcation
18 open(IN,$opt_i) || die "Can't open input file $opt_i";
21 if (/<insert_code_here>/){
22 $autogenMsg = "of section of machine generated code (mkderivedparameters.pl). Do not edit.";
30 print $startComment." START ".$autogenMsg.$endComment."\n\n";
34 print $startComment." END ".$autogenMsg.$endComment."\n\n";
46 # Write parameter enumerations and datatypes
49 my $enumConst = $params{'ANY'}->{"kindEnum"};
50 print "typedef enum icalparameter_kind {\n ICAL_ANY_PARAMETER = ".$enumConst.",\n";
52 foreach $param (sort keys %params) {
56 next if $param eq 'NO' or $param eq 'ANY';
58 my $uc = join("",map {uc($_);} split(/-/,$param));
60 $enumConst = $params{$param}->{"kindEnum"};
62 print " ICAL_${uc}_PARAMETER = ".$enumConst.", \n";
65 $enumConst = $params{'NO'}->{"kindEnum"};
66 print " ICAL_NO_PARAMETER = ".$enumConst."\n} icalparameter_kind;\n\n";
68 # Now create enumerations for parameter values
71 print "#define ICALPARAMETER_FIRST_ENUM $idx\n\n";
73 foreach $param (sort keys %params) {
77 next if $param eq 'NO' or $param eq 'ANY';
79 my $type = $params{$param}->{"C"};
80 my $ucv = join("",map {uc(lc($_));} split(/-/,$param));
81 my @enums = @{$params{$param}->{'enums'}};
85 print "typedef enum $type {\n";
99 my $uce = join("",map {uc(lc($_));} split(/-/,$e));
101 print " ICAL_${ucv}_${uce} = $idx";
105 $c_type =~ s/enum //;
107 print "\n} $type;\n\n";
111 print "#define ICALPARAMETER_LAST_ENUM $idx\n\n";
118 # Create the icalparameter_value to icalvalue_kind conversion table
122 foreach $enum (@{$params{'VALUE'}->{'enums'}}){
123 next if $enum eq 'NO' or $enum eq 'ERROR';
124 $uc = join("",map {uc(lc($_));} split(/-/,$enum));
125 $out.=" {ICAL_VALUE_${uc},ICAL_${uc}_VALUE},\n";
130 print "static const struct icalparameter_value_kind_map value_kind_map[$count] = {\n";
132 print " {ICAL_VALUE_X,ICAL_X_VALUE},\n";
133 print " {ICAL_VALUE_NONE,ICAL_NO_VALUE}\n};\n\n";
135 #Create the parameter Name map
139 foreach $param (sort keys %params) {
143 next if $param eq 'NO' or $param eq 'ANY';
145 my $lc = join("",map {lc($_);} split(/-/,$param));
146 my $uc = join("",map {uc(lc($_));} split(/-/,$param));
149 $out.=" {ICAL_${uc}_PARAMETER,\"$param\"},\n";
153 print "static const struct icalparameter_kind_map parameter_map[$count] = { \n";
155 print " { ICAL_NO_PARAMETER, \"\"}\n};\n\n";
157 # Create the parameter value map
160 foreach $param (sort keys %params) {
164 next if $param eq 'NO' or $param eq 'ANY';
166 my $type = $params{$param}->{"C"};
167 my $uc = join("",map {uc(lc($_));} split(/-/,$param));
168 my @enums = @{$params{$param}->{'enums'}};
173 my $uce = join("",map {uc(lc($_));} split(/-/,$e));
176 $out.=" {ICAL_${uc}_PARAMETER,ICAL_${uc}_${uce},\"$e\"},\n";
183 print "static const struct icalparameter_map icalparameter_map[] = {\n";
184 print "{ICAL_ANY_PARAMETER,0,\"\"},\n";
186 print " {ICAL_NO_PARAMETER,0,\"\"}};\n\n";
190 foreach $param (sort keys %params){
192 next if $param eq 'NO' or $param eq 'ANY';
194 my $type = $params{$param}->{'C'};
196 my $ucf = join("",map {ucfirst(lc($_));} split(/-/,$param));
207 if ($type=~/char/ ) {
209 $charorenum = " icalerror_check_arg_rz( (param!=0), \"param\");\n return param->string;";
211 $set_code = "((struct icalparameter_impl*)param)->string = icalmemory_strdup(v);";
213 $pointer_check = "icalerror_check_arg_rz( (v!=0),\"v\");";
214 $pointer_check_v = "icalerror_check_arg_rv( (v!=0),\"v\");";
218 $xrange =" if (param->string != 0){\n return ICAL_${uc}_X;\n }\n" if !exists $no_xname{$uc};
220 $charorenum= "icalerror_check_arg( (param!=0), \"param\");\n$xrange\nreturn ($type)(param->data);";
222 $pointer_check = "icalerror_check_arg_rz(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rz(v < ICAL_${uc}_NONE,\"v\");";
224 $pointer_check_v = "icalerror_check_arg_rv(v >= ICAL_${uc}_X,\"v\");\n icalerror_check_arg_rv(v < ICAL_${uc}_NONE,\"v\");";
226 $set_code = "((struct icalparameter_impl*)param)->data = (int)v;";
236 icalparameter* icalparameter_new_${lc}($type v)
238 struct icalparameter_impl *impl;
239 icalerror_clear_errno();
241 impl = icalparameter_new_impl(ICAL_${uc}_PARAMETER);
246 icalparameter_set_${lc}((icalparameter*) impl,v);
247 if (icalerrno != ICAL_NO_ERROR) {
248 icalparameter_free((icalparameter*) impl);
252 return (icalparameter*) impl;
255 ${type} icalparameter_get_${lc}(const icalparameter* param)
257 icalerror_clear_errno();
261 void icalparameter_set_${lc}(icalparameter* param, ${type} v)
264 icalerror_check_arg_rv( (param!=0), "param");
265 icalerror_clear_errno();
267 if (param->string != NULL)
268 free (param->string);
278 icalparameter* icalparameter_new_${lc}($type v);
279 ${type} icalparameter_get_${lc}(const icalparameter* value);
280 void icalparameter_set_${lc}(icalparameter* value, ${type} v);
292 package Net::ICal::Parameter::${ucf};
293 \@ISA=qw(Net::ICal::Parameter);
298 my \$package = shift;
301 bless \$self, \$package;
306 \$p = Net::ICal::icalparameter_new_from_string(\$Net::ICal::ICAL_${uc}_PARAMETER,\$value);
308 \$p = Net::ICal::icalparameter_new(\$Net::ICal::ICAL_${uc}_PARAMETER);
319 my \$impl = \$self->_impl();
321 return Net::ICal::icalparameter_as_ical_string(\$impl);
327 # This is hard to implement, so I've punted for now.
328 die "Set is not implemented";
340 #endif /*ICALPARAMETER_H*/