root = ..\..

!include $(root)\build\config.nmake
!include $(root)\build\c\rules.nmake
!include $(root)\build\cxx\rules.nmake

EXTRA_CPPFLAGS = /I..

#########################################################################

src = c\expat\xmlparse.c c\expat\xmlrole.c c\expat\xmltok.c
src = $(src) c\genx\genx.c c\genx\char-props.c

src = $(src) cxx\string.cxx cxx\ro-string.cxx

!if "$(XSDE_EXCEPTIONS)" == "n"
src = $(src) cxx\sys-error.cxx
!endif

!if "$(XSDE_PARSER_VALIDATION)$(XSDE_SERIALIZER_VALIDATION)" != "nn"
src = $(src) cxx\schema-error.cxx
!endif

!if "$(XSDE_POLYMORPHIC)" == "y"
src = $(src) cxx\hashmap.cxx
!endif

# Common data types.
#
src = $(src) cxx\buffer.cxx

!if "$(XSDE_STL)" == "y"
src = $(src) cxx\string-sequence-stl.cxx
!else
src = $(src) cxx\qname.cxx cxx\string-sequence.cxx
!endif


## XML
##
!if "$(XSDE_PARSER_VALIDATION)$(XSDE_SERIALIZER_VALIDATION)" != "nn"
src = $(src) cxx\xml\char-table.cxx cxx\xml\ncname.cxx
!endif


## C++/Parser
##
src = $(src) cxx\parser\elements.cxx cxx\parser\state.cxx
src = $(src) cxx\parser\expat\document.cxx cxx\parser\expat\xml-error.cxx

!if "$(XSDE_POLYMORPHIC)" == "y"
src = $(src) cxx\parser\map.cxx cxx\parser\substitution-map.cxx
!endif

!if "$(XSDE_EXCEPTIONS)" == "y"
src = $(src) cxx\parser\exceptions.cxx
!else
src = $(src) cxx\parser\error.cxx
!endif


# Parser implementations.
#
!if "$(XSDE_PARSER_VALIDATION)" == "y"

src = $(src)                                    \
cxx\parser\validating\parser.cxx                \
cxx\parser\validating\time-zone.cxx             \
cxx\parser\validating\xml-schema-pskel.cxx

!if "$(XSDE_POLYMORPHIC)" == "y"
src = $(src) cxx\parser\validating\inheritance-map.cxx
!endif

src = $(src)                                    \
cxx\parser\validating\boolean.cxx               \
cxx\parser\validating\number.cxx                \
cxx\parser\validating\byte.cxx                  \
cxx\parser\validating\unsigned-byte.cxx         \
cxx\parser\validating\short.cxx                 \
cxx\parser\validating\unsigned-short.cxx        \
cxx\parser\validating\int.cxx                   \
cxx\parser\validating\unsigned-int.cxx          \
cxx\parser\validating\integer.cxx               \
cxx\parser\validating\negative-integer.cxx      \
cxx\parser\validating\non-positive-integer.cxx  \
cxx\parser\validating\positive-integer.cxx      \
cxx\parser\validating\non-negative-integer.cxx  \
cxx\parser\validating\float.cxx                 \
cxx\parser\validating\double.cxx                \
cxx\parser\validating\decimal.cxx

!if "$(XSDE_LONGLONG)" == "y"
src = $(src)                                    \
cxx\parser\validating\long-long.cxx             \
cxx\parser\validating\unsigned-long-long.cxx
!else
src = $(src)                                    \
cxx\parser\validating\long.cxx                  \
cxx\parser\validating\unsigned-long.cxx
!endif

!if "$(XSDE_STL)" == "y"

src = $(src)                                    \
cxx\parser\validating\string-stl.cxx            \
cxx\parser\validating\normalized-string-stl.cxx \
cxx\parser\validating\token-stl.cxx             \
cxx\parser\validating\name-stl.cxx              \
cxx\parser\validating\nmtoken-stl.cxx           \
cxx\parser\validating\nmtokens-stl.cxx          \
cxx\parser\validating\ncname-stl.cxx            \
cxx\parser\validating\id-stl.cxx                \
cxx\parser\validating\idref-stl.cxx             \
cxx\parser\validating\idrefs-stl.cxx            \
cxx\parser\validating\language-stl.cxx          \
cxx\parser\validating\uri-stl.cxx               \
cxx\parser\validating\qname-stl.cxx

!else

src = $(src)                                 \
cxx\parser\validating\string.cxx             \
cxx\parser\validating\normalized-string.cxx  \
cxx\parser\validating\token.cxx              \
cxx\parser\validating\name.cxx               \
cxx\parser\validating\nmtoken.cxx            \
cxx\parser\validating\nmtokens.cxx           \
cxx\parser\validating\ncname.cxx             \
cxx\parser\validating\id.cxx                 \
cxx\parser\validating\idref.cxx              \
cxx\parser\validating\idrefs.cxx             \
cxx\parser\validating\language.cxx           \
cxx\parser\validating\uri.cxx                \
cxx\parser\validating\qname.cxx

!endif # stl

src = $(src)                                 \
cxx\parser\validating\base64-binary.cxx      \
cxx\parser\validating\hex-binary.cxx         \
cxx\parser\validating\gday.cxx               \
cxx\parser\validating\gmonth.cxx             \
cxx\parser\validating\gyear.cxx              \
cxx\parser\validating\gmonth-day.cxx         \
cxx\parser\validating\gyear-month.cxx        \
cxx\parser\validating\date.cxx               \
cxx\parser\validating\time.cxx               \
cxx\parser\validating\date-time.cxx          \
cxx\parser\validating\duration.cxx

!else # validation

src = $(src)                                        \
cxx\parser\non-validating\parser.cxx                \
cxx\parser\non-validating\time-zone.cxx             \
cxx\parser\non-validating\xml-schema-pskel.cxx

src = $(src)                                        \
cxx\parser\non-validating\boolean.cxx               \
cxx\parser\non-validating\number.cxx                \
cxx\parser\non-validating\byte.cxx                  \
cxx\parser\non-validating\unsigned-byte.cxx         \
cxx\parser\non-validating\short.cxx                 \
cxx\parser\non-validating\unsigned-short.cxx        \
cxx\parser\non-validating\int.cxx                   \
cxx\parser\non-validating\unsigned-int.cxx          \
cxx\parser\non-validating\integer.cxx               \
cxx\parser\non-validating\negative-integer.cxx      \
cxx\parser\non-validating\non-positive-integer.cxx  \
cxx\parser\non-validating\positive-integer.cxx      \
cxx\parser\non-validating\non-negative-integer.cxx  \
cxx\parser\non-validating\float.cxx                 \
cxx\parser\non-validating\double.cxx                \
cxx\parser\non-validating\decimal.cxx

!if "$(XSDE_LONGLONG)" == "y"
src = $(src)                                        \
cxx\parser\non-validating\long-long.cxx             \
cxx\parser\non-validating\unsigned-long-long.cxx
!else
src = $(src)                                        \
cxx\parser\non-validating\long.cxx                  \
cxx\parser\non-validating\unsigned-long.cxx
!endif

!if "$(XSDE_STL)" == "y"

src = $(src)                                        \
cxx\parser\non-validating\string-stl.cxx            \
cxx\parser\non-validating\normalized-string-stl.cxx \
cxx\parser\non-validating\token-stl.cxx             \
cxx\parser\non-validating\name-stl.cxx              \
cxx\parser\non-validating\nmtoken-stl.cxx           \
cxx\parser\non-validating\nmtokens-stl.cxx          \
cxx\parser\non-validating\ncname-stl.cxx            \
cxx\parser\non-validating\id-stl.cxx                \
cxx\parser\non-validating\idref-stl.cxx             \
cxx\parser\non-validating\idrefs-stl.cxx            \
cxx\parser\non-validating\language-stl.cxx          \
cxx\parser\non-validating\uri-stl.cxx               \
cxx\parser\non-validating\qname-stl.cxx

!else

src = $(src)                                     \
cxx\parser\non-validating\string.cxx             \
cxx\parser\non-validating\normalized-string.cxx  \
cxx\parser\non-validating\token.cxx              \
cxx\parser\non-validating\name.cxx               \
cxx\parser\non-validating\nmtoken.cxx            \
cxx\parser\non-validating\nmtokens.cxx           \
cxx\parser\non-validating\ncname.cxx             \
cxx\parser\non-validating\id.cxx                 \
cxx\parser\non-validating\idref.cxx              \
cxx\parser\non-validating\idrefs.cxx             \
cxx\parser\non-validating\language.cxx           \
cxx\parser\non-validating\uri.cxx                \
cxx\parser\non-validating\qname.cxx

!endif # stl

src = $(src)                                     \
cxx\parser\non-validating\base64-binary.cxx      \
cxx\parser\non-validating\hex-binary.cxx         \
cxx\parser\non-validating\gday.cxx               \
cxx\parser\non-validating\gmonth.cxx             \
cxx\parser\non-validating\gyear.cxx              \
cxx\parser\non-validating\gmonth-day.cxx         \
cxx\parser\non-validating\gyear-month.cxx        \
cxx\parser\non-validating\date.cxx               \
cxx\parser\non-validating\time.cxx               \
cxx\parser\non-validating\date-time.cxx          \
cxx\parser\non-validating\duration.cxx

!endif # validation


## C++/Serializer
##
src = $(src)                      \
cxx\serializer\elements.cxx       \
cxx\serializer\context.cxx

src = $(src)                      \
cxx\serializer\genx\document.cxx  \
cxx\serializer\genx\xml-error.cxx

!if "$(XSDE_POLYMORPHIC)" == "y"
src = $(src) cxx\serializer\map.cxx cxx\serializer\substitution-map.cxx
!endif

!if "$(XSDE_EXCEPTIONS)" == "y"
src = $(src) cxx\serializer\exceptions.cxx
!else
src = $(src) cxx\serializer\error.cxx
!endif

# Serializer implementations.
#
!if "$(XSDE_SERIALIZER_VALIDATION)" == "y"

src = $(src)                                        \
cxx\serializer\validating\serializer.cxx            \
cxx\serializer\validating\time-zone.cxx             \
cxx\serializer\validating\xml-schema-sskel.cxx

!if "$(XSDE_POLYMORPHIC)" == "y"
src = $(src) cxx\serializer\validating\inheritance-map.cxx
!endif

src = $(src)                                        \
cxx\serializer\validating\boolean.cxx               \
cxx\serializer\validating\byte.cxx                  \
cxx\serializer\validating\unsigned-byte.cxx         \
cxx\serializer\validating\short.cxx                 \
cxx\serializer\validating\unsigned-short.cxx        \
cxx\serializer\validating\int.cxx                   \
cxx\serializer\validating\unsigned-int.cxx          \
cxx\serializer\validating\integer.cxx               \
cxx\serializer\validating\negative-integer.cxx      \
cxx\serializer\validating\non-positive-integer.cxx  \
cxx\serializer\validating\positive-integer.cxx      \
cxx\serializer\validating\non-negative-integer.cxx  \
cxx\serializer\validating\float.cxx                 \
cxx\serializer\validating\double.cxx                \
cxx\serializer\validating\decimal.cxx

!if "$(XSDE_LONGLONG)" == "y"
src = $(src)                                        \
cxx\serializer\validating\long-long.cxx             \
cxx\serializer\validating\unsigned-long-long.cxx
!else
src = $(src)                                        \
cxx\serializer\validating\long.cxx                  \
cxx\serializer\validating\unsigned-long.cxx
!endif

!if "$(XSDE_STL)" == "y"

src = $(src)                                        \
cxx\serializer\validating\string-stl.cxx            \
cxx\serializer\validating\normalized-string-stl.cxx \
cxx\serializer\validating\token-stl.cxx             \
cxx\serializer\validating\name-stl.cxx              \
cxx\serializer\validating\nmtoken-stl.cxx           \
cxx\serializer\validating\ncname-stl.cxx            \
cxx\serializer\validating\id-stl.cxx                \
cxx\serializer\validating\idref-stl.cxx             \
cxx\serializer\validating\language-stl.cxx          \
cxx\serializer\validating\uri-stl.cxx               \
cxx\serializer\validating\idrefs-stl.cxx            \
cxx\serializer\validating\nmtokens-stl.cxx          \
cxx\serializer\validating\qname-stl.cxx

!else

src = $(src)                                     \
cxx\serializer\validating\string.cxx             \
cxx\serializer\validating\normalized-string.cxx  \
cxx\serializer\validating\token.cxx              \
cxx\serializer\validating\name.cxx               \
cxx\serializer\validating\nmtoken.cxx            \
cxx\serializer\validating\ncname.cxx             \
cxx\serializer\validating\id.cxx                 \
cxx\serializer\validating\idref.cxx              \
cxx\serializer\validating\language.cxx           \
cxx\serializer\validating\uri.cxx                \
cxx\serializer\validating\idrefs.cxx             \
cxx\serializer\validating\nmtokens.cxx           \
cxx\serializer\validating\qname.cxx

!endif # stl

src = $(src)                                     \
cxx\serializer\validating\base64-binary.cxx      \
cxx\serializer\validating\hex-binary.cxx         \
cxx\serializer\validating\gday.cxx               \
cxx\serializer\validating\gmonth.cxx             \
cxx\serializer\validating\gyear.cxx              \
cxx\serializer\validating\gmonth-day.cxx         \
cxx\serializer\validating\gyear-month.cxx        \
cxx\serializer\validating\date.cxx               \
cxx\serializer\validating\time.cxx               \
cxx\serializer\validating\date-time.cxx          \
cxx\serializer\validating\duration.cxx

!else # validation

src = $(src)                                            \
cxx\serializer\non-validating\serializer.cxx            \
cxx\serializer\non-validating\time-zone.cxx             \
cxx\serializer\non-validating\xml-schema-sskel.cxx

src = $(src)                                            \
cxx\serializer\non-validating\boolean.cxx               \
cxx\serializer\non-validating\byte.cxx                  \
cxx\serializer\non-validating\unsigned-byte.cxx         \
cxx\serializer\non-validating\short.cxx                 \
cxx\serializer\non-validating\unsigned-short.cxx        \
cxx\serializer\non-validating\int.cxx                   \
cxx\serializer\non-validating\unsigned-int.cxx          \
cxx\serializer\non-validating\integer.cxx               \
cxx\serializer\non-validating\negative-integer.cxx      \
cxx\serializer\non-validating\non-positive-integer.cxx  \
cxx\serializer\non-validating\positive-integer.cxx      \
cxx\serializer\non-validating\non-negative-integer.cxx  \
cxx\serializer\non-validating\float.cxx                 \
cxx\serializer\non-validating\double.cxx                \
cxx\serializer\non-validating\decimal.cxx

!if "$(XSDE_LONGLONG)" == "y"
src = $(src)                                            \
cxx\serializer\non-validating\long-long.cxx             \
cxx\serializer\non-validating\unsigned-long-long.cxx
!else
src = $(src)                                            \
cxx\serializer\non-validating\long.cxx                  \
cxx\serializer\non-validating\unsigned-long.cxx
!endif

!if "$(XSDE_STL)" == "y"

src = $(src)                                            \
cxx\serializer\non-validating\string-stl.cxx            \
cxx\serializer\non-validating\normalized-string-stl.cxx \
cxx\serializer\non-validating\token-stl.cxx             \
cxx\serializer\non-validating\name-stl.cxx              \
cxx\serializer\non-validating\nmtoken-stl.cxx           \
cxx\serializer\non-validating\ncname-stl.cxx            \
cxx\serializer\non-validating\id-stl.cxx                \
cxx\serializer\non-validating\idref-stl.cxx             \
cxx\serializer\non-validating\language-stl.cxx          \
cxx\serializer\non-validating\uri-stl.cxx               \
cxx\serializer\non-validating\idrefs-stl.cxx            \
cxx\serializer\non-validating\nmtokens-stl.cxx          \
cxx\serializer\non-validating\qname-stl.cxx

!else

src = $(src)                                         \
cxx\serializer\non-validating\string.cxx             \
cxx\serializer\non-validating\normalized-string.cxx  \
cxx\serializer\non-validating\token.cxx              \
cxx\serializer\non-validating\name.cxx               \
cxx\serializer\non-validating\nmtoken.cxx            \
cxx\serializer\non-validating\ncname.cxx             \
cxx\serializer\non-validating\id.cxx                 \
cxx\serializer\non-validating\idref.cxx              \
cxx\serializer\non-validating\language.cxx           \
cxx\serializer\non-validating\uri.cxx                \
cxx\serializer\non-validating\idrefs.cxx             \
cxx\serializer\non-validating\nmtokens.cxx           \
cxx\serializer\non-validating\qname.cxx

!endif # stl

src = $(src)                                         \
cxx\serializer\non-validating\base64-binary.cxx      \
cxx\serializer\non-validating\hex-binary.cxx         \
cxx\serializer\non-validating\gday.cxx               \
cxx\serializer\non-validating\gmonth.cxx             \
cxx\serializer\non-validating\gyear.cxx              \
cxx\serializer\non-validating\gmonth-day.cxx         \
cxx\serializer\non-validating\gyear-month.cxx        \
cxx\serializer\non-validating\date.cxx               \
cxx\serializer\non-validating\time.cxx               \
cxx\serializer\non-validating\date-time.cxx          \
cxx\serializer\non-validating\duration.cxx

!endif # validation


#
#
obj = $(src:.cxx=.obj)
obj = $(obj:.c=.obj)


# Build.
#
xsde.lib: $(obj)
	$(AR) $(ARFLAGS) /OUT:$@ $**
!if "$(RANLIB)" != ""
	$(RANLIB) $@
!endif

$(obj): config.h

config.h:
	@echo generating config.h
	@echo /* Generated - do not edit. */       >$@
	@echo #ifndef XSDE_CONFIG_H               >>$@
	@echo #define XSDE_CONFIG_H               >>$@
!if "$(XSDE_PLATFORM)" == "wince"
	@echo #define XSDE_PLATFORM_WINCE         >>$@
!endif
!if "$(XSDE_PLATFORM)" == "win32"
	@echo #define XSDE_PLATFORM_WIN32         >>$@
!endif
!if "$(XSDE_PLATFORM)" == "posix"
	@echo #define XSDE_PLATFORM_POSIX         >>$@
!endif
	@echo #define XSDE_ARCH_WIDTH $(XSDE_ARCH_WIDTH) >>$@
!if "$(XSDE_BYTEORDER)" == "l"
	@echo #define XSDE_BYTEORDER 1234         >>$@
!endif
!if "$(XSDE_BYTEORDER)" == "b"
	@echo #define XSDE_BYTEORDER 4321         >>$@
!endif
!if "$(XSDE_STL)" == "y"
	@echo #define XSDE_STL                    >>$@
!endif
!if "$(XSDE_IOSTREAM)" == "y"
	@echo #define XSDE_IOSTREAM               >>$@
!endif
!if "$(XSDE_EXCEPTIONS)" == "y"
	@echo #define XSDE_EXCEPTIONS             >>$@
!endif
!if "$(XSDE_LONGLONG)" == "y"
	@echo #define XSDE_LONGLONG               >>$@
!endif
!if "$(XSDE_SNPRINTF)" == "y"
	@echo #define XSDE_SNPRINTF               >>$@
!endif
!if "$(XSDE_PARSER_VALIDATION)" == "y"
	@echo #define XSDE_PARSER_VALIDATION      >>$@
!endif
!if "$(XSDE_SERIALIZER_VALIDATION)" == "y"
	@echo #define XSDE_SERIALIZER_VALIDATION  >>$@
!endif

!if "$(XSDE_REUSE_STYLE)" == "mixin"
	@echo #define XSDE_REUSE_STYLE_MIXIN      >>$@
!else
	@echo #undef XSDE_REUSE_STYLE_MIXIN       >>$@
!endif
!if "$(XSDE_REUSE_STYLE)" == "tiein"
	@echo #define XSDE_REUSE_STYLE_TIEIN      >>$@
!else
	@echo #undef XSDE_REUSE_STYLE_TIEIN       >>$@
!endif
!if "$(XSDE_REUSE_STYLE)" == "none"
	@echo #define XSDE_REUSE_STYLE_NONE       >>$@
!else
	@echo #undef XSDE_REUSE_STYLE_NONE        >>$@
!endif
!if "$(XSDE_POLYMORPHIC)" == "y"
	@echo #define XSDE_POLYMORPHIC            >>$@
	@echo #define XSDE_PARSER_SMAP_BUCKETS $(XSDE_PARSER_SMAP_BUCKETS)UL >>$@
!if "$(XSDE_PARSER_VALIDATION)" == "y"
	@echo #define XSDE_PARSER_IMAP_BUCKETS $(XSDE_PARSER_IMAP_BUCKETS)UL >>$@
!endif
	@echo #define XSDE_SERIALIZER_SMAP_BUCKETS $(XSDE_SERIALIZER_SMAP_BUCKETS)UL >>$@
	@echo #define XSDE_SERIALIZER_SMAP_BUCKET_BUCKETS $(XSDE_SERIALIZER_SMAP_BUCKET_BUCKETS)UL >>$@
!if "$(XSDE_SERIALIZER_VALIDATION)" == "y"
	@echo #define XSDE_SERIALIZER_IMAP_BUCKETS $(XSDE_SERIALIZER_IMAP_BUCKETS)UL >>$@
!endif
!else
	@echo #undef XSDE_POLYMORPHIC             >>$@
!endif
	@echo #endif                              >>$@

# Test.
#
test: xsde.lib

# Clean.
#
# Nmake that comes with eVC++ 4 cannot handle del $(obj)
# because the resulting line is too long.
#
clean:
	-del xsde.lib config.h
	-del c\expat\*.obj
	-del c\genx\*.obj
	-del cxx\*.obj
	-del cxx\parser\*.obj
	-del cxx\parser\expat\*.obj
!if "$(XSDE_PARSER_VALIDATION)" == "y"
	-del cxx\parser\validating\*.obj
!else
	-del cxx\parser\non-validating\*.obj
!endif
	-del cxx\serializer\*.obj
	-del cxx\serializer\genx\*.obj
!if "$(XSDE_SERIALIZER_VALIDATION)" == "y"
	-del cxx\serializer\validating\*.obj
!else
	-del cxx\serializer\non-validating\*.obj
!endif
