#!/usr/bin/ruby
require 'stringio'
template={
C:<<-EOM,
typedef _T_ (*T_FUNC_)(_SIG_);
T_FUNC_ P_FUNC_;
P_FUNC_=(T_FUNC_)GetProcAddress(H,"_FUNC_");
EOM
CS:<<-EOM,
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern _T_ _FUNC_(_SIG_);
EOM
Nemerle:<<-EOM,
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern _FUNC_(_SIG_):_T_;
EOM
VB:<<-EOM,
<DllImport(library,CallingConvention:=CallingConvention.Cdecl)>shared function _FUNC_(_SIG_) as _T_
end function
EOM
FS:<<-EOM,
[<DllImport(library,CallingConvention=CallingConvention.Cdecl)>]extern _T_ _FUNC_(_SIG_)
EOM
}
type={
C:->(k){k},
CS:->(k){
k=='char*'?'string':['void*','FILE*','mpz_t','mpf_t'].include?(k)?'IntPtr':k.end_with?('*')?'ref '+k[0..-2]:k
},
Nemerle:->(k){
k=='char*'?'string':['void*','FILE*','mpz_t','mpf_t'].include?(k)?'IntPtr':k.end_with?('*')?'ref '+k[0..-2]:k
},
VB:->(k){
k[0,3]='integer' if k.start_with?('int')
k=='char*'?'string':['void*','FILE*','mpz_t','mpf_t'].include?(k)?'IntPtr':k.end_with?('*')?'ref '+k[0..-2]:k
},
FS:->(k){
k=='char*'?'string':['void*','FILE*','mpz_t','mpf_t'].include?(k)?'IntPtr':k.end_with?('*')?'ref '+k[0..-2]:k
},
}
signature={
C:->(a){a*','},
CS:->(a){a.map.with_index{|e,i|'%s %s'%[type[:CS].(e),(i+97).chr]}*','},
Nemerle:->(a){a.map.with_index{|e,i|'%s:%s'%[(i+97).chr,type[:Nemerle].(e)]}*','},
VB:->(a){a.map.with_index{|e,i|'%s as %s'%[(i+97).chr,type[:VB].(e)]}*','},
FS:->(a){a.map.with_index{|e,i|'%s %s'%[type[:FS].(e),(i+97).chr]}*','},
}
lang=:CS
s=StringIO.new
DATA.each{|e|
next if e.chomp.empty?
t,f,*a=e.chomp.split
s.puts template[lang].gsub('_FUNC_',f).gsub('_T_',t).gsub('_SIG_',signature[lang].(a))
}
if lang==:C
puts s.string.lines.each_slice(3).map(&:to_a).transpose
else
puts s.string
end
__END__
void __gmpz_init mpz_t
void __gmpz_clear mpz_t
void __gmpz_out_str FILE* int mpz_t
void __gmpz_set mpz_t mpz_t
void __gmpz_set_str mpz_t char* int
void __gmpz_set_si mpz_t long
int __gmpz_cmp_si mpz_t long
long __gmpz_get_si mpz_t
void __gmpz_abs mpz_t mpz_t
void __gmpz_add mpz_t mpz_t mpz_t
void __gmpz_add_ui mpz_t mpz_t long
void __gmpz_mul mpz_t mpz_t mpz_t
void __gmpz_mul_si mpz_t mpz_t long
void __gmpz_mul_ui mpz_t mpz_t long
void __gmpz_sub mpz_t mpz_t mpz_t
void __gmpz_sub_ui mpz_t mpz_t long
void __gmpz_ui_sub mpz_t long mpz_t
void __gmpz_tdiv_q mpz_t mpz_t mpz_t
void __gmpz_tdiv_r mpz_t mpz_t mpz_t
void __gmpz_tdiv_q_ui mpz_t mpz_t long
void __gmpz_tdiv_r_ui mpz_t mpz_t long
IyEvdXNyL2Jpbi9ydWJ5CnJlcXVpcmUgJ3N0cmluZ2lvJwoKdGVtcGxhdGU9ewoJQzo8PC1FT00sCnR5cGVkZWYgX1RfICgqVF9GVU5DXykoX1NJR18pOwpUX0ZVTkNfIFBfRlVOQ187ClBfRlVOQ189KFRfRlVOQ18pR2V0UHJvY0FkZHJlc3MoSCwiX0ZVTkNfIik7CglFT00KCglDUzo8PC1FT00sCltEbGxJbXBvcnQobGlicmFyeSxDYWxsaW5nQ29udmVudGlvbj1DYWxsaW5nQ29udmVudGlvbi5DZGVjbCldc3RhdGljIGV4dGVybiBfVF8gX0ZVTkNfKF9TSUdfKTsKCUVPTQoKCU5lbWVybGU6PDwtRU9NLApbRGxsSW1wb3J0KGxpYnJhcnksQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpXXN0YXRpYyBleHRlcm4gX0ZVTkNfKF9TSUdfKTpfVF87CglFT00KCglWQjo8PC1FT00sCjxEbGxJbXBvcnQobGlicmFyeSxDYWxsaW5nQ29udmVudGlvbjo9Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPnNoYXJlZCBmdW5jdGlvbiBfRlVOQ18oX1NJR18pIGFzIF9UXwplbmQgZnVuY3Rpb24KCUVPTQoKCUZTOjw8LUVPTSwKIFs8RGxsSW1wb3J0KGxpYnJhcnksQ2FsbGluZ0NvbnZlbnRpb249Q2FsbGluZ0NvbnZlbnRpb24uQ2RlY2wpPl1leHRlcm4gX1RfIF9GVU5DXyhfU0lHXykKCUVPTQp9Cgp0eXBlPXsKCUM6LT4oayl7a30sCglDUzotPihrKXsKCQlrPT0nY2hhcionPydzdHJpbmcnOlsndm9pZConLCdGSUxFKicsJ21wel90JywnbXBmX3QnXS5pbmNsdWRlPyhrKT8nSW50UHRyJzprLmVuZF93aXRoPygnKicpPydyZWYgJytrWzAuLi0yXTprCgl9LAoJTmVtZXJsZTotPihrKXsKCQlrPT0nY2hhcionPydzdHJpbmcnOlsndm9pZConLCdGSUxFKicsJ21wel90JywnbXBmX3QnXS5pbmNsdWRlPyhrKT8nSW50UHRyJzprLmVuZF93aXRoPygnKicpPydyZWYgJytrWzAuLi0yXTprCgl9LAoJVkI6LT4oayl7CgkJa1swLDNdPSdpbnRlZ2VyJyBpZiBrLnN0YXJ0X3dpdGg/KCdpbnQnKQoJCWs9PSdjaGFyKic/J3N0cmluZyc6Wyd2b2lkKicsJ0ZJTEUqJywnbXB6X3QnLCdtcGZfdCddLmluY2x1ZGU/KGspPydJbnRQdHInOmsuZW5kX3dpdGg/KCcqJyk/J3JlZiAnK2tbMC4uLTJdOmsKCX0sCglGUzotPihrKXsKCQlrPT0nY2hhcionPydzdHJpbmcnOlsndm9pZConLCdGSUxFKicsJ21wel90JywnbXBmX3QnXS5pbmNsdWRlPyhrKT8nSW50UHRyJzprLmVuZF93aXRoPygnKicpPydyZWYgJytrWzAuLi0yXTprCgl9LAp9CgpzaWduYXR1cmU9ewoJQzotPihhKXthKicsJ30sCglDUzotPihhKXthLm1hcC53aXRoX2luZGV4e3xlLGl8JyVzICVzJyVbdHlwZVs6Q1NdLihlKSwoaSs5NykuY2hyXX0qJywnfSwKCU5lbWVybGU6LT4oYSl7YS5tYXAud2l0aF9pbmRleHt8ZSxpfCclczolcyclWyhpKzk3KS5jaHIsdHlwZVs6TmVtZXJsZV0uKGUpXX0qJywnfSwKCVZCOi0+KGEpe2EubWFwLndpdGhfaW5kZXh7fGUsaXwnJXMgYXMgJXMnJVsoaSs5NykuY2hyLHR5cGVbOlZCXS4oZSldfSonLCd9LAoJRlM6LT4oYSl7YS5tYXAud2l0aF9pbmRleHt8ZSxpfCclcyAlcyclW3R5cGVbOkZTXS4oZSksKGkrOTcpLmNocl19KicsJ30sCn0KCmxhbmc9OkNTCgpzPVN0cmluZ0lPLm5ldwpEQVRBLmVhY2h7fGV8CgluZXh0IGlmIGUuY2hvbXAuZW1wdHk/Cgl0LGYsKmE9ZS5jaG9tcC5zcGxpdAoJcy5wdXRzIHRlbXBsYXRlW2xhbmddLmdzdWIoJ19GVU5DXycsZikuZ3N1YignX1RfJyx0KS5nc3ViKCdfU0lHXycsc2lnbmF0dXJlW2xhbmddLihhKSkKfQppZiBsYW5nPT06QwoJcHV0cyBzLnN0cmluZy5saW5lcy5lYWNoX3NsaWNlKDMpLm1hcCgmOnRvX2EpLnRyYW5zcG9zZQplbHNlCglwdXRzIHMuc3RyaW5nCmVuZAoKX19FTkRfXwp2b2lkIF9fZ21wel9pbml0IG1wel90CnZvaWQgX19nbXB6X2NsZWFyIG1wel90CnZvaWQgX19nbXB6X291dF9zdHIgRklMRSogaW50IG1wel90CnZvaWQgX19nbXB6X3NldCBtcHpfdCBtcHpfdAp2b2lkIF9fZ21wel9zZXRfc3RyIG1wel90IGNoYXIqIGludAp2b2lkIF9fZ21wel9zZXRfc2kgbXB6X3QgbG9uZwppbnQgX19nbXB6X2NtcF9zaSBtcHpfdCBsb25nCmxvbmcgX19nbXB6X2dldF9zaSBtcHpfdAoKdm9pZCBfX2dtcHpfYWJzIG1wel90IG1wel90CnZvaWQgX19nbXB6X2FkZCBtcHpfdCBtcHpfdCBtcHpfdAp2b2lkIF9fZ21wel9hZGRfdWkgbXB6X3QgbXB6X3QgbG9uZwp2b2lkIF9fZ21wel9tdWwgbXB6X3QgbXB6X3QgbXB6X3QKdm9pZCBfX2dtcHpfbXVsX3NpIG1wel90IG1wel90IGxvbmcKdm9pZCBfX2dtcHpfbXVsX3VpIG1wel90IG1wel90IGxvbmcKdm9pZCBfX2dtcHpfc3ViIG1wel90IG1wel90IG1wel90CnZvaWQgX19nbXB6X3N1Yl91aSBtcHpfdCBtcHpfdCBsb25nCnZvaWQgX19nbXB6X3VpX3N1YiBtcHpfdCBsb25nIG1wel90CnZvaWQgX19nbXB6X3RkaXZfcSBtcHpfdCBtcHpfdCBtcHpfdAp2b2lkIF9fZ21wel90ZGl2X3IgbXB6X3QgbXB6X3QgbXB6X3QKdm9pZCBfX2dtcHpfdGRpdl9xX3VpIG1wel90IG1wel90IGxvbmcKdm9pZCBfX2dtcHpfdGRpdl9yX3VpIG1wel90IG1wel90IGxvbmcK
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_init(IntPtr a);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_clear(IntPtr a);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_out_str(IntPtr a,int b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_set(IntPtr a,IntPtr b);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_set_str(IntPtr a,string b,int c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_set_si(IntPtr a,long b);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern int __gmpz_cmp_si(IntPtr a,long b);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern long __gmpz_get_si(IntPtr a);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_abs(IntPtr a,IntPtr b);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_add(IntPtr a,IntPtr b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_add_ui(IntPtr a,IntPtr b,long c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_mul(IntPtr a,IntPtr b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_mul_si(IntPtr a,IntPtr b,long c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_mul_ui(IntPtr a,IntPtr b,long c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_sub(IntPtr a,IntPtr b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_sub_ui(IntPtr a,IntPtr b,long c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_ui_sub(IntPtr a,long b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_tdiv_q(IntPtr a,IntPtr b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_tdiv_r(IntPtr a,IntPtr b,IntPtr c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_tdiv_q_ui(IntPtr a,IntPtr b,long c);
[DllImport(library,CallingConvention=CallingConvention.Cdecl)]static extern void __gmpz_tdiv_r_ui(IntPtr a,IntPtr b,long c);