2017-01-28 20:35:23 -05:00
|
|
|
# frozen_string_literal: true
|
2014-05-17 21:48:47 -04:00
|
|
|
require 'optparse'
|
|
|
|
require 'erb'
|
|
|
|
|
|
|
|
C_ESC = {
|
|
|
|
"\\" => "\\\\",
|
|
|
|
'"' => '\"',
|
|
|
|
"\n" => '\n',
|
|
|
|
}
|
|
|
|
|
|
|
|
0x00.upto(0x1f) {|ch| C_ESC[[ch].pack("C")] ||= "\\%03o" % ch }
|
|
|
|
0x7f.upto(0xff) {|ch| C_ESC[[ch].pack("C")] = "\\%03o" % ch }
|
|
|
|
C_ESC_PAT = Regexp.union(*C_ESC.keys)
|
|
|
|
|
|
|
|
def c_str(str)
|
|
|
|
'"' + str.gsub(C_ESC_PAT) {|s| C_ESC[s]} + '"'
|
|
|
|
end
|
|
|
|
|
|
|
|
opt = OptionParser.new
|
|
|
|
|
|
|
|
opt.def_option('-h', 'help') {
|
|
|
|
puts opt
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
|
|
|
|
opt_o = nil
|
|
|
|
opt.def_option('-o FILE', 'specify output file') {|filename|
|
|
|
|
opt_o = filename
|
|
|
|
}
|
|
|
|
|
|
|
|
opt_H = nil
|
|
|
|
opt.def_option('-H FILE', 'specify output header file') {|filename|
|
|
|
|
opt_H = filename
|
|
|
|
}
|
|
|
|
|
|
|
|
opt.parse!
|
|
|
|
|
|
|
|
h = {}
|
2014-07-05 22:42:55 -04:00
|
|
|
COMMENTS = {}
|
2014-05-17 21:48:47 -04:00
|
|
|
|
|
|
|
DATA.each_line {|s|
|
|
|
|
next if /\A\s*(\#|\z)/ =~ s
|
|
|
|
name, default_value, comment = s.chomp.split(/\s+/, 3)
|
|
|
|
|
|
|
|
default_value = nil if default_value == 'nil'
|
|
|
|
|
|
|
|
if h.has_key? name
|
|
|
|
warn "#{$.}: warning: duplicate name: #{name}"
|
|
|
|
next
|
|
|
|
end
|
|
|
|
h[name] = default_value
|
2014-07-05 22:42:55 -04:00
|
|
|
COMMENTS[name] = comment if comment
|
2014-05-17 21:48:47 -04:00
|
|
|
}
|
|
|
|
DEFS = h.to_a
|
|
|
|
|
|
|
|
def each_const
|
|
|
|
DEFS.each {|name, default_value|
|
|
|
|
yield name, default_value
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def each_name(pat)
|
|
|
|
DEFS.each {|name, default_value|
|
|
|
|
next if pat !~ name
|
|
|
|
yield name
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2018-02-22 08:28:25 -05:00
|
|
|
erb_new = lambda do |src, safe, trim|
|
2018-02-27 06:12:23 -05:00
|
|
|
if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
|
2018-02-22 08:28:25 -05:00
|
|
|
ERB.new(src, trim_mode: trim)
|
|
|
|
else
|
|
|
|
ERB.new(src, safe, trim)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
|
2014-05-17 21:48:47 -04:00
|
|
|
% each_const {|name, default_value|
|
|
|
|
#if !defined(<%=name%>)
|
|
|
|
# if defined(HAVE_CONST_<%=name.upcase%>)
|
|
|
|
# define <%=name%> <%=name%>
|
|
|
|
%if default_value
|
|
|
|
# else
|
|
|
|
# define <%=name%> <%=default_value%>
|
|
|
|
%end
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
% }
|
|
|
|
EOS
|
|
|
|
|
2018-02-22 08:28:25 -05:00
|
|
|
erb_new.call(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
|
2014-05-17 21:48:47 -04:00
|
|
|
% each_const {|name, default_value|
|
|
|
|
#if defined(<%=name%>)
|
2014-07-05 22:42:55 -04:00
|
|
|
% if comment = COMMENTS[name]
|
|
|
|
/* <%=comment%> */
|
|
|
|
% end
|
2014-05-17 21:48:47 -04:00
|
|
|
rb_define_const(mod, <%=c_str name.sub(/\A_*/, '')%>, INTEGER2NUM(<%=name%>));
|
|
|
|
#endif
|
|
|
|
% }
|
|
|
|
EOS
|
|
|
|
|
2018-02-22 08:28:25 -05:00
|
|
|
header_result = erb_new.call(<<'EOS', nil, '%').result(binding)
|
2014-05-17 21:48:47 -04:00
|
|
|
/* autogenerated file */
|
|
|
|
|
|
|
|
<%= gen_const_decls %>
|
|
|
|
EOS
|
|
|
|
|
2018-02-22 08:28:25 -05:00
|
|
|
result = erb_new.call(<<'EOS', nil, '%').result(binding)
|
2014-05-17 21:48:47 -04:00
|
|
|
/* autogenerated file */
|
|
|
|
|
|
|
|
#ifdef HAVE_LONG_LONG
|
|
|
|
#define INTEGER2NUM(n) \
|
|
|
|
(FIXNUM_MAX < (n) ? ULL2NUM(n) : \
|
|
|
|
FIXNUM_MIN > (LONG_LONG)(n) ? LL2NUM(n) : \
|
|
|
|
LONG2FIX(n))
|
|
|
|
#else
|
|
|
|
#define INTEGER2NUM(n) \
|
|
|
|
(FIXNUM_MAX < (n) ? ULONG2NUM(n) : \
|
|
|
|
FIXNUM_MIN > (long)(n) ? LONG2NUM(n) : \
|
|
|
|
LONG2FIX(n))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static void
|
|
|
|
init_constants(VALUE mod)
|
|
|
|
{
|
|
|
|
<%= gen_const_defs %>
|
|
|
|
}
|
|
|
|
EOS
|
|
|
|
|
|
|
|
if opt_H
|
|
|
|
File.open(opt_H, 'w') {|f|
|
|
|
|
f << header_result
|
|
|
|
}
|
|
|
|
else
|
|
|
|
result = header_result + result
|
|
|
|
end
|
|
|
|
|
|
|
|
if opt_o
|
|
|
|
File.open(opt_o, 'w') {|f|
|
|
|
|
f << result
|
|
|
|
}
|
|
|
|
else
|
|
|
|
$stdout << result
|
|
|
|
end
|
|
|
|
|
|
|
|
__END__
|
|
|
|
# SUSv4
|
|
|
|
_SC_AIO_LISTIO_MAX
|
|
|
|
_SC_AIO_MAX
|
|
|
|
_SC_AIO_PRIO_DELTA_MAX
|
|
|
|
_SC_ARG_MAX
|
|
|
|
_SC_ATEXIT_MAX
|
|
|
|
_SC_BC_BASE_MAX
|
|
|
|
_SC_BC_DIM_MAX
|
|
|
|
_SC_BC_SCALE_MAX
|
|
|
|
_SC_BC_STRING_MAX
|
|
|
|
_SC_CHILD_MAX
|
|
|
|
_SC_CLK_TCK
|
|
|
|
_SC_COLL_WEIGHTS_MAX
|
|
|
|
_SC_DELAYTIMER_MAX
|
|
|
|
_SC_EXPR_NEST_MAX
|
|
|
|
_SC_HOST_NAME_MAX
|
|
|
|
_SC_IOV_MAX
|
|
|
|
_SC_LINE_MAX
|
|
|
|
_SC_LOGIN_NAME_MAX
|
|
|
|
_SC_NGROUPS_MAX
|
|
|
|
_SC_GETGR_R_SIZE_MAX
|
|
|
|
_SC_GETPW_R_SIZE_MAX
|
|
|
|
_SC_MQ_OPEN_MAX
|
|
|
|
_SC_MQ_PRIO_MAX
|
|
|
|
_SC_OPEN_MAX
|
|
|
|
_SC_ADVISORY_INFO
|
|
|
|
_SC_BARRIERS
|
|
|
|
_SC_ASYNCHRONOUS_IO
|
|
|
|
_SC_CLOCK_SELECTION
|
|
|
|
_SC_CPUTIME
|
|
|
|
_SC_FSYNC
|
|
|
|
_SC_IPV6
|
|
|
|
_SC_JOB_CONTROL
|
|
|
|
_SC_MAPPED_FILES
|
|
|
|
_SC_MEMLOCK
|
|
|
|
_SC_MEMLOCK_RANGE
|
|
|
|
_SC_MEMORY_PROTECTION
|
|
|
|
_SC_MESSAGE_PASSING
|
|
|
|
_SC_MONOTONIC_CLOCK
|
|
|
|
_SC_PRIORITIZED_IO
|
|
|
|
_SC_PRIORITY_SCHEDULING
|
|
|
|
_SC_RAW_SOCKETS
|
|
|
|
_SC_READER_WRITER_LOCKS
|
|
|
|
_SC_REALTIME_SIGNALS
|
|
|
|
_SC_REGEXP
|
|
|
|
_SC_SAVED_IDS
|
|
|
|
_SC_SEMAPHORES
|
|
|
|
_SC_SHARED_MEMORY_OBJECTS
|
|
|
|
_SC_SHELL
|
|
|
|
_SC_SPAWN
|
|
|
|
_SC_SPIN_LOCKS
|
|
|
|
_SC_SPORADIC_SERVER
|
|
|
|
_SC_SS_REPL_MAX
|
|
|
|
_SC_SYNCHRONIZED_IO
|
|
|
|
_SC_THREAD_ATTR_STACKADDR
|
|
|
|
_SC_THREAD_ATTR_STACKSIZE
|
|
|
|
_SC_THREAD_CPUTIME
|
|
|
|
_SC_THREAD_PRIO_INHERIT
|
|
|
|
_SC_THREAD_PRIO_PROTECT
|
|
|
|
_SC_THREAD_PRIORITY_SCHEDULING
|
|
|
|
_SC_THREAD_PROCESS_SHARED
|
|
|
|
_SC_THREAD_ROBUST_PRIO_INHERIT
|
|
|
|
_SC_THREAD_ROBUST_PRIO_PROTECT
|
|
|
|
_SC_THREAD_SAFE_FUNCTIONS
|
|
|
|
_SC_THREAD_SPORADIC_SERVER
|
|
|
|
_SC_THREADS
|
|
|
|
_SC_TIMEOUTS
|
|
|
|
_SC_TIMERS
|
|
|
|
_SC_TRACE
|
|
|
|
_SC_TRACE_EVENT_FILTER
|
|
|
|
_SC_TRACE_EVENT_NAME_MAX
|
|
|
|
_SC_TRACE_INHERIT
|
|
|
|
_SC_TRACE_LOG
|
|
|
|
_SC_TRACE_NAME_MAX
|
|
|
|
_SC_TRACE_SYS_MAX
|
|
|
|
_SC_TRACE_USER_EVENT_MAX
|
|
|
|
_SC_TYPED_MEMORY_OBJECTS
|
|
|
|
_SC_VERSION
|
|
|
|
_SC_V7_ILP32_OFF32
|
|
|
|
_SC_V7_ILP32_OFFBIG
|
|
|
|
_SC_V7_LP64_OFF64
|
|
|
|
_SC_V7_LPBIG_OFFBIG
|
|
|
|
_SC_V6_ILP32_OFF32
|
|
|
|
_SC_V6_ILP32_OFFBIG
|
|
|
|
_SC_V6_LP64_OFF64
|
|
|
|
_SC_V6_LPBIG_OFFBIG
|
|
|
|
_SC_2_C_BIND
|
|
|
|
_SC_2_C_DEV
|
|
|
|
_SC_2_CHAR_TERM
|
|
|
|
_SC_2_FORT_DEV
|
|
|
|
_SC_2_FORT_RUN
|
|
|
|
_SC_2_LOCALEDEF
|
|
|
|
_SC_2_PBS
|
|
|
|
_SC_2_PBS_ACCOUNTING
|
|
|
|
_SC_2_PBS_CHECKPOINT
|
|
|
|
_SC_2_PBS_LOCATE
|
|
|
|
_SC_2_PBS_MESSAGE
|
|
|
|
_SC_2_PBS_TRACK
|
|
|
|
_SC_2_SW_DEV
|
|
|
|
_SC_2_UPE
|
|
|
|
_SC_2_VERSION
|
|
|
|
_SC_PAGE_SIZE
|
|
|
|
_SC_PAGESIZE
|
|
|
|
_SC_THREAD_DESTRUCTOR_ITERATIONS
|
|
|
|
_SC_THREAD_KEYS_MAX
|
|
|
|
_SC_THREAD_STACK_MIN
|
|
|
|
_SC_THREAD_THREADS_MAX
|
|
|
|
_SC_RE_DUP_MAX
|
|
|
|
_SC_RTSIG_MAX
|
|
|
|
_SC_SEM_NSEMS_MAX
|
|
|
|
_SC_SEM_VALUE_MAX
|
|
|
|
_SC_SIGQUEUE_MAX
|
|
|
|
_SC_STREAM_MAX
|
|
|
|
_SC_SYMLOOP_MAX
|
|
|
|
_SC_TIMER_MAX
|
|
|
|
_SC_TTY_NAME_MAX
|
|
|
|
_SC_TZNAME_MAX
|
|
|
|
_SC_XOPEN_CRYPT
|
|
|
|
_SC_XOPEN_ENH_I18N
|
|
|
|
_SC_XOPEN_REALTIME
|
|
|
|
_SC_XOPEN_REALTIME_THREADS
|
|
|
|
_SC_XOPEN_SHM
|
|
|
|
_SC_XOPEN_STREAMS
|
|
|
|
_SC_XOPEN_UNIX
|
|
|
|
_SC_XOPEN_UUCP
|
|
|
|
_SC_XOPEN_VERSION
|
|
|
|
|
|
|
|
# non-standard
|
|
|
|
_SC_PHYS_PAGES
|
|
|
|
_SC_AVPHYS_PAGES
|
|
|
|
_SC_NPROCESSORS_CONF
|
|
|
|
_SC_NPROCESSORS_ONLN
|
|
|
|
_SC_CPUSET_SIZE
|
|
|
|
|
|
|
|
# SUSv4
|
|
|
|
_CS_PATH
|
|
|
|
_CS_POSIX_V7_ILP32_OFF32_CFLAGS
|
|
|
|
_CS_POSIX_V7_ILP32_OFF32_LDFLAGS
|
|
|
|
_CS_POSIX_V7_ILP32_OFF32_LIBS
|
|
|
|
_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS
|
|
|
|
_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS
|
|
|
|
_CS_POSIX_V7_ILP32_OFFBIG_LIBS
|
|
|
|
_CS_POSIX_V7_LP64_OFF64_CFLAGS
|
|
|
|
_CS_POSIX_V7_LP64_OFF64_LDFLAGS
|
|
|
|
_CS_POSIX_V7_LP64_OFF64_LIBS
|
|
|
|
_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS
|
|
|
|
_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS
|
|
|
|
_CS_POSIX_V7_LPBIG_OFFBIG_LIBS
|
|
|
|
_CS_POSIX_V7_THREADS_CFLAGS
|
|
|
|
_CS_POSIX_V7_THREADS_LDFLAGS
|
|
|
|
_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS
|
|
|
|
_CS_V7_ENV
|
|
|
|
_CS_POSIX_V6_ILP32_OFF32_CFLAGS
|
|
|
|
_CS_POSIX_V6_ILP32_OFF32_LDFLAGS
|
|
|
|
_CS_POSIX_V6_ILP32_OFF32_LIBS
|
|
|
|
_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
|
|
|
|
_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
|
|
|
|
_CS_POSIX_V6_ILP32_OFFBIG_LIBS
|
|
|
|
_CS_POSIX_V6_LP64_OFF64_CFLAGS
|
|
|
|
_CS_POSIX_V6_LP64_OFF64_LDFLAGS
|
|
|
|
_CS_POSIX_V6_LP64_OFF64_LIBS
|
|
|
|
_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
|
|
|
|
_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
|
|
|
|
_CS_POSIX_V6_LPBIG_OFFBIG_LIBS
|
|
|
|
_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS
|
|
|
|
_CS_V6_ENV
|
|
|
|
|
|
|
|
# non-standard
|
|
|
|
_CS_GNU_LIBC_VERSION
|
|
|
|
_CS_GNU_LIBPTHREAD_VERSION
|
|
|
|
|
|
|
|
# SUSv4
|
|
|
|
_PC_FILESIZEBITS
|
|
|
|
_PC_LINK_MAX
|
|
|
|
_PC_MAX_CANON
|
|
|
|
_PC_MAX_INPUT
|
|
|
|
_PC_NAME_MAX
|
|
|
|
_PC_PATH_MAX
|
|
|
|
_PC_PIPE_BUF
|
|
|
|
_PC_2_SYMLINKS
|
|
|
|
_PC_ALLOC_SIZE_MIN
|
|
|
|
_PC_REC_INCR_XFER_SIZE
|
|
|
|
_PC_REC_MAX_XFER_SIZE
|
|
|
|
_PC_REC_MIN_XFER_SIZE
|
|
|
|
_PC_REC_XFER_ALIGN
|
|
|
|
_PC_SYMLINK_MAX
|
|
|
|
_PC_CHOWN_RESTRICTED
|
|
|
|
_PC_NO_TRUNC
|
|
|
|
_PC_VDISABLE
|
|
|
|
_PC_ASYNC_IO
|
|
|
|
_PC_PRIO_IO
|
|
|
|
_PC_SYNC_IO
|
|
|
|
_PC_TIMESTAMP_RESOLUTION
|
|
|
|
|