This is not the most useful way of substring.
This commit is contained in:
parent
4eb997d49e
commit
ffcb1ce6aa
34
src/lorem.c
34
src/lorem.c
@ -17,15 +17,23 @@
|
|||||||
static struct {
|
static struct {
|
||||||
size_t capacity, size; /* Lead block. */
|
size_t capacity, size; /* Lead block. */
|
||||||
struct block_array blocks;
|
struct block_array blocks;
|
||||||
} lorem;
|
} buffer;
|
||||||
|
|
||||||
|
struct lorem lorem(const char *const a, const char *const b) {
|
||||||
|
struct lorem l;
|
||||||
|
assert(a && a <= b);
|
||||||
|
l.sub = a;
|
||||||
|
l.size = (size_t)(b - a);
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
const char *lorem_dup(const struct lorem sub) {
|
const char *lorem_dup(const struct lorem sub) {
|
||||||
char *string;
|
char *string;
|
||||||
size_t size;
|
size_t size;
|
||||||
if(!sub.sub) { errno = EDOM; return 0; } /* Null substring. */
|
if(!sub.sub) { errno = EDOM; return 0; } /* Null substring. */
|
||||||
if(sub.size == ~(size_t)0) { errno = ERANGE; return 0; } /* Unlikely. */
|
if(sub.size == ~(size_t)0) { errno = ERANGE; return 0; } /* Unlikely. */
|
||||||
if((size = sub.size + 1) > lorem.capacity - lorem.size) {
|
if((size = sub.size + 1) > buffer.capacity - buffer.size) {
|
||||||
size_t c0 = lorem.capacity < 8 ? 8 : lorem.capacity;
|
size_t c0 = buffer.capacity < 8 ? 8 : buffer.capacity;
|
||||||
char *block = 0, **record = 0;
|
char *block = 0, **record = 0;
|
||||||
while(c0 < size) { /* Grow. */
|
while(c0 < size) { /* Grow. */
|
||||||
size_t c1 = c0 + (c0 >> 1) + (c0 >> 3);
|
size_t c1 = c0 + (c0 >> 1) + (c0 >> 3);
|
||||||
@ -33,31 +41,31 @@ const char *lorem_dup(const struct lorem sub) {
|
|||||||
c0 = c1;
|
c0 = c1;
|
||||||
}
|
}
|
||||||
if(!(block = malloc(c0))
|
if(!(block = malloc(c0))
|
||||||
|| !(record = block_array_new(&lorem.blocks))) { /* Error. */
|
|| !(record = block_array_new(&buffer.blocks))) { /* Error. */
|
||||||
free(block);
|
free(block);
|
||||||
if(!errno) errno = ERANGE;
|
if(!errno) errno = ERANGE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
*record = block;
|
*record = block;
|
||||||
lorem.capacity = c0;
|
buffer.capacity = c0;
|
||||||
lorem.size = 0;
|
buffer.size = 0;
|
||||||
/*printf("%s size %zu\n", orcify(block), c0);*/
|
/*printf("%s size %zu\n", orcify(block), c0);*/
|
||||||
}
|
}
|
||||||
assert(lorem.blocks.size);
|
assert(buffer.blocks.size);
|
||||||
string = lorem.blocks.data[lorem.blocks.size - 1] + lorem.size;
|
string = buffer.blocks.data[buffer.blocks.size - 1] + buffer.size;
|
||||||
memcpy(string, sub.sub, sub.size);
|
memcpy(string, sub.sub, sub.size);
|
||||||
string[sub.size] = '\0';
|
string[sub.size] = '\0';
|
||||||
lorem.size += size;
|
buffer.size += size;
|
||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
void lorem_(void) {
|
void lorem_(void) {
|
||||||
size_t i;
|
size_t i;
|
||||||
for(i = 0; i < lorem.blocks.size; i++) {
|
for(i = 0; i < buffer.blocks.size; i++) {
|
||||||
char *block = lorem.blocks.data[i];
|
char *block = buffer.blocks.data[i];
|
||||||
/*printf("free %s\n", orcify(block));*/
|
/*printf("free %s\n", orcify(block));*/
|
||||||
free(block);
|
free(block);
|
||||||
}
|
}
|
||||||
lorem.capacity = lorem.size = 0;
|
buffer.capacity = buffer.size = 0;
|
||||||
block_array_(&lorem.blocks);
|
block_array_(&buffer.blocks);
|
||||||
}
|
}
|
||||||
|
@ -2,5 +2,6 @@
|
|||||||
|
|
||||||
struct lorem { const char *sub; size_t size; };
|
struct lorem { const char *sub; size_t size; };
|
||||||
|
|
||||||
|
struct lorem lorem(const char *const a, const char *const b);
|
||||||
const char *lorem_dup(const struct lorem);
|
const char *lorem_dup(const struct lorem);
|
||||||
void lorem_(void);
|
void lorem_(void);
|
||||||
|
@ -9,6 +9,12 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
/* Temporary buffer to lookup. */
|
||||||
|
#define ARRAY_NAME char
|
||||||
|
#define ARRAY_TYPE char
|
||||||
|
#include "array.h"
|
||||||
|
/* ...wait, why would you copy? modify the table to use substring. */
|
||||||
|
|
||||||
/* This is a lookup table for source strings ("2000glider") to substring the
|
/* This is a lookup table for source strings ("2000glider") to substring the
|
||||||
first description ("Glider pilot log book"). */
|
first description ("Glider pilot log book"). */
|
||||||
static int lookup_is_equal(const char *const x, const char *const y)
|
static int lookup_is_equal(const char *const x, const char *const y)
|
||||||
@ -26,13 +32,13 @@ static struct lorem lookup_default = { 0, 0 };
|
|||||||
#include "../src/table.h"
|
#include "../src/table.h"
|
||||||
|
|
||||||
|
|
||||||
static void source_to_string(const union line64 line, const struct lorem *u,
|
static void source_to_string(const union line64 line, char *const*const u,
|
||||||
char (*const a)[12]) { (void)u; date32_to_string(line.date, a); }
|
char (*const a)[12]) { (void)u; date32_to_string(line.date, a); }
|
||||||
static int source_compare(const union line64 a, const union line64 b)
|
static int source_compare(const union line64 a, const union line64 b)
|
||||||
{ return a.u64 > b.u64; }
|
{ return a.u64 > b.u64; }
|
||||||
#define TREE_NAME source
|
#define TREE_NAME source
|
||||||
#define TREE_KEY union line64
|
#define TREE_KEY union line64
|
||||||
#define TREE_VALUE struct lorem
|
#define TREE_VALUE char *
|
||||||
#define TREE_COMPARE
|
#define TREE_COMPARE
|
||||||
#define TREE_TO_STRING
|
#define TREE_TO_STRING
|
||||||
#include "../src/tree.h"
|
#include "../src/tree.h"
|
||||||
@ -78,6 +84,8 @@ static int scan(union date32 date, const char *const buffer,
|
|||||||
|
|
||||||
<source> * { why = "default source unrecognized"; goto catch; }
|
<source> * { why = "default source unrecognized"; goto catch; }
|
||||||
<source> @s0 keyword @s1 / "\n" => skip {
|
<source> @s0 keyword @s1 / "\n" => skip {
|
||||||
|
struct lorem lor = lorem(s0, s1);
|
||||||
|
const char *label;
|
||||||
printf("extracted <%.*s>\n", (int)(s1 - s0), s0);
|
printf("extracted <%.*s>\n", (int)(s1 - s0), s0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -115,5 +123,6 @@ struct sources sources(struct journal *const j) {
|
|||||||
catch:
|
catch:
|
||||||
sources_(&s);
|
sources_(&s);
|
||||||
finally:
|
finally:
|
||||||
|
char_array_(&temp); /* Erase the temporary buffer. */
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -17,5 +17,6 @@ catch:
|
|||||||
finally:
|
finally:
|
||||||
sources_(&s);
|
sources_(&s);
|
||||||
journal_(&j);
|
journal_(&j);
|
||||||
|
lorem_();
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user