130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Copyright 2013 Google Inc. All Rights Reserved.
230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Licensed under the Apache License, Version 2.0 (the "License");
430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   you may not use this file except in compliance with the License.
530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   You may obtain a copy of the License at
630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   http://www.apache.org/licenses/LICENSE-2.0
830625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Unless required by applicable law or agreed to in writing, software
1030625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   distributed under the License is distributed on an "AS IS" BASIS,
1130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   See the License for the specific language governing permissions and
1330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   limitations under the License.
1430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka
1530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka   Functions for streaming input and output.
1630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka*/
171571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
181571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#ifndef BROTLI_DEC_STREAMS_H_
191571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#define BROTLI_DEC_STREAMS_H_
201571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
211571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#include <stdio.h>
221571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#include "./types.h"
231571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
241571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
251571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaextern "C" {
261571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#endif
271571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
2830625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Function pointer type used to read len bytes into buf. Returns the */
2930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* number of bytes read or -1 on error. */
301571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef int (*BrotliInputFunction)(void* data, uint8_t* buf, size_t len);
311571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
3230625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Input callback function with associated data. */
331571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef struct {
341571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  BrotliInputFunction cb_;
351571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  void* data_;
361571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka} BrotliInput;
371571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
3830625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Reads len bytes into buf, using the in callback. */
391571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkastatic BROTLI_INLINE int BrotliRead(BrotliInput in, uint8_t* buf, size_t len) {
401571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  return in.cb_(in.data_, buf, len);
411571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka}
421571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
4330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Function pointer type used to write len bytes into buf. Returns the */
4430625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* number of bytes written or -1 on error. */
451571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef int (*BrotliOutputFunction)(void* data, const uint8_t* buf, size_t len);
461571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
4730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Output callback function with associated data. */
481571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef struct {
491571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  BrotliOutputFunction cb_;
501571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  void* data_;
511571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka} BrotliOutput;
521571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
5330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Writes len bytes into buf, using the out callback. */
541571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkastatic BROTLI_INLINE int BrotliWrite(BrotliOutput out,
551571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka                                     const uint8_t* buf, size_t len) {
561571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  return out.cb_(out.data_, buf, len);
571571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka}
581571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
5930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Memory region with position. */
601571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef struct {
611571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  const uint8_t* buffer;
621571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  size_t length;
631571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  size_t pos;
641571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka} BrotliMemInput;
651571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
6630625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Input callback where *data is a BrotliMemInput struct. */
671571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaint BrotliMemInputFunction(void* data, uint8_t* buf, size_t count);
681571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
6930625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Returns an input callback that wraps the given memory region. */
701571db36a9b00e895882ee236e9f84d62f8ea226Zoltan SzabadkaBrotliInput BrotliInitMemInput(const uint8_t* buffer, size_t length,
711571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka                               BrotliMemInput* mem_input);
721571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
7330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Output buffer with position. */
741571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkatypedef struct {
751571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  uint8_t* buffer;
761571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  size_t length;
771571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka  size_t pos;
781571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka} BrotliMemOutput;
791571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
8030625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Output callback where *data is a BrotliMemOutput struct. */
811571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaint BrotliMemOutputFunction(void* data, const uint8_t* buf, size_t count);
821571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
8330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Returns an output callback that wraps the given memory region. */
841571db36a9b00e895882ee236e9f84d62f8ea226Zoltan SzabadkaBrotliOutput BrotliInitMemOutput(uint8_t* buffer, size_t length,
851571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka                                 BrotliMemOutput* mem_output);
861571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
8730625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Input callback that reads from standard input. */
881571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaint BrotliStdinInputFunction(void* data, uint8_t* buf, size_t count);
891571db36a9b00e895882ee236e9f84d62f8ea226Zoltan SzabadkaBrotliInput BrotliStdinInput();
901571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
9130625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Output callback that writes to standard output. */
921571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaint BrotliStdoutOutputFunction(void* data, const uint8_t* buf, size_t count);
931571db36a9b00e895882ee236e9f84d62f8ea226Zoltan SzabadkaBrotliOutput BrotliStdoutOutput();
941571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
9530625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka/* Output callback that writes to a file. */
961571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadkaint BrotliFileOutputFunction(void* data, const uint8_t* buf, size_t count);
971571db36a9b00e895882ee236e9f84d62f8ea226Zoltan SzabadkaBrotliOutput BrotliFileOutput(FILE* f);
981571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
991571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#if defined(__cplusplus) || defined(c_plusplus)
10030625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka}    /* extern "C" */
1011571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka#endif
1021571db36a9b00e895882ee236e9f84d62f8ea226Zoltan Szabadka
10330625ba238fcb360c80a093164347503bbedf7adZoltan Szabadka#endif  /* BROTLI_DEC_STREAMS_H_ */
104