summaryrefslogtreecommitdiff
path: root/sal/osl/all/readline.c
diff options
context:
space:
mode:
Diffstat (limited to 'sal/osl/all/readline.c')
-rw-r--r--sal/osl/all/readline.c311
1 files changed, 0 insertions, 311 deletions
diff --git a/sal/osl/all/readline.c b/sal/osl/all/readline.c
deleted file mode 100644
index e5baa4f96..000000000
--- a/sal/osl/all/readline.c
+++ /dev/null
@@ -1,311 +0,0 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * $RCSfile: readline.c,v $
- * $Revision: 1.9 $
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <osl/diagnose.h>
-#include <osl/file.h>
-#include <rtl/byteseq.h>
-#include <rtl/alloc.h>
-
-
-/* Test cases:
-
- 1. A file without line ends
- 2. A file with lines longer than the initial buffer size
- 3. An empty file
- 4.
-*/
-
-/** Some defines
-*/
-#define CR 0x0D
-#define LF 0x0A
-
-#define INITIAL_BUFF_SIZE 80
-#define BUFFER_GROW_FACTOR 2
-#define READ_BLOCK_SIZE (INITIAL_BUFF_SIZE - 1)
-
-/** Helper data and function
-*/
-
-struct _Buffer
-{
- sal_Char* m_pMem;
- sal_uInt64 m_Capacity; /* elements possible in buffer */
- sal_uInt64 m_Size; /* elements actually in buffer */
- sal_uInt64 m_ActiveSectionStart; /* buffer was lastly filled from here to
- (m_Size - 1) */
-};
-
-typedef struct _Buffer Buffer;
-
-
-/** Allocate the memory of the buffer
- @Returns sal_True on succes
-*/
-static sal_Bool AllocateBuffer(Buffer* pBuffer, sal_uInt64 Capacity)
-{
- sal_Bool rc = sal_False;
-
- OSL_ASSERT(pBuffer);
-
- pBuffer->m_pMem = (sal_Char*)rtl_allocateZeroMemory((sal_uInt32)Capacity);
- if (pBuffer->m_pMem)
- {
- pBuffer->m_Capacity = Capacity;
- pBuffer->m_Size = 0;
- pBuffer->m_ActiveSectionStart = 0;
- rc = sal_True;
- }
-
- return rc;
-}
-
-/** Release the memory occupied by the buffer
-*/
-static void FreeBuffer(Buffer* pBuffer)
-{
- OSL_ASSERT(pBuffer);
-
- rtl_freeMemory(pBuffer->m_pMem);
- pBuffer->m_pMem = 0;
- pBuffer->m_Capacity = 0;
- pBuffer->m_Size = 0;
- pBuffer->m_ActiveSectionStart = 0;
-}
-
-/** Grow the buffer by the specified factor (usually doubling
- the buffer size)
- In case of failure, growing the buffer, the original buffer
- stays untouched
-
- @Returns sal_True on success
-*/
-static sal_Bool GrowBuffer(Buffer* pBuffer, size_t factor)
-{
- sal_Bool rc = sal_False;
- void* p;
-
- OSL_ASSERT(pBuffer);
-
- p = rtl_reallocateMemory(
- pBuffer->m_pMem, (sal_uInt32)(pBuffer->m_Capacity * factor));
- if (p)
- {
- pBuffer->m_pMem = (sal_Char*)p;
- pBuffer->m_Capacity *= factor;
- rc = sal_True;
- }
-
- return rc;
-}
-
-/** Read n bytes from file into buffer,
- grow the buffer if necessary
-
- @Returns osl_File_E_None on success else
- an error code
-*/
-static oslFileError ReadFromFile(oslFileHandle hFile, Buffer* pBuffer, sal_uInt64 Requested, sal_uInt64* pRead)
-{
- oslFileError rc;
-
- OSL_ASSERT(pBuffer);
- OSL_ASSERT(hFile);
- OSL_ASSERT(pRead);
-
- if (((pBuffer->m_Size + Requested) > pBuffer->m_Capacity) &&
- !GrowBuffer(pBuffer, BUFFER_GROW_FACTOR))
- return osl_File_E_NOMEM;
-
- pBuffer->m_ActiveSectionStart = pBuffer->m_Size;
-
- rc = osl_readFile(
- hFile,
- pBuffer->m_pMem + pBuffer->m_ActiveSectionStart,
- Requested,
- pRead);
-
- if (osl_File_E_None == rc)
- pBuffer->m_Size += *pRead;
-
- return rc;
-}
-
-/** Makes a sequence from the given buffer and release the memory
- occupied by the buffer
-*/
-static void MakeSequenceFreeBuffer(sal_Sequence** ppSequence, Buffer* pBuffer, sal_uInt64 Length)
-{
- OSL_ASSERT(ppSequence);
- OSL_ASSERT(pBuffer);
- OSL_ASSERT(Length <= pBuffer->m_Capacity);
-
- rtl_byte_sequence_constructFromArray(ppSequence, (sal_Int8*)pBuffer->m_pMem, (sal_Int32)Length);
- FreeBuffer(pBuffer);
-}
-
-/** Handle occurence of LF character:
- construct a sequence from buffer
- correct file pointer (maybe we have read more than necessary)
-
- @Returns osl_File_E_None on success else
- an error code
-*/
-static oslFileError HandleLFFreeBuffer(oslFileHandle hFile, sal_Sequence** ppSequence, Buffer* pBuffer, sal_uInt64 Pos)
-{
- sal_Int64 offset = 0;
- oslFileError rc = osl_File_E_None;
-
- OSL_ASSERT(hFile);
- OSL_ASSERT(pBuffer);
- OSL_ASSERT(LF == pBuffer->m_pMem[Pos]);
-
- /* correct file pointer pos in case we have read to far */
- offset = pBuffer->m_Size - (Pos + 1);
- rc = osl_setFilePos(hFile, osl_Pos_Current, -offset);
-
- if (osl_File_E_None == rc)
- MakeSequenceFreeBuffer(ppSequence, pBuffer, Pos);
- else
- FreeBuffer(pBuffer);
-
- return rc;
-}
-
-/** Handle occurence of CR character
- construct a sequence from buffer
- correct file pointer (maybe we have read more than necessary)
-
- @Returns osl_File_E_None on success else
- an error code
-*/
-static oslFileError HandleCRFreeBuffer(oslFileHandle hFile, sal_Sequence** ppSequence, Buffer* pBuffer, sal_uInt64 Pos)
-{
- sal_Int64 offset = 0;
- sal_uInt64 nread = 0;
- oslFileError rc = osl_File_E_None;
-
- OSL_ASSERT(hFile);
- OSL_ASSERT(pBuffer);
- OSL_ASSERT(CR == pBuffer->m_pMem[Pos]);
-
- if (Pos == (pBuffer->m_Size - 1))
- {
- /* only need to check if the next byte is a LF
- that's why reading only one byte from file */
- rc = ReadFromFile(hFile, pBuffer, 1, &nread);
-
- if (osl_File_E_None != rc)
- {
- FreeBuffer(pBuffer);
- return rc;
- }
- else if (0 == nread)
- {
- MakeSequenceFreeBuffer(ppSequence, pBuffer, Pos);
- return osl_File_E_None;
- }
- }
-
- if (LF == pBuffer->m_pMem[Pos + 1])
- Pos++;
-
- /* correct the file pointer */
- offset = pBuffer->m_Size - (Pos + 1);
- rc = osl_setFilePos(hFile, osl_Pos_Current, -offset);
-
- if (osl_File_E_None == rc)
- MakeSequenceFreeBuffer(ppSequence, pBuffer, Pos - 1);
- else
- FreeBuffer(pBuffer);
-
- return rc;
-}
-
-/***************************************************************************
- osl_readLine (platform independent)
- Reads a line from given file. The new line delimiter(s) are NOT returned!
- Valid line ends: \n, \r\n or \r
-
- @param Handle [in] Handle to an open file.
- @param ppSequence [in/out] a pointer to a valid sequence.
-
- @return osl_File_E_None on success otherwise one of the following errorcodes:<p>
-
- osl_File_E_INVAL the format of the parameters was not valid<br>
- osl_File_E_NOMEM the necessary memory could not be allocated
-****************************************************************************/
-
-oslFileError SAL_CALL osl_readLine(oslFileHandle Handle, sal_Sequence** ppSeq)
-{
- oslFileError rc;
- sal_uInt64 nread = 0;
- Buffer line_buffer;
- sal_uInt64 pos;
-
- OSL_PRECOND(Handle, "invalid handle");
- OSL_PRECOND(ppSeq, "invalid parameter detected");
-
- if (!AllocateBuffer(&line_buffer, INITIAL_BUFF_SIZE))
- return osl_File_E_NOMEM;
-
- for(;;)
- {
- rc = ReadFromFile(Handle, &line_buffer, READ_BLOCK_SIZE, &nread);
-
- if (osl_File_E_None != rc)
- {
- FreeBuffer(&line_buffer);
- return rc;
- }
- else if (0 == nread)
- {
- /* EOF */
- nread = line_buffer.m_Size;
- MakeSequenceFreeBuffer(ppSeq, &line_buffer, nread);
- if (0 < nread)
- return osl_File_E_None;
- else
- return osl_File_E_AGAIN;
- }
-
- /* scan buffer for line end */
- for (pos = line_buffer.m_ActiveSectionStart; pos < line_buffer.m_Size; pos++)
- {
- switch(line_buffer.m_pMem[pos])
- {
- case LF:
- return HandleLFFreeBuffer(Handle, ppSeq, &line_buffer, pos);
- case CR:
- return HandleCRFreeBuffer(Handle, ppSeq, &line_buffer, pos);
- }
- }
- } /* end for */
-}