adding reallocz, adding workaround for segfault, some reformating.

This commit is contained in:
Enno Boland (Gottox) 2008-07-02 09:43:21 +02:00
parent 22b697c8d0
commit c499a2afe1

30
smu.c
View file

@ -31,6 +31,7 @@ static int doreplace(const char *begin, const char *end, int newblock); /* Par
static int doshortlink(const char *begin, const char *end, int newblock); /* Parser for links and images */ static int doshortlink(const char *begin, const char *end, int newblock); /* Parser for links and images */
static int dosurround(const char *begin, const char *end, int newblock); /* Parser for surrounding tags */ static int dosurround(const char *begin, const char *end, int newblock); /* Parser for surrounding tags */
static int dounderline(const char *begin, const char *end, int newblock); /* Parser for underline tags */ static int dounderline(const char *begin, const char *end, int newblock); /* Parser for underline tags */
static void *ereallocz(void *p, size_t size);
static void hprint(const char *begin, const char *end); /* escapes HTML and prints it to output */ static void hprint(const char *begin, const char *end); /* escapes HTML and prints it to output */
static void process(const char *begin, const char *end, int isblock); /* Processes range between begin and end. */ static void process(const char *begin, const char *end, int isblock); /* Processes range between begin and end. */
@ -274,7 +275,7 @@ int
dolist(const char *begin, const char *end, int newblock) { dolist(const char *begin, const char *end, int newblock) {
unsigned int i, j, indent, run, ul, isblock; unsigned int i, j, indent, run, ul, isblock;
const char *p, *q; const char *p, *q;
char *buffer; char *buffer = NULL;
isblock = 0; isblock = 0;
if(newblock) if(newblock)
@ -297,8 +298,7 @@ dolist(const char *begin, const char *end, int newblock) {
return 0; return 0;
for(p++; p != end && (*p == ' ' || *p == '\t'); p++); for(p++; p != end && (*p == ' ' || *p == '\t'); p++);
indent = p - q; indent = p - q;
if(!(buffer = malloc(BUFSIZ))) buffer = ereallocz(buffer, BUFSIZ);
eprint("Malloc failed.");
if(!newblock) if(!newblock)
fputc('\n', stdout); fputc('\n', stdout);
fputs(ul ? "<ul>\n" : "<ol>\n", stdout); fputs(ul ? "<ul>\n" : "<ol>\n", stdout);
@ -492,6 +492,19 @@ dounderline(const char *begin, const char *end, int newblock) {
return 0; return 0;
} }
void *
ereallocz(void *p, size_t size) {
void *res;
if(p)
res = realloc(p , size);
else
res = calloc(1, size);
if(!res)
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
}
void void
hprint(const char *begin, const char *end) { hprint(const char *begin, const char *end) {
const char *p; const char *p;
@ -516,13 +529,13 @@ process(const char *begin, const char *end, int newblock) {
int affected; int affected;
unsigned int i; unsigned int i;
for(p = begin; p != end;) { for(p = begin; p < end;) {
if(newblock) if(newblock)
while(*p == '\n') while(*p == '\n')
if(++p == end) if(++p == end)
return; return;
affected = 0; affected = 0;
for(i = 0; i < LENGTH(parsers) && affected == 0; i++) for(i = 0; i < LENGTH(parsers) && !affected; i++)
affected = parsers[i](p, end, newblock); affected = parsers[i](p, end, newblock);
p += abs(affected); p += abs(affected);
if(!affected) { if(!affected) {
@ -544,7 +557,7 @@ process(const char *begin, const char *end, int newblock) {
int int
main(int argc, char *argv[]) { main(int argc, char *argv[]) {
char *buffer; char *buffer = NULL;
int s, i; int s, i;
unsigned long len, bsize; unsigned long len, bsize;
FILE *source = stdin; FILE *source = stdin;
@ -566,15 +579,14 @@ main(int argc, char *argv[]) {
if(i < argc && !(source = fopen(argv[i], "r"))) if(i < argc && !(source = fopen(argv[i], "r")))
eprint("Cannot open file `%s`\n",argv[i]); eprint("Cannot open file `%s`\n",argv[i]);
bsize = 2 * BUFSIZ; bsize = 2 * BUFSIZ;
if(!(buffer = malloc(bsize))) buffer = ereallocz(buffer, bsize);
eprint("Malloc failed.");
len = 0; len = 0;
while((s = fread(buffer + len, 1, BUFSIZ, source))) { while((s = fread(buffer + len, 1, BUFSIZ, source))) {
len += s; len += s;
if(BUFSIZ + len + 1 > bsize) { if(BUFSIZ + len + 1 > bsize) {
bsize += BUFSIZ; bsize += BUFSIZ;
if(!(buffer = realloc(buffer, bsize))) if(!(buffer = realloc(buffer, bsize)))
eprint("Malloc failed."); eprint("realloc failed.");
} }
} }
buffer[len] = '\0'; buffer[len] = '\0';