mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-24 09:14:04 +02:00
Update dr_flac and dr_wav.
This commit is contained in:
+45
-35
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
|
FLAC audio decoder. Choice of public domain or MIT-0. See license statements at the end of this file.
|
||||||
dr_flac - v0.11.7 - 2019-05-06
|
dr_flac - v0.11.8 - 2019-05-21
|
||||||
|
|
||||||
David Reid - mackron@gmail.com
|
David Reid - mackron@gmail.com
|
||||||
*/
|
*/
|
||||||
@@ -1145,17 +1145,24 @@ static drflac_bool32 drflac__gIsSSE2Supported = DRFLAC_FALSE;
|
|||||||
static drflac_bool32 drflac__gIsSSE41Supported = DRFLAC_FALSE;
|
static drflac_bool32 drflac__gIsSSE41Supported = DRFLAC_FALSE;
|
||||||
static void drflac__init_cpu_caps()
|
static void drflac__init_cpu_caps()
|
||||||
{
|
{
|
||||||
int info[4] = {0};
|
static drflac_bool32 isCPUCapsInitialized = DRFLAC_FALSE;
|
||||||
|
|
||||||
/* LZCNT */
|
if (!isCPUCapsInitialized) {
|
||||||
drflac__cpuid(info, 0x80000001);
|
int info[4] = {0};
|
||||||
drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0;
|
|
||||||
|
|
||||||
/* SSE2 */
|
/* LZCNT */
|
||||||
drflac__gIsSSE2Supported = drflac_has_sse2();
|
drflac__cpuid(info, 0x80000001);
|
||||||
|
drflac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0;
|
||||||
|
|
||||||
/* SSE4.1 */
|
/* SSE2 */
|
||||||
drflac__gIsSSE41Supported = drflac_has_sse41();
|
drflac__gIsSSE2Supported = drflac_has_sse2();
|
||||||
|
|
||||||
|
/* SSE4.1 */
|
||||||
|
drflac__gIsSSE41Supported = drflac_has_sse41();
|
||||||
|
|
||||||
|
/* Initialized. */
|
||||||
|
isCPUCapsInitialized = DRFLAC_TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -4897,9 +4904,9 @@ typedef struct
|
|||||||
static DRFLAC_INLINE void drflac__decode_block_header(drflac_uint32 blockHeader, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)
|
static DRFLAC_INLINE void drflac__decode_block_header(drflac_uint32 blockHeader, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)
|
||||||
{
|
{
|
||||||
blockHeader = drflac__be2host_32(blockHeader);
|
blockHeader = drflac__be2host_32(blockHeader);
|
||||||
*isLastBlock = (blockHeader & (0x01 << 31)) >> 31;
|
*isLastBlock = (blockHeader & 0x80000000UL) >> 31;
|
||||||
*blockType = (blockHeader & (0x7F << 24)) >> 24;
|
*blockType = (blockHeader & 0x7F000000UL) >> 24;
|
||||||
*blockSize = (blockHeader & 0xFFFFFF);
|
*blockSize = (blockHeader & 0x00FFFFFFUL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static DRFLAC_INLINE drflac_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)
|
static DRFLAC_INLINE drflac_bool32 drflac__read_and_decode_block_header(drflac_read_proc onRead, void* pUserData, drflac_uint8* isLastBlock, drflac_uint8* blockType, drflac_uint32* blockSize)
|
||||||
@@ -6759,10 +6766,10 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
|
case DRFLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:
|
||||||
{
|
{
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
decodedSample = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
} else {
|
} else {
|
||||||
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
int side = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
int left = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample;
|
int left = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample);
|
||||||
decodedSample = left - side;
|
decodedSample = left - side;
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
@@ -6770,11 +6777,11 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
|
case DRFLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:
|
||||||
{
|
{
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
int side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
int side = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
int right = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample;
|
int right = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample);
|
||||||
decodedSample = side + right;
|
decodedSample = side + right;
|
||||||
} else {
|
} else {
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
decodedSample = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -6783,14 +6790,14 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
int mid;
|
int mid;
|
||||||
int side;
|
int side;
|
||||||
if (channelIndex == 0) {
|
if (channelIndex == 0) {
|
||||||
mid = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
mid = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
side = pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample;
|
side = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 1].wastedBitsPerSample);
|
||||||
|
|
||||||
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
||||||
decodedSample = (mid + side) >> 1;
|
decodedSample = (mid + side) >> 1;
|
||||||
} else {
|
} else {
|
||||||
mid = pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample;
|
mid = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex - 1].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex - 1].wastedBitsPerSample);
|
||||||
side = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
side = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
|
|
||||||
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
mid = (((unsigned int)mid) << 1) | (side & 0x01);
|
||||||
decodedSample = (mid - side) >> 1;
|
decodedSample = (mid - side) >> 1;
|
||||||
@@ -6800,11 +6807,11 @@ drflac_uint64 drflac__read_s32__misaligned(drflac* pFlac, drflac_uint64 samplesT
|
|||||||
case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:
|
case DRFLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
decodedSample = pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample;
|
decodedSample = (int)((drflac_uint32)pFlac->currentFrame.subframes[channelIndex + 0].pDecodedSamples[nextSampleInFrame] << pFlac->currentFrame.subframes[channelIndex + 0].wastedBitsPerSample);
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
decodedSample <<= (32 - pFlac->bitsPerSample);
|
decodedSample = (int)((drflac_uint32)decodedSample << (32 - pFlac->bitsPerSample));
|
||||||
|
|
||||||
if (bufferOut) {
|
if (bufferOut) {
|
||||||
*bufferOut++ = decodedSample;
|
*bufferOut++ = decodedSample;
|
||||||
@@ -6876,8 +6883,8 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int left = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
int left = (int)((drflac_uint32)pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample));
|
||||||
int side = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
int side = (int)((drflac_uint32)pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample));
|
||||||
int right = left - side;
|
int right = left - side;
|
||||||
|
|
||||||
bufferOut[i*2+0] = left;
|
bufferOut[i*2+0] = left;
|
||||||
@@ -6892,8 +6899,8 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int side = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
int side = (int)((drflac_uint32)pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample));
|
||||||
int right = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
int right = (int)((drflac_uint32)pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample));
|
||||||
int left = right + side;
|
int left = right + side;
|
||||||
|
|
||||||
bufferOut[i*2+0] = left;
|
bufferOut[i*2+0] = left;
|
||||||
@@ -6908,13 +6915,13 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
int mid = pDecodedSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample;
|
int mid = (int)((drflac_uint32)pDecodedSamples0[i] << pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
||||||
int side = pDecodedSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample;
|
int side = (int)((drflac_uint32)pDecodedSamples1[i] << pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
||||||
|
|
||||||
mid = (((drflac_uint32)mid) << 1) | (side & 0x01);
|
mid = (((drflac_uint32)mid) << 1) | (side & 0x01);
|
||||||
|
|
||||||
bufferOut[i*2+0] = ((mid + side) >> 1) << (unusedBitsPerSample);
|
bufferOut[i*2+0] = (drflac_int32)((drflac_uint32)((mid + side) >> 1) << (unusedBitsPerSample));
|
||||||
bufferOut[i*2+1] = ((mid - side) >> 1) << (unusedBitsPerSample);
|
bufferOut[i*2+1] = (drflac_int32)((drflac_uint32)((mid - side) >> 1) << (unusedBitsPerSample));
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
@@ -6929,8 +6936,8 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
const drflac_int32* pDecodedSamples1 = pFlac->currentFrame.subframes[1].pDecodedSamples + firstAlignedSampleInFrame;
|
||||||
|
|
||||||
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
bufferOut[i*2+0] = pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample);
|
bufferOut[i*2+0] = (drflac_int32)((drflac_uint32)pDecodedSamples0[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[0].wastedBitsPerSample));
|
||||||
bufferOut[i*2+1] = pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample);
|
bufferOut[i*2+1] = (drflac_int32)((drflac_uint32)pDecodedSamples1[i] << (unusedBitsPerSample + pFlac->currentFrame.subframes[1].wastedBitsPerSample));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -6940,7 +6947,7 @@ drflac_uint64 drflac_read_s32(drflac* pFlac, drflac_uint64 samplesToRead, drflac
|
|||||||
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
for (i = 0; i < alignedSampleCountPerChannel; ++i) {
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
for (j = 0; j < channelCount; ++j) {
|
for (j = 0; j < channelCount; ++j) {
|
||||||
bufferOut[(i*channelCount)+j] = (pFlac->currentFrame.subframes[j].pDecodedSamples[firstAlignedSampleInFrame + i]) << (unusedBitsPerSample + pFlac->currentFrame.subframes[j].wastedBitsPerSample);
|
bufferOut[(i*channelCount)+j] = (drflac_int32)((drflac_uint32)(pFlac->currentFrame.subframes[j].pDecodedSamples[firstAlignedSampleInFrame + i]) << (unusedBitsPerSample + pFlac->currentFrame.subframes[j].wastedBitsPerSample));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8649,6 +8656,9 @@ drflac_bool32 drflac_next_cuesheet_track(drflac_cuesheet_track_iterator* pIter,
|
|||||||
/*
|
/*
|
||||||
REVISION HISTORY
|
REVISION HISTORY
|
||||||
================
|
================
|
||||||
|
v0.11.8 - 2019-05-21
|
||||||
|
- Fix warnings.
|
||||||
|
|
||||||
v0.11.7 - 2019-05-06
|
v0.11.7 - 2019-05-06
|
||||||
- C89 fixes.
|
- C89 fixes.
|
||||||
|
|
||||||
|
|||||||
+10
-7
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
WAV audio loader and writer. Choice of public domain or MIT-0. See license statements at the end of this file.
|
WAV audio loader and writer. Choice of public domain or MIT-0. See license statements at the end of this file.
|
||||||
dr_wav - v0.9.1 - 2019-05-05
|
dr_wav - v0.9.2 - 2019-05-21
|
||||||
|
|
||||||
David Reid - mackron@gmail.com
|
David Reid - mackron@gmail.com
|
||||||
*/
|
*/
|
||||||
@@ -2040,7 +2040,7 @@ drwav_bool32 drwav_init_ex(drwav* pWav, drwav_read_proc onRead, drwav_seek_proc
|
|||||||
|
|
||||||
drwav_uint32 drwav_riff_chunk_size_riff(drwav_uint64 dataChunkSize)
|
drwav_uint32 drwav_riff_chunk_size_riff(drwav_uint64 dataChunkSize)
|
||||||
{
|
{
|
||||||
if (dataChunkSize <= (0xFFFFFFFF - 36)) {
|
if (dataChunkSize <= (0xFFFFFFFFUL - 36)) {
|
||||||
return 36 + (drwav_uint32)dataChunkSize;
|
return 36 + (drwav_uint32)dataChunkSize;
|
||||||
} else {
|
} else {
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFF;
|
||||||
@@ -2049,10 +2049,10 @@ drwav_uint32 drwav_riff_chunk_size_riff(drwav_uint64 dataChunkSize)
|
|||||||
|
|
||||||
drwav_uint32 drwav_data_chunk_size_riff(drwav_uint64 dataChunkSize)
|
drwav_uint32 drwav_data_chunk_size_riff(drwav_uint64 dataChunkSize)
|
||||||
{
|
{
|
||||||
if (dataChunkSize <= 0xFFFFFFFF) {
|
if (dataChunkSize <= 0xFFFFFFFFUL) {
|
||||||
return (drwav_uint32)dataChunkSize;
|
return (drwav_uint32)dataChunkSize;
|
||||||
} else {
|
} else {
|
||||||
return 0xFFFFFFFF;
|
return 0xFFFFFFFFUL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2121,7 +2121,7 @@ drwav_bool32 drwav_init_write__internal(drwav* pWav, const drwav_data_format* pF
|
|||||||
so for the sake of simplicity I'm not doing any validation for that.
|
so for the sake of simplicity I'm not doing any validation for that.
|
||||||
*/
|
*/
|
||||||
if (pFormat->container == drwav_container_riff) {
|
if (pFormat->container == drwav_container_riff) {
|
||||||
if (initialDataChunkSize > (0xFFFFFFFF - 36)) {
|
if (initialDataChunkSize > (0xFFFFFFFFUL - 36)) {
|
||||||
return DRWAV_FALSE; /* Not enough room to store every sample. */
|
return DRWAV_FALSE; /* Not enough room to store every sample. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3195,8 +3195,8 @@ void drwav_u8_to_s16(drwav_int16* pOut, const drwav_uint8* pIn, size_t sampleCou
|
|||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; i < sampleCount; ++i) {
|
for (i = 0; i < sampleCount; ++i) {
|
||||||
int x = pIn[i];
|
int x = pIn[i];
|
||||||
r = x - 128;
|
r = x << 8;
|
||||||
r = r << 8;
|
r = r - 32768;
|
||||||
pOut[i] = (short)r;
|
pOut[i] = (short)r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4675,6 +4675,9 @@ void drwav_free(void* pDataReturnedByOpenAndRead)
|
|||||||
/*
|
/*
|
||||||
REVISION HISTORY
|
REVISION HISTORY
|
||||||
================
|
================
|
||||||
|
v0.9.2 - 2019-05-21
|
||||||
|
- Fix warnings.
|
||||||
|
|
||||||
v0.9.1 - 2019-05-05
|
v0.9.1 - 2019-05-05
|
||||||
- Add support for C89.
|
- Add support for C89.
|
||||||
- Change license to choice of public domain or MIT-0.
|
- Change license to choice of public domain or MIT-0.
|
||||||
|
|||||||
Reference in New Issue
Block a user