............
This commit is contained in:
parent
6dc07896bf
commit
268b92edcd
52
backtrace.c
Normal file
52
backtrace.c
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#include <execinfo.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
void myfunc3(void)
|
||||||
|
{
|
||||||
|
int j, nptrs;
|
||||||
|
#define SIZE 100
|
||||||
|
void *buffer[100];
|
||||||
|
char **strings;
|
||||||
|
|
||||||
|
nptrs = backtrace(buffer, SIZE);
|
||||||
|
printf("backtrace() returned %d addresses\n", nptrs);
|
||||||
|
|
||||||
|
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
|
||||||
|
would produce similar output to the following: */
|
||||||
|
|
||||||
|
strings = backtrace_symbols(buffer, nptrs);
|
||||||
|
if (strings == NULL) {
|
||||||
|
perror("backtrace_symbols");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < nptrs; j++)
|
||||||
|
printf("%s\n", strings[j]);
|
||||||
|
|
||||||
|
free(strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void myfunc2(void) /* "static" means don't export the symbol... */
|
||||||
|
{
|
||||||
|
myfunc3();
|
||||||
|
}
|
||||||
|
|
||||||
|
void myfunc(int ncalls)
|
||||||
|
{
|
||||||
|
if (ncalls > 1)
|
||||||
|
myfunc(ncalls - 1);
|
||||||
|
else
|
||||||
|
myfunc2();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf(stderr, "%s num-calls\n", argv[0]);
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
myfunc(atoi(argv[1]));
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
100
cparse.c
Normal file
100
cparse.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#include "vec.h"
|
||||||
|
#include <errno.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int find_funcs(const char *path)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
regex_t fdre, fcre;
|
||||||
|
int ret;
|
||||||
|
char line[1024];
|
||||||
|
char boum[1024];
|
||||||
|
regmatch_t rm[2];
|
||||||
|
const char *re_func_decl = "^(\\w+(\\s+)?){2,}\\([^!@#$+%^]+?\\)\\s+";
|
||||||
|
const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)";
|
||||||
|
|
||||||
|
fp = fopen(path, "r");
|
||||||
|
if (fp == 0) {
|
||||||
|
fprintf(stderr, "Failed to open file %s (%d: %s)\n", path, errno, strerror(errno));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
ret = regcomp(&fdre, re_func_decl, REG_EXTENDED);
|
||||||
|
if (ret != 0) {
|
||||||
|
fprintf(stderr, "Failed to compile regex '%s'\n", re_func_decl);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
ret = regcomp(&fcre, re_func_call, REG_EXTENDED);
|
||||||
|
if (ret != 0) {
|
||||||
|
fprintf(stderr, "Failed to compile regex '%s'\n", re_func_call);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
bool in = false;
|
||||||
|
graph_vec g = new_graph(10);
|
||||||
|
int index;
|
||||||
|
int i1, i2 = -1;
|
||||||
|
while ((fgets(line, 1024, fp)) != NULL) {
|
||||||
|
if (in && line[0] == '}') {
|
||||||
|
in = false;
|
||||||
|
}
|
||||||
|
if (in) {
|
||||||
|
if (regexec(&fcre, line, 2, rm, 0) == 0) {
|
||||||
|
// printf("Line: <<%.*s>>\n", (int)(rm[0].rm_eo - rm[0].rm_so), line + rm[0].rm_so);
|
||||||
|
sprintf(boum, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
// printf("%.*s\n", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
if ((index = is_in(g, boum))) {
|
||||||
|
if (g.node[i2]->nbs == g.node[i2]->cap)
|
||||||
|
g.node[i2]->succ = reallocarray(g.node[i2]->succ, (g.node[i2]->cap += 5), sizeof(nodept));
|
||||||
|
g.node[i2]->succ[i1] = g.node[index];
|
||||||
|
g.node[i2]->nbs++;
|
||||||
|
i1++;
|
||||||
|
} else {
|
||||||
|
insert_node(&g, i, boum, false);
|
||||||
|
if (g.node[i2]->nbs == g.node[i2]->cap)
|
||||||
|
g.node[i2]->succ = reallocarray(g.node[i2]->succ, (g.node[i2]->cap += 5), sizeof(nodept));
|
||||||
|
g.node[i2]->succ[i1] = g.node[i];
|
||||||
|
g.node[i2]->nbs++;
|
||||||
|
i1++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (regexec(&fdre, line, 2, rm, 0) == 0) {
|
||||||
|
sprintf(boum, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
// printf("%.*s\n", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
insert_node(&g, i, boum, true);
|
||||||
|
i++;
|
||||||
|
i2++;
|
||||||
|
in = true;
|
||||||
|
i1 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for (int j = 0; j < i; j++) {
|
||||||
|
// printf("NODE %d: %s\n", j, g.node[j]->func);
|
||||||
|
// for (int n = 0; n < g.node[j]->nbs; n++) {
|
||||||
|
// printf("SUCC %d: %s\n", j, g.node[j]->succ[n]->func);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
print_node(g.node[0]);
|
||||||
|
regfree(&fdre);
|
||||||
|
regfree(&fcre);
|
||||||
|
fclose(fp);
|
||||||
|
delete_graph(&g);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
find_funcs("./memline.c");
|
||||||
|
// graph_vec g = new_graph(3);
|
||||||
|
// insert_node(&g, new_node(0), "main");
|
||||||
|
// insert_node(&g, new_node(1), "main1");
|
||||||
|
// insert_node(&g, new_node(2), "main2");
|
||||||
|
// printf("%d %d %d\n", g.node[0]->num,g.node[1]->num,g.node[2]->num);
|
||||||
|
// printf("%s %s %s\n", g.func[0],g.func[1],g.func[2]);
|
||||||
|
// delete_graph(&g);
|
||||||
|
return 0;
|
||||||
|
}
|
121
cparse.c.~1~
Normal file
121
cparse.c.~1~
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
#include "vec.h"
|
||||||
|
#include <errno.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int find_funcs(const char *path)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
regex_t fdre, fcre;
|
||||||
|
int ret;
|
||||||
|
char line[1024];
|
||||||
|
char boum[1024];
|
||||||
|
regmatch_t rm[2];
|
||||||
|
const char *re_func_decl = "^(\\w+(\\s+)?){2,}\\([^!@#$+%^]+?\\)\\s+";
|
||||||
|
const char *re_func_call = "([a-zA-Z_0-9]+)\\(.*\\)";
|
||||||
|
|
||||||
|
fp = fopen(path, "r");
|
||||||
|
if (fp == 0) {
|
||||||
|
fprintf(stderr, "Failed to open file %s (%d: %s)\n", path, errno, strerror(errno));
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
ret = regcomp(&fdre, re_func_decl, REG_EXTENDED);
|
||||||
|
if (ret != 0) {
|
||||||
|
fprintf(stderr, "Failed to compile regex '%s'\n", re_func_decl);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
ret = regcomp(&fcre, re_func_call, REG_EXTENDED);
|
||||||
|
if (ret != 0) {
|
||||||
|
fprintf(stderr, "Failed to compile regex '%s'\n", re_func_call);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
bool in = false;
|
||||||
|
graph_vec g = new_graph(10);
|
||||||
|
// while ((fgets(line, 1024, fp)) != NULL) {
|
||||||
|
// if (regexec(&fdre, line, 2, rm, 0) == 0) {
|
||||||
|
// // printf("Line: <<%.*s>>\n", (int)(rm[0].rm_eo - rm[0].rm_so), line + rm[0].rm_so);
|
||||||
|
// sprintf(boum, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
// insert_node(&g, i, boum);
|
||||||
|
// i++;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// rewind(fp);
|
||||||
|
// i = -1;
|
||||||
|
int index;
|
||||||
|
int i1, i2 = -1;
|
||||||
|
while ((fgets(line, 1024, fp)) != NULL) {
|
||||||
|
if (in && line[0] == '}') {
|
||||||
|
in = false;
|
||||||
|
}
|
||||||
|
if (in) {
|
||||||
|
if (regexec(&fcre, line, 2, rm, 0) == 0) {
|
||||||
|
// printf("Line: <<%.*s>>\n", (int)(rm[0].rm_eo - rm[0].rm_so), line + rm[0].rm_so);
|
||||||
|
sprintf(boum, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
if ((index = is_in(g, boum))) {
|
||||||
|
if (g.node[i2]->nbs == g.node[i2]->cap)
|
||||||
|
g.node[i2]->succ = reallocarray(g.node[i2]->succ, (g.node[i2]->cap += 5), sizeof(nodept));
|
||||||
|
// printf("NBS = %d %s\n", g.node[index]->num, g.func[index]);
|
||||||
|
// g.node[i]->succ = malloc(sizeof(nodept));
|
||||||
|
g.node[i2]->succ[i1] = g.node[index];
|
||||||
|
g.node[i2]->nbs++;
|
||||||
|
i1++;
|
||||||
|
// insert_succ(g.node[i], g.node[index]);
|
||||||
|
} else {
|
||||||
|
insert_node(&g, i, boum);
|
||||||
|
i++;
|
||||||
|
// if (g.node[i]->nbs == g.node[i]->cap)
|
||||||
|
// g.node[i]->succ = reallocarray(g.node[i]->succ, (g.node[i]->cap += 5), sizeof(nodept));
|
||||||
|
// struct node *n = malloc(sizeof(struct node));
|
||||||
|
// n->num = i;
|
||||||
|
// n->nbs = 0;
|
||||||
|
// // n->cap = 5;
|
||||||
|
// // n->succ = malloc(5 * sizeof(nodept));
|
||||||
|
// strcpy(n->func, boum);
|
||||||
|
// g.node[i]->succ[i1] = n;
|
||||||
|
// g.node[i]->nbs++;
|
||||||
|
// i1++;
|
||||||
|
// insert_succ(&g, i, i1, boum);
|
||||||
|
// i1++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (regexec(&fdre, line, 2, rm, 0) == 0) {
|
||||||
|
sprintf(boum, "%.*s", (int)(rm[1].rm_eo - rm[1].rm_so), line + rm[1].rm_so);
|
||||||
|
insert_node(&g, i, boum);
|
||||||
|
i++;
|
||||||
|
i2++;
|
||||||
|
in = true;
|
||||||
|
i1 = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int j = 0; j < i; j++) {
|
||||||
|
printf("NODE %d: %s\n",j, g.node[j]->func);
|
||||||
|
for (int n = 0; n < g.node[j]->nbs; n++) {
|
||||||
|
printf("SUCC %d: %s\n",j, g.node[j]->succ[n]->func);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for (int j = 0; j < i; j++) {
|
||||||
|
// printf("fc %s\n", boum2[j]);
|
||||||
|
// }
|
||||||
|
regfree(&fdre);
|
||||||
|
regfree(&fcre);
|
||||||
|
fclose(fp);
|
||||||
|
delete_graph(&g);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
find_funcs("./memline.c");
|
||||||
|
// graph_vec g = new_graph(3);
|
||||||
|
// insert_node(&g, new_node(0), "main");
|
||||||
|
// insert_node(&g, new_node(1), "main1");
|
||||||
|
// insert_node(&g, new_node(2), "main2");
|
||||||
|
// printf("%d %d %d\n", g.node[0]->num,g.node[1]->num,g.node[2]->num);
|
||||||
|
// printf("%s %s %s\n", g.func[0],g.func[1],g.func[2]);
|
||||||
|
// delete_graph(&g);
|
||||||
|
return 0;
|
||||||
|
}
|
97
vec.c
Normal file
97
vec.c
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#include "vec.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
nodept new_node(int num)
|
||||||
|
{
|
||||||
|
struct node *n = malloc(sizeof(nodept));
|
||||||
|
assert(n);
|
||||||
|
// n->succ = malloc((n->cap = 8) * sizeof(nodept));
|
||||||
|
// assert(n->succ);
|
||||||
|
n->num = num;
|
||||||
|
n->nbs = 0;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_node(struct node *n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
// for (i = 0; i < n->nbs; i++) {
|
||||||
|
// free(n->succ[i]);
|
||||||
|
// }
|
||||||
|
// free(n->succ);
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert_succ(graph_vec *g, int i, int i1, fix_str str)
|
||||||
|
{
|
||||||
|
if (g->node[i]->nbs == g->node[i]->cap)
|
||||||
|
g->node[i]->succ = reallocarray(g->node[i]->succ, (g->node[i]->cap += 5), sizeof(nodept));
|
||||||
|
struct node *n = malloc(sizeof(struct node));
|
||||||
|
n->num = i;
|
||||||
|
n->nbs = 0;
|
||||||
|
strcpy(n->func, str);
|
||||||
|
g->node[i]->succ[i1] = n;
|
||||||
|
g->node[i]->nbs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
graph_vec new_graph(int cap)
|
||||||
|
{
|
||||||
|
graph_vec g;
|
||||||
|
g.n = -1;
|
||||||
|
g.cap = cap;
|
||||||
|
// g.func = calloc(cap, sizeof(fix_str));
|
||||||
|
// g.node = calloc(cap, sizeof(nodept));
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
|
||||||
|
void insert_node(graph_vec *g, int i, fix_str str, bool intern)
|
||||||
|
{
|
||||||
|
++g->n;
|
||||||
|
struct node *n = malloc(sizeof(struct node));
|
||||||
|
n->num = i;
|
||||||
|
n->nbs = 0;
|
||||||
|
n->cap = 5;
|
||||||
|
n->succ = malloc(5 * sizeof(nodept));
|
||||||
|
strcpy(n->func, str);
|
||||||
|
g->node[g->n] = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delete_graph(graph_vec *g)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i <= g->n; ++i) {
|
||||||
|
if (g->node[i]) {
|
||||||
|
if (g->node[i]->succ) {
|
||||||
|
free(g->node[i]->succ);
|
||||||
|
g->node[i]->succ = NULL;
|
||||||
|
}
|
||||||
|
free(g->node[i]);
|
||||||
|
g->node[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_in(graph_vec g, fix_str func)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < g.n; ++i) {
|
||||||
|
if (strcmp(g.node[i]->func, func) == 0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_node(nodept node)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
printf("NODE: %s\n", node->func);
|
||||||
|
for (int i = 0; i < node->nbs; ++i) {
|
||||||
|
printf("SUCC: %s\n", node->succ[i]->func);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < node->nbs; ++i) {
|
||||||
|
if (node->succ[i]->intern)
|
||||||
|
print_node(node->succ[i]);
|
||||||
|
}
|
||||||
|
}
|
23
vec.h
23
vec.h
@ -1,3 +1,5 @@
|
|||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
typedef char fix_str[256];
|
typedef char fix_str[256];
|
||||||
typedef struct node *nodept;
|
typedef struct node *nodept;
|
||||||
typedef struct nodes graph_vec;
|
typedef struct nodes graph_vec;
|
||||||
@ -5,12 +7,23 @@ typedef struct nodes graph_vec;
|
|||||||
struct nodes {
|
struct nodes {
|
||||||
int n;
|
int n;
|
||||||
int cap;
|
int cap;
|
||||||
fix_str *func; // noms de fonctions
|
nodept node[1000];
|
||||||
nodept *node;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct node {
|
struct node {
|
||||||
int num; // le numero de noeud
|
bool intern;
|
||||||
int nbs; // nombre de successeurs
|
int num; // le numero de noeud
|
||||||
struct node **succ; // les successeurs
|
int nbs; // nombre de successeurs
|
||||||
|
fix_str func; // noms de fonctions
|
||||||
|
int cap;
|
||||||
|
nodept *succ; // les successeurs
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct node *new_node(int num);
|
||||||
|
void delete_node(struct node *n);
|
||||||
|
void insert_succ(graph_vec *g, int i, int i1, fix_str str);
|
||||||
|
graph_vec new_graph(int cap);
|
||||||
|
void insert_node(graph_vec *g, int i, fix_str str, bool intern);
|
||||||
|
void delete_graph(graph_vec *g);
|
||||||
|
int is_in(graph_vec g, fix_str func);
|
||||||
|
void print_node(nodept node);
|
||||||
|
Loading…
Reference in New Issue
Block a user