portability

diff --git a/skeletons/asn_types.h b/skeletons/asn_types.h
index d2633f6..4785f96 100644
--- a/skeletons/asn_types.h
+++ b/skeletons/asn_types.h
@@ -24,10 +24,8 @@
 #endif
 
 #ifdef WIN32
-#define	 snprintf(str, size, format, args...)	\
-	_snprintf(str, size, format, ##args)
-#define	 vsnprintf(str, size, format, ap)	\
-	_vsnprintf(str, size, format, ap)
+#define	 snprintf	_snprintf
+#define	 vsnprintf	_vsnprintf
 #define	alloca(size)	_alloca(size)
 #endif
 
@@ -59,10 +57,15 @@
  */
 #ifndef	ASN_DEBUG	/* If debugging code is not defined elsewhere... */
 #if	EMIT_ASN_DEBUG == 1	/* And it was asked to emit this code... */
+#ifdef	__GNUC__
 #define	ASN_DEBUG(fmt, args...)	do {		\
 		fprintf(stderr, fmt, ##args);	\
 		fprintf(stderr, "\n");		\
 	} while(0)
+#else	/* !__GNUC__ */
+extern void ASN_DEBUG_f(const char *fmt, ...);
+#define	ASN_DEBUG	ASN_DEBUG_f
+#endif	/* __GNUC__ */
 #else	/* EMIT_ASN_DEBUG */
 #define	ASN_DEBUG(fmt, args...)	((void)0)	/* Emit a no-op operator */
 #endif	/* EMIT_ASN_DEBUG */
diff --git a/skeletons/constr_TYPE.c b/skeletons/constr_TYPE.c
index 9ab1bdc..2a19bc9 100644
--- a/skeletons/constr_TYPE.c
+++ b/skeletons/constr_TYPE.c
@@ -56,3 +56,15 @@
 	return 0;
 }
 
+
+/*
+ * Some compilers do not support variable args macros.
+ * This function is a replacement of ASN_DEBUG() macro.
+ */
+void ASN_DEBUG_f(const char *fmt, ...) {
+	va_list ap;
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}