1*16467b97STreehugger RobotANTLR_BEGIN_NAMESPACE() 2*16467b97STreehugger Robot 3*16467b97STreehugger Robottemplate<class ImplTraits> 4*16467b97STreehugger RobotANTLR_FDSC FileUtils<ImplTraits>::AntlrFopen(const ANTLR_UINT8* filename, const char * mode) 5*16467b97STreehugger Robot{ 6*16467b97STreehugger Robot return (ANTLR_FDSC)fopen((const char *)filename, mode); 7*16467b97STreehugger Robot} 8*16467b97STreehugger Robot 9*16467b97STreehugger Robottemplate<class ImplTraits> 10*16467b97STreehugger Robotvoid FileUtils<ImplTraits>::AntlrFclose (ANTLR_FDSC fd) 11*16467b97STreehugger Robot{ 12*16467b97STreehugger Robot fclose(fd); 13*16467b97STreehugger Robot} 14*16467b97STreehugger Robot 15*16467b97STreehugger Robottemplate<class ImplTraits> 16*16467b97STreehugger RobotANTLR_UINT32 FileUtils<ImplTraits>::AntlrFsize(const ANTLR_UINT8* filename) 17*16467b97STreehugger Robot{ 18*16467b97STreehugger Robot struct _stat statbuf; 19*16467b97STreehugger Robot 20*16467b97STreehugger Robot _stat((const char *)filename, &statbuf); 21*16467b97STreehugger Robot 22*16467b97STreehugger Robot return (ANTLR_UINT32)statbuf.st_size; 23*16467b97STreehugger Robot} 24*16467b97STreehugger Robot 25*16467b97STreehugger Robottemplate<class ImplTraits> 26*16467b97STreehugger RobotANTLR_UINT32 FileUtils<ImplTraits>::AntlrFread(ANTLR_FDSC fdsc, ANTLR_UINT32 count, void* data) 27*16467b97STreehugger Robot{ 28*16467b97STreehugger Robot return (ANTLR_UINT32)fread(data, (size_t)count, 1, fdsc); 29*16467b97STreehugger Robot} 30*16467b97STreehugger Robot 31*16467b97STreehugger Robottemplate<class ImplTraits> 32*16467b97STreehugger Robot template<typename InputStreamType> 33*16467b97STreehugger RobotANTLR_UINT32 FileUtils<ImplTraits>::AntlrRead8Bit(InputStreamType* input, const ANTLR_UINT8* fileName) 34*16467b97STreehugger Robot{ 35*16467b97STreehugger Robot ANTLR_FDSC infile; 36*16467b97STreehugger Robot ANTLR_UINT32 fSize; 37*16467b97STreehugger Robot 38*16467b97STreehugger Robot /* Open the OS file in read binary mode 39*16467b97STreehugger Robot */ 40*16467b97STreehugger Robot infile = FileUtils<ImplTraits>::AntlrFopen(fileName, "rb"); 41*16467b97STreehugger Robot 42*16467b97STreehugger Robot /* Check that it was there 43*16467b97STreehugger Robot */ 44*16467b97STreehugger Robot if (infile == NULL) 45*16467b97STreehugger Robot { 46*16467b97STreehugger Robot ParseFileAbsentException ex; 47*16467b97STreehugger Robot throw ex; 48*16467b97STreehugger Robot } 49*16467b97STreehugger Robot 50*16467b97STreehugger Robot /* It was there, so we can read the bytes now 51*16467b97STreehugger Robot */ 52*16467b97STreehugger Robot fSize = FileUtils<ImplTraits>::AntlrFsize(fileName); /* Size of input file */ 53*16467b97STreehugger Robot 54*16467b97STreehugger Robot /* Allocate buffer for this input set 55*16467b97STreehugger Robot */ 56*16467b97STreehugger Robot void* data = ImplTraits::AllocPolicyType::alloc(fSize); 57*16467b97STreehugger Robot /* Now we read the file. Characters are not converted to 58*16467b97STreehugger Robot * the internal ANTLR encoding until they are read from the buffer 59*16467b97STreehugger Robot */ 60*16467b97STreehugger Robot FileUtils<ImplTraits>::AntlrFread(infile, fSize, data ); 61*16467b97STreehugger Robot 62*16467b97STreehugger Robot input->set_data( (unsigned char*) data ); 63*16467b97STreehugger Robot input->set_sizeBuf( fSize ); 64*16467b97STreehugger Robot 65*16467b97STreehugger Robot input->set_isAllocated(true); 66*16467b97STreehugger Robot 67*16467b97STreehugger Robot /* And close the file handle 68*16467b97STreehugger Robot */ 69*16467b97STreehugger Robot FileUtils<ImplTraits>::AntlrFclose(infile); 70*16467b97STreehugger Robot 71*16467b97STreehugger Robot return ANTLR_SUCCESS; 72*16467b97STreehugger Robot} 73*16467b97STreehugger Robot 74*16467b97STreehugger RobotANTLR_END_NAMESPACE() 75