#!/usr/bin/perl #Generate a .c source that preinitializes a coffee file system #David Kopf July 2009 #Assumes coffee file_header structure is #struct file_header { # coffee_page_t log_page; # uint16_t log_records; # uint16_t log_record_size; # coffee_page_t max_pages; # uint8_t deprecated_eof_hint; # uint8_t flags; # char name[COFFEE_NAME_LENGTH]; # } __attribute__((packed)); $coffee_page_t=1; $coffee_name_length=16; $coffee_header_length=2*$coffee_page_t+$coffee_name_length+6; #coffee_sector_size is the number of bytes in the smallest allocated block of the coffee file system $coffee_sector_size=256; open(OUTPUT, "> httpd-coffeefsdata.c"); chdir("httpd-fs"); opendir(DIR, "."); @files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); closedir(DIR); foreach $file (@files) { # $dirname = fileparse($file); if(-d $file && $file !~ /^\./) { print "Processing directory $file\n"; opendir(DIR, $file); @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); closedir(DIR); printf "Adding files @newfiles\n"; @files = (@files, map { $_ = "$file/$_" } @newfiles); next; } } print(OUTPUT "/**************Generated by /tools/avr-makecoffeedata*****************/\n"); print(OUTPUT "/*For coffee filesystem of sector size $coffee_sector_size and header length $coffee_header_length bytes*/\n"); foreach $file (@files) {if(-f $file) { if (length($file)>($coffee_name_length-1)) {die "$file: name is too long!";} print "Adding file $file\n"; open(FILE, $file) || die "Could not open file $file\n"; if (grep /.png/,$file) {binmode FILE;} if (grep /.jpg/,$file) {binmode FILE;} if (grep /.gif/,$file) {binmode FILE;} $file =~ s-^-/-; $fvar = $file; $fvar =~ s-/-_-g; $fvar =~ s-\.-_-g; $file_length= -s FILE; $coffee_sectors=int(($coffee_header_length+$file_length+$coffee_sector_size-1)/$coffee_sector_size); # $coffee_sectors=sprintf("%.0f",($coffee_header_length+$file_length+$coffee_sector_size-1)/$coffee_sector_size)-1; $coffee_length=$coffee_sectors*$coffee_sector_size; # for AVR, add PROGMEM here print(OUTPUT "\n__attribute__ ((section (\".coffeedata\")))\n"); print(OUTPUT "static const char data".$fvar."[$coffee_length] PROGMEM = {\n"); print(OUTPUT "\t/* $file */\n\t "); #--------------------Header----------------------------- #log_page for($j=0;$j<$coffee_page_t;$j++) {print (OUTPUT "0x00, ");} #log_records, log_record_size for($j=0;$j<4;$j++) {print (OUTPUT "0x00, ");} #max_pages if ($coffee_page_t==1) { printf(OUTPUT "0x%2.2x, ",$coffee_sectors); } elsif ($coffee_page_t==2) { printf(OUTPUT "0x%2.2x, ",($coffee_sectors>> 8)&0xff); printf(OUTPUT "0x%2.2x, ",($coffee_sectors )&0xff); } elsif ($coffee_page_t==4) { printf(OUTPUT "0x%2.2x, ",($coffee_sectors>>24)&0xff); printf(OUTPUT "0x%2.2x, ",($coffee_sectors>>16)&0xff); printf(OUTPUT "0x%2.2x, ",($coffee_sectors>> 8)&0xff); printf(OUTPUT "0x%2.2x, ",($coffee_sectors )&0xff); } else { die "Unsupported coffee_page_t $coffee_page_t\n"; } #eof hint and flags print(OUTPUT "0x00, 0x03,\n\t"); #file name for($j = 0; $j < length($file); $j++) { printf(OUTPUT " %#02.2x,", unpack("C", substr($file, $j, 1))); } for(; $j < $coffee_name_length; $j++) { printf(OUTPUT " 0x00,"); } print(OUTPUT "\n\t"); #------------------File Data--------------------------- $coffee_length-=$coffee_header_length; $i = 0; while(read(FILE, $data, 1)) { # printf(OUTPUT " %#2.2x,", unpack("C", $data)); printf(OUTPUT " 0x%2.2x,", unpack("C", $data)); $i++;$coffee_length--; if($i == 10) { print(OUTPUT "\n\t"); $i = 0; } } while (--$coffee_length>1) { print (OUTPUT " 0x00,"); if($i++ == 9) { print(OUTPUT "\n\t"); $i = 0; } } print (OUTPUT " 0x00};\n"); close(FILE); push(@fvars, $fvar); push(@pfiles, $file); }} for($i = 0; $i < @fvars; $i++) { $file = $pfiles[$i]; $fvar = $fvars[$i]; if($i == 0) { $prevfile = "NULL"; } else { $prevfile = "file" . $fvars[$i - 1]; } # for AVR, add PROGMEM here print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] PROGMEM = {{$prevfile, data$fvar, "); print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); } print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n");