From f44a1596e1724dc86b1f0028af4f5004f79c89b1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 21 Sep 2021 23:20:31 +0100 Subject: [PATCH] Added ADLER32. --- CMakeLists.txt | 2 +- adler32.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ adler32.h | 34 ++++++++++++++++++++++++++ library.c | 5 ---- library.h | 26 +++++++++++++++++++- 5 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 adler32.c create mode 100644 adler32.h delete mode 100644 library.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 99a6841..5e8c8b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ project("Aaru.Checksums.Native" C) set(CMAKE_C_STANDARD 90) -add_library("Aaru.Checksums.Native" SHARED library.c) +add_library("Aaru.Checksums.Native" SHARED adler32.h adler32.c library.h) diff --git a/adler32.c b/adler32.c new file mode 100644 index 0000000..78999f5 --- /dev/null +++ b/adler32.c @@ -0,0 +1,65 @@ +/* + * This file is part of the Aaru Data Preservation Suite. + * Copyright (c) 2019-2021 Natalia Portillo. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include +#include + +#include "library.h" +#include "adler32.h" + +adler32_ctx* adler32_init() +{ + adler32_ctx* ctx; + + ctx = (adler32_ctx*)malloc(sizeof(adler32_ctx)); + + if(!ctx) return NULL; + + ctx->sum1 = 1; + ctx->sum2 = 0; + + return ctx; +} + +int adler32_update(adler32_ctx* ctx, const uint8_t* data, uint32_t len) +{ + if(!ctx || !data) return -1; + + for(uint32_t i = 0; i < len; i++) + { + ctx->sum1 = (ctx->sum1 + data[i]) % ADLER_MODULE; + ctx->sum2 = (ctx->sum2 + ctx->sum1) % ADLER_MODULE; + } + + return 0; +} + +int adler32_final(adler32_ctx* ctx, uint32_t* checksum) +{ + if(!ctx) return -1; + + *checksum = (ctx->sum2 << 16) | ctx->sum1; + return 0; +} + +void adler32_free(adler32_ctx* ctx) +{ + if(!ctx) return; + + free(ctx); +} \ No newline at end of file diff --git a/adler32.h b/adler32.h new file mode 100644 index 0000000..07d5ed5 --- /dev/null +++ b/adler32.h @@ -0,0 +1,34 @@ +/* + * This file is part of the Aaru Data Preservation Suite. + * Copyright (c) 2019-2021 Natalia Portillo. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#ifndef AARU_CHECKSUMS_NATIVE_ADLER32_H +#define AARU_CHECKSUMS_NATIVE_ADLER32_H + +#define ADLER_MODULE 65521 + +typedef struct { + uint16_t sum1; + uint16_t sum2; +} adler32_ctx; + +AARU_EXPORT adler32_ctx* AARU_CALL adler32_init(); +AARU_EXPORT int AARU_CALL adler32_update(adler32_ctx* ctx, const uint8_t* data, uint32_t len); +AARU_EXPORT int AARU_CALL adler32_final(adler32_ctx* ctx, uint32_t* checksum); +AARU_EXPORT void AARU_CALL adler32_free(adler32_ctx* ctx); + +#endif//AARU_CHECKSUMS_NATIVE_LIBRARY_H diff --git a/library.c b/library.c deleted file mode 100644 index efc825f..0000000 --- a/library.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -#include "library.h" - -void hello(void) { printf("Hello, World!\n"); } diff --git a/library.h b/library.h index 73835ce..5899c71 100644 --- a/library.h +++ b/library.h @@ -1,6 +1,30 @@ #ifndef AARU_CHECKSUMS_NATIVE_LIBRARY_H #define AARU_CHECKSUMS_NATIVE_LIBRARY_H -void hello(void); +#ifdef __cplusplus +#define EXTERNC extern "C" +#else +#define EXTERNC +#endif + +#if defined(_WIN32) +#define AARU_CALL __stdcall +#define AARU_EXPORT EXTERNC __declspec(dllexport) +#define AARU_LOCAL +#else +#define AARU_CALL +#if defined(__APPLE__) +#define AARU_EXPORT EXTERNC __attribute__((visibility("default"))) +#define AARU_LOCAL __attribute__((visibility("hidden"))) +#else +#if __GNUC__ >= 4 +#define AARU_EXPORT EXTERNC __attribute__ ((visibility("default"))) +#define AARU_LOCAL __attribute__((visibility("hidden"))) +#else +#define AARU_EXPORT EXTERNC +#define idaAARU_LOCAL_local +#endif +#endif +#endif #endif//AARU_CHECKSUMS_NATIVE_LIBRARY_H