summaryrefslogtreecommitdiff
path: root/libc/src/stdio/printf_core/writer.h
blob: b5c36bf38e8141bef57eb23e9d45203d4cb55061 (plain)
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
//===-- Writer definition for printf ----------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_SRC_STDIO_PRINTF_CORE_WRITER_H
#define LLVM_LIBC_SRC_STDIO_PRINTF_CORE_WRITER_H

#include "src/__support/CPP/string_view.h"
#include <stddef.h>

namespace __llvm_libc {
namespace printf_core {

using WriteStrFunc = int (*)(void *, cpp::string_view);
using WriteCharsFunc = int (*)(void *, char, size_t);
using WriteCharFunc = int (*)(void *, char);

class Writer final {
  // output is a pointer to the string or file that the writer is meant to write
  // to.
  void *output;

  // raw_write is a function that, when called on output with a char* and
  // length, will copy the number of bytes equal to the length from the char*
  // onto the end of output. It should return a positive number or zero on
  // success, or a negative number on failure.
  WriteStrFunc str_write;
  WriteCharsFunc chars_write;
  WriteCharFunc char_write;

  int chars_written = 0;

public:
  Writer(void *init_output, WriteStrFunc init_str_write,
         WriteCharsFunc init_chars_write, WriteCharFunc init_char_write)
      : output(init_output), str_write(init_str_write),
        chars_write(init_chars_write), char_write(init_char_write) {}

  // write will copy new_string into output using str_write. It increments
  // chars_written by the length of new_string. It returns the result of
  // str_write.
  int write(cpp::string_view new_string);

  // this version of write will copy length copies of new_char into output using
  // chars_write. This is primarily used for padding.  It returns the result of
  // chars_write.
  int write(char new_char, size_t len);

  // this version of write will copy just new_char into output. This is often
  // used for negative signs. It returns the result of chars_write.
  int write(char new_char);

  int get_chars_written() { return chars_written; }
};

} // namespace printf_core
} // namespace __llvm_libc

#endif // LLVM_LIBC_SRC_STDIO_PRINTF_CORE_WRITER_H