web c++ + lv2 and vst3 fixes
This commit is contained in:
parent
985f3f7cc3
commit
4fe02c89af
@ -5,6 +5,7 @@ ifeq ($(OS), Windows_NT)
|
|||||||
LV2DIR = $(shell echo '${COMMONPROGRAMFILES}' | sed 's:\\:/:g')/LV2
|
LV2DIR = $(shell echo '${COMMONPROGRAMFILES}' | sed 's:\\:/:g')/LV2
|
||||||
LV2DIR_USER = $(shell echo '${APPDATA}' | sed 's:\\:/:g')/LV2
|
LV2DIR_USER = $(shell echo '${APPDATA}' | sed 's:\\:/:g')/LV2
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
CXX = g++
|
||||||
else
|
else
|
||||||
UNAME_S = $(shell uname -s)
|
UNAME_S = $(shell uname -s)
|
||||||
ifeq ($(UNAME_S), Darwin)
|
ifeq ($(UNAME_S), Darwin)
|
||||||
@ -12,12 +13,14 @@ else
|
|||||||
LV2DIR = /Library/Audio/Plug-Ins/LV2
|
LV2DIR = /Library/Audio/Plug-Ins/LV2
|
||||||
LV2DIR_USER = ${HOME}/Library/Audio/Plug-Ins/LV2
|
LV2DIR_USER = ${HOME}/Library/Audio/Plug-Ins/LV2
|
||||||
CC = clang
|
CC = clang
|
||||||
|
CXX = clang++
|
||||||
else
|
else
|
||||||
DLL_SUFFIX = .so
|
DLL_SUFFIX = .so
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
LV2DIR = ${PREFIX}/lib/lv2
|
LV2DIR = ${PREFIX}/lib/lv2
|
||||||
LV2DIR_USER = ${HOME}/.lv2
|
LV2DIR_USER = ${HOME}/.lv2
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
CXX = g++
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ ifeq ($(OS), Windows_NT)
|
|||||||
VST3DIR = $(shell echo '${COMMONPROGRAMFILES}' | sed 's:\\:/:g')/VST3
|
VST3DIR = $(shell echo '${COMMONPROGRAMFILES}' | sed 's:\\:/:g')/VST3
|
||||||
VST3DIR_USER = $(shell echo '${LOCALAPPDATA}' | sed 's:\\:/:g')/Programs/Common/VST3
|
VST3DIR_USER = $(shell echo '${LOCALAPPDATA}' | sed 's:\\:/:g')/Programs/Common/VST3
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
CXX = g++
|
||||||
else
|
else
|
||||||
UNAME_S = $(shell uname -s)
|
UNAME_S = $(shell uname -s)
|
||||||
ifeq ($(UNAME_S), Darwin)
|
ifeq ($(UNAME_S), Darwin)
|
||||||
@ -14,12 +15,14 @@ else
|
|||||||
VST3DIR = /Library/Audio/Plug-Ins/VST3
|
VST3DIR = /Library/Audio/Plug-Ins/VST3
|
||||||
VST3DIR_USER = ${HOME}/Library/Audio/Plug-Ins/VST3
|
VST3DIR_USER = ${HOME}/Library/Audio/Plug-Ins/VST3
|
||||||
CC = clang
|
CC = clang
|
||||||
|
CXX = clang++
|
||||||
else
|
else
|
||||||
DLL_SUFFIX = .so
|
DLL_SUFFIX = .so
|
||||||
PLATFORM = $(shell uname -m)-linux
|
PLATFORM = $(shell uname -m)-linux
|
||||||
VST3DIR = /usr/local/lib/vst3
|
VST3DIR = /usr/local/lib/vst3
|
||||||
VST3DIR_USER = ${HOME}/.vst3
|
VST3DIR_USER = ${HOME}/.vst3
|
||||||
CC = gcc
|
CC = gcc
|
||||||
|
CXX = g++
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ DATA_DIR := $(or $(DATA_DIR),.)
|
|||||||
PLUGIN_DIR := $(or $(PLUGIN_DIR),src)
|
PLUGIN_DIR := $(or $(PLUGIN_DIR),src)
|
||||||
|
|
||||||
CC = clang
|
CC = clang
|
||||||
|
CXX = clang++
|
||||||
|
|
||||||
CFLAGS = -Ofast -Wall -Wpedantic -Wextra
|
CFLAGS = -Ofast -Wall -Wpedantic -Wextra
|
||||||
CFLAGS_ALL = -I${COMMON_DIR}/src -I${DATA_DIR}/src -I${PLUGIN_DIR} --target=wasm32 -flto -fvisibility=hidden ${CFLAGS} ${CFLAGS_EXTRA}
|
CFLAGS_ALL = -I${COMMON_DIR}/src -I${DATA_DIR}/src -I${PLUGIN_DIR} --target=wasm32 -flto -fvisibility=hidden ${CFLAGS} ${CFLAGS_EXTRA}
|
||||||
@ -29,9 +30,20 @@ LDFLAGS_ALL += -Wl,--export=processor_midi_msg_in
|
|||||||
endif
|
endif
|
||||||
LDFLAGS_ALL += ${LDFLAGS} ${LDFLAGS_EXTRA}
|
LDFLAGS_ALL += ${LDFLAGS} ${LDFLAGS_EXTRA}
|
||||||
|
|
||||||
C_SRCS = ${COMMON_DIR}/src/processor.c
|
CXXFLAGS = ${CFLAGS}
|
||||||
|
CXXFLAGS_ALL = -I${COMMON_DIR}/src -I${DATA_DIR}/src -I${PLUGIN_DIR} --target=wasm32 -flto -fvisibility=hidden ${CXXFLAGS} ${CXXFLAGS_EXTRA}
|
||||||
|
|
||||||
|
C_SRCS = ${COMMON_DIR}/src/processor.c ${COMMON_DIR}/src/walloc.c ${COMMON_DIR}/src/memset.c
|
||||||
C_OBJS = $(addprefix build/obj/, $(notdir $(C_SRCS:.c=.o)))
|
C_OBJS = $(addprefix build/obj/, $(notdir $(C_SRCS:.c=.o)))
|
||||||
|
|
||||||
|
ifeq ($(CXX_SRCS_EXTRA),)
|
||||||
|
CXX_SRCS =
|
||||||
|
CXX_OBJS =
|
||||||
|
else
|
||||||
|
CXX_SRCS = ${COMMON_DIR}/src/new.cpp ${CXX_SRCS_EXTRA}
|
||||||
|
CXX_OBJS = $(addprefix build/obj/, $(notdir $(CXX_SRCS:.cpp=.o)))
|
||||||
|
endif
|
||||||
|
|
||||||
ALL = build/${BUNDLE_NAME}.wasm build/${BUNDLE_NAME}_processor.js build/${BUNDLE_NAME}.js
|
ALL = build/${BUNDLE_NAME}.wasm build/${BUNDLE_NAME}_processor.js build/${BUNDLE_NAME}.js
|
||||||
|
|
||||||
default: all
|
default: all
|
||||||
@ -40,14 +52,13 @@ default: all
|
|||||||
|
|
||||||
all: ${ALL}
|
all: ${ALL}
|
||||||
|
|
||||||
|
ifeq ($(CXX_OBJS),)
|
||||||
build/${BUNDLE_NAME}.wasm: ${C_OBJS} | build
|
build/${BUNDLE_NAME}.wasm: ${C_OBJS} | build
|
||||||
${CC} $^ -o $@ ${CFLAGS_ALL} ${LDFLAGS_ALL}
|
${CC} $^ -o $@ ${CFLAGS_ALL} ${LDFLAGS_ALL}
|
||||||
|
else
|
||||||
.SECONDEXPANSION:
|
build/${BUNDLE_NAME}.wasm: ${C_OBJS} ${CXX_OBJS} | build
|
||||||
|
${CXX} $^ -o $@ ${CFLAGS_ALL} ${CXXFLAGS_ALL} ${LDFLAGS_ALL}
|
||||||
PERCENT := %
|
endif
|
||||||
$(C_OBJS): build/obj/%.o: $$(filter $$(PERCENT)/$$(basename $$(notdir $$@)).c,$$(C_SRCS)) | build/obj
|
|
||||||
${CC} $^ -o $@ -c ${CFLAGS_ALL}
|
|
||||||
|
|
||||||
build/${BUNDLE_NAME}_processor.js: ${DATA_DIR}/src/processor.js | build
|
build/${BUNDLE_NAME}_processor.js: ${DATA_DIR}/src/processor.js | build
|
||||||
cp $^ $@
|
cp $^ $@
|
||||||
@ -62,3 +73,13 @@ clean:
|
|||||||
rm -fr build
|
rm -fr build
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
|
.SECONDEXPANSION:
|
||||||
|
|
||||||
|
PERCENT := %
|
||||||
|
|
||||||
|
$(C_OBJS): build/obj/%.o: $$(filter $$(PERCENT)/$$(basename $$(notdir $$@)).c,$$(C_SRCS)) | build/obj
|
||||||
|
${CC} $^ -o $@ -c ${CFLAGS_ALL}
|
||||||
|
|
||||||
|
$(CXX_OBJS): build/obj/%.o: $$(filter $$(PERCENT)/$$(basename $$(notdir $$@)).cpp,$$(CXX_SRCS)) | build/obj
|
||||||
|
${CXX} $^ -o $@ -c ${CXXFLAGS_ALL}
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
BUNDLE_NAME := {{=it.product.bundleName}}
|
BUNDLE_NAME := {{=it.product.bundleName}}
|
||||||
|
|
||||||
CFLAGS_EXTRA := {{=it.make && it.make.cflags ? it.make.cflags : ""}} {{=it.web_make && it.web_make.cflags ? it.web_make.cflags : ""}}
|
CFLAGS_EXTRA := {{=it.make && it.make.cflags ? it.make.cflags : ""}} {{=it.web_make && it.web_make.cflags ? it.web_make.cflags : ""}}
|
||||||
LDFLAGS_EXTRA := {{=it.make && it.make.ldflags ? it.make.ldflags : ""}} {{=it.web_make && it.web_make.ldflags ? it.web_make.ldflags : ""}}
|
LDFLAGS_EXTRA := {{=it.make && it.make.ldflags ? it.make.ldflags : ""}} {{=it.web_make && it.web_make.ldflags ? it.web_make.ldflags : ""}}
|
||||||
|
CXXFLAGS_EXTRA := {{=it.make && it.make.cxxflags ? it.make.cxxflags : ""}} {{=it.web_make && it.web_make.cxxflags ? it.web_make.cxxflags : ""}}
|
||||||
|
|
||||||
|
C_SRCS_EXTRA := {{=it.make && it.make.cSrcs ? it.make.cSrcs : ""}} {{=it.web_make.cSrcs ? it.web_make.cSrcs : ""}}
|
||||||
|
CXX_SRCS_EXTRA := {{=it.make && it.make.cxxSrcs ? it.make.cxxSrcs : ""}} {{=it.web_make.cxxSrcs ? it.web_make.cxxSrcs : ""}}
|
||||||
|
|
||||||
COMMON_DIR := {{=it.web_make && it.web_make.commonDir ? it.web_make.commonDir : (it.make && it.make.commonDir ? it.make.commonDir : "")}}
|
COMMON_DIR := {{=it.web_make && it.web_make.commonDir ? it.web_make.commonDir : (it.make && it.make.commonDir ? it.make.commonDir : "")}}
|
||||||
DATA_DIR := {{=it.web_make && it.web_make.dataDir ? it.web_make.dataDir : (it.make && it.make.dataDir ? it.make.dataDir : "")}}
|
DATA_DIR := {{=it.web_make && it.web_make.dataDir ? it.web_make.dataDir : (it.make && it.make.dataDir ? it.make.dataDir : "")}}
|
||||||
PLUGIN_DIR := {{=it.web_make && it.web_make.pluginDir ? it.web_make.pluginDir : (it.make && it.make.pluginDir ? it.make.pluginDir : "")}}
|
PLUGIN_DIR := {{=it.web_make && it.web_make.pluginDir ? it.web_make.pluginDir : (it.make && it.make.pluginDir ? it.make.pluginDir : "")}}
|
||||||
|
|
||||||
HAS_MIDI_IN := {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0 ? "yes" : "no"}}
|
HAS_MIDI_IN := {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length > 0 ? "yes" : "no"}}
|
||||||
|
12
templates/web/src/memset.c
Normal file
12
templates/web/src/memset.c
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2023 Orastron Srl unipersonale
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "memset.h"
|
||||||
|
|
||||||
|
void *memset(void *ptr, int value, size_t num) {
|
||||||
|
unsigned char *p = (unsigned char *)ptr;
|
||||||
|
for (size_t i = 0; i < num; i++)
|
||||||
|
p[i] = (unsigned char)value;
|
||||||
|
return ptr;
|
||||||
|
}
|
@ -2,9 +2,19 @@
|
|||||||
* Copyright (C) 2023 Orastron Srl unipersonale
|
* Copyright (C) 2023 Orastron Srl unipersonale
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void *memset(void *ptr, int value, size_t num) {
|
#ifndef MEMSET_H
|
||||||
unsigned char *p = (unsigned char *)ptr;
|
#define MEMSET_H
|
||||||
for (size_t i = 0; i < num; i++)
|
|
||||||
p[i] = (unsigned char)value;
|
#include <stddef.h>
|
||||||
return ptr;
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void *memset(void *ptr, int value, size_t num);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
14
templates/web/src/new.cpp
Normal file
14
templates/web/src/new.cpp
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#include "walloc.h"
|
||||||
|
|
||||||
|
void * operator new(size_t size) {
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
void * operator new[](size_t size) {
|
||||||
|
return malloc(size);
|
||||||
|
}
|
||||||
|
void operator delete (void *ptr) noexcept {
|
||||||
|
free(ptr);
|
||||||
|
}
|
||||||
|
void operator delete[] (void *ptr) noexcept {
|
||||||
|
free(ptr);
|
||||||
|
}
|
127
templates/web/src/walloc.c
Normal file
127
templates/web/src/walloc.c
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021, 2022, 2024 Orastron Srl unipersonale
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "walloc.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern unsigned char __heap_base;
|
||||||
|
|
||||||
|
typedef struct _header {
|
||||||
|
struct _header *next;
|
||||||
|
struct _header *prev;
|
||||||
|
char free;
|
||||||
|
} header;
|
||||||
|
|
||||||
|
static char inited = 0;
|
||||||
|
|
||||||
|
static size_t get_size(header *h) {
|
||||||
|
char *n = (char *)h->next;
|
||||||
|
return (n ? n : (char *)(__builtin_wasm_memory_size(0) << 16)) - (char *)h - sizeof(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void split_if_possible(header *h, size_t s, size_t size) {
|
||||||
|
if (s <= size + sizeof(header) + sizeof(header))
|
||||||
|
return;
|
||||||
|
|
||||||
|
header *hn = (header *)((char *)h + sizeof(header) + size);
|
||||||
|
hn->prev = h;
|
||||||
|
hn->next = h->next;
|
||||||
|
hn->free = 1;
|
||||||
|
h->next = hn;
|
||||||
|
if (hn->next)
|
||||||
|
hn->next->prev = hn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *malloc(size_t size) {
|
||||||
|
if (size == 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
header *h = (header *)&__heap_base;
|
||||||
|
|
||||||
|
if (!inited) {
|
||||||
|
h->next = NULL;
|
||||||
|
h->prev = NULL;
|
||||||
|
h->free = 1;
|
||||||
|
inited = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
header *p;
|
||||||
|
for (; h; p = h, h = h->next) {
|
||||||
|
if (!h->free)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
size_t s = get_size(h);
|
||||||
|
if (s < size)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
split_if_possible(h, s, size);
|
||||||
|
|
||||||
|
h->free = 0;
|
||||||
|
return (char *)h + sizeof(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t n = __builtin_wasm_memory_grow(0, ((size + sizeof(header) - 1) >> 16) + 1);
|
||||||
|
if (n < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (p->free)
|
||||||
|
h = p;
|
||||||
|
else {
|
||||||
|
h = (header *)(n << 16);
|
||||||
|
p->next = h;
|
||||||
|
h->prev = p;
|
||||||
|
h->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
split_if_possible(h, get_size(h), size);
|
||||||
|
|
||||||
|
h->free = 0;
|
||||||
|
return (char *)h + sizeof(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *realloc(void *ptr, size_t size) {
|
||||||
|
if (ptr == NULL)
|
||||||
|
return malloc(size);
|
||||||
|
|
||||||
|
if (size == 0) {
|
||||||
|
free(ptr);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
header *h = (header *)((char *)ptr - sizeof(header));
|
||||||
|
size_t s = get_size(h);
|
||||||
|
if (s >= size)
|
||||||
|
return ptr;
|
||||||
|
|
||||||
|
void *p = malloc(size);
|
||||||
|
if (p == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char *src = (char *)ptr;
|
||||||
|
char *dest = (char *)p;
|
||||||
|
for (size_t i = 0; i < s; i++)
|
||||||
|
dest[i] = src[i];
|
||||||
|
|
||||||
|
free(ptr);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free(void *ptr) {
|
||||||
|
header *h = (header *)((char *)ptr - sizeof(header));
|
||||||
|
h->free = 1;
|
||||||
|
|
||||||
|
if (h->next && h->next->free) {
|
||||||
|
h->next = h->next->next;
|
||||||
|
if (h->next)
|
||||||
|
h->next->prev = h;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h->prev && h->prev->free) {
|
||||||
|
h->prev->next = h->next;
|
||||||
|
if (h->next)
|
||||||
|
h->next->prev = h->prev;
|
||||||
|
}
|
||||||
|
}
|
@ -2,126 +2,21 @@
|
|||||||
* Copyright (C) 2021, 2022, 2024 Orastron Srl unipersonale
|
* Copyright (C) 2021, 2022, 2024 Orastron Srl unipersonale
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef WALLOC_H
|
||||||
|
#define WALLOC_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
void *malloc(size_t size);
|
void *malloc(size_t size);
|
||||||
void *realloc(void *ptr, size_t size);
|
void *realloc(void *ptr, size_t size);
|
||||||
void free(void *ptr);
|
void free(void *ptr);
|
||||||
|
|
||||||
extern unsigned char __heap_base;
|
#ifdef __cplusplus
|
||||||
|
|
||||||
typedef struct _header {
|
|
||||||
struct _header *next;
|
|
||||||
struct _header *prev;
|
|
||||||
char free;
|
|
||||||
} header;
|
|
||||||
|
|
||||||
static char inited = 0;
|
|
||||||
|
|
||||||
static size_t get_size(header *h) {
|
|
||||||
char *n = (char *)h->next;
|
|
||||||
return (n ? n : (char *)(__builtin_wasm_memory_size(0) << 16)) - (char *)h - sizeof(header);
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void split_if_possible(header *h, size_t s, size_t size) {
|
#endif
|
||||||
if (s <= size + sizeof(header) + sizeof(header))
|
|
||||||
return;
|
|
||||||
|
|
||||||
header *hn = (header *)((char *)h + sizeof(header) + size);
|
|
||||||
hn->prev = h;
|
|
||||||
hn->next = h->next;
|
|
||||||
hn->free = 1;
|
|
||||||
h->next = hn;
|
|
||||||
if (hn->next)
|
|
||||||
hn->next->prev = hn;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *malloc(size_t size) {
|
|
||||||
if (size == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
header *h = (header *)&__heap_base;
|
|
||||||
|
|
||||||
if (!inited) {
|
|
||||||
h->next = NULL;
|
|
||||||
h->prev = NULL;
|
|
||||||
h->free = 1;
|
|
||||||
inited = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
header *p;
|
|
||||||
for (; h; p = h, h = h->next) {
|
|
||||||
if (!h->free)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
size_t s = get_size(h);
|
|
||||||
if (s < size)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
split_if_possible(h, s, size);
|
|
||||||
|
|
||||||
h->free = 0;
|
|
||||||
return (char *)h + sizeof(header);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t n = __builtin_wasm_memory_grow(0, ((size + sizeof(header) - 1) >> 16) + 1);
|
|
||||||
if (n < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (p->free)
|
|
||||||
h = p;
|
|
||||||
else {
|
|
||||||
h = (header *)(n << 16);
|
|
||||||
p->next = h;
|
|
||||||
h->prev = p;
|
|
||||||
h->next = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
split_if_possible(h, get_size(h), size);
|
|
||||||
|
|
||||||
h->free = 0;
|
|
||||||
return (char *)h + sizeof(header);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *realloc(void *ptr, size_t size) {
|
|
||||||
if (ptr == NULL)
|
|
||||||
return malloc(size);
|
|
||||||
|
|
||||||
if (size == 0) {
|
|
||||||
free(ptr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
header *h = (header *)((char *)ptr - sizeof(header));
|
|
||||||
size_t s = get_size(h);
|
|
||||||
if (s >= size)
|
|
||||||
return ptr;
|
|
||||||
|
|
||||||
void *p = malloc(size);
|
|
||||||
if (p == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
char *src = (char *)ptr;
|
|
||||||
char *dest = (char *)p;
|
|
||||||
for (size_t i = 0; i < s; i++)
|
|
||||||
dest[i] = src[i];
|
|
||||||
|
|
||||||
free(ptr);
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free(void *ptr) {
|
|
||||||
header *h = (header *)((char *)ptr - sizeof(header));
|
|
||||||
h->free = 1;
|
|
||||||
|
|
||||||
if (h->next && h->next->free) {
|
|
||||||
h->next = h->next->next;
|
|
||||||
if (h->next)
|
|
||||||
h->next->prev = h;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (h->prev && h->prev->free) {
|
|
||||||
h->prev->next = h->next;
|
|
||||||
if (h->next)
|
|
||||||
h->next->prev = h->prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -3,7 +3,10 @@ var sep = path.sep;
|
|||||||
|
|
||||||
module.exports = function (data, api) {
|
module.exports = function (data, api) {
|
||||||
api.copyFile(`src${sep}memset.h`, `src${sep}memset.h`);
|
api.copyFile(`src${sep}memset.h`, `src${sep}memset.h`);
|
||||||
|
api.copyFile(`src${sep}memset.c`, `src${sep}memset.c`);
|
||||||
api.copyFile(`src${sep}walloc.h`, `src${sep}walloc.h`);
|
api.copyFile(`src${sep}walloc.h`, `src${sep}walloc.h`);
|
||||||
|
api.copyFile(`src${sep}walloc.c`, `src${sep}walloc.c`);
|
||||||
|
api.copyFile(`src${sep}new.cpp`, `src${sep}new.cpp`);
|
||||||
api.copyFile(`src${sep}processor.c`, `src${sep}processor.c`);
|
api.copyFile(`src${sep}processor.c`, `src${sep}processor.c`);
|
||||||
api.generateFileFromTemplateFile(`src${sep}data.h`, `src${sep}data.h`, data);
|
api.generateFileFromTemplateFile(`src${sep}data.h`, `src${sep}data.h`, data);
|
||||||
api.generateFileFromTemplateFile(`src${sep}processor.js`, `src${sep}processor.js`, data);
|
api.generateFileFromTemplateFile(`src${sep}processor.js`, `src${sep}processor.js`, data);
|
||||||
|
Loading…
Reference in New Issue
Block a user