1#!/usr/bin/ruby
2
3# DLL �̃_�C�i�~�b�N���[�h�p�c�[��
4# �P�s�� �N���X��
5# �Q�s�� dll ��
6# �R�s�ڈȍ~ �֐��v���g�^�C�v
7# �ȃt�@�C�� source ��
8# ruby dllutl.rb < source
9# �Ƃ��Ă��΁A���̊֐��� dll ����_�C�i�~�b�N���[�h���Ă����
10# �\�[�X�������쐬���Ă����B�������A���܂蕡�G�Ȋ֐��v���g�^�C�v�ɂ�
11# ���Ή��B���� () ����݁B
12#
13# �K�p�FPublic Domain
14#
15# Version 0.1p
16#
17# Daisuke Aoki <dai@y7.net>
18
19def arg_ana(args)
20  list = []
21  temp = ""
22  if args.index(",")==nil
23    temp = args
24  else
25    temp = args.split(/,/)
26  end
27  for i in temp
28    if i == "void"
29      return []
30    end
31    if i =~ /\s*(.*)\s+(\S+)\s*/
32      rest = $2
33      if rest =~ /(\s*\**\s*\**\s*\**\s*\**\s*)(.*)/
34        list << $2
35      else
36        return nil
37      end
38    else
39      return nil
40    end
41  end
42  return list
43end
44
45class_name = "default_name"
46dll_name = "default_name.dll"
47class_name = gets.chomp
48dll_name = gets.chomp
49
50funclist = []
51while gets
52#    if $_ =~ /(\s*[^\s]\s+\**)([^\(]+)(\(.*\))\;\s*/
53#    if $_ =~ /(\s*\S+\s+)([^\(]+)(\(.*\))\;\s*/
54    if $_ =~ /^#.*/
55      next
56    end
57    rest = $_
58    part_prev = ""
59    part_func = ""
60    part_post = ""
61    if rest =~ /\s*(.*)\s*(\(.*?\))\s*;/
62      rest = $1
63      part_post << $2
64      if rest =~ /\s*(.*)\s+(\S+)\s*/
65        part_prev << $1
66        rest = $2
67        if rest =~ /(\s*\**\s*\**\s*\**\s*\**\s*)(.*)/
68          part_prev << $1
69          part_func << $2
70#          printf("<%s><%s><%s>\n",part_prev,part_func,part_post)
71        end
72      end
73    end
74    if part_func!=""
75      funclist << [part_prev,part_func,part_post]
76    end
77end
78
79print "/***************************************************************\n"
80printf " name: %s  dll: %s \n",class_name,dll_name
81print "***************************************************************/\n"
82
83print "\n"
84printf "extern int load_%s(void);\n",class_name
85printf "extern void free_%s(void);\n",class_name
86print "\n"
87
88for i in funclist
89  printf "typedef %s(*type_%s)%s;\n",i[0],i[1],i[2]
90end
91printf "\nstatic struct %s_ {\n",class_name
92for i in funclist
93  printf "\t type_%s %s;\n",i[1],i[1]
94end
95printf "} %s;\n\n",class_name
96
97printf "static volatile HANDLE h_%s = NULL;\n\n",class_name
98
99printf "void free_%s(void)
100{
101\tif(h_%s){
102\t\tFreeLibrary(h_%s);
103\t\th_%s = NULL;
104\t}
105}
106
107",class_name,class_name,class_name,class_name
108
109printf "int load_%s(void)
110{
111\tif(!h_%s){
112\t\th_%s = LoadLibrary(\"%s\");
113\t\tif(!h_%s) return -1;
114\t}
115",class_name,class_name,class_name,dll_name,class_name
116for i in funclist
117  printf "\t%s.%s = (type_%s)GetProcAddress(h_%s,\"%s\");\n",class_name,i[1],i[1],class_name,i[1]
118  printf "\tif(!%s.%s){ free_%s(); return -1; }\n",class_name,i[1],class_name
119end
120printf "\treturn 0;\n}\n\n"
121
122for i in funclist
123  printf "%s %s%s
124{
125\tif(h_%s){
126",i[0],i[1],i[2],class_name
127  if i[0] =~ /\s*void\s*/
128    printf "\t\t%s.%s(",class_name,i[1]
129  else
130    printf "\t\treturn %s.%s(",class_name,i[1]
131  end
132  args = ""
133  if i[2] =~ /\((.*)\)/
134    args = $1.strip
135  end
136  arglist = arg_ana(args)
137  if arglist == nil
138    print "\n@@@ BAD @@@\n"
139    exit
140  end
141  num = 0
142  for j in arglist
143    if j != "void"
144      print "," if num!=0
145      print j
146      num += 1
147    end
148  end
149  print ");\n"
150  if i[0] =~ /\s*void\s*/
151    printf "\t}\n"
152  else
153    printf "\t}\n\treturn (%s)0;\n",i[0]
154  end
155  printf "}\n\n"
156end
157
158print "/***************************************************************/\n"
159
160