1#!/usr/bin/perl
2
3require 5;
4
5# LCL symbol...			localize symbols
6# ARC arch			architecture symbol
7# DFT cpp-expr			default method?
8# DEF symbol alternatives...	specifiy alternatives
9# DEP cpp-expr			when to apply these (which architecture &c)
10# MTH name init crack load	new method independent of everything else
11# LOD load			load method to use
12# END				guess
13
14$method_count=0;
15
16while(<>) {
17   if(/^\s+\*\s+(\w+)\s+(.*)$/) {
18      $1 eq "END" and last;
19      $1 eq "LCL" and do {
20         @lcl=split /\s+/,$2;
21      };
22      $1 eq "ARC" and do {
23         $arch=$2;
24      };
25      $1 eq "DFT" and do {
26         $default=$2;
27      };
28      $1 eq "LOD" and do {
29         $load=$2;
30      };
31      $1 eq "MTH" and do {
32         my($name,$init,$crack,$load)=split /\s+/,$2;
33         $methods .= "  { \"$name\", $init, $crack, $load },\n";
34         $method_count++;
35      };
36      $1 eq "DEF" and do {
37         my($def,$val)=split /\s+/,$2,2;
38         my(@val);
39         if($val) {
40            @val=split /\s*\$\s*/,$val;
41            for(@val) {
42               $_=["# undef $def\n# define $def $_\n", ", $def=$_"];
43            }
44         } else {
45            @val = (["# undef $def\n", ""], ["# define $def 1\n", ", $def"]);
46         }
47         $def{$def}=[@val];
48      };
49      $1 eq "DEP" and do {
50         $method=$method_count;
51         $def.="#elif $2\n";
52         $tab.="#elif $2\n$methods";
53         $def.="# define $arch 1\n" if $arch;
54         gen_def("");
55         $def.="# undef $arch\n" if $arch;
56         undef $arch;
57         undef $default;
58         undef %def;
59      };
60   }
61}
62
63sub gen_def {
64   my($sym)=(keys %def)[0];
65   if($sym) {
66      my($val)=delete $def{$sym};
67      for(@{$val}) {
68         gen_def($_[0].$_->[0],$_[1].$_->[1]);
69      }
70      $def{$sym}=$val;
71   } else {
72      $def.="# undef METHOD\n# define METHOD $method\n$_[0]";
73      $tab.="  { \"zip$method$_[1]\"";
74      for(@lcl) {
75         $def.="# undef $_\n# define $_ METHOD${method}_$_\n";
76         $tab.=", METHOD${method}_$_";
77      }
78      $tab.=", $load },\n";
79      $def.="#  if $default\n#   define DEFAULT_METHOD $method\n#  endif\n" if $default;
80      $def.="#  include \"zipcrack.c\"\n";
81      $method++;
82   }
83}
84
85##############################################################################
86
87open C,">crackdef.c" or die "crackdef.c: $!";
88print C <<EOF;
89/*
90 * this file is automatically generated from zipcrack.c, do NOT modify
91 */
92
93#if 0
94$def#else
95#warn no architecture compiled in
96#endif
97
98#ifndef DEFAULT_METHOD
99#define DEFAULT_METHOD 0
100#endif
101
102int default_method = DEFAULT_METHOD;
103
104method methods[] = {
105#if 0
106$tab#else
107#endif
108  { 0, 0, 0, 0 }
109};
110
111EOF
112