Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1207)

Side by Side Diff: third_party/libxml/src/xmlIO.c

Issue 1193533007: Upgrade to libxml 2.9.2 and libxslt 1.1.28 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no iconv Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/src/xml2-config.in ('k') | third_party/libxml/src/xmlcatalog.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * xmlIO.c : implementation of the I/O interfaces used by the parser 2 * xmlIO.c : implementation of the I/O interfaces used by the parser
3 * 3 *
4 * See Copyright for the status of this software. 4 * See Copyright for the status of this software.
5 * 5 *
6 * daniel@veillard.com 6 * daniel@veillard.com
7 * 7 *
8 * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char 8 * 14 Nov 2000 ht - for VMS, truncated name of long functions to under 32 char
9 */ 9 */
10 10
(...skipping 17 matching lines...) Expand all
28 #endif 28 #endif
29 #ifdef HAVE_UNISTD_H 29 #ifdef HAVE_UNISTD_H
30 #include <unistd.h> 30 #include <unistd.h>
31 #endif 31 #endif
32 #ifdef HAVE_STDLIB_H 32 #ifdef HAVE_STDLIB_H
33 #include <stdlib.h> 33 #include <stdlib.h>
34 #endif 34 #endif
35 #ifdef HAVE_ZLIB_H 35 #ifdef HAVE_ZLIB_H
36 #include <zlib.h> 36 #include <zlib.h>
37 #endif 37 #endif
38 #ifdef HAVE_LZMA_H
39 #include <lzma.h>
40 #endif
38 41
39 #if defined(WIN32) || defined(_WIN32) 42 #if defined(WIN32) || defined(_WIN32)
40 #include <windows.h> 43 #include <windows.h>
41 #endif 44 #endif
42 45
43 #if defined(_WIN32_WCE) 46 #if defined(_WIN32_WCE)
44 #include <winnls.h> /* for CP_UTF8 */ 47 #include <winnls.h> /* for CP_UTF8 */
45 #endif 48 #endif
46 49
47 /* Figure a portable way to know if a file is a directory. */ 50 /* Figure a portable way to know if a file is a directory. */
(...skipping 30 matching lines...) Expand all
78 # endif 81 # endif
79 # endif 82 # endif
80 # endif 83 # endif
81 #endif 84 #endif
82 85
83 #include <libxml/xmlmemory.h> 86 #include <libxml/xmlmemory.h>
84 #include <libxml/parser.h> 87 #include <libxml/parser.h>
85 #include <libxml/parserInternals.h> 88 #include <libxml/parserInternals.h>
86 #include <libxml/xmlIO.h> 89 #include <libxml/xmlIO.h>
87 #include <libxml/uri.h> 90 #include <libxml/uri.h>
91 #include <libxml/nanohttp.h>
92 #include <libxml/nanoftp.h>
88 #include <libxml/xmlerror.h> 93 #include <libxml/xmlerror.h>
89 #ifdef LIBXML_CATALOG_ENABLED 94 #ifdef LIBXML_CATALOG_ENABLED
90 #include <libxml/catalog.h> 95 #include <libxml/catalog.h>
91 #endif 96 #endif
92 #include <libxml/globals.h> 97 #include <libxml/globals.h>
93 98
99 #include "buf.h"
100 #include "enc.h"
101
94 /* #define VERBOSE_FAILURE */ 102 /* #define VERBOSE_FAILURE */
95 /* #define DEBUG_EXTERNAL_ENTITIES */ 103 /* #define DEBUG_EXTERNAL_ENTITIES */
96 /* #define DEBUG_INPUT */ 104 /* #define DEBUG_INPUT */
97 105
98 #ifdef DEBUG_INPUT 106 #ifdef DEBUG_INPUT
99 #define MINLEN 40 107 #define MINLEN 40
100 #else 108 #else
101 #define MINLEN 4000 109 #define MINLEN 4000
102 #endif 110 #endif
103 111
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 * returns 1. if stat fails, returns 0 (if calling 764 * returns 1. if stat fails, returns 0 (if calling
757 * stat on the filename fails, it can't be right). 765 * stat on the filename fails, it can't be right).
758 * if stat succeeds and the file is a directory, 766 * if stat succeeds and the file is a directory,
759 * returns 2. otherwise returns 1. 767 * returns 2. otherwise returns 1.
760 */ 768 */
761 769
762 int 770 int
763 xmlCheckFilename (const char *path) 771 xmlCheckFilename (const char *path)
764 { 772 {
765 #ifdef HAVE_STAT 773 #ifdef HAVE_STAT
766 » struct stat stat_buffer; 774 struct stat stat_buffer;
767 #endif 775 #endif
768 » if (path == NULL) 776 if (path == NULL)
769 » » return(0); 777 » return(0);
770 778
771 #ifdef HAVE_STAT 779 #ifdef HAVE_STAT
772 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) 780 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
781 /*
782 * On Windows stat and wstat do not work with long pathname,
783 * which start with '\\?\'
784 */
785 if ((path[0] == '\\') && (path[1] == '\\') && (path[2] == '?') &&
786 (path[3] == '\\') )
787 return 1;
788
773 if (xmlWrapStat(path, &stat_buffer) == -1) 789 if (xmlWrapStat(path, &stat_buffer) == -1)
774 return 0; 790 return 0;
775 #else 791 #else
776 if (stat(path, &stat_buffer) == -1) 792 if (stat(path, &stat_buffer) == -1)
777 return 0; 793 return 0;
778 #endif 794 #endif
779 #ifdef S_ISDIR 795 #ifdef S_ISDIR
780 if (S_ISDIR(stat_buffer.st_mode)) 796 if (S_ISDIR(stat_buffer.st_mode))
781 return 2; 797 return 2;
782 #endif 798 #endif
783 #endif /* HAVE_STAT */ 799 #endif /* HAVE_STAT */
784 return 1; 800 return 1;
785 } 801 }
786 802
787 static int 803 /**
804 * xmlNop:
805 *
806 * No Operation function, does nothing, no input
807 *
808 * Returns zero
809 */
810 int
788 xmlNop(void) { 811 xmlNop(void) {
789 return(0); 812 return(0);
790 } 813 }
791 814
792 /** 815 /**
793 * xmlFdRead: 816 * xmlFdRead:
794 * @context: the I/O context 817 * @context: the I/O context
795 * @buffer: where to drop data 818 * @buffer: where to drop data
796 * @len: number of bytes to read 819 * @len: number of bytes to read
797 * 820 *
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
864 * xmlFileOpen_real: 887 * xmlFileOpen_real:
865 * @filename: the URI for matching 888 * @filename: the URI for matching
866 * 889 *
867 * input from FILE *, supports compressed input 890 * input from FILE *, supports compressed input
868 * if @filename is " " then the standard input is used 891 * if @filename is " " then the standard input is used
869 * 892 *
870 * Returns an I/O context or NULL in case of error 893 * Returns an I/O context or NULL in case of error
871 */ 894 */
872 static void * 895 static void *
873 xmlFileOpen_real (const char *filename) { 896 xmlFileOpen_real (const char *filename) {
874 const char *path = NULL; 897 const char *path = filename;
875 FILE *fd; 898 FILE *fd;
876 899
877 if (filename == NULL) 900 if (filename == NULL)
878 return(NULL); 901 return(NULL);
879 902
880 if (!strcmp(filename, "-")) { 903 if (!strcmp(filename, "-")) {
881 fd = stdin; 904 fd = stdin;
882 return((void *) fd); 905 return((void *) fd);
883 } 906 }
884 907
885 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) { 908 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
886 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) 909 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
887 path = &filename[17]; 910 path = &filename[17];
888 #else 911 #else
889 path = &filename[16]; 912 path = &filename[16];
890 #endif 913 #endif
891 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { 914 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
892 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) 915 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
893 path = &filename[8]; 916 path = &filename[8];
894 #else 917 #else
895 path = &filename[7]; 918 path = &filename[7];
896 #endif 919 #endif
897 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) { 920 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
898 /* lots of generators seems to lazy to read RFC 1738 */ 921 /* lots of generators seems to lazy to read RFC 1738 */
899 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) 922 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
900 path = &filename[6]; 923 path = &filename[6];
901 #else 924 #else
902 path = &filename[5]; 925 path = &filename[5];
903 #endif 926 #endif
904 } else 927 }
905 » path = filename;
906 928
907 if (path == NULL)
908 return(NULL);
909 if (!xmlCheckFilename(path)) 929 if (!xmlCheckFilename(path))
910 return(NULL); 930 return(NULL);
911 931
912 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) 932 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
913 fd = xmlWrapOpen(path, 0); 933 fd = xmlWrapOpen(path, 0);
914 #else 934 #else
915 fd = fopen(path, "r"); 935 fd = fopen(path, "r");
916 #endif /* WIN32 */ 936 #endif /* WIN32 */
917 if (fd == NULL) xmlIOErr(0, path); 937 if (fd == NULL) xmlIOErr(0, path);
918 return((void *) fd); 938 return((void *) fd);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 #endif 998 #endif
979 } else 999 } else
980 path = filename; 1000 path = filename;
981 1001
982 if (path == NULL) 1002 if (path == NULL)
983 return(NULL); 1003 return(NULL);
984 1004
985 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) 1005 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
986 fd = xmlWrapOpen(path, 1); 1006 fd = xmlWrapOpen(path, 1);
987 #else 1007 #else
988 » fd = fopen(path, "wb"); 1008 » fd = fopen(path, "wb");
989 #endif /* WIN32 */ 1009 #endif /* WIN32 */
990 1010
991 if (fd == NULL) xmlIOErr(0, path); 1011 if (fd == NULL) xmlIOErr(0, path);
992 return((void *) fd); 1012 return((void *) fd);
993 } 1013 }
994 #endif /* LIBXML_OUTPUT_ENABLED */ 1014 #endif /* LIBXML_OUTPUT_ENABLED */
995 1015
996 /** 1016 /**
997 * xmlFileRead: 1017 * xmlFileRead:
998 * @context: the I/O context 1018 * @context: the I/O context
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 * if @filename is " " then the standard input is used 1156 * if @filename is " " then the standard input is used
1137 * 1157 *
1138 * Returns an I/O context or NULL in case of error 1158 * Returns an I/O context or NULL in case of error
1139 */ 1159 */
1140 static void * 1160 static void *
1141 xmlGzfileOpen_real (const char *filename) { 1161 xmlGzfileOpen_real (const char *filename) {
1142 const char *path = NULL; 1162 const char *path = NULL;
1143 gzFile fd; 1163 gzFile fd;
1144 1164
1145 if (!strcmp(filename, "-")) { 1165 if (!strcmp(filename, "-")) {
1146 fd = gzdopen(dup(0), "rb"); 1166 int duped_fd = dup(fileno(stdin));
1167 fd = gzdopen(duped_fd, "rb");
1168 if (fd == Z_NULL && duped_fd >= 0) {
1169 close(duped_fd); /* gzdOpen() does not close on failure */
1170 }
1171
1147 return((void *) fd); 1172 return((void *) fd);
1148 } 1173 }
1149 1174
1150 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) 1175 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
1151 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) 1176 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1152 path = &filename[17]; 1177 path = &filename[17];
1153 #else 1178 #else
1154 path = &filename[16]; 1179 path = &filename[16];
1155 #endif 1180 #endif
1156 else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { 1181 else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 * Returns an I/O context or NULL in case of error 1235 * Returns an I/O context or NULL in case of error
1211 */ 1236 */
1212 static void * 1237 static void *
1213 xmlGzfileOpenW (const char *filename, int compression) { 1238 xmlGzfileOpenW (const char *filename, int compression) {
1214 const char *path = NULL; 1239 const char *path = NULL;
1215 char mode[15]; 1240 char mode[15];
1216 gzFile fd; 1241 gzFile fd;
1217 1242
1218 snprintf(mode, sizeof(mode), "wb%d", compression); 1243 snprintf(mode, sizeof(mode), "wb%d", compression);
1219 if (!strcmp(filename, "-")) { 1244 if (!strcmp(filename, "-")) {
1220 fd = gzdopen(dup(1), mode); 1245 int duped_fd = dup(fileno(stdout));
1246 fd = gzdopen(duped_fd, "rb");
1247 if (fd == Z_NULL && duped_fd >= 0) {
1248 close(duped_fd); /* gzdOpen() does not close on failure */
1249 }
1250
1221 return((void *) fd); 1251 return((void *) fd);
1222 } 1252 }
1223 1253
1224 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) 1254 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17))
1225 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__) 1255 #if defined (_WIN32) || defined (__DJGPP__) && !defined(__CYGWIN__)
1226 path = &filename[17]; 1256 path = &filename[17];
1227 #else 1257 #else
1228 path = &filename[16]; 1258 path = &filename[16];
1229 #endif 1259 #endif
1230 else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) { 1260 else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1297 static int 1327 static int
1298 xmlGzfileClose (void * context) { 1328 xmlGzfileClose (void * context) {
1299 int ret; 1329 int ret;
1300 1330
1301 ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1; 1331 ret = (gzclose((gzFile) context) == Z_OK ) ? 0 : -1;
1302 if (ret < 0) xmlIOErr(0, "gzclose()"); 1332 if (ret < 0) xmlIOErr(0, "gzclose()");
1303 return(ret); 1333 return(ret);
1304 } 1334 }
1305 #endif /* HAVE_ZLIB_H */ 1335 #endif /* HAVE_ZLIB_H */
1306 1336
1337 #ifdef HAVE_LZMA_H
1338 /************************************************************************
1339 * *
1340 * I/O for compressed file accesses *
1341 * *
1342 ************************************************************************/
1343 #include "xzlib.h"
1344 /**
1345 * xmlXzfileMatch:
1346 * @filename: the URI for matching
1347 *
1348 * input from compressed file test
1349 *
1350 * Returns 1 if matches, 0 otherwise
1351 */
1352 static int
1353 xmlXzfileMatch (const char *filename ATTRIBUTE_UNUSED) {
1354 return(1);
1355 }
1356
1357 /**
1358 * xmlXzFileOpen_real:
1359 * @filename: the URI for matching
1360 *
1361 * input from compressed file open
1362 * if @filename is " " then the standard input is used
1363 *
1364 * Returns an I/O context or NULL in case of error
1365 */
1366 static void *
1367 xmlXzfileOpen_real (const char *filename) {
1368 const char *path = NULL;
1369 xzFile fd;
1370
1371 if (!strcmp(filename, "-")) {
1372 fd = __libxml2_xzdopen(dup(fileno(stdin)), "rb");
1373 return((void *) fd);
1374 }
1375
1376 if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file://localhost/", 17)) {
1377 path = &filename[16];
1378 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:///", 8)) {
1379 path = &filename[7];
1380 } else if (!xmlStrncasecmp(BAD_CAST filename, BAD_CAST "file:/", 6)) {
1381 /* lots of generators seems to lazy to read RFC 1738 */
1382 path = &filename[5];
1383 } else
1384 path = filename;
1385
1386 if (path == NULL)
1387 return(NULL);
1388 if (!xmlCheckFilename(path))
1389 return(NULL);
1390
1391 fd = __libxml2_xzopen(path, "rb");
1392 return((void *) fd);
1393 }
1394
1395 /**
1396 * xmlXzfileOpen:
1397 * @filename: the URI for matching
1398 *
1399 * Wrapper around xmlXzfileOpen_real that try it with an unescaped
1400 * version of @filename, if this fails fallback to @filename
1401 *
1402 * Returns a handler or NULL in case or failure
1403 */
1404 static void *
1405 xmlXzfileOpen (const char *filename) {
1406 char *unescaped;
1407 void *retval;
1408
1409 retval = xmlXzfileOpen_real(filename);
1410 if (retval == NULL) {
1411 unescaped = xmlURIUnescapeString(filename, 0, NULL);
1412 if (unescaped != NULL) {
1413 retval = xmlXzfileOpen_real(unescaped);
1414 }
1415 xmlFree(unescaped);
1416 }
1417
1418 return retval;
1419 }
1420
1421 /**
1422 * xmlXzfileRead:
1423 * @context: the I/O context
1424 * @buffer: where to drop data
1425 * @len: number of bytes to write
1426 *
1427 * Read @len bytes to @buffer from the compressed I/O channel.
1428 *
1429 * Returns the number of bytes written
1430 */
1431 static int
1432 xmlXzfileRead (void * context, char * buffer, int len) {
1433 int ret;
1434
1435 ret = __libxml2_xzread((xzFile) context, &buffer[0], len);
1436 if (ret < 0) xmlIOErr(0, "xzread()");
1437 return(ret);
1438 }
1439
1440 /**
1441 * xmlXzfileClose:
1442 * @context: the I/O context
1443 *
1444 * Close a compressed I/O channel
1445 */
1446 static int
1447 xmlXzfileClose (void * context) {
1448 int ret;
1449
1450 ret = (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
1451 if (ret < 0) xmlIOErr(0, "xzclose()");
1452 return(ret);
1453 }
1454 #endif /* HAVE_LZMA_H */
1455
1307 #ifdef LIBXML_HTTP_ENABLED 1456 #ifdef LIBXML_HTTP_ENABLED
1308 /************************************************************************ 1457 /************************************************************************
1309 * * 1458 * *
1310 * I/O for HTTP file accesses * 1459 * I/O for HTTP file accesses *
1311 * * 1460 * *
1312 ************************************************************************/ 1461 ************************************************************************/
1313 1462
1314 #ifdef LIBXML_OUTPUT_ENABLED 1463 #ifdef LIBXML_OUTPUT_ENABLED
1315 typedef struct xmlIOHTTPWriteCtxt_ 1464 typedef struct xmlIOHTTPWriteCtxt_
1316 { 1465 {
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
1905 if ( ctxt->compression > 0 ) { 2054 if ( ctxt->compression > 0 ) {
1906 content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content ); 2055 content_lgth = xmlZMemBuffGetContent( ctxt->doc_buff, &http_content );
1907 content_encoding = (char *) "Content-Encoding: gzip"; 2056 content_encoding = (char *) "Content-Encoding: gzip";
1908 } 2057 }
1909 else 2058 else
1910 #endif 2059 #endif
1911 { 2060 {
1912 /* Pull the data out of the memory output buffer */ 2061 /* Pull the data out of the memory output buffer */
1913 2062
1914 xmlOutputBufferPtr dctxt = ctxt->doc_buff; 2063 xmlOutputBufferPtr dctxt = ctxt->doc_buff;
1915 » http_content = (char *)dctxt->buffer->content; 2064 » http_content = (char *) xmlBufContent(dctxt->buffer);
1916 » content_lgth = dctxt->buffer->use; 2065 » content_lgth = xmlBufUse(dctxt->buffer);
1917 } 2066 }
1918 2067
1919 if ( http_content == NULL ) { 2068 if ( http_content == NULL ) {
1920 xmlChar msg[500]; 2069 xmlChar msg[500];
1921 xmlStrPrintf(msg, 500, 2070 xmlStrPrintf(msg, 500,
1922 (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n ", 2071 (const xmlChar *) "xmlIOHTTPCloseWrite: %s '%s' %s '%s'.\n ",
1923 "Error retrieving content.\nUnable to", 2072 "Error retrieving content.\nUnable to",
1924 http_mthd, "data to URI", ctxt->uri ); 2073 http_mthd, "data to URI", ctxt->uri );
1925 xmlIOErr(XML_IO_WRITE, (const char *) msg); 2074 xmlIOErr(XML_IO_WRITE, (const char *) msg);
1926 } 2075 }
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
2172 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__) 2321 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
2173 xmlInitPlatformSpecificIo(); 2322 xmlInitPlatformSpecificIo();
2174 #endif 2323 #endif
2175 2324
2176 xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen, 2325 xmlRegisterInputCallbacks(xmlFileMatch, xmlFileOpen,
2177 xmlFileRead, xmlFileClose); 2326 xmlFileRead, xmlFileClose);
2178 #ifdef HAVE_ZLIB_H 2327 #ifdef HAVE_ZLIB_H
2179 xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen, 2328 xmlRegisterInputCallbacks(xmlGzfileMatch, xmlGzfileOpen,
2180 xmlGzfileRead, xmlGzfileClose); 2329 xmlGzfileRead, xmlGzfileClose);
2181 #endif /* HAVE_ZLIB_H */ 2330 #endif /* HAVE_ZLIB_H */
2331 #ifdef HAVE_LZMA_H
2332 xmlRegisterInputCallbacks(xmlXzfileMatch, xmlXzfileOpen,
2333 xmlXzfileRead, xmlXzfileClose);
2334 #endif /* HAVE_ZLIB_H */
2182 2335
2183 #ifdef LIBXML_HTTP_ENABLED 2336 #ifdef LIBXML_HTTP_ENABLED
2184 xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen, 2337 xmlRegisterInputCallbacks(xmlIOHTTPMatch, xmlIOHTTPOpen,
2185 xmlIOHTTPRead, xmlIOHTTPClose); 2338 xmlIOHTTPRead, xmlIOHTTPClose);
2186 #endif /* LIBXML_HTTP_ENABLED */ 2339 #endif /* LIBXML_HTTP_ENABLED */
2187 2340
2188 #ifdef LIBXML_FTP_ENABLED 2341 #ifdef LIBXML_FTP_ENABLED
2189 xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen, 2342 xmlRegisterInputCallbacks(xmlIOFTPMatch, xmlIOFTPOpen,
2190 xmlIOFTPRead, xmlIOFTPClose); 2343 xmlIOFTPRead, xmlIOFTPClose);
2191 #endif /* LIBXML_FTP_ENABLED */ 2344 #endif /* LIBXML_FTP_ENABLED */
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 xmlParserInputBufferPtr 2422 xmlParserInputBufferPtr
2270 xmlAllocParserInputBuffer(xmlCharEncoding enc) { 2423 xmlAllocParserInputBuffer(xmlCharEncoding enc) {
2271 xmlParserInputBufferPtr ret; 2424 xmlParserInputBufferPtr ret;
2272 2425
2273 ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); 2426 ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
2274 if (ret == NULL) { 2427 if (ret == NULL) {
2275 xmlIOErrMemory("creating input buffer"); 2428 xmlIOErrMemory("creating input buffer");
2276 return(NULL); 2429 return(NULL);
2277 } 2430 }
2278 memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); 2431 memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
2279 ret->buffer = xmlBufferCreateSize(2 * xmlDefaultBufferSize); 2432 ret->buffer = xmlBufCreateSize(2 * xmlDefaultBufferSize);
2280 if (ret->buffer == NULL) { 2433 if (ret->buffer == NULL) {
2281 xmlFree(ret); 2434 xmlFree(ret);
2282 return(NULL); 2435 return(NULL);
2283 } 2436 }
2284 ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; 2437 xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT);
2285 ret->encoder = xmlGetCharEncodingHandler(enc); 2438 ret->encoder = xmlGetCharEncodingHandler(enc);
2286 if (ret->encoder != NULL) 2439 if (ret->encoder != NULL)
2287 ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); 2440 ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize);
2288 else 2441 else
2289 ret->raw = NULL; 2442 ret->raw = NULL;
2290 ret->readcallback = NULL; 2443 ret->readcallback = NULL;
2291 ret->closecallback = NULL; 2444 ret->closecallback = NULL;
2292 ret->context = NULL; 2445 ret->context = NULL;
2293 ret->compressed = -1; 2446 ret->compressed = -1;
2294 ret->rawconsumed = 0; 2447 ret->rawconsumed = 0;
2295 2448
2296 return(ret); 2449 return(ret);
2297 } 2450 }
(...skipping 10 matching lines...) Expand all
2308 xmlOutputBufferPtr 2461 xmlOutputBufferPtr
2309 xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) { 2462 xmlAllocOutputBuffer(xmlCharEncodingHandlerPtr encoder) {
2310 xmlOutputBufferPtr ret; 2463 xmlOutputBufferPtr ret;
2311 2464
2312 ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); 2465 ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
2313 if (ret == NULL) { 2466 if (ret == NULL) {
2314 xmlIOErrMemory("creating output buffer"); 2467 xmlIOErrMemory("creating output buffer");
2315 return(NULL); 2468 return(NULL);
2316 } 2469 }
2317 memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); 2470 memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
2318 ret->buffer = xmlBufferCreate(); 2471 ret->buffer = xmlBufCreate();
2319 if (ret->buffer == NULL) { 2472 if (ret->buffer == NULL) {
2320 xmlFree(ret); 2473 xmlFree(ret);
2321 return(NULL); 2474 return(NULL);
2322 } 2475 }
2323 2476
2324 /* try to avoid a performance problem with Windows realloc() */ 2477 /* try to avoid a performance problem with Windows realloc() */
2325 if (ret->buffer->alloc == XML_BUFFER_ALLOC_EXACT) 2478 if (xmlBufGetAllocationScheme(ret->buffer) == XML_BUFFER_ALLOC_EXACT)
2326 ret->buffer->alloc = XML_BUFFER_ALLOC_DOUBLEIT; 2479 xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_DOUBLEIT);
2327 2480
2328 ret->encoder = encoder; 2481 ret->encoder = encoder;
2329 if (encoder != NULL) { 2482 if (encoder != NULL) {
2330 ret->conv = xmlBufferCreateSize(4000); 2483 ret->conv = xmlBufCreateSize(4000);
2331 if (ret->conv == NULL) { 2484 if (ret->conv == NULL) {
2332 xmlFree(ret); 2485 xmlFree(ret);
2333 return(NULL); 2486 return(NULL);
2334 } 2487 }
2335 2488
2336 /* 2489 /*
2337 * This call is designed to initiate the encoder state 2490 * This call is designed to initiate the encoder state
2338 */ 2491 */
2339 » xmlCharEncOutFunc(encoder, ret->conv, NULL); 2492 » xmlCharEncOutput(ret, 1);
2340 } else 2493 } else
2341 ret->conv = NULL; 2494 ret->conv = NULL;
2342 ret->writecallback = NULL; 2495 ret->writecallback = NULL;
2343 ret->closecallback = NULL; 2496 ret->closecallback = NULL;
2344 ret->context = NULL; 2497 ret->context = NULL;
2345 ret->written = 0; 2498 ret->written = 0;
2346 2499
2347 return(ret); 2500 return(ret);
2348 } 2501 }
2349 2502
2350 /** 2503 /**
2351 * xmlAllocOutputBufferInternal: 2504 * xmlAllocOutputBufferInternal:
2352 * @encoder: the encoding converter or NULL 2505 * @encoder: the encoding converter or NULL
2353 * 2506 *
2354 * Create a buffered parser output 2507 * Create a buffered parser output
2355 * 2508 *
2356 * Returns the new parser output or NULL 2509 * Returns the new parser output or NULL
2357 */ 2510 */
2358 xmlOutputBufferPtr 2511 xmlOutputBufferPtr
2359 xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) { 2512 xmlAllocOutputBufferInternal(xmlCharEncodingHandlerPtr encoder) {
2360 xmlOutputBufferPtr ret; 2513 xmlOutputBufferPtr ret;
2361 2514
2362 ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer)); 2515 ret = (xmlOutputBufferPtr) xmlMalloc(sizeof(xmlOutputBuffer));
2363 if (ret == NULL) { 2516 if (ret == NULL) {
2364 xmlIOErrMemory("creating output buffer"); 2517 xmlIOErrMemory("creating output buffer");
2365 return(NULL); 2518 return(NULL);
2366 } 2519 }
2367 memset(ret, 0, (size_t) sizeof(xmlOutputBuffer)); 2520 memset(ret, 0, (size_t) sizeof(xmlOutputBuffer));
2368 ret->buffer = xmlBufferCreate(); 2521 ret->buffer = xmlBufCreate();
2369 if (ret->buffer == NULL) { 2522 if (ret->buffer == NULL) {
2370 xmlFree(ret); 2523 xmlFree(ret);
2371 return(NULL); 2524 return(NULL);
2372 } 2525 }
2373 2526
2374 2527
2375 /* 2528 /*
2376 * For conversion buffers we use the special IO handling 2529 * For conversion buffers we use the special IO handling
2377 * We don't do that from the exported API to avoid confusing
2378 * user's code.
2379 */ 2530 */
2380 ret->buffer->alloc = XML_BUFFER_ALLOC_IO; 2531 xmlBufSetAllocationScheme(ret->buffer, XML_BUFFER_ALLOC_IO);
2381 ret->buffer->contentIO = ret->buffer->content;
2382 2532
2383 ret->encoder = encoder; 2533 ret->encoder = encoder;
2384 if (encoder != NULL) { 2534 if (encoder != NULL) {
2385 ret->conv = xmlBufferCreateSize(4000); 2535 ret->conv = xmlBufCreateSize(4000);
2386 if (ret->conv == NULL) { 2536 if (ret->conv == NULL) {
2387 xmlFree(ret); 2537 xmlFree(ret);
2388 return(NULL); 2538 return(NULL);
2389 } 2539 }
2390 2540
2391 /* 2541 /*
2392 * This call is designed to initiate the encoder state 2542 * This call is designed to initiate the encoder state
2393 */ 2543 */
2394 » xmlCharEncOutFunc(encoder, ret->conv, NULL); 2544 xmlCharEncOutput(ret, 1);
2395 } else 2545 } else
2396 ret->conv = NULL; 2546 ret->conv = NULL;
2397 ret->writecallback = NULL; 2547 ret->writecallback = NULL;
2398 ret->closecallback = NULL; 2548 ret->closecallback = NULL;
2399 ret->context = NULL; 2549 ret->context = NULL;
2400 ret->written = 0; 2550 ret->written = 0;
2401 2551
2402 return(ret); 2552 return(ret);
2403 } 2553 }
2404 2554
2405 #endif /* LIBXML_OUTPUT_ENABLED */ 2555 #endif /* LIBXML_OUTPUT_ENABLED */
2406 2556
2407 /** 2557 /**
2408 * xmlFreeParserInputBuffer: 2558 * xmlFreeParserInputBuffer:
2409 * @in: a buffered parser input 2559 * @in: a buffered parser input
2410 * 2560 *
2411 * Free up the memory used by a buffered parser input 2561 * Free up the memory used by a buffered parser input
2412 */ 2562 */
2413 void 2563 void
2414 xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) { 2564 xmlFreeParserInputBuffer(xmlParserInputBufferPtr in) {
2415 if (in == NULL) return; 2565 if (in == NULL) return;
2416 2566
2417 if (in->raw) { 2567 if (in->raw) {
2418 xmlBufferFree(in->raw); 2568 xmlBufFree(in->raw);
2419 in->raw = NULL; 2569 in->raw = NULL;
2420 } 2570 }
2421 if (in->encoder != NULL) { 2571 if (in->encoder != NULL) {
2422 xmlCharEncCloseFunc(in->encoder); 2572 xmlCharEncCloseFunc(in->encoder);
2423 } 2573 }
2424 if (in->closecallback != NULL) { 2574 if (in->closecallback != NULL) {
2425 in->closecallback(in->context); 2575 in->closecallback(in->context);
2426 } 2576 }
2427 if (in->buffer != NULL) { 2577 if (in->buffer != NULL) {
2428 xmlBufferFree(in->buffer); 2578 xmlBufFree(in->buffer);
2429 in->buffer = NULL; 2579 in->buffer = NULL;
2430 } 2580 }
2431 2581
2432 xmlFree(in); 2582 xmlFree(in);
2433 } 2583 }
2434 2584
2435 #ifdef LIBXML_OUTPUT_ENABLED 2585 #ifdef LIBXML_OUTPUT_ENABLED
2436 /** 2586 /**
2437 * xmlOutputBufferClose: 2587 * xmlOutputBufferClose:
2438 * @out: a buffered output 2588 * @out: a buffered output
(...skipping 11 matching lines...) Expand all
2450 2600
2451 if (out == NULL) 2601 if (out == NULL)
2452 return (-1); 2602 return (-1);
2453 if (out->writecallback != NULL) 2603 if (out->writecallback != NULL)
2454 xmlOutputBufferFlush(out); 2604 xmlOutputBufferFlush(out);
2455 if (out->closecallback != NULL) { 2605 if (out->closecallback != NULL) {
2456 err_rc = out->closecallback(out->context); 2606 err_rc = out->closecallback(out->context);
2457 } 2607 }
2458 written = out->written; 2608 written = out->written;
2459 if (out->conv) { 2609 if (out->conv) {
2460 xmlBufferFree(out->conv); 2610 xmlBufFree(out->conv);
2461 out->conv = NULL; 2611 out->conv = NULL;
2462 } 2612 }
2463 if (out->encoder != NULL) { 2613 if (out->encoder != NULL) {
2464 xmlCharEncCloseFunc(out->encoder); 2614 xmlCharEncCloseFunc(out->encoder);
2465 } 2615 }
2466 if (out->buffer != NULL) { 2616 if (out->buffer != NULL) {
2467 xmlBufferFree(out->buffer); 2617 xmlBufFree(out->buffer);
2468 out->buffer = NULL; 2618 out->buffer = NULL;
2469 } 2619 }
2470 2620
2471 if (out->error) 2621 if (out->error)
2472 err_rc = -1; 2622 err_rc = -1;
2473 xmlFree(out); 2623 xmlFree(out);
2474 return ((err_rc == 0) ? written : err_rc); 2624 return ((err_rc == 0) ? written : err_rc);
2475 } 2625 }
2476 #endif /* LIBXML_OUTPUT_ENABLED */ 2626 #endif /* LIBXML_OUTPUT_ENABLED */
2477 2627
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 if (strncmp(buff4, cptr, 4) == 0) 2676 if (strncmp(buff4, cptr, 4) == 0)
2527 ret->compressed = 0; 2677 ret->compressed = 0;
2528 else 2678 else
2529 ret->compressed = 1; 2679 ret->compressed = 1;
2530 gzrewind(context); 2680 gzrewind(context);
2531 } 2681 }
2532 } 2682 }
2533 #endif 2683 #endif
2534 } 2684 }
2535 #endif 2685 #endif
2686 #ifdef HAVE_LZMA_H
2687 if ((xmlInputCallbackTable[i].opencallback == xmlXzfileOpen) &&
2688 (strcmp(URI, "-") != 0)) {
2689 ret->compressed = __libxml2_xzcompressed(context);
2690 }
2691 #endif
2536 } 2692 }
2537 else 2693 else
2538 xmlInputCallbackTable[i].closecallback (context); 2694 xmlInputCallbackTable[i].closecallback (context);
2539 2695
2540 return(ret); 2696 return(ret);
2541 } 2697 }
2542 2698
2543 /** 2699 /**
2544 * xmlParserInputBufferCreateFilename: 2700 * xmlParserInputBufferCreateFilename:
2545 * @URI: a C string containing the URI or filename 2701 * @URI: a C string containing the URI or filename
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
2787 if (buffer == NULL) return(NULL); 2943 if (buffer == NULL) return(NULL);
2788 2944
2789 ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback) 2945 ret = xmlOutputBufferCreateIO((xmlOutputWriteCallback)
2790 xmlBufferWrite, 2946 xmlBufferWrite,
2791 (xmlOutputCloseCallback) 2947 (xmlOutputCloseCallback)
2792 NULL, (void *) buffer, encoder); 2948 NULL, (void *) buffer, encoder);
2793 2949
2794 return(ret); 2950 return(ret);
2795 } 2951 }
2796 2952
2953 /**
2954 * xmlOutputBufferGetContent:
2955 * @out: an xmlOutputBufferPtr
2956 *
2957 * Gives a pointer to the data currently held in the output buffer
2958 *
2959 * Returns a pointer to the data or NULL in case of error
2960 */
2961 const xmlChar *
2962 xmlOutputBufferGetContent(xmlOutputBufferPtr out) {
2963 if ((out == NULL) || (out->buffer == NULL))
2964 return(NULL);
2965
2966 return(xmlBufContent(out->buffer));
2967 }
2968
2969 /**
2970 * xmlOutputBufferGetSize:
2971 * @out: an xmlOutputBufferPtr
2972 *
2973 * Gives the length of the data currently held in the output buffer
2974 *
2975 * Returns 0 in case or error or no data is held, the size otherwise
2976 */
2977 size_t
2978 xmlOutputBufferGetSize(xmlOutputBufferPtr out) {
2979 if ((out == NULL) || (out->buffer == NULL))
2980 return(0);
2981
2982 return(xmlBufUse(out->buffer));
2983 }
2984
2985
2797 #endif /* LIBXML_OUTPUT_ENABLED */ 2986 #endif /* LIBXML_OUTPUT_ENABLED */
2798 2987
2799 /** 2988 /**
2800 * xmlParserInputBufferCreateFd: 2989 * xmlParserInputBufferCreateFd:
2801 * @fd: a file descriptor number 2990 * @fd: a file descriptor number
2802 * @enc: the charset encoding if known 2991 * @enc: the charset encoding if known
2803 * 2992 *
2804 * Create a buffered parser input for the progressive parsing for the input 2993 * Create a buffered parser input for the progressive parsing for the input
2805 * from a file descriptor 2994 * from a file descriptor
2806 * 2995 *
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2839 int errcode; 3028 int errcode;
2840 3029
2841 if (size <= 0) return(NULL); 3030 if (size <= 0) return(NULL);
2842 if (mem == NULL) return(NULL); 3031 if (mem == NULL) return(NULL);
2843 3032
2844 ret = xmlAllocParserInputBuffer(enc); 3033 ret = xmlAllocParserInputBuffer(enc);
2845 if (ret != NULL) { 3034 if (ret != NULL) {
2846 ret->context = (void *) mem; 3035 ret->context = (void *) mem;
2847 ret->readcallback = (xmlInputReadCallback) xmlNop; 3036 ret->readcallback = (xmlInputReadCallback) xmlNop;
2848 ret->closecallback = NULL; 3037 ret->closecallback = NULL;
2849 » errcode = xmlBufferAdd(ret->buffer, (const xmlChar *) mem, size); 3038 » errcode = xmlBufAdd(ret->buffer, (const xmlChar *) mem, size);
2850 if (errcode != 0) { 3039 if (errcode != 0) {
2851 xmlFree(ret); 3040 xmlFree(ret);
2852 return(NULL); 3041 return(NULL);
2853 } 3042 }
2854 } 3043 }
2855 3044
2856 return(ret); 3045 return(ret);
2857 } 3046 }
2858 3047
2859 /** 3048 /**
(...skipping 16 matching lines...) Expand all
2876 3065
2877 if (size <= 0) return(NULL); 3066 if (size <= 0) return(NULL);
2878 if (mem == NULL) return(NULL); 3067 if (mem == NULL) return(NULL);
2879 3068
2880 ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer)); 3069 ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
2881 if (ret == NULL) { 3070 if (ret == NULL) {
2882 xmlIOErrMemory("creating input buffer"); 3071 xmlIOErrMemory("creating input buffer");
2883 return(NULL); 3072 return(NULL);
2884 } 3073 }
2885 memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer)); 3074 memset(ret, 0, (size_t) sizeof(xmlParserInputBuffer));
2886 ret->buffer = xmlBufferCreateStatic((void *)mem, (size_t) size); 3075 ret->buffer = xmlBufCreateStatic((void *)mem, (size_t) size);
2887 if (ret->buffer == NULL) { 3076 if (ret->buffer == NULL) {
2888 xmlFree(ret); 3077 xmlFree(ret);
2889 return(NULL); 3078 return(NULL);
2890 } 3079 }
2891 ret->encoder = xmlGetCharEncodingHandler(enc); 3080 ret->encoder = xmlGetCharEncodingHandler(enc);
2892 if (ret->encoder != NULL) 3081 if (ret->encoder != NULL)
2893 ret->raw = xmlBufferCreateSize(2 * xmlDefaultBufferSize); 3082 ret->raw = xmlBufCreateSize(2 * xmlDefaultBufferSize);
2894 else 3083 else
2895 ret->raw = NULL; 3084 ret->raw = NULL;
2896 ret->compressed = -1; 3085 ret->compressed = -1;
2897 ret->context = (void *) mem; 3086 ret->context = (void *) mem;
2898 ret->readcallback = NULL; 3087 ret->readcallback = NULL;
2899 ret->closecallback = NULL; 3088 ret->closecallback = NULL;
2900 3089
2901 return(ret); 3090 return(ret);
2902 } 3091 }
2903 3092
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3052 3241
3053 if (len < 0) return(0); 3242 if (len < 0) return(0);
3054 if ((in == NULL) || (in->error)) return(-1); 3243 if ((in == NULL) || (in->error)) return(-1);
3055 if (in->encoder != NULL) { 3244 if (in->encoder != NULL) {
3056 unsigned int use; 3245 unsigned int use;
3057 3246
3058 /* 3247 /*
3059 * Store the data in the incoming raw buffer 3248 * Store the data in the incoming raw buffer
3060 */ 3249 */
3061 if (in->raw == NULL) { 3250 if (in->raw == NULL) {
3062 » in->raw = xmlBufferCreate(); 3251 » in->raw = xmlBufCreate();
3063 } 3252 }
3064 » ret = xmlBufferAdd(in->raw, (const xmlChar *) buf, len); 3253 » ret = xmlBufAdd(in->raw, (const xmlChar *) buf, len);
3065 if (ret != 0) 3254 if (ret != 0)
3066 return(-1); 3255 return(-1);
3067 3256
3068 /* 3257 /*
3069 * convert as much as possible to the parser reading buffer. 3258 * convert as much as possible to the parser reading buffer.
3070 */ 3259 */
3071 » use = in->raw->use; 3260 » use = xmlBufUse(in->raw);
3072 » nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); 3261 » nbchars = xmlCharEncInput(in, 1);
3073 if (nbchars < 0) { 3262 if (nbchars < 0) {
3074 xmlIOErr(XML_IO_ENCODER, NULL); 3263 xmlIOErr(XML_IO_ENCODER, NULL);
3075 in->error = XML_IO_ENCODER; 3264 in->error = XML_IO_ENCODER;
3076 return(-1); 3265 return(-1);
3077 } 3266 }
3078 » in->rawconsumed += (use - in->raw->use); 3267 » in->rawconsumed += (use - xmlBufUse(in->raw));
3079 } else { 3268 } else {
3080 nbchars = len; 3269 nbchars = len;
3081 ret = xmlBufferAdd(in->buffer, (xmlChar *) buf, nbchars); 3270 ret = xmlBufAdd(in->buffer, (xmlChar *) buf, nbchars);
3082 if (ret != 0) 3271 if (ret != 0)
3083 return(-1); 3272 return(-1);
3084 } 3273 }
3085 #ifdef DEBUG_INPUT 3274 #ifdef DEBUG_INPUT
3086 xmlGenericError(xmlGenericErrorContext, 3275 xmlGenericError(xmlGenericErrorContext,
3087 "I/O: pushed %d chars, buffer %d/%d\n", 3276 "I/O: pushed %d chars, buffer %d/%d\n",
3088 nbchars, in->buffer->use, in->buffer->size); 3277 nbchars, xmlBufUse(in->buffer), xmlBufLength(in->buffer));
3089 #endif 3278 #endif
3090 return(nbchars); 3279 return(nbchars);
3091 } 3280 }
3092 3281
3093 /** 3282 /**
3094 * endOfInput: 3283 * endOfInput:
3095 * 3284 *
3096 * When reading from an Input channel indicated end of file or error 3285 * When reading from an Input channel indicated end of file or error
3097 * don't reread from it again. 3286 * don't reread from it again.
3098 */ 3287 */
(...skipping 17 matching lines...) Expand all
3116 * onto in->buffer or in->raw 3305 * onto in->buffer or in->raw
3117 * 3306 *
3118 * Returns the number of chars read and stored in the buffer, or -1 3307 * Returns the number of chars read and stored in the buffer, or -1
3119 * in case of error. 3308 * in case of error.
3120 */ 3309 */
3121 int 3310 int
3122 xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) { 3311 xmlParserInputBufferGrow(xmlParserInputBufferPtr in, int len) {
3123 char *buffer = NULL; 3312 char *buffer = NULL;
3124 int res = 0; 3313 int res = 0;
3125 int nbchars = 0; 3314 int nbchars = 0;
3126 int buffree;
3127 unsigned int needSize;
3128 3315
3129 if ((in == NULL) || (in->error)) return(-1); 3316 if ((in == NULL) || (in->error)) return(-1);
3130 if ((len <= MINLEN) && (len != 4)) 3317 if ((len <= MINLEN) && (len != 4))
3131 len = MINLEN; 3318 len = MINLEN;
3132 3319
3133 buffree = in->buffer->size - in->buffer->use; 3320 if (xmlBufAvail(in->buffer) <= 0) {
3134 if (buffree <= 0) {
3135 xmlIOErr(XML_IO_BUFFER_FULL, NULL); 3321 xmlIOErr(XML_IO_BUFFER_FULL, NULL);
3136 in->error = XML_IO_BUFFER_FULL; 3322 in->error = XML_IO_BUFFER_FULL;
3137 return(-1); 3323 return(-1);
3138 } 3324 }
3139 3325
3140 needSize = in->buffer->use + len + 1; 3326 if (xmlBufGrow(in->buffer, len + 1) < 0) {
3141 if (needSize > in->buffer->size){ 3327 xmlIOErrMemory("growing input buffer");
3142 if (!xmlBufferResize(in->buffer, needSize)){ 3328 in->error = XML_ERR_NO_MEMORY;
3143 » xmlIOErrMemory("growing input buffer"); 3329 return(-1);
3144 » in->error = XML_ERR_NO_MEMORY;
3145 return(-1);
3146 }
3147 } 3330 }
3148 buffer = (char *)&in->buffer->content[in->buffer->use]; 3331 buffer = (char *)xmlBufEnd(in->buffer);
3149 3332
3150 /* 3333 /*
3151 * Call the read method for this I/O type. 3334 * Call the read method for this I/O type.
3152 */ 3335 */
3153 if (in->readcallback != NULL) { 3336 if (in->readcallback != NULL) {
3154 res = in->readcallback(in->context, &buffer[0], len); 3337 res = in->readcallback(in->context, &buffer[0], len);
3155 if (res <= 0) 3338 if (res <= 0)
3156 in->readcallback = endOfInput; 3339 in->readcallback = endOfInput;
3157 } else { 3340 } else {
3158 xmlIOErr(XML_IO_NO_INPUT, NULL); 3341 xmlIOErr(XML_IO_NO_INPUT, NULL);
3159 in->error = XML_IO_NO_INPUT; 3342 in->error = XML_IO_NO_INPUT;
3160 return(-1); 3343 return(-1);
3161 } 3344 }
3162 if (res < 0) { 3345 if (res < 0) {
3163 return(-1); 3346 return(-1);
3164 } 3347 }
3348
3349 /*
3350 * try to establish compressed status of input if not done already
3351 */
3352 if (in->compressed == -1) {
3353 #ifdef HAVE_LZMA_H
3354 if (in->readcallback == xmlXzfileRead)
3355 in->compressed = __libxml2_xzcompressed(in->context);
3356 #endif
3357 }
3358
3165 len = res; 3359 len = res;
3166 if (in->encoder != NULL) { 3360 if (in->encoder != NULL) {
3167 unsigned int use; 3361 unsigned int use;
3168 3362
3169 /* 3363 /*
3170 * Store the data in the incoming raw buffer 3364 * Store the data in the incoming raw buffer
3171 */ 3365 */
3172 if (in->raw == NULL) { 3366 if (in->raw == NULL) {
3173 » in->raw = xmlBufferCreate(); 3367 » in->raw = xmlBufCreate();
3174 } 3368 }
3175 » res = xmlBufferAdd(in->raw, (const xmlChar *) buffer, len); 3369 » res = xmlBufAdd(in->raw, (const xmlChar *) buffer, len);
3176 if (res != 0) 3370 if (res != 0)
3177 return(-1); 3371 return(-1);
3178 3372
3179 /* 3373 /*
3180 * convert as much as possible to the parser reading buffer. 3374 * convert as much as possible to the parser reading buffer.
3181 */ 3375 */
3182 » use = in->raw->use; 3376 » use = xmlBufUse(in->raw);
3183 » nbchars = xmlCharEncInFunc(in->encoder, in->buffer, in->raw); 3377 » nbchars = xmlCharEncInput(in, 1);
3184 if (nbchars < 0) { 3378 if (nbchars < 0) {
3185 xmlIOErr(XML_IO_ENCODER, NULL); 3379 xmlIOErr(XML_IO_ENCODER, NULL);
3186 in->error = XML_IO_ENCODER; 3380 in->error = XML_IO_ENCODER;
3187 return(-1); 3381 return(-1);
3188 } 3382 }
3189 » in->rawconsumed += (use - in->raw->use); 3383 » in->rawconsumed += (use - xmlBufUse(in->raw));
3190 } else { 3384 } else {
3191 nbchars = len; 3385 nbchars = len;
3192 » in->buffer->use += nbchars; 3386 xmlBufAddLen(in->buffer, nbchars);
3193 » buffer[nbchars] = 0;
3194 } 3387 }
3195 #ifdef DEBUG_INPUT 3388 #ifdef DEBUG_INPUT
3196 xmlGenericError(xmlGenericErrorContext, 3389 xmlGenericError(xmlGenericErrorContext,
3197 » "I/O: read %d chars, buffer %d/%d\n", 3390 » "I/O: read %d chars, buffer %d\n",
3198 nbchars, in->buffer->use, in->buffer->size); 3391 nbchars, xmlBufUse(in->buffer));
3199 #endif 3392 #endif
3200 return(nbchars); 3393 return(nbchars);
3201 } 3394 }
3202 3395
3203 /** 3396 /**
3204 * xmlParserInputBufferRead: 3397 * xmlParserInputBufferRead:
3205 * @in: a buffered parser input 3398 * @in: a buffered parser input
3206 * @len: indicative value of the amount of chars to read 3399 * @len: indicative value of the amount of chars to read
3207 * 3400 *
3208 * Refresh the content of the input buffer, the old data are considered 3401 * Refresh the content of the input buffer, the old data are considered
3209 * consumed 3402 * consumed
3210 * This routine handle the I18N transcoding to internal UTF-8 3403 * This routine handle the I18N transcoding to internal UTF-8
3211 * 3404 *
3212 * Returns the number of chars read and stored in the buffer, or -1 3405 * Returns the number of chars read and stored in the buffer, or -1
3213 * in case of error. 3406 * in case of error.
3214 */ 3407 */
3215 int 3408 int
3216 xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) { 3409 xmlParserInputBufferRead(xmlParserInputBufferPtr in, int len) {
3217 if ((in == NULL) || (in->error)) return(-1); 3410 if ((in == NULL) || (in->error)) return(-1);
3218 if (in->readcallback != NULL) 3411 if (in->readcallback != NULL)
3219 return(xmlParserInputBufferGrow(in, len)); 3412 return(xmlParserInputBufferGrow(in, len));
3220 else if ((in->buffer != NULL) && 3413 else if (xmlBufGetAllocationScheme(in->buffer) == XML_BUFFER_ALLOC_IMMUTABLE )
3221 (in->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE))
3222 return(0); 3414 return(0);
3223 else 3415 else
3224 return(-1); 3416 return(-1);
3225 } 3417 }
3226 3418
3227 #ifdef LIBXML_OUTPUT_ENABLED 3419 #ifdef LIBXML_OUTPUT_ENABLED
3228 /** 3420 /**
3229 * xmlOutputBufferWrite: 3421 * xmlOutputBufferWrite:
3230 * @out: a buffered parser output 3422 * @out: a buffered parser output
3231 * @len: the size in bytes of the array. 3423 * @len: the size in bytes of the array.
(...skipping 24 matching lines...) Expand all
3256 chunk = 4 * MINLEN; 3448 chunk = 4 * MINLEN;
3257 3449
3258 /* 3450 /*
3259 * first handle encoding stuff. 3451 * first handle encoding stuff.
3260 */ 3452 */
3261 if (out->encoder != NULL) { 3453 if (out->encoder != NULL) {
3262 /* 3454 /*
3263 * Store the data in the incoming raw buffer 3455 * Store the data in the incoming raw buffer
3264 */ 3456 */
3265 if (out->conv == NULL) { 3457 if (out->conv == NULL) {
3266 » » out->conv = xmlBufferCreate(); 3458 » » out->conv = xmlBufCreate();
3267 } 3459 }
3268 » ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); 3460 » ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk);
3269 if (ret != 0) 3461 if (ret != 0)
3270 return(-1); 3462 return(-1);
3271 3463
3272 » if ((out->buffer->use < MINLEN) && (chunk == len)) 3464 » if ((xmlBufUse(out->buffer) < MINLEN) && (chunk == len))
3273 goto done; 3465 goto done;
3274 3466
3275 /* 3467 /*
3276 * convert as much as possible to the parser reading buffer. 3468 * convert as much as possible to the parser reading buffer.
3277 */ 3469 */
3278 » ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); 3470 » ret = xmlCharEncOutput(out, 0);
3279 if ((ret < 0) && (ret != -3)) { 3471 if ((ret < 0) && (ret != -3)) {
3280 xmlIOErr(XML_IO_ENCODER, NULL); 3472 xmlIOErr(XML_IO_ENCODER, NULL);
3281 out->error = XML_IO_ENCODER; 3473 out->error = XML_IO_ENCODER;
3282 return(-1); 3474 return(-1);
3283 } 3475 }
3284 » nbchars = out->conv->use; 3476 » nbchars = xmlBufUse(out->conv);
3285 } else { 3477 } else {
3286 » ret = xmlBufferAdd(out->buffer, (const xmlChar *) buf, chunk); 3478 » ret = xmlBufAdd(out->buffer, (const xmlChar *) buf, chunk);
3287 if (ret != 0) 3479 if (ret != 0)
3288 return(-1); 3480 return(-1);
3289 » nbchars = out->buffer->use; 3481 » nbchars = xmlBufUse(out->buffer);
3290 } 3482 }
3291 buf += chunk; 3483 buf += chunk;
3292 len -= chunk; 3484 len -= chunk;
3293 3485
3294 if ((nbchars < MINLEN) && (len <= 0)) 3486 if ((nbchars < MINLEN) && (len <= 0))
3295 goto done; 3487 goto done;
3296 3488
3297 if (out->writecallback) { 3489 if (out->writecallback) {
3298 /* 3490 /*
3299 * second write the stuff to the I/O channel 3491 * second write the stuff to the I/O channel
3300 */ 3492 */
3301 if (out->encoder != NULL) { 3493 if (out->encoder != NULL) {
3302 ret = out->writecallback(out->context, 3494 ret = out->writecallback(out->context,
3303 » » » » (const char *)out->conv->content, nbchars); 3495 (const char *)xmlBufContent(out->conv), nbchars);
3304 if (ret >= 0) 3496 if (ret >= 0)
3305 » » xmlBufferShrink(out->conv, ret); 3497 » » xmlBufShrink(out->conv, ret);
3306 } else { 3498 } else {
3307 ret = out->writecallback(out->context, 3499 ret = out->writecallback(out->context,
3308 » » » » (const char *)out->buffer->content, nbchars); 3500 (const char *)xmlBufContent(out->buffer), nbchars);
3309 if (ret >= 0) 3501 if (ret >= 0)
3310 » » xmlBufferShrink(out->buffer, ret); 3502 » » xmlBufShrink(out->buffer, ret);
3311 } 3503 }
3312 if (ret < 0) { 3504 if (ret < 0) {
3313 xmlIOErr(XML_IO_WRITE, NULL); 3505 xmlIOErr(XML_IO_WRITE, NULL);
3314 out->error = XML_IO_WRITE; 3506 out->error = XML_IO_WRITE;
3315 return(ret); 3507 return(ret);
3316 } 3508 }
3317 out->written += ret; 3509 out->written += ret;
3318 } 3510 }
3319 written += nbchars; 3511 written += nbchars;
3320 } while (len > 0); 3512 } while (len > 0);
(...skipping 23 matching lines...) Expand all
3344 xmlEscapeContent(unsigned char* out, int *outlen, 3536 xmlEscapeContent(unsigned char* out, int *outlen,
3345 const xmlChar* in, int *inlen) { 3537 const xmlChar* in, int *inlen) {
3346 unsigned char* outstart = out; 3538 unsigned char* outstart = out;
3347 const unsigned char* base = in; 3539 const unsigned char* base = in;
3348 unsigned char* outend = out + *outlen; 3540 unsigned char* outend = out + *outlen;
3349 const unsigned char* inend; 3541 const unsigned char* inend;
3350 3542
3351 inend = in + (*inlen); 3543 inend = in + (*inlen);
3352 3544
3353 while ((in < inend) && (out < outend)) { 3545 while ((in < inend) && (out < outend)) {
3354 » if (*in == '<') { 3546 » if (*in == '<') {
3355 if (outend - out < 4) break; 3547 if (outend - out < 4) break;
3356 *out++ = '&'; 3548 *out++ = '&';
3357 *out++ = 'l'; 3549 *out++ = 'l';
3358 *out++ = 't'; 3550 *out++ = 't';
3359 *out++ = ';'; 3551 *out++ = ';';
3360 } else if (*in == '>') { 3552 } else if (*in == '>') {
3361 if (outend - out < 4) break; 3553 if (outend - out < 4) break;
3362 *out++ = '&'; 3554 *out++ = '&';
3363 *out++ = 'g'; 3555 *out++ = 'g';
3364 *out++ = 't'; 3556 *out++ = 't';
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3408 int nbchars = 0; /* number of chars to output to I/O */ 3600 int nbchars = 0; /* number of chars to output to I/O */
3409 int ret; /* return from function call */ 3601 int ret; /* return from function call */
3410 int written = 0; /* number of char written to I/O so far */ 3602 int written = 0; /* number of char written to I/O so far */
3411 int oldwritten=0;/* loop guard */ 3603 int oldwritten=0;/* loop guard */
3412 int chunk; /* number of byte currently processed from str */ 3604 int chunk; /* number of byte currently processed from str */
3413 int len; /* number of bytes in str */ 3605 int len; /* number of bytes in str */
3414 int cons; /* byte from str consumed */ 3606 int cons; /* byte from str consumed */
3415 3607
3416 if ((out == NULL) || (out->error) || (str == NULL) || 3608 if ((out == NULL) || (out->error) || (str == NULL) ||
3417 (out->buffer == NULL) || 3609 (out->buffer == NULL) ||
3418 » (out->buffer->alloc == XML_BUFFER_ALLOC_IMMUTABLE)) return(-1); 3610 » (xmlBufGetAllocationScheme(out->buffer) == XML_BUFFER_ALLOC_IMMUTABLE))
3611 return(-1);
3419 len = strlen((const char *)str); 3612 len = strlen((const char *)str);
3420 if (len < 0) return(0); 3613 if (len < 0) return(0);
3421 if (out->error) return(-1); 3614 if (out->error) return(-1);
3422 if (escaping == NULL) escaping = xmlEscapeContent; 3615 if (escaping == NULL) escaping = xmlEscapeContent;
3423 3616
3424 do { 3617 do {
3425 oldwritten = written; 3618 oldwritten = written;
3426 3619
3427 /* 3620 /*
3428 * how many bytes to consume and how many bytes to store. 3621 * how many bytes to consume and how many bytes to store.
3429 */ 3622 */
3430 cons = len; 3623 cons = len;
3431 » chunk = (out->buffer->size - out->buffer->use) - 1; 3624 » chunk = xmlBufAvail(out->buffer) - 1;
3432 3625
3433 /* 3626 /*
3434 * make sure we have enough room to save first, if this is 3627 * make sure we have enough room to save first, if this is
3435 * not the case force a flush, but make sure we stay in the loop 3628 * not the case force a flush, but make sure we stay in the loop
3436 */ 3629 */
3437 if (chunk < 40) { 3630 if (chunk < 40) {
3438 » if (xmlBufferGrow(out->buffer, out->buffer->size + 100) < 0) 3631 » if (xmlBufGrow(out->buffer, 100) < 0)
3439 return(-1); 3632 return(-1);
3440 oldwritten = -1; 3633 oldwritten = -1;
3441 continue; 3634 continue;
3442 } 3635 }
3443 3636
3444 /* 3637 /*
3445 * first handle encoding stuff. 3638 * first handle encoding stuff.
3446 */ 3639 */
3447 if (out->encoder != NULL) { 3640 if (out->encoder != NULL) {
3448 /* 3641 /*
3449 * Store the data in the incoming raw buffer 3642 * Store the data in the incoming raw buffer
3450 */ 3643 */
3451 if (out->conv == NULL) { 3644 if (out->conv == NULL) {
3452 » » out->conv = xmlBufferCreate(); 3645 » » out->conv = xmlBufCreate();
3453 } 3646 }
3454 » ret = escaping(out->buffer->content + out->buffer->use , 3647 » ret = escaping(xmlBufEnd(out->buffer) ,
3455 &chunk, str, &cons); 3648 &chunk, str, &cons);
3456 if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ 3649 if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
3457 return(-1); 3650 return(-1);
3458 » out->buffer->use += chunk; 3651 xmlBufAddLen(out->buffer, chunk);
3459 » out->buffer->content[out->buffer->use] = 0;
3460 3652
3461 » if ((out->buffer->use < MINLEN) && (cons == len)) 3653 » if ((xmlBufUse(out->buffer) < MINLEN) && (cons == len))
3462 goto done; 3654 goto done;
3463 3655
3464 /* 3656 /*
3465 * convert as much as possible to the output buffer. 3657 * convert as much as possible to the output buffer.
3466 */ 3658 */
3467 » ret = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); 3659 » ret = xmlCharEncOutput(out, 0);
3468 if ((ret < 0) && (ret != -3)) { 3660 if ((ret < 0) && (ret != -3)) {
3469 xmlIOErr(XML_IO_ENCODER, NULL); 3661 xmlIOErr(XML_IO_ENCODER, NULL);
3470 out->error = XML_IO_ENCODER; 3662 out->error = XML_IO_ENCODER;
3471 return(-1); 3663 return(-1);
3472 } 3664 }
3473 » nbchars = out->conv->use; 3665 » nbchars = xmlBufUse(out->conv);
3474 } else { 3666 } else {
3475 » ret = escaping(out->buffer->content + out->buffer->use , 3667 » ret = escaping(xmlBufEnd(out->buffer), &chunk, str, &cons);
3476 » &chunk, str, &cons);
3477 if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */ 3668 if ((ret < 0) || (chunk == 0)) /* chunk==0 => nothing done */
3478 return(-1); 3669 return(-1);
3479 » out->buffer->use += chunk; 3670 xmlBufAddLen(out->buffer, chunk);
3480 » out->buffer->content[out->buffer->use] = 0; 3671 » nbchars = xmlBufUse(out->buffer);
3481 » nbchars = out->buffer->use;
3482 } 3672 }
3483 str += cons; 3673 str += cons;
3484 len -= cons; 3674 len -= cons;
3485 3675
3486 if ((nbchars < MINLEN) && (len <= 0)) 3676 if ((nbchars < MINLEN) && (len <= 0))
3487 goto done; 3677 goto done;
3488 3678
3489 if (out->writecallback) { 3679 if (out->writecallback) {
3490 /* 3680 /*
3491 * second write the stuff to the I/O channel 3681 * second write the stuff to the I/O channel
3492 */ 3682 */
3493 if (out->encoder != NULL) { 3683 if (out->encoder != NULL) {
3494 ret = out->writecallback(out->context, 3684 ret = out->writecallback(out->context,
3495 » » » » (const char *)out->conv->content, nbchars); 3685 (const char *)xmlBufContent(out->conv), nbchars);
3496 if (ret >= 0) 3686 if (ret >= 0)
3497 » » xmlBufferShrink(out->conv, ret); 3687 » » xmlBufShrink(out->conv, ret);
3498 } else { 3688 } else {
3499 ret = out->writecallback(out->context, 3689 ret = out->writecallback(out->context,
3500 » » » » (const char *)out->buffer->content, nbchars); 3690 (const char *)xmlBufContent(out->buffer), nbchars);
3501 if (ret >= 0) 3691 if (ret >= 0)
3502 » » xmlBufferShrink(out->buffer, ret); 3692 » » xmlBufShrink(out->buffer, ret);
3503 } 3693 }
3504 if (ret < 0) { 3694 if (ret < 0) {
3505 xmlIOErr(XML_IO_WRITE, NULL); 3695 xmlIOErr(XML_IO_WRITE, NULL);
3506 out->error = XML_IO_WRITE; 3696 out->error = XML_IO_WRITE;
3507 return(ret); 3697 return(ret);
3508 } 3698 }
3509 out->written += ret; 3699 out->written += ret;
3510 » } else if (out->buffer->size - out->buffer->use < MINLEN) { 3700 » } else if (xmlBufAvail(out->buffer) < MINLEN) {
3511 » xmlBufferResize(out->buffer, out->buffer->size + MINLEN); 3701 » xmlBufGrow(out->buffer, MINLEN);
3512 } 3702 }
3513 written += nbchars; 3703 written += nbchars;
3514 } while ((len > 0) && (oldwritten != written)); 3704 } while ((len > 0) && (oldwritten != written));
3515 3705
3516 done: 3706 done:
3517 #ifdef DEBUG_INPUT 3707 #ifdef DEBUG_INPUT
3518 xmlGenericError(xmlGenericErrorContext, 3708 xmlGenericError(xmlGenericErrorContext,
3519 "I/O: wrote %d chars\n", written); 3709 "I/O: wrote %d chars\n", written);
3520 #endif 3710 #endif
3521 return(written); 3711 return(written);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3559 int 3749 int
3560 xmlOutputBufferFlush(xmlOutputBufferPtr out) { 3750 xmlOutputBufferFlush(xmlOutputBufferPtr out) {
3561 int nbchars = 0, ret = 0; 3751 int nbchars = 0, ret = 0;
3562 3752
3563 if ((out == NULL) || (out->error)) return(-1); 3753 if ((out == NULL) || (out->error)) return(-1);
3564 /* 3754 /*
3565 * first handle encoding stuff. 3755 * first handle encoding stuff.
3566 */ 3756 */
3567 if ((out->conv != NULL) && (out->encoder != NULL)) { 3757 if ((out->conv != NULL) && (out->encoder != NULL)) {
3568 /* 3758 /*
3569 » * convert as much as possible to the parser reading buffer. 3759 » * convert as much as possible to the parser output buffer.
3570 */ 3760 */
3571 » nbchars = xmlCharEncOutFunc(out->encoder, out->conv, out->buffer); 3761 » do {
3572 » if (nbchars < 0) { 3762 » nbchars = xmlCharEncOutput(out, 0);
3573 » xmlIOErr(XML_IO_ENCODER, NULL); 3763 » if (nbchars < 0) {
3574 » out->error = XML_IO_ENCODER; 3764 » » xmlIOErr(XML_IO_ENCODER, NULL);
3575 » return(-1); 3765 » » out->error = XML_IO_ENCODER;
3576 » } 3766 » » return(-1);
3767 » }
3768 » } while (nbchars);
3577 } 3769 }
3578 3770
3579 /* 3771 /*
3580 * second flush the stuff to the I/O channel 3772 * second flush the stuff to the I/O channel
3581 */ 3773 */
3582 if ((out->conv != NULL) && (out->encoder != NULL) && 3774 if ((out->conv != NULL) && (out->encoder != NULL) &&
3583 (out->writecallback != NULL)) { 3775 (out->writecallback != NULL)) {
3584 ret = out->writecallback(out->context, 3776 ret = out->writecallback(out->context,
3585 » (const char *)out->conv->content, out->conv->use); 3777 (const char *)xmlBufContent(out->conv),
3778 xmlBufUse(out->conv));
3586 if (ret >= 0) 3779 if (ret >= 0)
3587 » xmlBufferShrink(out->conv, ret); 3780 » xmlBufShrink(out->conv, ret);
3588 } else if (out->writecallback != NULL) { 3781 } else if (out->writecallback != NULL) {
3589 ret = out->writecallback(out->context, 3782 ret = out->writecallback(out->context,
3590 » (const char *)out->buffer->content, out->buffer->use); 3783 (const char *)xmlBufContent(out->buffer),
3784 xmlBufUse(out->buffer));
3591 if (ret >= 0) 3785 if (ret >= 0)
3592 » xmlBufferShrink(out->buffer, ret); 3786 » xmlBufShrink(out->buffer, ret);
3593 } 3787 }
3594 if (ret < 0) { 3788 if (ret < 0) {
3595 xmlIOErr(XML_IO_FLUSH, NULL); 3789 xmlIOErr(XML_IO_FLUSH, NULL);
3596 out->error = XML_IO_FLUSH; 3790 out->error = XML_IO_FLUSH;
3597 return(ret); 3791 return(ret);
3598 } 3792 }
3599 out->written += ret; 3793 out->written += ret;
3600 3794
3601 #ifdef DEBUG_INPUT 3795 #ifdef DEBUG_INPUT
3602 xmlGenericError(xmlGenericErrorContext, 3796 xmlGenericError(xmlGenericErrorContext,
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
3983 } 4177 }
3984 } 4178 }
3985 input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt); 4179 input = xmlDefaultExternalEntityLoader((const char *) resource, ID, ctxt);
3986 if (resource != (xmlChar *) URL) 4180 if (resource != (xmlChar *) URL)
3987 xmlFree(resource); 4181 xmlFree(resource);
3988 return(input); 4182 return(input);
3989 } 4183 }
3990 4184
3991 #define bottom_xmlIO 4185 #define bottom_xmlIO
3992 #include "elfgcchack.h" 4186 #include "elfgcchack.h"
OLDNEW
« no previous file with comments | « third_party/libxml/src/xml2-config.in ('k') | third_party/libxml/src/xmlcatalog.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698