#include "jam.h"
#include "lists.h"
#include "regexp.h"
#include "pathsys.h"
#include "variable.h"
#include "javaclass.h"
#include "search.h"
#include "parse.h"
#include "rules.h"
#include "newstr.h"
#include <stdio.h>
#define MAXPATTERN 10
#define BUFSIZE 1024
static const char* classfile_doscan(const char** end, char* buf, int bufsize,
FILE* f, regexp** re, int rec);
static const char* convert_to_dotclass(char* name);
const char* java_classfile(PATHNAME* name)
{
LIST* packagescan;
char textname[BUFSIZE];
char buf[BUFSIZE];
const char* boundname;
FILE* f;
regexp* re[MAXPATTERN];
int rec = 0;
const char* p;
const char* end;
char* q;
time_t stamp;
TARGET* t;
packagescan = var_get("PACKAGESCAN");
if (!packagescan)
printf("Warning: ':C' operator used without PACKAGESCAN. Not scanning.\n");
else
while (rec < MAXPATTERN && packagescan) {
re[rec++] = regcomp( packagescan->string );
packagescan = list_next( packagescan );
}
/*
* Bind the filename to get the real path.
*/
path_build(name, textname, 0); /* overflow check would be nice */
t = bindtarget(textname);
pushsettings(t->settings);
boundname = search(textname, &stamp);
popsettings(t->settings);
if (!rec || !(f = fopen(boundname, "r"))) {
printf("Warning: Could not open %s for Java package scan.\n", boundname);
/*
* What is useful here? We will just change the .java extension into
* .class, in the (probably false) hope that it will be useful.
*/
return convert_to_dotclass(textname);
}
p = classfile_doscan(&end, buf, sizeof(buf), f, re, rec);
fclose(f);
if (!p) return convert_to_dotclass(textname);
for (q = buf; p != end; ++p)
if (*p != ' ' && *p != '\t' && *p != '\n')
*(q++) = (*p == '.' ? '/' : *p);
*(q++) = '/';
memcpy(q, name->f_base.ptr, name->f_base.len);
memcpy(q + name->f_base.len, ".class", 7);
return newstr(buf);
}
static const char* classfile_doscan(const char** end, char* buf, int bufsize,
FILE* f, regexp** re, int rec)
{
while (fgets(buf, bufsize, f)) {
int i;
for (i = 0; i < rec; i++)
if (regexec(re[i], buf) && re[i]->startp[1]) {
*end = re[i]->endp[1];
return re[i]->startp[1];
}
}
return 0;
}
static const char* convert_to_dotclass(char* name)
{
char* buf;
const char* s;
int len;
/*
* This function is pretty quick and dirty.
*/
len = strlen(name);
if (len < 5) return newstr(name);
if (strncmp(name + len - 5, ".java", 5)) return newstr(name);
/* (6 - 5) == difference between ".class" and ".java", 1 for the terminator */
buf = malloc(len + (6 - 5) + 1);
memcpy(buf, name, len - 5);
memcpy(buf + len - 5, ".class", 7);
s = newstr(buf);
free(buf);
return s;
}
# |
Change |
User |
Description |
Committed |
|
#1
|
2634 |
Jan Mikkelsen |
Changes for the :C modifier, including documentation. |
|
|