<?xml version="1.0" encoding="utf-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text" encoding="iso-8859-1"/> <xsl:template match="descriptors"> <xsl:variable name="num_lang" select="count(languages/lang)"/> <xsl:text>#include "string-descriptors.h" </xsl:text> <!-- string descriptors --> <xsl:for-each select="strings/string/lang"> <xsl:text>static const struct { </xsl:text> <xsl:text> struct usb_st_string_descriptor base; </xsl:text> <xsl:text> Uint16 chars[</xsl:text> <xsl:value-of select="string-length(text()) -1"/> <xsl:text>]; </xsl:text> <xsl:text>} string_descriptor_</xsl:text> <xsl:number count="/descriptors/strings/string" format="1"/> <xsl:text>_</xsl:text> <xsl:choose> <xsl:when test="@id"> <xsl:value-of select="@id"/> </xsl:when> <xsl:otherwise> <xsl:text>all</xsl:text> </xsl:otherwise> </xsl:choose> <xsl:text>= {{</xsl:text> <xsl:value-of select="string-length(text())*2 + 2"/> <xsl:text>, 3, {'</xsl:text> <xsl:value-of select="substring(text(), 1,1)"/> <xsl:text>'}}, { </xsl:text> <xsl:call-template name="output-UCS2"> <xsl:with-param name="string" select="substring(text(), 2)"/> </xsl:call-template> <xsl:text>}}; </xsl:text> </xsl:for-each> <!-- string tables --> <xsl:for-each select="/descriptors/languages/lang"> <xsl:variable name="id" select="@id"/> <xsl:text>static const struct usb_st_string_descriptor * string_table_</xsl:text> <xsl:value-of select="$id"/> <xsl:text>[] = { </xsl:text> <xsl:for-each select="/descriptors/strings/string"> <xsl:text> &string_descriptor_</xsl:text> <xsl:number count="/descriptors/strings/string" format="1"/> <xsl:text>_</xsl:text> <xsl:choose> <xsl:when test="lang[@id = $id]"> <xsl:value-of select="$id"/> </xsl:when> <xsl:when test="lang[@id = 'all' or count(@id) = 0]"> <xsl:text>all</xsl:text> </xsl:when> <xsl:otherwise> <xsl:message terminate="yes"> <xsl:text>No string found for index </xsl:text> <xsl:number count="/descriptors/strings/string" format="1"/> <xsl:text> and language </xsl:text> <xsl:value-of select="$id"/> </xsl:message> </xsl:otherwise> </xsl:choose> <xsl:text>.base, </xsl:text> </xsl:for-each> <xsl:text>}; </xsl:text> </xsl:for-each> <!-- language descriptor --> <xsl:text>static const struct { </xsl:text> <xsl:text> struct usb_st_language_descriptor base; </xsl:text> <xsl:text> Uint16 langs[</xsl:text> <xsl:value-of select="$num_lang -1"/> <xsl:text>]; </xsl:text> <xsl:text>} language_descriptor = { </xsl:text> <xsl:text> {</xsl:text> <xsl:value-of select="$num_lang*2 + 2"/> <xsl:text>, 3, {</xsl:text> <xsl:value-of select="languages/lang[1]/text()"/> <xsl:text>}}, {</xsl:text> <xsl:for-each select="languages/lang[position() > 1]"> <xsl:value-of select="text()"/> <xsl:text>, </xsl:text> </xsl:for-each> <xsl:text>}}; </xsl:text> <!-- language lookup table --> <xsl:text>static const struct { </xsl:text> <xsl:text> struct usb_st_string_languages base; </xsl:text> <xsl:text> struct usb_st_string_language_map map[</xsl:text> <xsl:value-of select="$num_lang - 1"/> <xsl:text>]; } </xsl:text> <xsl:text>string_languages_full={{</xsl:text> <xsl:value-of select="$num_lang"/> <xsl:text>, </xsl:text> <xsl:value-of select="count(strings/string)"/> <xsl:text>, &language_descriptor.base</xsl:text> <xsl:text>, {{</xsl:text> <xsl:value-of select="languages/lang[1]/text()"/> <xsl:text>, string_table_</xsl:text> <xsl:value-of select="languages/lang[1]/@id"/> <xsl:text>}}}, { </xsl:text> <xsl:for-each select="languages/lang[position() > 1]"> <xsl:text> {</xsl:text> <xsl:value-of select="text()"/> <xsl:text>, string_table_</xsl:text> <xsl:value-of select="@id"/> <xsl:text>}, </xsl:text> </xsl:for-each> <xsl:text> } }; </xsl:text> <xsl:text>const struct usb_st_string_languages * const string_languages = &string_languages_full.base; </xsl:text> </xsl:template> <xsl:template name="output-UCS2"> <xsl:param name="string"/> <xsl:if test="string-length($string) > 0"> <xsl:text>'</xsl:text> <xsl:value-of select="substring($string, 1,1)"/> <xsl:text>'</xsl:text> <xsl:if test="string-length($string) > 1"> <xsl:text>, </xsl:text> </xsl:if> <xsl:call-template name="output-UCS2"> <xsl:with-param name="string" select="substring($string, 2)"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>