source: trunk/libtransmission/file.c

Last change on this file was 14493, checked in by mikedld, 6 years ago

Forward-declare tr_error structure in headers

  • Property svn:keywords set to Date Rev Author Id
File size: 2.8 KB
Line 
1/*
2 * This file Copyright (C) 2013-2014 Mnemosyne LLC
3 *
4 * It may be used under the GNU GPL versions 2 or 3
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 * $Id: file.c 14493 2015-04-11 14:54:01Z mikedld $
8 */
9
10#include <assert.h>
11#include <string.h> /* strlen () */
12
13#include "transmission.h"
14#include "error.h"
15#include "file.h"
16#include "utils.h"
17
18bool
19tr_sys_file_read_line (tr_sys_file_t    handle,
20                       char           * buffer,
21                       size_t           buffer_size,
22                       tr_error      ** error)
23{
24  bool ret = false;
25  size_t offset = 0;
26  uint64_t bytes_read;
27
28  assert (handle != TR_BAD_SYS_FILE);
29  assert (buffer != NULL);
30  assert (buffer_size > 0);
31
32  while (buffer_size > 0)
33    {
34      size_t i;
35      bool found_eol = false;
36
37      ret = tr_sys_file_read (handle, buffer + offset, MIN(buffer_size, 1024u),
38                              &bytes_read, error);
39      if (!ret || (offset == 0 && bytes_read == 0))
40        {
41          ret = false;
42          break;
43        }
44
45      for (i = 0; i < bytes_read; ++i, ++offset, --buffer_size)
46        {
47          if (buffer[offset] == '\n')
48            {
49              found_eol = true;
50              break;
51            }
52        }
53
54      if (found_eol || buffer_size == 0 || bytes_read == 0)
55        {
56          const int64_t delta = -(int64_t) bytes_read + i + (found_eol ? 1 : 0);
57
58          if (delta != 0)
59            {
60              ret = tr_sys_file_seek (handle, delta, TR_SEEK_CUR, NULL, error);
61              if (!ret)
62                break;
63            }
64
65          if (offset > 0 && buffer[offset - 1] == '\r')
66            buffer[offset - 1] = '\0';
67          else
68            buffer[offset] = '\0';
69
70          break;
71        }
72    }
73
74  return ret;
75}
76
77bool
78tr_sys_file_write_line (tr_sys_file_t    handle,
79                        const char     * buffer,
80                        tr_error      ** error)
81{
82  bool ret;
83
84  assert (handle != TR_BAD_SYS_FILE);
85  assert (buffer != NULL);
86
87  ret = tr_sys_file_write (handle, buffer, strlen (buffer), NULL, error);
88
89  if (ret)
90    ret = tr_sys_file_write (handle, TR_NATIVE_EOL_STR, TR_NATIVE_EOL_STR_SIZE,
91                             NULL, error);
92
93  return ret;
94}
95
96bool
97tr_sys_file_write_fmt (tr_sys_file_t    handle,
98                       const char     * format,
99                       tr_error      ** error,
100                                        ...)
101{
102  bool ret = false;
103  char * buffer;
104  va_list args;
105
106  assert (handle != TR_BAD_SYS_FILE);
107  assert (format != NULL);
108
109  va_start (args, error);
110  buffer = tr_strdup_vprintf (format, args);
111  va_end (args);
112
113  if (buffer != NULL)
114    {
115      ret = tr_sys_file_write (handle, buffer, strlen (buffer), NULL, error);
116      tr_free (buffer);
117    }
118  else
119    {
120      tr_error_set_literal (error, 0, "Unable to format message.");
121    }
122
123  return ret;
124}
Note: See TracBrowser for help on using the repository browser.