⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlwriter.c

📁 libxml,在UNIX/LINUX下非常重要的一个库,为XML相关应用提供方便.目前上载的是最新版本,若要取得最新版本,请参考里面的readme.
💻 C
📖 第 1 页 / 共 5 页
字号:
        int c;        int n;        igroup[0] = igroup[1] = igroup[2] = 0;        for (n = 0; n < 3 && i < len; n++, i++) {            c = data[i];            igroup[n] = (unsigned char) c;        }        if (n > 0) {            ogroup[0] = dtable[igroup[0] >> 2];            ogroup[1] = dtable[((igroup[0] & 3) << 4) | (igroup[1] >> 4)];            ogroup[2] =                dtable[((igroup[1] & 0xF) << 2) | (igroup[2] >> 6)];            ogroup[3] = dtable[igroup[2] & 0x3F];            if (n < 3) {                ogroup[3] = '=';                if (n < 2) {                    ogroup[2] = '=';                }            }            if (linelen >= B64LINELEN) {                count = xmlOutputBufferWrite(out, 2, B64CRLF);                if (count == -1)                    return -1;                sum += count;                linelen = 0;            }            count = xmlOutputBufferWrite(out, 4, (const char *) ogroup);            if (count == -1)                return -1;            sum += count;            linelen += 4;        }        if (i >= len)            break;    }    return sum;}/** * xmlTextWriterWriteBase64: * @writer: the xmlTextWriterPtr * @data:   binary data * @start:  the position within the data of the first byte to encode * @len:  the number of bytes to encode * * Write an base64 encoded xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteBase64(xmlTextWriterPtr writer, const char *data,                         int start, int len){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))        return -1;    sum = 0;    lk = xmlListFront(writer->nodes);    if (lk != 0) {        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);        if (p != 0) {            count = xmlTextWriterHandleStateDependencies(writer, p);            if (count < 0)                return -1;            sum += count;        }    }    if (writer->indent)        writer->doindent = 0;    count =        xmlOutputBufferWriteBase64(writer->out, len,                                   (unsigned char *) data + start);    if (count < 0)        return -1;    sum += count;    return sum;}/** * xmlOutputBufferWriteBinHex: * @out: the xmlOutputBufferPtr * @data:   binary data * @len:  the number of bytes to encode * * Write hqx encoded data to an xmlOutputBuffer. * ::todo * * Returns the bytes written (may be 0 because of buffering)  * or -1 in case of error */static intxmlOutputBufferWriteBinHex(xmlOutputBufferPtr out,                           int len, const unsigned char *data){    int count;    int sum;    static char hex[16] =     	{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};    int i;    if ((out == NULL) || (data == NULL) || (len < 0)) {        return -1;    }    sum = 0;    for (i = 0; i < len; i++) {        count =            xmlOutputBufferWrite(out, 1,                                 (const char *) &hex[data[i] >> 4]);        if (count == -1)            return -1;        sum += count;        count =            xmlOutputBufferWrite(out, 1,                                 (const char *) &hex[data[i] & 0xF]);        if (count == -1)            return -1;        sum += count;    }    return sum;}/** * xmlTextWriterWriteBinHex: * @writer: the xmlTextWriterPtr * @data:   binary data * @start:  the position within the data of the first byte to encode * @len:  the number of bytes to encode * * Write a BinHex encoded xml text. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteBinHex(xmlTextWriterPtr writer, const char *data,                         int start, int len){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if ((writer == NULL) || (data == NULL) || (start < 0) || (len < 0))        return -1;    sum = 0;    lk = xmlListFront(writer->nodes);    if (lk != 0) {        p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);        if (p != 0) {            count = xmlTextWriterHandleStateDependencies(writer, p);            if (count < 0)                return -1;            sum += count;        }    }    if (writer->indent)        writer->doindent = 0;    count =        xmlOutputBufferWriteBinHex(writer->out, len,                                   (unsigned char *) data + start);    if (count < 0)        return -1;    sum += count;    return sum;}/** * xmlTextWriterStartAttribute: * @writer:  the xmlTextWriterPtr * @name:  element name * * Start an xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar * name){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    if ((writer == NULL) || (name == NULL) || (*name == '\0'))        return -1;    sum = 0;    lk = xmlListFront(writer->nodes);    if (lk == 0)        return -1;    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);    if (p == 0)        return -1;    switch (p->state) {        case XML_TEXTWRITER_ATTRIBUTE:            count = xmlTextWriterEndAttribute(writer);            if (count < 0)                return -1;            sum += count;            /* fallthrough */        case XML_TEXTWRITER_NAME:            count = xmlOutputBufferWriteString(writer->out, " ");            if (count < 0)                return -1;            sum += count;            count =                xmlOutputBufferWriteString(writer->out,                                           (const char *) name);            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWriteString(writer->out, "=");            if (count < 0)                return -1;            sum += count;            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);            if (count < 0)                return -1;            sum += count;            p->state = XML_TEXTWRITER_ATTRIBUTE;            break;        default:            return -1;    }    return sum;}/** * xmlTextWriterStartAttributeNS: * @writer:  the xmlTextWriterPtr * @prefix:  namespace prefix or NULL * @name:  element local name * @namespaceURI:  namespace URI or NULL * * Start an xml attribute with namespace support. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterStartAttributeNS(xmlTextWriterPtr writer,                              const xmlChar * prefix, const xmlChar * name,                              const xmlChar * namespaceURI){    int count;    int sum;    xmlChar *buf;    xmlTextWriterNsStackEntry *p;    if ((writer == NULL) || (name == NULL) || (*name == '\0'))        return -1;    buf = 0;    if (prefix != 0) {        buf = xmlStrdup(prefix);        buf = xmlStrcat(buf, BAD_CAST ":");    }    buf = xmlStrcat(buf, name);    sum = 0;    count = xmlTextWriterStartAttribute(writer, buf);    xmlFree(buf);    if (count < 0)        return -1;    sum += count;    if (namespaceURI != 0) {        buf = xmlStrdup(BAD_CAST "xmlns");        if (prefix != 0) {            buf = xmlStrcat(buf, BAD_CAST ":");            buf = xmlStrcat(buf, prefix);        }        p = (xmlTextWriterNsStackEntry *)            xmlMalloc(sizeof(xmlTextWriterNsStackEntry));        if (p == 0) {            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                            "xmlTextWriterStartAttributeNS : out of memory!\n");            return -1;        }        p->prefix = buf;        p->uri = xmlStrdup(namespaceURI);        if (p->uri == 0) {            xmlWriterErrMsg(writer, XML_ERR_NO_MEMORY,                            "xmlTextWriterStartAttributeNS : out of memory!\n");            xmlFree(p);            return -1;        }        p->elem = xmlListFront(writer->nodes);        xmlListPushFront(writer->nsstack, p);    }    return sum;}/** * xmlTextWriterEndAttribute: * @writer:  the xmlTextWriterPtr * * End the current xml element. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterEndAttribute(xmlTextWriterPtr writer){    int count;    int sum;    xmlLinkPtr lk;    xmlTextWriterStackEntry *p;    xmlTextWriterNsStackEntry *np;    if (writer == NULL)        return -1;    lk = xmlListFront(writer->nodes);    if (lk == 0) {        xmlListDelete(writer->nsstack);	writer->nsstack = NULL;        return -1;    }    p = (xmlTextWriterStackEntry *) xmlLinkGetData(lk);    if (p == 0) {        xmlListDelete(writer->nsstack);	writer->nsstack = NULL;        return -1;    }    sum = 0;    switch (p->state) {        case XML_TEXTWRITER_ATTRIBUTE:            p->state = XML_TEXTWRITER_NAME;            count = xmlOutputBufferWrite(writer->out, 1, &writer->qchar);            if (count < 0) {                xmlListDelete(writer->nsstack);		writer->nsstack = NULL;                return -1;            }            sum += count;            while (!xmlListEmpty(writer->nsstack)) {	        xmlChar *namespaceURI = NULL;		xmlChar *prefix = NULL;                lk = xmlListFront(writer->nsstack);                np = (xmlTextWriterNsStackEntry *) xmlLinkGetData(lk);		if (np != 0) {		    namespaceURI = xmlStrdup(np->uri);		    prefix = xmlStrdup(np->prefix);		}		xmlListPopFront(writer->nsstack);                if (np != 0) {                    count =                        xmlTextWriterWriteAttribute(writer, prefix,                                                    namespaceURI);		    xmlFree(namespaceURI);		    xmlFree(prefix);                    if (count < 0) {                        xmlListDelete(writer->nsstack);			writer->nsstack = NULL;                        return -1;                    }                    sum += count;                }            }            break;        default:            xmlListClear(writer->nsstack);            return -1;    }    return sum;}/** * xmlTextWriterWriteFormatAttribute: * @writer:  the xmlTextWriterPtr * @name:  attribute name * @format:  format string (see printf) * @...:  extra parameters for the format * * Write a formatted xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteFormatAttribute(xmlTextWriterPtr writer,                                  const xmlChar * name, const char *format,                                  ...){    int rc;    va_list ap;    va_start(ap, format);    rc = xmlTextWriterWriteVFormatAttribute(writer, name, format, ap);    va_end(ap);    return rc;}/** * xmlTextWriterWriteVFormatAttribute: * @writer:  the xmlTextWriterPtr * @name:  attribute name * @format:  format string (see printf) * @argptr:  pointer to the first member of the variable argument list. * * Write a formatted xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteVFormatAttribute(xmlTextWriterPtr writer,                                   const xmlChar * name,                                   const char *format, va_list argptr){    int rc;    xmlChar *buf;    if (writer == NULL)        return -1;    buf = xmlTextWriterVSprintf(format, argptr);    if (buf == 0)        return 0;    rc = xmlTextWriterWriteAttribute(writer, name, buf);    xmlFree(buf);    return rc;}/** * xmlTextWriterWriteAttribute: * @writer:  the xmlTextWriterPtr * @name:  attribute name * @content:  attribute content * * Write an xml attribute. * * Returns the bytes written (may be 0 because of buffering) or -1 in case of error */intxmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar * name,                            const xmlChar * content){    int count;    int sum;    sum = 0;    count = xmlTextWriterStartAttribute(writer, name);    if (count < 0)        return -1;    sum += count;    count = xmlTextWriterWriteString(writer, content);    if (count < 0)        return -1;    sum += count;    count = xmlTextWriterEndAttribute(writer);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -