Instrument Neutral Distributed Interface INDI  2.0.2
userio.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 2021 by Pawel Soja <kernel32.pl@gmail.com>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with this library; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 #include "userio.h"
19 #include <stddef.h>
20 #include <stdio.h>
21 #include <string.h>
22 
23 static ssize_t s_file_write(void *user, const void * ptr, size_t count)
24 {
25  return fwrite(ptr, 1, count, (FILE *)user);
26 }
27 
28 static int s_file_printf(void *user, const char * format, va_list arg)
29 {
30  return vfprintf((FILE *)user, format, arg);
31 }
32 
33 static const struct userio s_userio_file = {
34  .write = s_file_write,
35  .vprintf = s_file_printf,
36  .joinbuff = NULL,
37 };
38 
39 const struct userio *userio_file()
40 {
41  return &s_userio_file;
42 }
43 
44 ssize_t userio_printf(const struct userio *io, void *user, const char * format, ...)
45 {
46  int ret;
47  va_list ap;
48  va_start(ap, format);
49  ret = io->vprintf(user, format, ap);
50  va_end(ap);
51  return ret;
52 }
53 
54 ssize_t userio_vprintf(const struct userio *io, void *user, const char * format, va_list arg)
55 {
56  return io->vprintf(user, format, arg);
57 }
58 
59 ssize_t userio_write(const struct userio *io, void *user, const void * ptr, size_t count)
60 {
61  return io->write(user, ptr, count);
62 }
63 
64 ssize_t userio_prints(const struct userio *io, void *user, const char *str)
65 {
66  return io->write(user, str, strlen(str));
67 }
68 
69 ssize_t userio_putc(const struct userio *io, void *user, int ch)
70 {
71  char c = ch;
72  return io->write(user, &c, sizeof(c));
73 }
74 
75 size_t userio_xml_escape(const struct userio *io, void *user, const char *src)
76 {
77  size_t total = 0;
78  const char *ptr = src;
79  const char *replacement;
80 
81  for(; *ptr; ++ptr)
82  {
83  switch(*ptr)
84  {
85  case '&': replacement = "&amp;"; break;
86  case '\'': replacement = "&apos;"; break;
87  case '"': replacement = "&quot;"; break;
88  case '<': replacement = "&lt;"; break;
89  case '>': replacement = "&gt;"; break;
90  default: replacement = NULL;
91  }
92 
93  if (replacement != NULL)
94  {
95  total += userio_write(io, user, src, (size_t)(ptr - src));
96  src = ptr + 1;
97  total += userio_write(io, user, replacement, strlen(replacement));
98  }
99  }
100  total += userio_write(io, user, src, (size_t)(ptr - src));
101  return total;
102 }
103 
104 void userio_xmlv1(const userio *io, void *user)
105 {
106  userio_prints(io, user, "<?xml version='1.0'?>\n");
107 }
Definition: userio.h:29
int(* vprintf)(void *user, const char *format, va_list arg)
Definition: userio.h:31
ssize_t(* write)(void *user, const void *ptr, size_t count)
Definition: userio.h:30
ssize_t userio_prints(const struct userio *io, void *user, const char *str)
Definition: userio.c:64
ssize_t userio_vprintf(const struct userio *io, void *user, const char *format, va_list arg)
Definition: userio.c:54
ssize_t userio_write(const struct userio *io, void *user, const void *ptr, size_t count)
Definition: userio.c:59
ssize_t userio_printf(const struct userio *io, void *user, const char *format,...)
Definition: userio.c:44
size_t userio_xml_escape(const struct userio *io, void *user, const char *src)
Definition: userio.c:75
ssize_t userio_putc(const struct userio *io, void *user, int ch)
Definition: userio.c:69
const struct userio * userio_file()
Definition: userio.c:39
void userio_xmlv1(const userio *io, void *user)
Definition: userio.c:104