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