Instrument Neutral Distributed Interface INDI 2.2.5
userio.c
Go to the documentation of this file.
1/*
2 Copyright (C) 2021 by Pawel Soja <[email protected]>
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
23static ssize_t s_file_write(void *user, const void * ptr, size_t count)
24{
25 return fwrite(ptr, 1, count, (FILE *)user);
26}
27
28static int s_file_printf(void *user, const char * format, va_list arg)
29{
30 return vfprintf((FILE *)user, format, arg);
31}
32
33static const struct userio s_userio_file = {
34 .write = s_file_write,
35 .vprintf = s_file_printf,
36 .joinbuff = NULL,
37};
38
39const struct userio *userio_file()
40{
41 return &s_userio_file;
42}
43
44ssize_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
54ssize_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
59ssize_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
64ssize_t userio_prints(const struct userio *io, void *user, const char *str)
65{
66 return io->write(user, str, strlen(str));
67}
68
69ssize_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
75size_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
104void userio_xmlv1(const userio *io, void *user)
105{
106 userio_prints(io, user, "<?xml version='1.0'?>\n");
107}
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
void userio_xmlv1(const userio *io, void *user)
Definition userio.c:104
const struct userio * userio_file()
Definition userio.c:39