xref: /aosp_15_r20/external/antlr/runtime/Cpp/include/antlr3filestream.inl (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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