|
Packit |
f00812 |
/*
|
|
Packit |
f00812 |
* This file is part of flex.
|
|
Packit |
f00812 |
*
|
|
Packit |
f00812 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit |
f00812 |
* modification, are permitted provided that the following conditions
|
|
Packit |
f00812 |
* are met:
|
|
Packit |
f00812 |
*
|
|
Packit |
f00812 |
* 1. Redistributions of source code must retain the above copyright
|
|
Packit |
f00812 |
* notice, this list of conditions and the following disclaimer.
|
|
Packit |
f00812 |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
Packit |
f00812 |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit |
f00812 |
* documentation and/or other materials provided with the distribution.
|
|
Packit |
f00812 |
*
|
|
Packit |
f00812 |
* Neither the name of the University nor the names of its contributors
|
|
Packit |
f00812 |
* may be used to endorse or promote products derived from this software
|
|
Packit |
f00812 |
* without specific prior written permission.
|
|
Packit |
f00812 |
*
|
|
Packit |
f00812 |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
|
Packit |
f00812 |
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
|
Packit |
f00812 |
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
Packit |
f00812 |
* PURPOSE.
|
|
Packit |
f00812 |
*/
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%{
|
|
Packit |
f00812 |
/* A template scanner file to build "scanner.c".
|
|
Packit |
f00812 |
* The whole idea is to cause memory realloc by
|
|
Packit |
f00812 |
* 1. pushing a lot on the condition stack, and
|
|
Packit |
f00812 |
* 2. eating input greater than YY_BUF_SIZE
|
|
Packit |
f00812 |
*/
|
|
Packit |
f00812 |
#include <stdio.h>
|
|
Packit |
f00812 |
#include <stdlib.h>
|
|
Packit |
f00812 |
#include "config.h"
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
/* Insanely small read buffer. This pretty much guarantees at least one realloc. */
|
|
Packit |
f00812 |
#ifdef YY_BUF_SIZE
|
|
Packit |
f00812 |
#undef YY_BUF_SIZE
|
|
Packit |
f00812 |
#endif
|
|
Packit |
f00812 |
#define YY_BUF_SIZE 8
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%option 8bit prefix="test"
|
|
Packit |
f00812 |
%option nounput nomain noyywrap noinput noyy_top_state
|
|
Packit |
f00812 |
%option warn stack nodefault
|
|
Packit |
f00812 |
%option noyyalloc noyyrealloc noyyfree
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%x parens
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%%
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
<INITIAL>{
|
|
Packit |
f00812 |
"(" { printf("yy_push_state(parens)\n"); yy_push_state(parens); }
|
|
Packit |
f00812 |
len=[0-9]+ { printf("About read token where %s\n",yytext); }
|
|
Packit |
f00812 |
0+ { }
|
|
Packit |
f00812 |
.|\n { }
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
<parens>{
|
|
Packit |
f00812 |
"(" { printf("yy_push_state(parens)\n"); yy_push_state(parens); }
|
|
Packit |
f00812 |
")" { printf("yy_pop_state()\n");yy_pop_state();}
|
|
Packit |
f00812 |
[^()\n]+ { }
|
|
Packit |
f00812 |
.|\n { }
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
%%
|
|
Packit |
f00812 |
/* total memory allocated */
|
|
Packit |
f00812 |
static size_t total_mem=0;
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
/* track the amount of memory for ptr. */
|
|
Packit |
f00812 |
struct memsz {
|
|
Packit |
f00812 |
void* p;
|
|
Packit |
f00812 |
size_t sz;
|
|
Packit |
f00812 |
};
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
static struct memsz * ptrs=0; /* Array of pairs. */
|
|
Packit |
f00812 |
static int nptrs=0; /* Number of pairs in array. */
|
|
Packit |
f00812 |
static int arrsz=0; /* Capacity of array. */
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
static void dump_mem(FILE* fp){
|
|
Packit |
f00812 |
int i;
|
|
Packit |
f00812 |
fprintf(fp,"\tptrs[%d] = {", nptrs);
|
|
Packit |
f00812 |
for (i=0; i < arrsz; i++)
|
|
Packit |
f00812 |
fprintf(fp," {%#lx,%ld},", (long)ptrs[i].p, (long)ptrs[i].sz);
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
fprintf(fp,"}\n");
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
void * yyalloc(yy_size_t n)
|
|
Packit |
f00812 |
{
|
|
Packit |
f00812 |
void * p;
|
|
Packit |
f00812 |
int i;
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
total_mem += n;
|
|
Packit |
f00812 |
p = malloc(n);
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
if( nptrs >= arrsz){
|
|
Packit |
f00812 |
/* increase array size by 1 */
|
|
Packit |
f00812 |
arrsz++;
|
|
Packit |
f00812 |
ptrs = realloc(ptrs, arrsz * sizeof(struct memsz));
|
|
Packit |
f00812 |
ptrs[nptrs].p = 0;
|
|
Packit |
f00812 |
ptrs[nptrs].sz = 0;
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
/* find a null slot */
|
|
Packit |
f00812 |
for(i=0; i < arrsz ; i++)
|
|
Packit |
f00812 |
if (ptrs[i].p == 0) {
|
|
Packit |
f00812 |
ptrs[i].p = p;
|
|
Packit |
f00812 |
ptrs[i].sz = n;
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
nptrs++;
|
|
Packit |
f00812 |
printf("yyflex_alloc(%8ld) total=%8ld return=%#10lx\n",(long)n,(long)total_mem,(long)p);
|
|
Packit |
f00812 |
dump_mem(stdout);
|
|
Packit |
f00812 |
return p;
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
void * yyrealloc(void* p, yy_size_t n)
|
|
Packit |
f00812 |
{
|
|
Packit |
f00812 |
int i;
|
|
Packit |
f00812 |
for (i=0; i < arrsz; i++)
|
|
Packit |
f00812 |
if ( ptrs[i].p == p){
|
|
Packit |
f00812 |
total_mem -= ptrs[i].sz;
|
|
Packit |
f00812 |
total_mem += n;
|
|
Packit |
f00812 |
ptrs[i].p = realloc(p,n);
|
|
Packit |
f00812 |
ptrs[i].sz = n;
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
printf("yyflex_realloc(%#10lx,%8ld) total=%8ld return=%8lx\n",
|
|
Packit |
f00812 |
(long)p,(long)n,(long)total_mem,(long)ptrs[i].p);
|
|
Packit |
f00812 |
dump_mem(stdout);
|
|
Packit |
f00812 |
return ptrs[i].p;
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
fprintf(stderr,"ERROR: yyflex_realloc could not locate pointer %#lx.\n",(long)p);
|
|
Packit |
f00812 |
dump_mem(stdout);
|
|
Packit |
f00812 |
exit(1);
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
void yyfree(void* p)
|
|
Packit |
f00812 |
{
|
|
Packit |
f00812 |
int i;
|
|
Packit |
f00812 |
for (i=0; i < arrsz; i++)
|
|
Packit |
f00812 |
if ( ptrs[i].p == p){
|
|
Packit |
f00812 |
total_mem -= ptrs[i].sz;
|
|
Packit |
f00812 |
free(p);
|
|
Packit |
f00812 |
ptrs[i].p = 0;
|
|
Packit |
f00812 |
ptrs[i].sz = 0;
|
|
Packit |
f00812 |
nptrs--;
|
|
Packit |
f00812 |
printf("yyflex_free(%#10lx) total=%8ld\n",(long)p,(long)total_mem);
|
|
Packit |
f00812 |
dump_mem(stdout);
|
|
Packit |
f00812 |
return;
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
fprintf(stderr,"ERROR: yyflex_free could not locate pointer %#lx.\n",(long)p);
|
|
Packit |
f00812 |
dump_mem(stdout);
|
|
Packit |
f00812 |
exit(1);
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
int main(void);
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
int
|
|
Packit |
f00812 |
main ()
|
|
Packit |
f00812 |
{
|
|
Packit |
f00812 |
arrsz = 1;
|
|
Packit |
f00812 |
ptrs = calloc(1, sizeof(struct memsz));
|
|
Packit |
f00812 |
nptrs = 0;
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
yyin = stdin;
|
|
Packit |
f00812 |
yyout = stdout;
|
|
Packit |
f00812 |
yylex();
|
|
Packit |
f00812 |
yylex_destroy();
|
|
Packit |
f00812 |
free(ptrs);
|
|
Packit |
f00812 |
|
|
Packit |
f00812 |
if ( nptrs > 0 || total_mem > 0){
|
|
Packit |
f00812 |
fprintf(stderr,"Oops. Looks like a memory leak: nptrs=%d, unfreed memory=%ld\n",nptrs,(long)total_mem);
|
|
Packit |
f00812 |
exit(1);
|
|
Packit |
f00812 |
}
|
|
Packit |
f00812 |
printf("TEST RETURNING OK.\n");
|
|
Packit |
f00812 |
return 0;
|
|
Packit |
f00812 |
}
|