summaryrefslogtreecommitdiff
path: root/nuttx/lib/lib_internal.h
blob: 2f776321a18c860218439cd8229e9ca79d3a5be0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/****************************************************************************
 * lib/lib_internal.h
 *
 *   Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <spudmonkey@racsa.co.cr>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

#ifndef __LIB_INTERNAL_H
#define __LIB_INTERNAL_H

/****************************************************************************
 * Included Files
 ****************************************************************************/

#include <nuttx/config.h>
#include <stdio.h>
#include <semaphore.h>

/****************************************************************************
 * Definitions
 ****************************************************************************/

#ifndef CONFIG_LIB_HOMEDIR
# define CONFIG_LIB_HOMEDIR "/"
#endif

#if CONFIG_STDIO_BUFFER_SIZE <= 0
# define lib_sem_initialize(s)
# define lib_take_semaphore(s)
# define lib_give_semaphore(s)
#endif

#define LIB_BUFLEN_UNKNOWN (0x7fffffff)

/****************************************************************************
 * Public Types
 ****************************************************************************/

/* This is the generic for of a stream used by the library
 * to manage variable sized output.
 */

struct lib_stream_s;

typedef void (*lib_putc_t)(struct lib_stream_s *this, int ch);

struct lib_stream_s
{
  lib_putc_t put;  /* Pointer to function to put one character */
  int        nput; /* Total number of characters put.  Written
                    * by put method, readable by user */
};

struct lib_memstream_s
{
  struct lib_stream_s  public;
  char                *buffer;  /* Address of first byte in the buffer */
  int                  buflen;    /* Size of the buffer in bytes */
};

struct lib_stdstream_s
{
  struct lib_stream_s  public;
  FILE                *stream;
};

struct lib_rawstream_s
{
  struct lib_stream_s  public;
  int                  fd;
};

/****************************************************************************
 * Public Variables
 ****************************************************************************/
 
/****************************************************************************
 * Public Function Prototypes
 ****************************************************************************/

/* Defined in lib_streamsem.c */

#if CONFIG_NFILE_STREAMS > 0
extern void  stream_semtake(FAR struct streamlist *list);
extern void  stream_semgive(FAR struct streamlist *list);
#endif

/* Defined in lib_memstream.c */

extern void lib_memstream(struct lib_memstream_s *memstream,
                          char *bufstart, int buflen);

/* Defined in lib_stdstream.c */

extern void lib_stdstream(struct lib_stdstream_s *stdstream,
                          FILE *stream);

/* Defined in lib_rawstream.c */

extern void lib_rawstream(struct lib_rawstream_s *rawstream,
                          int fd);

/* Defined in lib_lowstream.c */

#ifdef CONFIG_ARCH_LOWPUTC
extern void lib_lowstream(struct lib_stream_s *rawstream);
#endif

/* Defined in lib_nullstream.c */

extern void lib_nullstream(struct lib_stream_s *nullstream);

/* Defined in lib_libsprintf.c */

extern int lib_sprintf (struct lib_stream_s *obj,
                        const char *fmt, ...);

/* Defined lib_libvsprintf.c */

extern int lib_vsprintf(struct lib_stream_s *obj,
                        const char *src, va_list ap);

/* Defined lib_rawprintf.c */

extern int lib_rawvprintf(const char *src, va_list ap);

/* Defined lib_lowprintf.c */

extern int lib_lowvprintf(const char *src, va_list ap);

/* Defined in lib_libwrite.c */

extern ssize_t lib_fwrite(const void *ptr, size_t count, FILE *stream);

/* Defined in lib_libfread.c */

extern ssize_t lib_fread(void *ptr, size_t count, FILE *stream);

/* Defined in lib_libfflush.c */

extern ssize_t lib_fflush(FILE *stream, boolean bforce);

/* Defined in lib_rdflush.c */

extern int lib_rdflush(FILE *stream);

/* Defined in lib_wrflush.c */

int lib_wrflush(FILE *stream);

/* Defined in lib_sem.c */

#if CONFIG_STDIO_BUFFER_SIZE > 0
extern void lib_sem_initialize(FAR struct file_struct *stream);
extern void lib_take_semaphore(FAR struct file_struct *stream);
extern void lib_give_semaphore(FAR struct file_struct *stream);
#endif

/* Defined in lib_libgetbase.c */

extern int lib_getbase(const char *nptr, const char **endptr);

#endif /* __LIB_INTERNAL_H */