Blame tests/mem_nr.l

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
}