##############################################################################
#    Copyright (C) 2021-current alexpdev
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
##############################################################################

#######################
# CFFI Builder Module #
#######################

import os
from cffi import FFI

ffibuilder = FFI()  # 'hasher_build.py:FFI_BUILDER'
HEADER = '''
typedef struct {
    uint8_t *ptr;
    int size;
    int allocated;
    int logical;
} HASH;

typedef struct {
    uint8_t *piece_layer;
    uint8_t *pieces_root;
} HASHV2;

typedef struct {
    uint8_t *piece_layerV3;
    uint8_t *pieces_root;
    uint8_t *hashv1;
} HASHHYBRID;

HASH *HASHER(char **filelist, int piece_length);
HASHV2 *HasherV2(char *path, unsigned piece_length);
HASHHYBRID *HasherHybrid(char *path, unsigned piece_length);
'''

ffibuilder.cdef(HEADER)
path = "c"
filelist = os.listdir("c")
sources = [
    "hasher.c",
    "hasherv2.c",
    "hasherhybrid.c",
    "sha1.c",
    "sha256.c",
]
ffibuilder.set_source(
    "c_hasher",
    """
    #include "sha256.h"
    #include "sha1.h"
    #include "hasher.h"
    #include "hasherv2.h"
    #include "hasherhybrid.h"
    """,
    sources=sources)
if __name__ == "__main__":
    ffibuilder.compile()
