1// Copyright 2014 The Android Open Source Project
2//
3// This software is licensed under the terms of the GNU General Public
4// License version 2, as published by the Free Software Foundation, and
5// may be copied, distributed, and modified under those terms.
6//
7// This program is distributed in the hope that it will be useful,
8// but WITHOUT ANY WARRANTY; without even the implied warranty of
9// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10// GNU General Public License for more details.
11
12#ifndef ANDROID_UTILS_FILE_UTILS_H
13#define ANDROID_UTILS_FILE_UTILS_H
14
15#include "android/utils/compiler.h"
16
17#include <stdbool.h>
18#include <stddef.h>
19#include <stdint.h>
20
21ANDROID_BEGIN_HEADER
22
23// A simple structure used to own a buffer of heap-allocated memory that
24// typically comes from a file.
25// |data| is the address of the corresponding data in memory.
26// |size| is the size of the data in bytes.
27// |flags| is used internally, do not use it.
28// Note that |data| will always be NULL if |size| is 0.
29typedef struct {
30    uint8_t* data;
31    size_t size;
32    // private
33    size_t flags;
34} FileData;
35
36// Initializer value for a FileData instance.
37// Its important that this is all zeroes.
38#define FILE_DATA_INIT  { NULL, 0, 0 }
39
40// Return true iff a |fileData| is empty.
41static inline bool fileData_isEmpty(const FileData* fileData) {
42    return fileData->size == 0;
43}
44
45// Returns true iff |fileData| is valid. Used for unit-testing.
46bool fileData_isValid(const FileData* fileData);
47
48// Initialize a FileData value to the empty value.
49void fileData_initEmpty(FileData* fileData);
50
51// Initialize a FileData value by reading the content of a given file
52// at |filePath|. On success, return 0 and initializes |fileData| properly.
53// On failure, return -errno code, and set |fileData| to FILE_DATA_INIT.
54int fileData_initFromFile(FileData* fileData, const char* filePath);
55
56// Initialize a FileData by copying a memory buffer.
57// |fileData| is the address of the FileData value to initialize.
58// |buffer| is the address of the input buffer that will be copied
59// into the FileData.
60// |bufferLen| is the buffer length in bytes.
61// Return 0 on success, -errno code on failure.
62int fileData_initFromMemory(FileData* fileData,
63                            const void* buffer,
64                            size_t bufferLen);
65
66// Copy a FileData value into another one. This copies the contents in
67// the heap. On success return 0, on failure -errno code.
68int fileData_initFrom(FileData* fileData, const FileData* other);
69
70// Swap two FileData values.
71void fileData_swap(FileData* fileData, FileData* other);
72
73// Finalize a FileData value. This releases the corresponding memory.
74void fileData_done(FileData* fileData);
75
76ANDROID_END_HEADER
77
78#endif  // ANDROID_UTILS_FILE_UTILS_H
79