1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /** 18 * Byte buffer utilities. 19 */ 20 21 #ifndef __BUFFER_H 22 #define __BUFFER_H 23 24 #ifdef __cplusplus 25 extern "C" { 26 #endif 27 28 #include <stdlib.h> 29 30 /** 31 * Byte buffer of known size. Keeps track of how much data has been read 32 * into or written out of the buffer. 33 */ 34 typedef struct { 35 /** Buffered data. */ 36 char* data; 37 38 union { 39 /** For reading. # of bytes we expect. */ 40 size_t expected; 41 42 /** For writing. # of bytes to write. */ 43 size_t remaining; 44 }; 45 46 /** Actual # of bytes in the buffer. */ 47 size_t size; 48 49 /** Amount of memory allocated for this buffer. */ 50 size_t capacity; 51 } Buffer; 52 53 /** 54 * Returns true if all data has been read into the buffer. 55 */ 56 #define bufferReadComplete(buffer) (buffer->expected == buffer->size) 57 58 /** 59 * Returns true if the buffer has been completely written. 60 */ 61 #define bufferWriteComplete(buffer) (buffer->remaining == 0) 62 63 /** 64 * Creates a new buffer with the given initial capacity. 65 */ 66 Buffer* bufferCreate(size_t initialCapacity); 67 68 /** 69 * Wraps an existing byte array. 70 */ 71 Buffer* bufferWrap(char* data, size_t capacity, size_t size); 72 73 /** 74 * Frees and its data. 75 */ 76 void bufferFree(Buffer* buffer); 77 78 /** 79 * Prepares buffer to read 'expected' number of bytes. Expands capacity if 80 * necessary. Returns 0 if successful or -1 if an error occurs allocating 81 * memory. 82 */ 83 int bufferPrepareForRead(Buffer* buffer, size_t expected); 84 85 /** 86 * Reads some data into a buffer. Returns -1 in case of an error and sets 87 * errno (see read()). Returns 0 for EOF. Updates buffer->size and returns 88 * the new size after a succesful read. 89 * 90 * Precondition: buffer->size < buffer->expected 91 */ 92 ssize_t bufferRead(Buffer* buffer, int fd); 93 94 /** 95 * Prepares a buffer to be written out. 96 */ 97 void bufferPrepareForWrite(Buffer* buffer); 98 99 /** 100 * Writes data from buffer to the given fd. Returns -1 and sets errno in case 101 * of an error. Updates buffer->remaining and returns the number of remaining 102 * bytes to be written after a successful write. 103 * 104 * Precondition: buffer->remaining > 0 105 */ 106 ssize_t bufferWrite(Buffer* buffer, int fd); 107 108 #ifdef __cplusplus 109 } 110 #endif 111 112 #endif /* __BUFFER_H */ 113