Answer the question
In order to leave comments, you need to log in
How to use C++ code in conjunction with C?
main.cpp
#include "hslocallib.h"
int main(int argc, char *argv[]) {
const char *inpath = argv[1];
unsigned int length;
readInputData(inpath, &length);
return 0;
}
#ifndef HSLOCAL_INCLUDED
#define HSLOCAL_INCLUDED
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <hs/hs.h>
#include <errno.h>
static char *readInputData(const char *inputdata, unsigned int *length);
#endif //HSLOCAL_INCLUDED
#include "hslocallib.h"
static char *readInputData(const char *inputdata, unsigned int *length) {
FILE *file = fopen(inputdata, "rb");
if (!file) {
fprintf(stderr, "Невозможно прочитать файл \"%s\": %s\n", inputdata,
strerror(errno));
return NULL;
}
if (fseek(file, 0, SEEK_END) != 0) {
fprintf(stderr, "Невозможно определить конец файла \"%s\": %s\n", inputdata,
strerror(errno));
fclose(file);
return NULL;
}
long dataLen = ftell(file);
if (dataLen < 0) {
fprintf(stderr, "Невозможно вернуть положение указателя в файле %s\n", strerror(errno));
fclose(file);
return NULL;
}
if (fseek(file, 0, SEEK_SET) != 0) {
fprintf(stderr, "Невозможно найти начало файла \"%s\": %s\n", inputdata,
strerror(errno));
fclose(file);
return NULL;
}
char *inputData = malloc(dataLen);
if (!inputData) {
fprintf(stderr, "Невозможно выделить память для входных данных\n");
fclose(file);
return NULL;
}
char *ptrInputData = inputData;
size_t bytesLeft = dataLen;
while (bytesLeft) {
size_t bytesRead = fread(ptrInputData, 1, bytesLeft, file);
bytesLeft -= bytesRead;
ptrInputData += bytesRead;
if (ferror(file) != 0) {
fprintf(stderr, "Ошибка чтения файла\n");
free(inputData);
fclose(file);
return NULL;
}
}
fclose(file);
*length = (unsigned int)dataLen;
return inputData;
}
cmake_minimum_required(VERSION 3.17)
project(hsproject)
set(CMAKE_CXX_STANDARD 17)
add_library(hyperscanlocal STATIC hslocallib.h hslocallib.c)
add_executable(hsproject main.cpp)
target_link_libraries(hsproject hyperscanlocal)
Answer the question
In order to leave comments, you need to log in
Well, firstly, static functions will become private and will not be visible outside the file
. Secondly, extern "C" {} should be used on headers
#ifndef HSLOCAL_INCLUDED
#define HSLOCAL_INCLUDED
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <hs/hs.h>
#include <errno.h>
extern "C" {
char *readInputData(const char *inputdata, unsigned int *length);
}
#endif //HSLOCAL_INCLUDED
#include "hslocallib.h"
char *readInputData(const char *inputdata, unsigned int *length) {
FILE *file = fopen(inputdata, "rb");
if (!file) {
fprintf(stderr, "Невозможно прочитать файл \"%s\": %s\n", inputdata,
strerror(errno));
return NULL;
}
if (fseek(file, 0, SEEK_END) != 0) {
fprintf(stderr, "Невозможно определить конец файла \"%s\": %s\n", inputdata,
strerror(errno));
fclose(file);
return NULL;
}
long dataLen = ftell(file);
if (dataLen < 0) {
fprintf(stderr, "Невозможно вернуть положение указателя в файле %s\n", strerror(errno));
fclose(file);
return NULL;
}
if (fseek(file, 0, SEEK_SET) != 0) {
fprintf(stderr, "Невозможно найти начало файла \"%s\": %s\n", inputdata,
strerror(errno));
fclose(file);
return NULL;
}
char *inputData = malloc(dataLen);
if (!inputData) {
fprintf(stderr, "Невозможно выделить память для входных данных\n");
fclose(file);
return NULL;
}
char *ptrInputData = inputData;
size_t bytesLeft = dataLen;
while (bytesLeft) {
size_t bytesRead = fread(ptrInputData, 1, bytesLeft, file);
bytesLeft -= bytesRead;
ptrInputData += bytesRead;
if (ferror(file) != 0) {
fprintf(stderr, "Ошибка чтения файла\n");
free(inputData);
fclose(file);
return NULL;
}
}
fclose(file);
*length = (unsigned int)dataLen;
return inputData;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question