1 1.1 christos /* 2 1.1 christos * This file is part of flex. 3 1.1 christos * 4 1.1 christos * Redistribution and use in source and binary forms, with or without 5 1.1 christos * modification, are permitted provided that the following conditions 6 1.1 christos * are met: 7 1.1 christos * 8 1.1 christos * 1. Redistributions of source code must retain the above copyright 9 1.1 christos * notice, this list of conditions and the following disclaimer. 10 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright 11 1.1 christos * notice, this list of conditions and the following disclaimer in the 12 1.1 christos * documentation and/or other materials provided with the distribution. 13 1.1 christos * 14 1.1 christos * Neither the name of the University nor the names of its contributors 15 1.1 christos * may be used to endorse or promote products derived from this software 16 1.1 christos * without specific prior written permission. 17 1.1 christos * 18 1.1 christos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 19 1.1 christos * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 20 1.1 christos * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 1.1 christos * PURPOSE. 22 1.1 christos */ 23 1.1 christos 24 1.1 christos %{ 25 1.1 christos /* A template scanner file to build "scanner.c". 26 1.1 christos * The whole idea is to cause memory realloc by 27 1.1 christos * 1. pushing a lot on the condition stack, and 28 1.1 christos * 2. eating input greater than YY_BUF_SIZE 29 1.1 christos */ 30 1.1 christos #include <stdio.h> 31 1.1 christos #include <stdlib.h> 32 1.1 christos #include "config.h" 33 1.1 christos 34 1.1 christos /* Insanely small read buffer. This pretty much guarantees at least one realloc. */ 35 1.1 christos #ifdef YY_BUF_SIZE 36 1.1 christos #undef YY_BUF_SIZE 37 1.1 christos #endif 38 1.1 christos #define YY_BUF_SIZE 8 39 1.1 christos 40 1.1 christos %} 41 1.1 christos 42 1.1 christos %option 8bit prefix="test" 43 1.1 christos %option nounput nomain noyywrap noinput noyy_top_state 44 1.1 christos %option warn stack nodefault reentrant 45 1.1 christos %option noyyalloc noyyrealloc noyyfree 46 1.1 christos 47 1.1 christos %x parens 48 1.1 christos 49 1.1 christos %% 50 1.1 christos 51 1.1 christos <INITIAL>{ 52 1.1 christos "(" { printf("yy_push_state(parens)\n"); yy_push_state(parens,yyscanner); } 53 1.1 christos len=[0-9]+ { printf("About read token where %s\n",yytext); } 54 1.1 christos 0+ { } 55 1.1 christos .|\n { } 56 1.1 christos } 57 1.1 christos 58 1.1 christos <parens>{ 59 1.1 christos "(" { printf("yy_push_state(parens)\n"); yy_push_state(parens,yyscanner); } 60 1.1 christos ")" { printf("yy_pop_state()\n");yy_pop_state(yyscanner);} 61 1.1 christos [^()\n]+ { } 62 1.1 christos .|\n { } 63 1.1 christos } 64 1.1 christos 65 1.1 christos %% 66 1.1 christos /* total memory allocated */ 67 1.1 christos static size_t total_mem=0; 68 1.1 christos 69 1.1 christos /* track the amount of memory for ptr. */ 70 1.1 christos struct memsz { 71 1.1 christos void* p; 72 1.1 christos size_t sz; 73 1.1 christos }; 74 1.1 christos 75 1.1 christos static struct memsz * ptrs=0; /* Array of pairs. */ 76 1.1 christos static int nptrs=0; /* Number of pairs in array. */ 77 1.1 christos static int arrsz=0; /* Capacity of array. */ 78 1.1 christos 79 1.1 christos static void dump_mem(FILE* fp){ 80 1.1 christos int i; 81 1.1 christos fprintf(fp,"\tptrs[%d] = {", nptrs); 82 1.1 christos for (i=0; i < arrsz; i++) 83 1.1 christos fprintf(fp," {%#lx,%ld},", (long)ptrs[i].p, (long)ptrs[i].sz); 84 1.1 christos 85 1.1 christos fprintf(fp,"}\n"); 86 1.1 christos } 87 1.1 christos 88 1.1.1.2 christos void * testalloc(yy_size_t n , void* yyscanner) 89 1.1 christos { 90 1.1 christos (void)yyscanner; 91 1.1 christos 92 1.1 christos void * p; 93 1.1 christos int i; 94 1.1 christos 95 1.1 christos total_mem += n; 96 1.1.1.2 christos p = malloc(n); 97 1.1 christos 98 1.1 christos if( nptrs >= arrsz){ 99 1.1 christos /* increase array size by 1 */ 100 1.1 christos arrsz++; 101 1.1.1.2 christos ptrs = realloc(ptrs, (size_t) arrsz * sizeof(struct memsz)); 102 1.1 christos ptrs[nptrs].p = 0; 103 1.1 christos ptrs[nptrs].sz = 0; 104 1.1 christos } 105 1.1 christos 106 1.1 christos /* find a null slot */ 107 1.1 christos for(i=0; i < arrsz ; i++) 108 1.1 christos if (ptrs[i].p == 0) { 109 1.1 christos ptrs[i].p = p; 110 1.1 christos ptrs[i].sz = n; 111 1.1 christos } 112 1.1 christos 113 1.1 christos nptrs++; 114 1.1 christos printf("yyflex_alloc(%8ld) total=%8ld return=%#10lx\n",(long)n,(long)total_mem,(long)p); 115 1.1 christos dump_mem(stdout); 116 1.1 christos return p; 117 1.1 christos } 118 1.1 christos 119 1.1.1.2 christos void * testrealloc(void* p, yy_size_t n , void* yyscanner) 120 1.1 christos { 121 1.1 christos (void)yyscanner; 122 1.1 christos 123 1.1 christos int i; 124 1.1 christos for (i=0; i < arrsz; i++) 125 1.1 christos if ( ptrs[i].p == p){ 126 1.1 christos total_mem -= ptrs[i].sz; 127 1.1 christos total_mem += n; 128 1.1.1.2 christos ptrs[i].p = realloc(p, n); 129 1.1 christos ptrs[i].sz = n; 130 1.1 christos 131 1.1 christos printf("yyflex_realloc(%#10lx,%8ld) total=%8ld return=%8lx\n", 132 1.1 christos (long)p,(long)n,(long)total_mem,(long)ptrs[i].p); 133 1.1 christos dump_mem(stdout); 134 1.1 christos return ptrs[i].p; 135 1.1 christos } 136 1.1 christos 137 1.1 christos fprintf(stderr,"ERROR: yyflex_realloc could not locate pointer %#lx.\n",(long)p); 138 1.1 christos dump_mem(stdout); 139 1.1 christos exit(1); 140 1.1 christos } 141 1.1 christos 142 1.1.1.2 christos void testfree(void* p , void* yyscanner) 143 1.1 christos { 144 1.1 christos (void)yyscanner; 145 1.1 christos 146 1.1 christos int i; 147 1.1 christos for (i=0; i < arrsz; i++) 148 1.1 christos if ( ptrs[i].p == p){ 149 1.1 christos total_mem -= ptrs[i].sz; 150 1.1 christos free(p); 151 1.1 christos ptrs[i].p = 0; 152 1.1 christos ptrs[i].sz = 0; 153 1.1 christos nptrs--; 154 1.1 christos printf("yyflex_free(%#10lx) total=%8ld\n",(long)p,(long)total_mem); 155 1.1 christos dump_mem(stdout); 156 1.1 christos return; 157 1.1 christos } 158 1.1 christos 159 1.1 christos fprintf(stderr,"ERROR: yyflex_free could not locate pointer %#lx.\n",(long)p); 160 1.1 christos dump_mem(stdout); 161 1.1 christos exit(1); 162 1.1 christos } 163 1.1 christos 164 1.1 christos int main(void); 165 1.1 christos 166 1.1 christos int 167 1.1.1.2 christos main (void) 168 1.1 christos { 169 1.1 christos yyscan_t scanner; 170 1.1 christos arrsz = 1; 171 1.1.1.2 christos ptrs = calloc(1, sizeof(struct memsz)); 172 1.1 christos nptrs = 0; 173 1.1 christos 174 1.1.1.2 christos testlex_init(&scanner); 175 1.1.1.2 christos testset_in(stdin,scanner); 176 1.1.1.2 christos testset_out(stdout,scanner); 177 1.1.1.2 christos testlex(scanner); 178 1.1.1.2 christos testlex_destroy(scanner); 179 1.1 christos free(ptrs); 180 1.1 christos 181 1.1 christos if ( nptrs > 0 || total_mem > 0){ 182 1.1 christos fprintf(stderr,"Oops. Looks like a memory leak: nptrs=%d, unfreed memory=%ld\n",nptrs,(long)total_mem); 183 1.1 christos exit(1); 184 1.1 christos } 185 1.1 christos printf("TEST RETURNING OK.\n"); 186 1.1 christos return 0; 187 1.1 christos } 188