Annotation of embedaddon/expat/xmlwf/xmlfile.c, revision 1.1

1.1     ! misho       1: /* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
        !             2:    See the file COPYING for copying permission.
        !             3: */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <stdlib.h>
        !             7: #include <stddef.h>
        !             8: #include <string.h>
        !             9: #include <fcntl.h>
        !            10: 
        !            11: #ifdef COMPILED_FROM_DSP
        !            12: #include "winconfig.h"
        !            13: #elif defined(MACOS_CLASSIC)
        !            14: #include "macconfig.h"
        !            15: #elif defined(__amigaos__)
        !            16: #include "amigaconfig.h"
        !            17: #elif defined(__WATCOMC__)
        !            18: #include "watcomconfig.h"
        !            19: #elif defined(HAVE_EXPAT_CONFIG_H)
        !            20: #include <expat_config.h>
        !            21: #endif /* ndef COMPILED_FROM_DSP */
        !            22: 
        !            23: #include "expat.h"
        !            24: #include "xmlfile.h"
        !            25: #include "xmltchar.h"
        !            26: #include "filemap.h"
        !            27: 
        !            28: #if (defined(_MSC_VER) || (defined(__WATCOMC__) && !defined(__LINUX__)))
        !            29: #include <io.h>
        !            30: #endif
        !            31: 
        !            32: #if defined(__amigaos__) && defined(__USE_INLINE__)
        !            33: #include <proto/expat.h>
        !            34: #endif
        !            35: 
        !            36: #ifdef HAVE_UNISTD_H
        !            37: #include <unistd.h>
        !            38: #endif
        !            39: 
        !            40: #ifndef O_BINARY
        !            41: #ifdef _O_BINARY
        !            42: #define O_BINARY _O_BINARY
        !            43: #else
        !            44: #define O_BINARY 0
        !            45: #endif
        !            46: #endif
        !            47: 
        !            48: #ifdef _DEBUG
        !            49: #define READ_SIZE 16
        !            50: #else
        !            51: #define READ_SIZE (1024*8)
        !            52: #endif
        !            53: 
        !            54: 
        !            55: typedef struct {
        !            56:   XML_Parser parser;
        !            57:   int *retPtr;
        !            58: } PROCESS_ARGS;
        !            59: 
        !            60: static void
        !            61: reportError(XML_Parser parser, const XML_Char *filename)
        !            62: {
        !            63:   enum XML_Error code = XML_GetErrorCode(parser);
        !            64:   const XML_Char *message = XML_ErrorString(code);
        !            65:   if (message)
        !            66:     ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"),
        !            67:              filename,
        !            68:              XML_GetErrorLineNumber(parser),
        !            69:              XML_GetErrorColumnNumber(parser),
        !            70:              message);
        !            71:   else
        !            72:     ftprintf(stderr, T("%s: (unknown message %d)\n"), filename, code);
        !            73: }
        !            74:  
        !            75: /* This implementation will give problems on files larger than INT_MAX. */
        !            76: static void
        !            77: processFile(const void *data, size_t size,
        !            78:             const XML_Char *filename, void *args)
        !            79: {
        !            80:   XML_Parser parser = ((PROCESS_ARGS *)args)->parser;
        !            81:   int *retPtr = ((PROCESS_ARGS *)args)->retPtr;
        !            82:   if (XML_Parse(parser, (const char *)data, (int)size, 1) == XML_STATUS_ERROR) {
        !            83:     reportError(parser, filename);
        !            84:     *retPtr = 0;
        !            85:   }
        !            86:   else
        !            87:     *retPtr = 1;
        !            88: }
        !            89: 
        !            90: #if (defined(WIN32) || defined(__WATCOMC__))
        !            91: 
        !            92: static int
        !            93: isAsciiLetter(XML_Char c)
        !            94: {
        !            95:   return (T('a') <= c && c <= T('z')) || (T('A') <= c && c <= T('Z'));
        !            96: }
        !            97: 
        !            98: #endif /* WIN32 */
        !            99: 
        !           100: static const XML_Char *
        !           101: resolveSystemId(const XML_Char *base, const XML_Char *systemId,
        !           102:                 XML_Char **toFree)
        !           103: {
        !           104:   XML_Char *s;
        !           105:   *toFree = 0;
        !           106:   if (!base
        !           107:       || *systemId == T('/')
        !           108: #if (defined(WIN32) || defined(__WATCOMC__))
        !           109:       || *systemId == T('\\')
        !           110:       || (isAsciiLetter(systemId[0]) && systemId[1] == T(':'))
        !           111: #endif
        !           112:      )
        !           113:     return systemId;
        !           114:   *toFree = (XML_Char *)malloc((tcslen(base) + tcslen(systemId) + 2)
        !           115:                                * sizeof(XML_Char));
        !           116:   if (!*toFree)
        !           117:     return systemId;
        !           118:   tcscpy(*toFree, base);
        !           119:   s = *toFree;
        !           120:   if (tcsrchr(s, T('/')))
        !           121:     s = tcsrchr(s, T('/')) + 1;
        !           122: #if (defined(WIN32) || defined(__WATCOMC__))
        !           123:   if (tcsrchr(s, T('\\')))
        !           124:     s = tcsrchr(s, T('\\')) + 1;
        !           125: #endif
        !           126:   tcscpy(s, systemId);
        !           127:   return *toFree;
        !           128: }
        !           129: 
        !           130: static int
        !           131: externalEntityRefFilemap(XML_Parser parser,
        !           132:                          const XML_Char *context,
        !           133:                          const XML_Char *base,
        !           134:                          const XML_Char *systemId,
        !           135:                          const XML_Char *publicId)
        !           136: {
        !           137:   int result;
        !           138:   XML_Char *s;
        !           139:   const XML_Char *filename;
        !           140:   XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
        !           141:   PROCESS_ARGS args;
        !           142:   args.retPtr = &result;
        !           143:   args.parser = entParser;
        !           144:   filename = resolveSystemId(base, systemId, &s);
        !           145:   XML_SetBase(entParser, filename);
        !           146:   if (!filemap(filename, processFile, &args))
        !           147:     result = 0;
        !           148:   free(s);
        !           149:   XML_ParserFree(entParser);
        !           150:   return result;
        !           151: }
        !           152: 
        !           153: static int
        !           154: processStream(const XML_Char *filename, XML_Parser parser)
        !           155: {
        !           156:   /* passing NULL for filename means read intput from stdin */
        !           157:   int fd = 0;   /* 0 is the fileno for stdin */
        !           158: 
        !           159:   if (filename != NULL) {
        !           160:     fd = topen(filename, O_BINARY|O_RDONLY);
        !           161:     if (fd < 0) {
        !           162:       tperror(filename);
        !           163:       return 0;
        !           164:     }
        !           165:   }
        !           166:   for (;;) {
        !           167:     int nread;
        !           168:     char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
        !           169:     if (!buf) {
        !           170:       if (filename != NULL)
        !           171:         close(fd);
        !           172:       ftprintf(stderr, T("%s: out of memory\n"),
        !           173:                filename != NULL ? filename : "xmlwf");
        !           174:       return 0;
        !           175:     }
        !           176:     nread = read(fd, buf, READ_SIZE);
        !           177:     if (nread < 0) {
        !           178:       tperror(filename != NULL ? filename : "STDIN");
        !           179:       if (filename != NULL)
        !           180:         close(fd);
        !           181:       return 0;
        !           182:     }
        !           183:     if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
        !           184:       reportError(parser, filename != NULL ? filename : "STDIN");
        !           185:       if (filename != NULL)
        !           186:         close(fd);
        !           187:       return 0;
        !           188:     }
        !           189:     if (nread == 0) {
        !           190:       if (filename != NULL)
        !           191:         close(fd);
        !           192:       break;;
        !           193:     }
        !           194:   }
        !           195:   return 1;
        !           196: }
        !           197: 
        !           198: static int
        !           199: externalEntityRefStream(XML_Parser parser,
        !           200:                         const XML_Char *context,
        !           201:                         const XML_Char *base,
        !           202:                         const XML_Char *systemId,
        !           203:                         const XML_Char *publicId)
        !           204: {
        !           205:   XML_Char *s;
        !           206:   const XML_Char *filename;
        !           207:   int ret;
        !           208:   XML_Parser entParser = XML_ExternalEntityParserCreate(parser, context, 0);
        !           209:   filename = resolveSystemId(base, systemId, &s);
        !           210:   XML_SetBase(entParser, filename);
        !           211:   ret = processStream(filename, entParser);
        !           212:   free(s);
        !           213:   XML_ParserFree(entParser);
        !           214:   return ret;
        !           215: }
        !           216: 
        !           217: int
        !           218: XML_ProcessFile(XML_Parser parser,
        !           219:                 const XML_Char *filename,
        !           220:                 unsigned flags)
        !           221: {
        !           222:   int result;
        !           223: 
        !           224:   if (!XML_SetBase(parser, filename)) {
        !           225:     ftprintf(stderr, T("%s: out of memory"), filename);
        !           226:     exit(1);
        !           227:   }
        !           228: 
        !           229:   if (flags & XML_EXTERNAL_ENTITIES)
        !           230:       XML_SetExternalEntityRefHandler(parser,
        !           231:                                       (flags & XML_MAP_FILE)
        !           232:                                       ? externalEntityRefFilemap
        !           233:                                       : externalEntityRefStream);
        !           234:   if (flags & XML_MAP_FILE) {
        !           235:     PROCESS_ARGS args;
        !           236:     args.retPtr = &result;
        !           237:     args.parser = parser;
        !           238:     if (!filemap(filename, processFile, &args))
        !           239:       result = 0;
        !           240:   }
        !           241:   else
        !           242:     result = processStream(filename, parser);
        !           243:   return result;
        !           244: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>