Subversion Repositories wimsdev

Compare Revisions

Ignore whitespace Rev 12200 → Rev 12248

/trunk/wims/src/Misc/Plouffe.c
32,9 → 32,9
#define lang_no (sizeof(langs)/sizeof(langs[0]))
 
char *post_msg[lang_no]={
" <small>(click on a value to check its meaning in another window)</small> ",
" <small>(cliquez sur une valeur pour voir sa signification dans une autre fen&ecirc;tre)</small> ",
" <small>(ÔÚÊý×ÖÉϵ¥»÷¿É¹©ÄãÔÚÁíÒ»ÊÓ´°ÄÚ²éÔÄÆäÒâÒå)</small> "
" <small>(click on a value to check its meaning in another window)</small> ",
" <small>(cliquez sur une valeur pour voir sa signification dans une autre fen&ecirc;tre)</small> ",
" <small>(ÔÚÊý×ÖÉϵ¥»÷¿É¹©ÄãÔÚÁíÒ»ÊÓ´°ÄÚ²éÔÄÆäÒâÒå)</small> "
};
 
/***************** Nothing should need change hereafter *****************/
45,58 → 45,58
 
int getlang(void)
{
char *p;
int i;
p=getenv("w_module_language");
if(p==NULL || *p==0) p=getenv("w_lang");
if(p==NULL || *p==0) return 0; /* English is default */
for(i=0;i<lang_no && strcmp(p,langs[i])!=0;i++);
if(i<lang_no) return i; else return 0;
char *p;
int i;
p=getenv("w_module_language");
if(p==NULL || *p==0) p=getenv("w_lang");
if(p==NULL || *p==0) return 0; /* English is default */
for(i=0;i<lang_no && strcmp(p,langs[i])!=0;i++);
if(i<lang_no) return i; else return 0;
}
 
int main(int argc,char *argv[])
{
char *p,*pp,*p2,*p3,*ps,*last;
char buf[parmlim];
int i,got;
char *p,*pp,*p2,*p3,*ps,*last;
char buf[parmlim];
int i,got;
 
parm=getenv("wims_exec_parm");
parm=getenv("wims_exec_parm");
/* nothing to do if no parameter */
if(parm==NULL || *parm==0) return 0;
i=strlen(parm); if(i<0 || i>parmlim) {
fprintf(stderr,"Plouffe: parameter too long. \n"); exit(1);
}
got=0;
for(p=last=parm;*p!=0;p++) {
if(*p=='<') {
for(;*p!=0 && *p!='>'; p++);
if(*p==0) p--;
continue;
}
if(!isdigit(*p)) continue;
for(i=0,pp=p;isdigit(*pp) || *pp=='.';pp++) if(*pp=='.') i++;
if(i>1) { /* several decimal points. */
p=pp-1;continue;
}
for(p2=pp-1;p2>=p && (*p2=='.' || *p2=='0');p2--);
p2++;
for(i=0,p3=p;p3<p2 && *p3!='.';p3++);
for(i=0,ps=p;ps<p2 && (*ps=='0' || *ps=='.'); ps++);
if(p3>=p2 || p2<ps+Plouffe_min) {
p=pp-1;continue;
}
memmove(buf,last,p-last);buf[p-last]=0;
printf("%s",buf);last=p;
i=p2-p;if(i>Plouffe_max) i=Plouffe_max;
memmove(buf,p,i);buf[i]=0;
printf(WebPlouffe,buf);
memmove(buf,p,pp-p);buf[pp-p]=0;
printf("%s</a>",buf);last=pp;
got=1;p=pp-1;
if(parm==NULL || *parm==0) return 0;
i=strlen(parm); if(i<0 || i>parmlim) {
fprintf(stderr,"Plouffe: parameter too long. \n"); exit(1);
}
got=0;
for(p=last=parm;*p!=0;p++) {
if(*p=='<') {
for(;*p!=0 && *p!='>'; p++);
if(*p==0) p--;
continue;
}
if(*last!=0) printf("%s",last);
if(got) printf("%s",post_msg[getlang()]);
return 0;
if(!isdigit(*p)) continue;
for(i=0,pp=p;isdigit(*pp) || *pp=='.';pp++) if(*pp=='.') i++;
if(i>1) { /* several decimal points. */
p=pp-1;continue;
}
for(p2=pp-1;p2>=p && (*p2=='.' || *p2=='0');p2--);
p2++;
for(i=0,p3=p;p3<p2 && *p3!='.';p3++);
for(i=0,ps=p;ps<p2 && (*ps=='0' || *ps=='.'); ps++);
if(p3>=p2 || p2<ps+Plouffe_min) {
p=pp-1;continue;
}
memmove(buf,last,p-last);buf[p-last]=0;
printf("%s",buf);last=p;
i=p2-p;if(i>Plouffe_max) i=Plouffe_max;
memmove(buf,p,i);buf[i]=0;
printf(WebPlouffe,buf);
memmove(buf,p,pp-p);buf[pp-p]=0;
printf("%s</a>",buf);last=pp;
got=1;p=pp-1;
continue;
}
if(*last!=0) printf("%s",last);
if(got) printf("%s",post_msg[getlang()]);
return 0;
}
 
/trunk/wims/src/Misc/ccsum.c
31,8 → 31,8
#define MAX_LAPSE 15
 
struct {
char s[4], u[32];
int cl, start, end, cnt;
char s[4], u[32];
int cl, start, end, cnt;
} ses[MAX_SESSIONS];
int sescnt;
 
39,7 → 39,7
char *datestr;
 
struct cls {
int cl, cnt;
int cl, cnt;
} cls[MAX_CLASSES];
int clscnt;
 
48,156 → 48,157
static
void accessfile(char *content, char *type, char *s,...)
{
va_list vp;
char buf[MAX_LINELEN+1];
FILE *f;
int l;
va_list vp;
char buf[MAX_LINELEN+1];
FILE *f;
int l;
 
va_start(vp,s);
vsnprintf(buf,sizeof(buf),s,vp);
va_end(vp);
f=fopen(buf,type); if(f==NULL) {
if(*type=='r') content[0]=0;
return;
va_start(vp,s);
vsnprintf(buf,sizeof(buf),s,vp);
va_end(vp);
f=fopen(buf,type); if(f==NULL) {
if(*type=='r') content[0]=0;
return;
}
switch(*type) {
case 'a':
case 'w': {
l=strlen(content); fwrite(content,1,l,f); break;
}
switch(*type) {
case 'a':
case 'w': {
l=strlen(content); fwrite(content,1,l,f); break;
}
case 'r': {
l=fread(content,1,MAX_LINELEN-1,f);
if(l>0 && l<MAX_LINELEN) content[l]=0;
else content[0]=0;
break;
}
default: {
content[0]=0; break;
}
case 'r': {
l=fread(content,1,MAX_LINELEN-1,f);
if(l>0 && l<MAX_LINELEN) content[l]=0;
else content[0]=0;
break;
}
fclose(f);
default: {
content[0]=0; break;
}
}
fclose(f);
}
/* recursively generate a directory structure */
void mkdirs2(char *s)
{
struct stat st;
char *buf;
if(stat(s,&st)==-1) {
if(strrchr(s,'/')!=NULL) {
buf=xmalloc(strlen(s)+1);
ovlstrcpy(buf,s); *strrchr(buf,'/')=0;
mkdirs2(buf); free(buf);
}
mkdir(s,-1);
}
struct stat st;
char *buf;
if(stat(s,&st)==-1) {
if(strrchr(s,'/')!=NULL) {
buf=xmalloc(strlen(s)+1);
ovlstrcpy(buf,s); *strrchr(buf,'/')=0;
mkdirs2(buf); free(buf);
}
mkdir(s,-1);
}
}
 
static
void oneline(char *p)
{
char tbuf[8], sbuf[8], ubuf[256], cbuf[64];
char *p1, *p2;
int i,t,cl;
memmove(tbuf,p+9,6); tbuf[2]=tbuf[5]=0;
t=atoi(tbuf)*60+atoi(tbuf+3);
memmove(sbuf,p+18,4); sbuf[4]=0;
p1=strchr(p,','); if(p1==NULL) return;
if(!isdigit(*(p1+1))) return;
snprintf(cbuf,sizeof(cbuf),"%s",p1+1);
for(p2=cbuf;isdigit(*p2); p2++){};
*p2=0; cl=atoi(cbuf);
*p1=0; for(p1--;p1>p && !isspace(*(p1-1)); p1--);
snprintf(ubuf,sizeof(ubuf),"%s",p1);
for(i=0;i<sescnt;i++) {
char tbuf[8], sbuf[8], ubuf[256], cbuf[64];
char *p1, *p2;
int i,t,cl;
memmove(tbuf,p+9,6); tbuf[2]=tbuf[5]=0;
t=atoi(tbuf)*60+atoi(tbuf+3);
memmove(sbuf,p+18,4); sbuf[4]=0;
p1=strchr(p,','); if(p1==NULL) return;
if(!isdigit(*(p1+1))) return;
snprintf(cbuf,sizeof(cbuf),"%s",p1+1);
for(p2=cbuf;isdigit(*p2); p2++){};
*p2=0; cl=atoi(cbuf);
*p1=0; for(p1--;p1>p && !isspace(*(p1-1)); p1--);
snprintf(ubuf,sizeof(ubuf),"%s",p1);
for(i=0;i<sescnt;i++) {
if(cl==ses[i].cl && memcmp(sbuf,ses[i].s,4)==0 &&
ses[i].end>=t-MAX_LAPSE) {
ses[i].end=t; return;
ses[i].end>=t-MAX_LAPSE) {
ses[i].end=t; return;
}
}
if(sescnt>=MAX_SESSIONS) return;
memmove(ses[sescnt].s,sbuf,4); ses[sescnt].cl=cl;
ses[sescnt].start=ses[sescnt].end=t;
snprintf(ses[sescnt].u,sizeof(ses[sescnt].u),"%s",ubuf);
sescnt++;
}
if(sescnt>=MAX_SESSIONS) return;
memmove(ses[sescnt].s,sbuf,4); ses[sescnt].cl=cl;
ses[sescnt].start=ses[sescnt].end=t;
snprintf(ses[sescnt].u,sizeof(ses[sescnt].u),"%s",ubuf);
sescnt++;
}
 
void onefile(char *fname)
{
FILE *f;
long l;
char *fbuf, *p1, *p2, *p3;
l=filelength(fname); if(l<=0) return;
f=fopen(fname,"r"); if(f==NULL) return;
fbuf=xmalloc(l+16); (void)fread(fbuf,1,l,f); fclose(f); fbuf[l]=0;
for(p1=fbuf; *p1; p1=p2) {
p2=strchr(p1,'\n'); if(p2==NULL) p2=p1+strlen(p1); else *p2++=0;
p3=strchr(p1,','); if(p3==NULL) continue;
if(strncmp(p1,datestr,8)!=0) continue;
oneline(p1);
}
FILE *f;
long l;
char *fbuf, *p1, *p2, *p3;
l=filelength(fname); if(l<=0) return;
f=fopen(fname,"r"); if(f==NULL) return;
fbuf=xmalloc(l+16); (void)fread(fbuf,1,l,f); fclose(f); fbuf[l]=0;
for(p1=fbuf; *p1; p1=p2) {
p2=strchr(p1,'\n'); if(p2==NULL) p2=p1+strlen(p1); else *p2++=0;
p3=strchr(p1,','); if(p3==NULL) continue;
if(strncmp(p1,datestr,8)!=0) continue;
oneline(p1);
}
}
 
void classaccount(void)
{
int i,j;
clscnt=0;
for(i=0;i<sescnt;i++) {
ses[i].cnt=ses[i].end-ses[i].start+MIN_ADD;
if(ses[i].cnt<MIN_CONNECT) ses[i].cnt=MIN_CONNECT;
for(j=0;j<clscnt && ses[i].cl!=cls[j].cl;j++);
if(j<clscnt) cls[j].cnt+=ses[i].cnt;
else if(clscnt<MAX_CLASSES) {
cls[clscnt].cl=ses[i].cl;
cls[clscnt].cnt=ses[i].cnt;
clscnt++;
int i,j;
clscnt=0;
for(i=0;i<sescnt;i++) {
ses[i].cnt=ses[i].end-ses[i].start+MIN_ADD;
if(ses[i].cnt<MIN_CONNECT) ses[i].cnt=MIN_CONNECT;
for(j=0;j<clscnt && ses[i].cl!=cls[j].cl;j++);
if(j<clscnt) cls[j].cnt+=ses[i].cnt;
else
if(clscnt<MAX_CLASSES) {
cls[clscnt].cl=ses[i].cl;
cls[clscnt].cnt=ses[i].cnt;
clscnt++;
}
}
}
}
 
int clscmp(const void *c1, const void *c2)
{
struct cls *cl1, *cl2;
cl1=(struct cls *) c1; cl2=(struct cls *) c2;
return cl1->cl-cl2->cl;
struct cls *cl1, *cl2;
cl1=(struct cls *) c1; cl2=(struct cls *) c2;
return cl1->cl-cl2->cl;
}
 
void output(void)
{
char *p, buf[1024], dbuf[1024];
int i,t;
p=getenv("ccsum_outdir"); if(p==NULL || *p==0) return;
for(i=0;i<sescnt;i++) {
char *p, buf[1024], dbuf[1024];
int i,t;
p=getenv("ccsum_outdir"); if(p==NULL || *p==0) return;
for(i=0;i<sescnt;i++) {
snprintf(dbuf,sizeof(dbuf),"%s/%d",p,ses[i].cl);
mkdirs2(dbuf);
snprintf(buf,sizeof(buf),"%s.%02d:%02d %d\n",
datestr,ses[i].start/60,ses[i].start%60,ses[i].cnt);
datestr,ses[i].start/60,ses[i].start%60,ses[i].cnt);
accessfile(buf,"a","%s/%s",dbuf,ses[i].u);
}
snprintf(dbuf,sizeof(dbuf),"%s/bydate/%.4s",p,datestr);
mkdirs2(dbuf);
snprintf(dbuf+strlen(dbuf),sizeof(dbuf)-strlen(dbuf),"/%.2s",datestr+4);
t=0;
qsort(cls,clscnt,sizeof(cls[0]),clscmp);
for(i=0;i<clscnt;i++) {
}
snprintf(dbuf,sizeof(dbuf),"%s/bydate/%.4s",p,datestr);
mkdirs2(dbuf);
snprintf(dbuf+strlen(dbuf),sizeof(dbuf)-strlen(dbuf),"/%.2s",datestr+4);
t=0;
qsort(cls,clscnt,sizeof(cls[0]),clscmp);
for(i=0;i<clscnt;i++) {
snprintf(buf,sizeof(buf),"%s %d\n",datestr,cls[i].cnt);
accessfile(buf,"a","%s/%d/.total",p,cls[i].cl);
snprintf(buf,sizeof(buf),"%s %d %d\n",datestr+4,cls[i].cl,cls[i].cnt);
accessfile(buf,"a","%s",dbuf);
t+=cls[i].cnt;
}
snprintf(buf,sizeof(buf),"%s %d %d\n",datestr,t,(t+30)/60);
accessfile(buf,"a","%s/done",p);
}
snprintf(buf,sizeof(buf),"%s %d %d\n",datestr,t,(t+30)/60);
accessfile(buf,"a","%s/done",p);
}
 
int main(int argc, char *argv[])
{
sescnt=0;
if(argc<2) return 1;
datestr=getenv("ccsum_date");
if(datestr==NULL || strlen(datestr)!=8) return 2;
onefile(argv[1]);
classaccount();
output();
return 0;
sescnt=0;
if(argc<2) return 1;
datestr=getenv("ccsum_date");
if(datestr==NULL || strlen(datestr)!=8) return 2;
onefile(argv[1]);
classaccount();
output();
return 0;
}
 
/trunk/wims/src/Misc/chroot.c
51,14 → 51,14
time_t now;
 
char *env_rm[]={
"s2_dir", "w_wims_home", "session_base_dir", "trusted_module",
"session_dir", "wims_server_base", "w_httpd_PWD",
"w_wims_sesdir", "HTTP_CONNECTION",
"w_gnuplot_format", "w_insplot_font", "w_ins_anim_limit",
"w_ins_density", "w_ins_format",
"texgif_fontdir", "texgif_texheader",
"w_wims_tmp_debug", "w_insmath_logic", "w_insmath_rawmath",
"SERVER_ADMIN", "SERVER_ADDR", "SERVER_NAME"
"s2_dir", "w_wims_home", "session_base_dir", "trusted_module",
"session_dir", "wims_server_base", "w_httpd_PWD",
"w_wims_sesdir", "HTTP_CONNECTION",
"w_gnuplot_format", "w_insplot_font", "w_ins_anim_limit",
"w_ins_density", "w_ins_format",
"texgif_fontdir", "texgif_texheader",
"w_wims_tmp_debug", "w_insmath_logic", "w_insmath_rawmath",
"SERVER_ADMIN", "SERVER_ADDR", "SERVER_NAME"
};
 
#define env_rm_cnt (sizeof(env_rm)/sizeof(env_rm[0]))
82,179 → 82,178
/* Remove a tree */
int remove_tree(char *dirname)
{
DIR *sdir;
struct dirent *f;
struct stat dst;
DIR *sdir;
struct dirent *f;
struct stat dst;
 
sdir=opendir(dirname);
if(sdir==NULL) { /* Cannot open session directory. */
return -1;
sdir=opendir(dirname);
if(sdir==NULL) { /* Cannot open session directory. */
return -1;
}
while((f=readdir(sdir))!=NULL) {
char fname[255];
if(strcmp(".",f->d_name)==0 || strcmp("..",f->d_name)==0) continue;
snprintf(fname,sizeof(fname),"%s/%s",dirname,f->d_name);
if(lstat(fname,&dst)) continue;
if(S_ISDIR(dst.st_mode)) remove_tree(fname);
else {
if(remove(fname)<0)
fprintf(stderr,"ch..root: unable to remove %s. %s\n",fname,strerror(errno));
}
while((f=readdir(sdir))!=NULL) {
char fname[255];
if(strcmp(".",f->d_name)==0 || strcmp("..",f->d_name)==0) continue;
snprintf(fname,sizeof(fname),"%s/%s",dirname,f->d_name);
if(lstat(fname,&dst)) continue;
if(S_ISDIR(dst.st_mode)) remove_tree(fname);
else {
if(remove(fname)<0)
fprintf(stderr,"ch..root: unable to remove %s. %s\n",fname,strerror(errno));
}
}
closedir(sdir);
if(rmdir(dirname)<0) { /* Cannot remove directory. */
return -1;
}
return 0;
}
closedir(sdir);
if(rmdir(dirname)<0) { /* Cannot remove directory. */
return -1;
}
return 0;
}
 
/* Clean TMP */
void cleantmp(void)
{
DIR *sdir_base;
struct dirent *ses;
struct stat dst;
DIR *sdir_base;
struct dirent *ses;
struct stat dst;
 
if(chdir("../chroot/tmp/sessions")<0) return;
sdir_base=opendir(".");
if(sdir_base==NULL) return;
while((ses=readdir(sdir_base))!=NULL) {
if(ses->d_name[0]=='.') continue;
if(lstat(ses->d_name,&dst)) continue;
if(!S_ISDIR(dst.st_mode)) continue;
if(dst.st_mtime <= now) {
if(dst.st_mtime>=now-CLEAN_DELAY) continue;
if(dst.st_mtime>=now-CLEAN_DELAY2 && (dst.st_mode&S_IRWXO)==0) continue;
}
remove_tree(ses->d_name);
if(chdir("../chroot/tmp/sessions")<0) return;
sdir_base=opendir(".");
if(sdir_base==NULL) return;
while((ses=readdir(sdir_base))!=NULL) {
if(ses->d_name[0]=='.') continue;
if(lstat(ses->d_name,&dst)) continue;
if(!S_ISDIR(dst.st_mode)) continue;
if(dst.st_mtime <= now) {
if(dst.st_mtime>=now-CLEAN_DELAY) continue;
if(dst.st_mtime>=now-CLEAN_DELAY2 && (dst.st_mode&S_IRWXO)==0) continue;
}
remove_tree(ses->d_name);
}
}
 
/* Cleaning */
void cleaning(void)
{
DIR *sdir_base;
struct dirent *ses;
struct stat dst;
struct utimbuf ub;
char dbuf[256];
DIR *sdir_base;
struct dirent *ses;
struct stat dst;
struct utimbuf ub;
char dbuf[256];
 
if(stat(timestamp,&dst)==0 && dst.st_mtime==now) return;
ub.actime=ub.modtime=now; utime(timestamp,&ub);
sdir_base=opendir("/proc");
if(sdir_base==NULL) goto tmpdir;
while((ses=readdir(sdir_base))!=NULL) {
if(ses->d_name[0]<'0' || ses->d_name[9]>'9') continue;
snprintf(dbuf,sizeof(dbuf),"/proc/%s",ses->d_name);
if(lstat(dbuf,&dst)) continue;
if(!S_ISDIR(dst.st_mode)) continue;
if(dst.st_uid<UID_MIN || dst.st_uid>UID_MIN+UID_MASK) continue;
if(((dst.st_gid-UID_MIN-now)&TIME_MASK)<=CPU_MAX) continue;
kill(atoi(ses->d_name),SIGKILL);
}
closedir(sdir_base);
tmpdir: return;
if(stat(timestamp,&dst)==0 && dst.st_mtime==now) return;
ub.actime=ub.modtime=now; utime(timestamp,&ub);
sdir_base=opendir("/proc");
if(sdir_base==NULL) goto tmpdir;
while((ses=readdir(sdir_base))!=NULL) {
if(ses->d_name[0]<'0' || ses->d_name[9]>'9') continue;
snprintf(dbuf,sizeof(dbuf),"/proc/%s",ses->d_name);
if(lstat(dbuf,&dst)) continue;
if(!S_ISDIR(dst.st_mode)) continue;
if(dst.st_uid<UID_MIN || dst.st_uid>UID_MIN+UID_MASK) continue;
if(((dst.st_gid-UID_MIN-now)&TIME_MASK)<=CPU_MAX) continue;
kill(atoi(ses->d_name),SIGKILL);
}
closedir(sdir_base);
tmpdir: return;
}
 
/* Test Must */
int test_must(void)
{
char *pc;
if(must) return 1;
pc=getenv("chroot"); if(pc && strcmp(pc,"must")==0) return 1;
else return 0;
char *pc;
if(must) return 1;
pc=getenv("chroot"); if(pc && strcmp(pc,"must")==0) return 1;
else return 0;
}
 
/* MAIN */
int main(int argc,char *argv[])
{
char *args[1024];
char parm[MAX_PARMLEN];
char tmpbuf[256];
int i,k,uid,t;
struct stat st;
struct rlimit lim;
char *p, *pp;
char *args[1024];
char parm[MAX_PARMLEN];
char tmpbuf[256];
int i,k,uid,t;
struct stat st;
struct rlimit lim;
char *p, *pp;
 
if(argc<2) return 0;
now=time(NULL);
uid=geteuid();
t=stat("../chroot/tmp/sessions/.chroot",&st);
if(uid!=0 || t!=0) {
if(test_must()) goto abandon;
args[0]="bin/wrap..exec"; k=1;
if(argc<2) return 0;
now=time(NULL);
uid=geteuid();
t=stat("../chroot/tmp/sessions/.chroot",&st);
if(uid!=0 || t!=0) {
if(test_must()) goto abandon;
args[0]="bin/wrap..exec"; k=1;
}
else {
k=0;
p=getenv("REMOTE_ADDR");
if(p && *p) {
pp=strrchr(p,'.'); if(pp) execuid=(atoi(++pp)&UID_MASK)+UID_MIN;
}
else {
k=0;
p=getenv("REMOTE_ADDR");
if(p && *p) {
pp=strrchr(p,'.'); if(pp) execuid=(atoi(++pp)&UID_MASK)+UID_MIN;
}
getrlimit(RLIMIT_CPU,&lim);
i=lim.rlim_max; if(i<0) i=0; if(i>=CPU_MAX) i=CPU_MAX-1;
execgid=((i+now+1)&TIME_MASK)+UID_MIN;
cleaning();
getrlimit(RLIMIT_CPU,&lim);
i=lim.rlim_max; if(i<0) i=0; if(i>=CPU_MAX) i=CPU_MAX-1;
execgid=((i+now+1)&TIME_MASK)+UID_MIN;
cleaning();
}
if(argc>1 && strcmp(argv[1],"cleantmpdir")==0) {
if(uid!=0) fprintf(stderr,"ch..root cleantmpdir: uid not changed.\n");
else cleantmp();
return 0;
}
if(argc>3 && argv[1][0]=='&') {
if(k) goto abandon;
if(strcmp(argv[2],"sh")==0) {
lim.rlim_cur=lim.rlim_max=MAX_OUTLEN;
setrlimit(RLIMIT_FSIZE,&lim);
args[0]=name_sh; args[1]=opt_sh;
snprintf(parm,sizeof(parm),"%s\n%s\n",pre_sh,argv[3]);
args[2]=parm; args[3]=NULL; must=1;
goto cont;
}
if(argc>1 && strcmp(argv[1],"cleantmpdir")==0) {
if(uid!=0) fprintf(stderr,"ch..root cleantmpdir: uid not changed.\n");
else cleantmp();
return 0;
if(strcmp(argv[2],"perl")==0) {
lim.rlim_cur=lim.rlim_max=MAX_OUTLEN;
setrlimit(RLIMIT_FSIZE,&lim);
args[0]=name_perl; args[1]=opt_perl;
snprintf(parm,sizeof(parm),"%s\n%s\n",pre_perl,argv[3]);
args[2]=parm; args[3]=NULL; must=1;
goto cont;
}
if(argc>3 && argv[1][0]=='&') {
if(k) goto abandon;
if(strcmp(argv[2],"sh")==0) {
lim.rlim_cur=lim.rlim_max=MAX_OUTLEN;
setrlimit(RLIMIT_FSIZE,&lim);
args[0]=name_sh; args[1]=opt_sh;
snprintf(parm,sizeof(parm),"%s\n%s\n",pre_sh,argv[3]);
args[2]=parm; args[3]=NULL; must=1;
goto cont;
}
if(strcmp(argv[2],"perl")==0) {
lim.rlim_cur=lim.rlim_max=MAX_OUTLEN;
setrlimit(RLIMIT_FSIZE,&lim);
args[0]=name_perl; args[1]=opt_perl;
snprintf(parm,sizeof(parm),"%s\n%s\n",pre_perl,argv[3]);
args[2]=parm; args[3]=NULL; must=1;
goto cont;
}
goto abandon;
goto abandon;
}
for(i=0;i<1000 && i<argc; i++) args[i+k]=argv[i+1];
args[i]=NULL;
cont:
if(uid!=0) {
if(test_must()) goto abandon;
goto ex2;
}
if(t!=0) {
stat("bin",&st); execuid=execgid=st.st_uid;
if(test_must()) goto abandon;
goto ex;
}
if(chroot("../chroot")==0) {
(void)chdir("/tmp");
lim.rlim_cur=lim.rlim_max=PROC_QUOTA;
setrlimit(RLIMIT_NPROC,&lim);
setenv("PATH",chroot_path,1);
p=getenv("w_wims_session");
if(p && *p) {
snprintf(tmpbuf,sizeof(tmpbuf),"/tmp/sessions/%s",p);
p=strchr(tmpbuf,'_'); if(p) *p=0;
setenv("TMPDIR",tmpbuf,1);
setenv("tmp_dir",tmpbuf,1);
p=getenv("w_wims_priv_chroot");
if(p && strstr(p,"tmpdir")!=NULL)
(void)chdir(tmpbuf);
}
for(i=0;i<1000 && i<argc; i++) args[i+k]=argv[i+1];
args[i]=NULL;
cont:
if(uid!=0) {
if(test_must()) goto abandon;
goto ex2;
}
if(t!=0) {
stat("bin",&st); execuid=execgid=st.st_uid;
if(test_must()) goto abandon;
goto ex;
}
if(chroot("../chroot")==0) {
(void)chdir("/tmp");
lim.rlim_cur=lim.rlim_max=PROC_QUOTA;
setrlimit(RLIMIT_NPROC,&lim);
setenv("PATH",chroot_path,1);
p=getenv("w_wims_session");
if(p && *p) {
snprintf(tmpbuf,sizeof(tmpbuf),"/tmp/sessions/%s",p);
p=strchr(tmpbuf,'_'); if(p) *p=0;
setenv("TMPDIR",tmpbuf,1);
setenv("tmp_dir",tmpbuf,1);
p=getenv("w_wims_priv_chroot");
if(p && strstr(p,"tmpdir")!=NULL)
(void)chdir(tmpbuf);
}
}
else if(test_must()) goto abandon;
ex:
if(setregid(execgid,execgid)<0) goto abandon;
if(setreuid(execuid,execuid)<0) goto abandon;
ex2:
for(i=0;i<env_rm_cnt;i++) unsetenv(env_rm[i]);
if(strchr(args[0],'/')) execv(args[0],args); else execvp(args[0],args);
abandon: return 127;
}
else if(test_must()) goto abandon;
ex:
if(setregid(execgid,execgid)<0) goto abandon;
if(setreuid(execuid,execuid)<0) goto abandon;
ex2:
for(i=0;i<env_rm_cnt;i++) unsetenv(env_rm[i]);
if(strchr(args[0],'/')) execv(args[0],args); else execvp(args[0],args);
abandon: return 127;
}
 
/trunk/wims/src/Misc/clickzone.c
40,223 → 40,223
 
void fbase(void)
{
char *p, *m, *p1, *p2;
p=getenv("w_insdraw_filebase");
m=getenv("module_dir"); if(m==NULL) m="";
if(strncmp(m,"modules/",strlen("modules/"))!=0) {
snprintf(filebase,sizeof(filebase),"gifs"); return;
}
if(p==NULL || *p==0) {
if(strncmp(m,"modules/adm/",strlen("modules/adm"))==0)
snprintf(filebase,sizeof(filebase),"%s/insdraw gifs",m);
else
snprintf(filebase,sizeof(filebase),"%s gifs",m);
return;
}
for(p1=find_word_start(p); *p1; p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
if(strstr(p1,"..")!=NULL) continue;
snprintf(filebase+strlen(filebase),
sizeof(filebase)-strlen(filebase),
" %s/%s",m,p1);
}
char *p, *m, *p1, *p2;
p=getenv("w_insdraw_filebase");
m=getenv("module_dir"); if(m==NULL) m="";
if(strncmp(m,"modules/",strlen("modules/"))!=0) {
snprintf(filebase,sizeof(filebase),"gifs"); return;
}
if(p==NULL || *p==0) {
if(strncmp(m,"modules/adm/",strlen("modules/adm"))==0)
snprintf(filebase,sizeof(filebase),"%s/insdraw gifs",m);
else
snprintf(filebase,sizeof(filebase),"%s gifs",m);
return;
}
for(p1=find_word_start(p); *p1; p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
if(strstr(p1,"..")!=NULL) continue;
snprintf(filebase+strlen(filebase),
sizeof(filebase)-strlen(filebase),
" gifs");
" %s/%s",m,p1);
}
snprintf(filebase+strlen(filebase),
sizeof(filebase)-strlen(filebase),
" gifs");
}
 
/* File opening: with security */
FILE *open4read(char *n)
{
char *p, *p1, *p2;
int t;
FILE *f;
n=find_word_start(n);
if(*n==0) return NULL;
p=filebase;
p1=n+strlen(n)-4;if(p1<n || strcasecmp(p1,".gif")!=0) t=1; else t=0;
if(p!=NULL && *p!=0) {
char pbuf[MAX_LINELEN+1];
snprintf(pbuf,sizeof(pbuf),"%s",p);
p=find_word_start(pbuf); if(strstr(p,"..")!=NULL) return NULL;
if(*n=='/' || strstr(n,"..")!=NULL) return NULL;
char *p, *p1, *p2;
int t;
FILE *f;
n=find_word_start(n);
if(*n==0) return NULL;
p=filebase;
p1=n+strlen(n)-4;if(p1<n || strcasecmp(p1,".gif")!=0) t=1; else t=0;
if(p!=NULL && *p!=0) {
char pbuf[MAX_LINELEN+1];
snprintf(pbuf,sizeof(pbuf),"%s",p);
p=find_word_start(pbuf); if(strstr(p,"..")!=NULL) return NULL;
if(*n=='/' || strstr(n,"..")!=NULL) return NULL;
/* prohibit unusual file/dir names */
for(p1=p;*p1;p1++)
if(!isalnum(*p1) && !isspace(*p1) && strchr("~_-/.",*p1)==NULL)
return NULL;
for(p1=n;*p1;p1++)
if(!isalnum(*p1) && !isspace(*p1) && strchr("~_-/.",*p1)==NULL)
return NULL;
f=NULL;
for(p1=p; *p1; p1=find_word_start(p2)) {
if(*p1=='/') return NULL;
p2=find_word_end(p1);
if(*p2) *p2++=0;
snprintf(namebuf,sizeof(namebuf),"%s/%s",p1,n);
f=fopen(namebuf,"r"); if(f!=NULL) goto imgtype;
}
p1=getenv("w_wims_session");
if(p1!=NULL && strstr(p1,"..")==NULL && strncmp(n,"insert",6)==0) {
snprintf(namebuf,sizeof(namebuf),"../s2/%s/%s",p1,n);
f=fopen(namebuf,"r");
}
for(p1=p;*p1;p1++)
if(!isalnum(*p1) && !isspace(*p1) && strchr("~_-/.",*p1)==NULL)
return NULL;
for(p1=n;*p1;p1++)
if(!isalnum(*p1) && !isspace(*p1) && strchr("~_-/.",*p1)==NULL)
return NULL;
f=NULL;
for(p1=p; *p1; p1=find_word_start(p2)) {
if(*p1=='/') return NULL;
p2=find_word_end(p1);
if(*p2) *p2++=0;
snprintf(namebuf,sizeof(namebuf),"%s/%s",p1,n);
f=fopen(namebuf,"r"); if(f!=NULL) goto imgtype;
}
else {
snprintf(namebuf,sizeof(namebuf),"%s",n);
p1=getenv("w_wims_session");
if(p1!=NULL && strstr(p1,"..")==NULL && strncmp(n,"insert",6)==0) {
snprintf(namebuf,sizeof(namebuf),"../s2/%s/%s",p1,n);
f=fopen(namebuf,"r");
}
imgtype:
if(t && f!=NULL) {
char tbuf[1024],sbuf[4096];
fclose(f); f=NULL;
p1=getenv("TMPDIR"); if(p1==NULL || *p1==0) p1=".";
snprintf(tbuf,sizeof(tbuf),"%s/drawfile_.gif",p1);
snprintf(sbuf,sizeof(sbuf),"convert %s %s",namebuf,tbuf);
if (system(sbuf)) fprintf(stderr,"system failed");
f=fopen(tbuf,"r");
}
if(f!=NULL) snprintf(oldfile,sizeof(oldfile),"%s",n);
return f;
}
else {
snprintf(namebuf,sizeof(namebuf),"%s",n);
f=fopen(namebuf,"r");
}
imgtype:
if(t && f!=NULL) {
char tbuf[1024],sbuf[4096];
fclose(f); f=NULL;
p1=getenv("TMPDIR"); if(p1==NULL || *p1==0) p1=".";
snprintf(tbuf,sizeof(tbuf),"%s/drawfile_.gif",p1);
snprintf(sbuf,sizeof(sbuf),"convert %s %s",namebuf,tbuf);
if (system(sbuf)) fprintf(stderr,"system failed");
f=fopen(tbuf,"r");
}
if(f!=NULL) snprintf(oldfile,sizeof(oldfile),"%s",n);
return f;
}
 
int getvalue(char *p, int n)
{
int t;
char *p1;
if(n<0) n=VLEN;
for(t=0; t<n; t++,p=p1) {
p1=find_item_end(p); if(*p1) *p1++=0;
p=find_word_start(p);
if(*p==0) break;
v[t]=strevalue(p);
if(!isfinite(v[t])) exit(-1);
}
return t;
int t;
char *p1;
if(n<0) n=VLEN;
for(t=0; t<n; t++,p=p1) {
p1=find_item_end(p); if(*p1) *p1++=0;
p=find_word_start(p);
if(*p==0) break;
v[t]=strevalue(p);
if(!isfinite(v[t])) exit(-1);
}
return t;
}
 
/* test one condition. Returns 1 if met. */
int test(char *p)
{
char *p1;
int i,t;
double d;
p=find_word_start(p); p1=find_item_end(p);
if(*p1) *p1++=0; else exit(-1);
prec=0;
*p=tolower(*p);
if(strncasecmp(p,"polygon",3)==0 || *p=='g') {
int cross;
double x0,y0,a1,b1,c1,a2,b2,c2,s1,s2,s3,s4;
t=getvalue(p1,-1); if(t<6) exit(-1);
cross=0; x0=-19; y0=-19;
a1=clicky-y0;b1=x0-clickx;c1=clickx*y0-x0*clicky;
v[t]=v[0];v[t+1]=v[1];
for(i=2;i<t+2;i+=2) {
a2=v[i+1]-v[i-1];b2=v[i-2]-v[i];
c2=v[i]*v[i-1]-v[i-2]*v[i+1];
s1=a1*v[i-2]+b1*v[i-1]+c1;
s2=a1*v[i]+b1*v[i+1]+c1;
s3=a2*x0+b2*y0+c2;
s4=a2*clickx+b2*clicky+c2;
if(s1==0) continue;
if(s1*s2<=0 && s3*s4<=0) cross++;
}
return cross&1;
char *p1;
int i,t;
double d;
p=find_word_start(p); p1=find_item_end(p);
if(*p1) *p1++=0; else exit(-1);
prec=0;
*p=tolower(*p);
if(strncasecmp(p,"polygon",3)==0 || *p=='g') {
int cross;
double x0,y0,a1,b1,c1,a2,b2,c2,s1,s2,s3,s4;
t=getvalue(p1,-1); if(t<6) exit(-1);
cross=0; x0=-19; y0=-19;
a1=clicky-y0;b1=x0-clickx;c1=clickx*y0-x0*clicky;
v[t]=v[0];v[t+1]=v[1];
for(i=2;i<t+2;i+=2) {
a2=v[i+1]-v[i-1];b2=v[i-2]-v[i];
c2=v[i]*v[i-1]-v[i-2]*v[i+1];
s1=a1*v[i-2]+b1*v[i-1]+c1;
s2=a1*v[i]+b1*v[i+1]+c1;
s3=a2*x0+b2*y0+c2;
s4=a2*clickx+b2*clicky+c2;
if(s1==0) continue;
if(s1*s2<=0 && s3*s4<=0) cross++;
}
if(*p=='p' || strncasecmp(p,"point",3)==0) {
t=getvalue(p1,-1); if(t<2) exit(-1);
for(i=0;i<t;i+=2) {
d=sqrt(pow(v[i]-clickx,2)+pow(v[i+1]-clicky,2));
if(d<=4) return 1;
if(d<=7) {prec=1; return 1;}
}
return 0;
return cross&1;
}
if(*p=='p' || strncasecmp(p,"point",3)==0) {
t=getvalue(p1,-1); if(t<2) exit(-1);
for(i=0;i<t;i+=2) {
d=sqrt(pow(v[i]-clickx,2)+pow(v[i+1]-clicky,2));
if(d<=4) return 1;
if(d<=7) {prec=1; return 1;}
}
if(strncasecmp(p,"rectangle",1)==0) {
double x1,x2,y1,y2;
if(getvalue(p1,4)!=4) exit(-1);
x1=min(v[0],v[2]); x2=max(v[0],v[2]);
y1=min(v[1],v[3]); y2=max(v[1],v[3]);
if(clickx<x1 || clickx>x2 || clicky<y1 || clicky>y2) return 0;
else return 1;
}
if(strncasecmp(p,"circle",1)==0) {
double dist;
if(getvalue(p1,3)!=3 || v[2]<0) exit(-1);
dist=sqrt(pow(v[0]-clickx,2)+pow(v[1]-clicky,2));
if(dist>v[2]/2) return 0; else return 1;
}
if(strncasecmp(p,"ellipse",1)==0) {
double dist;
if(getvalue(p1,4)!=4) exit(-1);
if(v[2]<=0 || v[3]<=0) exit(-1);
dist=sqrt(pow(2*(v[0]-clickx)/v[2],2)+pow(2*(v[1]-clicky)/v[3],2));
if(dist>1) return 0; else return 1;
return 0;
}
if(strncasecmp(p,"bound",1)==0) {
char *p2;
FILE *f;
int c, T;
p2=find_item_end(p1); if(*p2) *p2++=0;
T=getvalue(p2,2); if(T!=2 && T!=0) exit(-1);
p1=find_word_start(p1); *find_word_end(p1)=0;
if(*p1==0) exit(-1);
if(strcmp(p1,oldfile)!=0) {
if(image) gdImageDestroy(image);
f=open4read(p1); if(f==NULL) exit(-1);
image=gdImageCreateFromGif(f); fclose(f);
if(T==0) {
testcolor=gdImageGetPixel(image,1,1);
}
else {
testcolor=gdImageColorAllocate(image,2,3,5);
gdImageFill(image,clickx,clicky,testcolor);
}
}
return 0;
}
if(strncasecmp(p,"rectangle",1)==0) {
double x1,x2,y1,y2;
if(getvalue(p1,4)!=4) exit(-1);
x1=min(v[0],v[2]); x2=max(v[0],v[2]);
y1=min(v[1],v[3]); y2=max(v[1],v[3]);
if(clickx<x1 || clickx>x2 || clicky<y1 || clicky>y2) return 0;
else return 1;
}
if(strncasecmp(p,"circle",1)==0) {
double dist;
if(getvalue(p1,3)!=3 || v[2]<0) exit(-1);
dist=sqrt(pow(v[0]-clickx,2)+pow(v[1]-clicky,2));
if(dist>v[2]/2) return 0; else return 1;
}
if(strncasecmp(p,"ellipse",1)==0) {
double dist;
if(getvalue(p1,4)!=4) exit(-1);
if(v[2]<=0 || v[3]<=0) exit(-1);
dist=sqrt(pow(2*(v[0]-clickx)/v[2],2)+pow(2*(v[1]-clicky)/v[3],2));
if(dist>1) return 0; else return 1;
return 0;
}
if(strncasecmp(p,"bound",1)==0) {
char *p2;
FILE *f;
int c, T;
p2=find_item_end(p1); if(*p2) *p2++=0;
T=getvalue(p2,2); if(T!=2 && T!=0) exit(-1);
p1=find_word_start(p1); *find_word_end(p1)=0;
if(*p1==0) exit(-1);
if(strcmp(p1,oldfile)!=0) {
if(image) gdImageDestroy(image);
f=open4read(p1); if(f==NULL) exit(-1);
image=gdImageCreateFromGif(f); fclose(f);
if(T==0) {
c=gdImageGetPixel(image,clickx,clicky);
if(c!=testcolor) return 1;
testcolor=gdImageGetPixel(image,1,1);
}
else {
c=gdImageGetPixel(image,v[0],v[1]);
if(c==testcolor) return 1;
testcolor=gdImageColorAllocate(image,2,3,5);
gdImageFill(image,clickx,clicky,testcolor);
}
return 0;
}
exit(-1);
if(T==0) {
c=gdImageGetPixel(image,clickx,clicky);
if(c!=testcolor) return 1;
}
else {
c=gdImageGetPixel(image,v[0],v[1]);
if(c==testcolor) return 1;
}
return 0;
}
exit(-1);
}
 
static
int oneline(char *p)
{
char *p1, *p2;
int t, rev;
char *p1, *p2;
int t, rev;
 
if(strparchr(p,'|')!=NULL) {
t=0; for(p1=p;p1;p1=p2) {
p2=strparchr(p1,'|'); if(p2!=NULL) *p2++=0;
t|=oneline(p1);
}
return t;
if(strparchr(p,'|')!=NULL) {
t=0; for(p1=p;p1;p1=p2) {
p2=strparchr(p1,'|'); if(p2!=NULL) *p2++=0;
t|=oneline(p1);
}
if(strparchr(p,'&')!=NULL) {
t=1; for(p1=p;p1;p1=p2) {
p2=strparchr(p1,'&'); if(p2!=NULL) *p2++=0;
t&=oneline(p1);
}
return t;
return t;
}
if(strparchr(p,'&')!=NULL) {
t=1; for(p1=p;p1;p1=p2) {
p2=strparchr(p1,'&'); if(p2!=NULL) *p2++=0;
t&=oneline(p1);
}
p1=find_word_start(p); rev=0;
if(*p1=='^') {
rev=1; p1=find_word_start(++p1);
}
if(*p1==0) return rev^1;
if(*p1=='(') {
p1++; p2=find_matching(p1,')');
if(p2==NULL) exit(-1);
*p2=0; return oneline(p1)^rev;
}
return t;
}
p1=find_word_start(p); rev=0;
if(*p1=='^') {
rev=1; p1=find_word_start(++p1);
}
if(*p1==0) return rev^1;
if(*p1=='(') {
p1++; p2=find_matching(p1,')');
if(p2==NULL) exit(-1);
*p2=0; return oneline(p1)^rev;
}
return test(p1)^rev;
}
 
263,21 → 263,21
/* Returns the number of lines matching the click coordinates */
int main()
{
char *p, *p2, *p3;
int i,j;
char *p, *p2, *p3;
int i,j;
 
fbase();
p=getenv("wims_exec_parm"); if(p==NULL || *p==0) return -1;
p=find_word_start(p); p2=strchr(p,'\n');
if(p2==NULL) p2=p+strlen(p); else *p2++=0;
p3=strchr(p,','); if(p3==NULL) return -1; else *p3++=0;
clickx=atoi(p); clicky=atoi(p3);
for(i=1,p=find_word_start(p2);*p;i++, p=find_word_start(p2)) {
fprintf(stderr,"Line %d.\n",i);
p2=strchr(p,'\n'); if(p2==NULL) p2=p+strlen(p); else *p2++=0;
if(*p==0) continue;
j=oneline(p);
if(j) {printf("%d %d",i,prec); return 0;}
}
printf("-1"); return 0;
fbase();
p=getenv("wims_exec_parm"); if(p==NULL || *p==0) return -1;
p=find_word_start(p); p2=strchr(p,'\n');
if(p2==NULL) p2=p+strlen(p); else *p2++=0;
p3=strchr(p,','); if(p3==NULL) return -1; else *p3++=0;
clickx=atoi(p); clicky=atoi(p3);
for(i=1,p=find_word_start(p2);*p;i++, p=find_word_start(p2)) {
fprintf(stderr,"Line %d.\n",i);
p2=strchr(p,'\n'); if(p2==NULL) p2=p+strlen(p); else *p2++=0;
if(*p==0) continue;
j=oneline(p);
if(j) {printf("%d %d",i,prec); return 0;}
}
printf("-1"); return 0;
}
/trunk/wims/src/Misc/cryptarith.c
35,241 → 35,239
/* Print the result */
void printresult(char curr[])
{
int i,j;
char ch;
for(i=0;i<linecnt;i++) {
for(j=0;j<charcnt[i];j++) {
ch=basetab[i][j];
if(ch==0) ch=' ';
else if(ch>='A' && ch<='Z') ch=curr[ch-'A'];
printf(" %d",ch);
}
printf("\n");
int i,j;
char ch;
for(i=0;i<linecnt;i++) {
for(j=0;j<charcnt[i];j++) {
ch=basetab[i][j];
if(ch==0) ch=' ';
else if(ch>='A' && ch<='Z') ch=curr[ch-'A'];
printf(" %d",ch);
}
printf("\n");
}
printf("\n");
}
 
/* returns 1 if OK, 0 if bad. */
int putvalue(char ch, char k, char curr[], char currb[])
{
int i=ch-'A';
if(ch==0) {
if(k>0) return 0; else return 1;
}
if((curr[i]!=-1 && curr[i]!=k) || (currb[k]!=0 && currb[k]!=ch))
return 0;
curr[i]=k;currb[k]=ch; return 1;
int i=ch-'A';
if(ch==0) {
if(k>0) return 0; else return 1;
}
if((curr[i]!=-1 && curr[i]!=k) || (currb[k]!=0 && currb[k]!=ch))
return 0;
curr[i]=k;currb[k]=ch; return 1;
}
 
/* check that leading number is not 0. Returns 0 if bad. */
int checklead(char curr[])
{
int i;
char ch;
for(i=0;i<linecnt;i++) {
ch=basetab[i][charcnt[i]-1];
if(curr[ch-'A']<=0) return 0;
}
return 1;
int i;
char ch;
for(i=0;i<linecnt;i++) {
ch=basetab[i][charcnt[i]-1];
if(curr[ch-'A']<=0) return 0;
}
return 1;
}
 
/* returns 0 if fail, 1 if OK. */
int colcompute(int c,char curr[],char currb[])
{
int i,j,k,sum;
char ch;
int i,j,k,sum;
char ch;
 
switch(style[1]) {
case '-':
case '+':
case '.': {
for(j=sum=0;j<linecnt;j++) {
if(!active[j]) continue;
ch=basetab[j][c];
if(ch!=0) {
if(style[j]!='-') sum+=curr[ch-'A'];
else sum-=curr[ch-'A'];
}
}
lastline:
sum+=carry[linecnt-1][c];
carry[linecnt-1][c+1]=(sum+10000)/10-1000; k=(sum+10000)%10;
return putvalue(basetab[linecnt-1][c],k,curr,currb);
switch(style[1]) {
case '-':
case '+':
case '.': {
for(j=sum=0;j<linecnt;j++) {
if(!active[j]) continue;
ch=basetab[j][c];
if(ch!=0) {
if(style[j]!='-') sum+=curr[ch-'A'];
else sum-=curr[ch-'A'];
}
}
lastline:
sum+=carry[linecnt-1][c];
carry[linecnt-1][c+1]=(sum+10000)/10-1000; k=(sum+10000)%10;
return putvalue(basetab[linecnt-1][c],k,curr,currb);
}
 
case '*': {
char c1,c2;
c2=basetab[0][c];
if(c2!=0) c2=curr[c2-'A'];
for(i=0;i<c && i<linecnt-3;i++) {
c1=basetab[1][i];
if(c2*c1!=0) sum=c2*curr[c1-'A']+carry[2+i][c];
else sum=carry[2+i][c];
carry[2+i][c+1]=sum/10;
if(!putvalue(basetab[2+i][c],sum%10,curr,currb))
return 0;
}
c2=basetab[1][c];
if(c2!=0) {
c2=curr[c2-'A'];
for(i=0;i<=c;i++) {
c1=basetab[0][i];
if(c1==0) break;
sum=c2*curr[c1-'A']+carry[2+c][i];
carry[2+c][i+1]=sum/10;
if(!putvalue(basetab[2+c][i],sum%10,curr,currb))
return 0;
}
}
for(i=sum=0;i<=c && i<linecnt-3;i++) {
ch=basetab[2+i][c-i];
if(ch!=0) sum+=curr[ch-'A'];
}
goto lastline;
case '*': {
char c1,c2;
c2=basetab[0][c];
if(c2!=0) c2=curr[c2-'A'];
for(i=0;i<c && i<linecnt-3;i++) {
c1=basetab[1][i];
if(c2*c1!=0) sum=c2*curr[c1-'A']+carry[2+i][c];
else sum=carry[2+i][c];
carry[2+i][c+1]=sum/10;
if(!putvalue(basetab[2+i][c],sum%10,curr,currb))
return 0;
}
c2=basetab[1][c];
if(c2!=0) {
c2=curr[c2-'A'];
for(i=0;i<=c;i++) {
c1=basetab[0][i];
if(c1==0) break;
sum=c2*curr[c1-'A']+carry[2+c][i];
carry[2+c][i+1]=sum/10;
if(!putvalue(basetab[2+c][i],sum%10,curr,currb))
return 0;
}
}
for(i=sum=0;i<=c && i<linecnt-3;i++) {
ch=basetab[2+i][c-i];
if(ch!=0) sum+=curr[ch-'A'];
}
goto lastline;
}
 
/* short multiplication */
case '$': {
char c1,c2;
for(j=sum=0;j<=c;j++) {
c1=basetab[0][j]; c2=basetab[1][c-j];
if(c1==0) break;
if(c2==0) continue;
sum+=curr[c1-'A']*curr[c2-'A'];
}
goto lastline;
case '$': {
char c1,c2;
for(j=sum=0;j<=c;j++) {
c1=basetab[0][j]; c2=basetab[1][c-j];
if(c1==0) break;
if(c2==0) continue;
sum+=curr[c1-'A']*curr[c2-'A'];
}
goto lastline;
}
 
 
default: return 0;
}
default: return 0;
}
}
 
void column(int c, char prev[], char prevb[])
{
char curr[32], currb[16];
int lreg[MAX_LINES],lfix[MAX_LINES];
int i,j,icarry;
char ch;
char curr[32], currb[16];
int lreg[MAX_LINES],lfix[MAX_LINES];
int i,j,icarry;
char ch;
 
memset(lreg,0,sizeof(lreg));
memset(lfix,0,sizeof(lfix));
memset(lreg,0,sizeof(lreg));
memset(lfix,0,sizeof(lfix));
 
for(i=0;i<linecnt;i++) {
if(!active[i]) continue;
ch=basetab[i][c];
if(ch==0 || prev[ch-'A']!=-1) lfix[i]=1;
}
for(icarry=0;;icarry=1) {
memmove(curr,prev,sizeof(curr));
memmove(currb,prevb,sizeof(currb));
for(i=0;i<linecnt;i++) {
if(!active[i]) continue;
ch=basetab[i][c];
if(ch==0 || prev[ch-'A']!=-1) lfix[i]=1;
if(!active[i] || lfix[i]) continue;
for(j=lreg[i]+icarry;j<10 && prevb[j]!=0;j++);
if(j>=10) {
for(j=0;j<10 && prevb[j]!=0;j++);
if(j>=10) return;
icarry=1;
}
else icarry=0;
lreg[i]=j;
}
for(icarry=0;;icarry=1) {
memmove(curr,prev,sizeof(curr));
memmove(currb,prevb,sizeof(currb));
for(i=0;i<linecnt;i++) {
if(!active[i] || lfix[i]) continue;
for(j=lreg[i]+icarry;j<10 && prevb[j]!=0;j++);
if(j>=10) {
for(j=0;j<10 && prevb[j]!=0;j++);
if(j>=10) return;
icarry=1;
}
else icarry=0;
lreg[i]=j;
if(icarry) break;
for(i=0;i<linecnt;i++) {
if(!active[i] || lfix[i]) continue;
if(!putvalue(basetab[i][c],lreg[i],curr,currb)) goto loopend;
}
if(!colcompute(c,curr,currb)) continue;
if(c<activelen-1) column(c+1,curr,currb);
else {
for(i=activelen;i<maxlen;i++) {
if(!colcompute(i,curr,currb)) goto loopend;
}
if(icarry) break;
for(i=0;i<linecnt;i++) {
if(!active[i] || lfix[i]) continue;
if(!putvalue(basetab[i][c],lreg[i],curr,currb)) goto loopend;
if(active[i]) continue;
if(carry[i][maxlen]) goto loopend;
}
if(!colcompute(c,curr,currb)) continue;
if(c<activelen-1) column(c+1,curr,currb);
else {
for(i=activelen;i<maxlen;i++) {
if(!colcompute(i,curr,currb)) goto loopend;
}
for(i=0;i<linecnt;i++) {
if(active[i]) continue;
if(carry[i][maxlen]) goto loopend;
}
if(!checklead(curr)) goto loopend;
total++;
printresult(curr);
}
loopend:
if(!checklead(curr)) goto loopend;
total++;
printresult(curr);
}
loopend:
}
}
 
int main(int argc, char *argv[])
{
char *p,*p2,*p3;
int i;
input=getenv("wims_exec_parm");
char *p,*p2,*p3;
int i;
input=getenv("wims_exec_parm");
/* nothing to do if no problem */
if(input==NULL || *input==0) return 0;
if(input==NULL || *input==0) return 0;
 
memset(basetab,0,sizeof(basetab));
memset(corresp,-1,sizeof(corresp));
memset(bcorresp,0,sizeof(bcorresp));
memset(carry,0,sizeof(carry));
memset(active,0,sizeof(active));
memset(basetab,0,sizeof(basetab));
memset(corresp,-1,sizeof(corresp));
memset(bcorresp,0,sizeof(bcorresp));
memset(carry,0,sizeof(carry));
memset(active,0,sizeof(active));
 
for(p=input+strlen(input);p>input && isspace(*(p-1));p--);
*p=0;
activelen=maxlen=0;
active[0]=active[1]=1;
for(linecnt=0,p=input;*p!=0 && linecnt<MAX_LINES;p=p3) {
p2=strchr(p,'\n');
if(p2==NULL) {
p2=p+strlen(p);p3=p2;
}
else p3=p2+1;
for(p=input+strlen(input);p>input && isspace(*(p-1));p--);
*p=0;
activelen=maxlen=0;
active[0]=active[1]=1;
for(linecnt=0,p=input;*p!=0 && linecnt<MAX_LINES;p=p3) {
p2=strchr(p,'\n');
if(p2==NULL) {
p2=p+strlen(p);p3=p2;
}
else p3=p2+1;
while(isspace(*p)) p++;
if(strchr("+-*/=.",*p)!=NULL) {
style[linecnt]=*p;p++;
while(isspace(*p)) p++;
if(strchr("+-*/=.",*p)!=NULL) {
style[linecnt]=*p;p++;
while(isspace(*p)) p++;
}
else style[linecnt]='+';
if(*p3==0) style[linecnt]='=';
if(linecnt>1) {
switch(style[1]) {
case '+':
case '-': {
if(*p3!=0) active[linecnt]=1;
break;
}
}
else style[linecnt]='+';
if(*p3==0) style[linecnt]='=';
if(linecnt>1) {
switch(style[1]) {
case '+':
case '-': {
if(*p3!=0) active[linecnt]=1;
break;
}
 
case '*':
case '/':
case '=':
break;
}
}
while(p2>p && isspace(*(p2-1))) p2--;
if(p2>p+MAX_CHARS) p2=p+MAX_CHARS;
*p2=0;
if(p2<=p) continue;
for(i=0;i<p2-p;i++) {
char ch;
ch=toupper(*(p2-i-1));
case '*':
case '/':
case '=':
break;
}
}
while(p2>p && isspace(*(p2-1))) p2--;
if(p2>p+MAX_CHARS) p2=p+MAX_CHARS;
*p2=0;
if(p2<=p) continue;
for(i=0;i<p2-p;i++) {
char ch;
ch=toupper(*(p2-i-1));
/* bad char */
if(ch<'A' || ch>'Z') return 1;
basetab[linecnt][i]=ch;
}
charcnt[linecnt]=p2-p;
if(active[linecnt] && p2-p>activelen) activelen=p2-p;
if(p2-p>maxlen) maxlen=p2-p;
linecnt++;
if(ch<'A' || ch>'Z') return 1;
basetab[linecnt][i]=ch;
}
charcnt[linecnt]=p2-p;
if(active[linecnt] && p2-p>activelen) activelen=p2-p;
if(p2-p>maxlen) maxlen=p2-p;
linecnt++;
}
/* multiplication */
if(style[1]=='*') {
if(linecnt==3) style[1]='$';
else {
if(linecnt!=charcnt[1]+3) return 1;
for(i=3;i<linecnt-1;i++)
if(charcnt[i]+i-2>maxlen) maxlen=charcnt[i]+i-2;
}
if(style[1]=='*') {
if(linecnt==3) style[1]='$';
else {
if(linecnt!=charcnt[1]+3) return 1;
for(i=3;i<linecnt-1;i++)
if(charcnt[i]+i-2>maxlen) maxlen=charcnt[i]+i-2;
}
}
 
column(0,corresp,bcorresp);
printf("\n!total %d solution(s).\n\n",total);
return 0;
column(0,corresp,bcorresp);
printf("\n!total %d solution(s).\n\n",total);
return 0;
}
 
/trunk/wims/src/Misc/curvecomp.c
58,8 → 58,8
double dist1, dist2, max1, max2, ratio1, ratio2, rep1, rep2;
double djump1, djump2;
struct cv {
int x,y, closest, rep;
double dist;
int x,y, closest, rep;
double dist;
} cv1[pointlim], cv2[pointlim];
int points1,points2;
 
71,186 → 71,187
 
void reverse(struct cv *cvbuf, int cnt)
{
int i;
struct cv cvt;
for(i=0;i<cnt/2;i++) {
memmove(&cvt,cvbuf+i,sizeof(cvt));
memmove(cvbuf+i,cvbuf+(cnt-i-1),sizeof(cvt));
memmove(cvbuf+(cnt-i-1),&cvt,sizeof(cvt));
}
int i;
struct cv cvt;
for(i=0;i<cnt/2;i++) {
memmove(&cvt,cvbuf+i,sizeof(cvt));
memmove(cvbuf+i,cvbuf+(cnt-i-1),sizeof(cvt));
memmove(cvbuf+(cnt-i-1),&cvt,sizeof(cvt));
}
}
 
int str2list(char *p, int lim)
{
char *p2;
for(p2=strchr(p,';'); p2; p2=strchr(p2+1,';')) *p2=',';
for(listcnt=0; p && listcnt<lim; p=p2) {
p2=strchr(p,','); if(p2!=NULL) *p2++=0;
p=find_word_start(p); if(*p==0) continue;
listbuf[listcnt++]=atoi(p);
}
return listcnt;
char *p2;
for(p2=strchr(p,';'); p2; p2=strchr(p2+1,';')) *p2=',';
for(listcnt=0; p && listcnt<lim; p=p2) {
p2=strchr(p,','); if(p2!=NULL) *p2++=0;
p=find_word_start(p); if(*p==0) continue;
listbuf[listcnt++]=atoi(p);
}
return listcnt;
}
 
int list2curve(struct cv *cvbuf)
{
int i, j, m, t, st, xx, yy, x2, y2, x3, y3, ll;
int i, j, m, t, st, xx, yy, x2, y2, x3, y3, ll;
 
ll=listcnt/2; if(ll<2) return 0;
xx=listbuf[0]; yy=listbuf[1];
j=0; if(xx>=bx[0] && xx<=bx[1] && yy>=by[0] && yy<=by[1]) {
cvbuf[0].x=xx; cvbuf[0].y=yy; j++;
}
for(i=1; i<ll && j<pointlim; i++) {
x2=listbuf[2*i]; y2=listbuf[2*i+1];
m=Max(Abs(x2-xx),Abs(y2-yy)); if(m<=0) continue;
if(discrete==1) st=m; else st=1;
for(t=st; t<=m && j<pointlim; t++) {
x3=(double) (x2*t+xx*(m-t))/m+0.5;
y3=(double) (y2*t+yy*(m-t))/m+0.5;
if(x3>=bx[0] && x3<=bx[1] && y3>=by[0] && y3<=by[1]) {
cvbuf[j].x=x3; cvbuf[j].y=y3; cvbuf[j].dist=-1;
cvbuf[j].rep=0; j++;
}
ll=listcnt/2; if(ll<2) return 0;
xx=listbuf[0]; yy=listbuf[1];
j=0; if(xx>=bx[0] && xx<=bx[1] && yy>=by[0] && yy<=by[1]) {
cvbuf[0].x=xx; cvbuf[0].y=yy; j++;
}
for(i=1; i<ll && j<pointlim; i++) {
x2=listbuf[2*i]; y2=listbuf[2*i+1];
m=Max(Abs(x2-xx),Abs(y2-yy)); if(m<=0) continue;
if(discrete==1) st=m; else st=1;
for(t=st; t<=m && j<pointlim; t++) {
x3=(double) (x2*t+xx*(m-t))/m+0.5;
y3=(double) (y2*t+yy*(m-t))/m+0.5;
if(x3>=bx[0] && x3<=bx[1] && y3>=by[0] && y3<=by[1]) {
cvbuf[j].x=x3; cvbuf[j].y=y3; cvbuf[j].dist=-1;
cvbuf[j].rep=0; j++;
}
xx=x2; yy=y2;
}
return j;
xx=x2; yy=y2;
}
return j;
}
 
void compare(void)
{
int i, j, cl;
double d, dt;
int i, j, cl;
double d, dt;
 
d=2*pointlim; cl=-1;
for(i=0,djump1=1;i<points1-1;i++) {
dt=sqrt(pow(cv1[i].x-cv1[i+1].x,2)+pow(cv1[i].y-cv1[i+1].y,2));
if(dt>djump1) djump1=dt;
d=2*pointlim; cl=-1;
for(i=0,djump1=1;i<points1-1;i++) {
dt=sqrt(pow(cv1[i].x-cv1[i+1].x,2)+pow(cv1[i].y-cv1[i+1].y,2));
if(dt>djump1) djump1=dt;
}
for(i=0,djump2=1;i<points2-1;i++) {
dt=sqrt(pow(cv2[i].x-cv2[i+1].x,2)+pow(cv2[i].y-cv2[i+1].y,2));
if(dt>djump2) djump2=dt;
}
for(i=0;i<points1;i++) {
for(j=0;j<points2;j++) {
dt=sqrt(pow(cv2[j].x-cv1[i].x,2)+pow(cv2[j].y-cv1[i].y,2));
if(dt<d) {d=dt; cl=j;}
else {dt=(dt-d)/djump2; if(dt>2) j+=dt-1;}
}
for(i=0,djump2=1;i<points2-1;i++) {
dt=sqrt(pow(cv2[i].x-cv2[i+1].x,2)+pow(cv2[i].y-cv2[i+1].y,2));
if(dt>djump2) djump2=dt;
cv1[i].dist=d; cv1[i].closest=cl;
if(i<points1)
d+=sqrt(pow(cv1[i].x-cv1[i+1].x,2)+pow(cv1[i].y-cv1[i+1].y,2))+0.1;
}
d=2*pointlim;
for(i=0;i<points2;i++) {
for(j=0;j<points1;j++) {
dt=sqrt(pow(cv1[j].x-cv2[i].x,2)+pow(cv1[j].y-cv2[i].y,2));
if(dt<d) {d=dt; cl=j;}
else {dt=(dt-d)/djump1; if(dt>2) j+=dt-1;}
}
for(i=0;i<points1;i++) {
for(j=0;j<points2;j++) {
dt=sqrt(pow(cv2[j].x-cv1[i].x,2)+pow(cv2[j].y-cv1[i].y,2));
if(dt<d) {d=dt; cl=j;}
else {dt=(dt-d)/djump2; if(dt>2) j+=dt-1;}
}
cv1[i].dist=d; cv1[i].closest=cl;
if(i<points1)
d+=sqrt(pow(cv1[i].x-cv1[i+1].x,2)+pow(cv1[i].y-cv1[i+1].y,2))+0.1;
}
d=2*pointlim; for(i=0;i<points2;i++) {
for(j=0;j<points1;j++) {
dt=sqrt(pow(cv1[j].x-cv2[i].x,2)+pow(cv1[j].y-cv2[i].y,2));
if(dt<d) {d=dt; cl=j;}
else {dt=(dt-d)/djump1; if(dt>2) j+=dt-1;}
}
cv2[i].dist=d; cv2[i].closest=cl;
if(i<points2)
d+=sqrt(pow(cv2[i].x-cv2[i+1].x,2)+pow(cv2[i].y-cv2[i+1].y,2))+0.1;
}
for(i=1, cl=cv1[0].closest;i<points1;i++) {
j=cv1[i].closest; if(j!=cl) cv2[j].rep++;
cl=j;
}
for(i=1, cl=cv2[0].closest;i<points2;i++) {
j=cv2[i].closest; if(j!=cl) cv1[j].rep++;
cl=j;
}
for(i=cl=0; i<points1; i++) if(cv1[i].rep>1) cl+=cv1[i].rep-1;
rep1=(double) cl/points1;
for(i=cl=0; i<points1; i++) if(cv2[i].rep>1) cl+=cv2[i].rep-1;
rep2=(double) cl/points2;
cv2[i].dist=d; cv2[i].closest=cl;
if(i<points2)
d+=sqrt(pow(cv2[i].x-cv2[i+1].x,2)+pow(cv2[i].y-cv2[i+1].y,2))+0.1;
}
for(i=1, cl=cv1[0].closest;i<points1;i++) {
j=cv1[i].closest; if(j!=cl) cv2[j].rep++;
cl=j;
}
for(i=1, cl=cv2[0].closest;i<points2;i++) {
j=cv2[i].closest; if(j!=cl) cv1[j].rep++;
cl=j;
}
for(i=cl=0; i<points1; i++) if(cv1[i].rep>1) cl+=cv1[i].rep-1;
rep1=(double) cl/points1;
for(i=cl=0; i<points1; i++) if(cv2[i].rep>1) cl+=cv2[i].rep-1;
rep2=(double) cl/points2;
}
 
void check(void)
{
int i,j,xret1,yret1,xret2,yret2;
int xx,yy,xmin,xmax,ymin,ymax;
double d;
max1=max2=0;
for(i=j=0,d=0;i<points1;i++) {
if(cv1[i].dist<=tol) j++;
d+=pow(cv1[i].dist,4);
if(max1<cv1[i].dist) max1=cv1[i].dist;
}
ratio1=(double) j/points1; dist1=pow(d/points1,0.25)*1.8;
for(i=j=0,d=0;i<points2;i++) {
if(cv2[i].dist<=tol) j++;
d+=pow(cv2[i].dist,4);
if(max2<cv2[i].dist) max2=cv2[i].dist;
}
ratio2=(double) j/points2; dist2=pow(d/points2,0.25)*1.8;
xret1=xret2=yret1=yret2=0;
xmin=xmax=cv2[0].x; ymin=ymax=cv2[0].y;
for(i=1;i<points2;i++) {
xx=cv2[i].x; yy=cv2[i].y;
xret1=Max(xret1,xmax-xx); xret2=Max(xret2,xx-xmin);
yret1=Max(yret1,ymax-yy); yret2=Max(yret2,yy-ymin);
xmin=Min(xx,xmin);xmax=Max(xx,xmax);
ymin=Min(yy,ymin);ymax=Max(yy,ymax);
}
if(Min(xret1,xret2)<=2) xfn=1;
if(Min(yret1,yret2)<=2) yfn=1;
int i,j,xret1,yret1,xret2,yret2;
int xx,yy,xmin,xmax,ymin,ymax;
double d;
max1=max2=0;
for(i=j=0,d=0;i<points1;i++) {
if(cv1[i].dist<=tol) j++;
d+=pow(cv1[i].dist,4);
if(max1<cv1[i].dist) max1=cv1[i].dist;
}
ratio1=(double) j/points1; dist1=pow(d/points1,0.25)*1.8;
for(i=j=0,d=0;i<points2;i++) {
if(cv2[i].dist<=tol) j++;
d+=pow(cv2[i].dist,4);
if(max2<cv2[i].dist) max2=cv2[i].dist;
}
ratio2=(double) j/points2; dist2=pow(d/points2,0.25)*1.8;
xret1=xret2=yret1=yret2=0;
xmin=xmax=cv2[0].x; ymin=ymax=cv2[0].y;
for(i=1;i<points2;i++) {
xx=cv2[i].x; yy=cv2[i].y;
xret1=Max(xret1,xmax-xx); xret2=Max(xret2,xx-xmin);
yret1=Max(yret1,ymax-yy); yret2=Max(yret2,yy-ymin);
xmin=Min(xx,xmin);xmax=Max(xx,xmax);
ymin=Min(yy,ymin);ymax=Max(yy,ymax);
}
if(Min(xret1,xret2)<=2) xfn=1;
if(Min(yret1,yret2)<=2) yfn=1;
}
 
void output(void)
{
printf("%.2f %.2f %.2f %.2f \
printf("%.2f %.2f %.2f %.2f \
%.3f %.3f %.1f %.1f \
%.3f %.3f",
dist1, dist2, max1, max2,
ratio1, ratio2, djump1, djump2,
rep1, rep2);
if(xfn) printf(" fx");
if(yfn) printf(" fy");
if(xfn) printf(" fx");
if(yfn) printf(" fy");
}
 
void test(void)
{
int i;
for(i=0;i<points1;i++) printf("%d,%d,%d,%.2f\n",
cv1[i].x,cv1[i].y,cv1[i].closest,cv1[i].dist);
printf("\n");
for(i=0;i<points2;i++) printf("%d,%d,%d,%.2f\n",
cv2[i].x,cv2[i].y,cv2[i].closest,cv2[i].dist);
printf("\n");
int i;
for(i=0;i<points1;i++) printf("%d,%d,%d,%.2f\n",
cv1[i].x,cv1[i].y,cv1[i].closest,cv1[i].dist);
printf("\n");
for(i=0;i<points2;i++) printf("%d,%d,%d,%.2f\n",
cv2[i].x,cv2[i].y,cv2[i].closest,cv2[i].dist);
printf("\n");
}
 
int main(int argc, char *argv[])
{
int i;
char *c1, *c2, *op;
c1=getenv("w_curvecomp_1"); c2=getenv("w_curvecomp_2");
int i;
char *c1, *c2, *op;
c1=getenv("w_curvecomp_1"); c2=getenv("w_curvecomp_2");
/* nothing to do */
if(c1==NULL || c2==NULL || *c1==0 || *c2==0) return 0;
snprintf(curve1,sizeof(curve1),"%s",c1);
snprintf(curve2,sizeof(curve2),"%s",c2);
bx[0]=by[0]=bx[1]=by[1]=-1;
c1=getenv("w_curvecomp_xrange"); c2=getenv("w_curvecomp_yrange");
if(c1!=NULL && *c1!=0) {
str2list(c1,2); for(i=0;i<listcnt;i++) bx[i]=listbuf[i];
}
if(c2!=NULL && *c2!=0) {
str2list(c2,2); for(i=0;i<listcnt;i++) by[i]=listbuf[i];
}
op=getenv("w_curvecomp_option"); if(op==NULL) op="";
if(bx[0]==-1) bx[0]=0;
if(bx[1]==-1) bx[1]=pointlim;
if(by[0]==-1) by[0]=0;
if(by[1]==-1) by[1]=pointlim;
c1=getenv("w_curvecomp_tolerance");
if(c1!=NULL && *c1!=0) tol=atoi(c1);
tol=Min(30,Max(5,tol));
if(c1==NULL || c2==NULL || *c1==0 || *c2==0) return 0;
snprintf(curve1,sizeof(curve1),"%s",c1);
snprintf(curve2,sizeof(curve2),"%s",c2);
bx[0]=by[0]=bx[1]=by[1]=-1;
c1=getenv("w_curvecomp_xrange"); c2=getenv("w_curvecomp_yrange");
if(c1!=NULL && *c1!=0) {
str2list(c1,2); for(i=0;i<listcnt;i++) bx[i]=listbuf[i];
}
if(c2!=NULL && *c2!=0) {
str2list(c2,2); for(i=0;i<listcnt;i++) by[i]=listbuf[i];
}
op=getenv("w_curvecomp_option"); if(op==NULL) op="";
if(bx[0]==-1) bx[0]=0;
if(bx[1]==-1) bx[1]=pointlim;
if(by[0]==-1) by[0]=0;
if(by[1]==-1) by[1]=pointlim;
c1=getenv("w_curvecomp_tolerance");
if(c1!=NULL && *c1!=0) tol=atoi(c1);
tol=Min(30,Max(5,tol));
 
if(strstr(op,"discrete1")!=NULL) discrete=1; else discrete=0;
str2list(curve1,pointlim*2); points1=list2curve(cv1);
if(strstr(op,"discrete2")!=NULL) discrete=1; else discrete=0;
str2list(curve2,pointlim*2); points2=list2curve(cv2);
if(points1<2 || points2<2) return 0;
compare(); check(); output();
return 0;
if(strstr(op,"discrete1")!=NULL) discrete=1; else discrete=0;
str2list(curve1,pointlim*2); points1=list2curve(cv1);
if(strstr(op,"discrete2")!=NULL) discrete=1; else discrete=0;
str2list(curve2,pointlim*2); points2=list2curve(cv2);
if(points1<2 || points2<2) return 0;
compare(); check(); output();
return 0;
}
/trunk/wims/src/Misc/cyclicode.c
35,41 → 35,41
 
void errorquit(char *msg)
{
fprintf(stderr,"%s\n",msg); exit(1);
fprintf(stderr,"%s\n",msg); exit(1);
}
 
int main(int argc, char *argv[])
{
char *parm, *p1, *p2, c1, c2;
char pbuf[1024];
int i,j,k;
double dt;
char *parm, *p1, *p2, c1, c2;
char pbuf[1024];
int i,j,k;
double dt;
 
parm=getenv("wims_exec_parm");
if(parm==NULL || *parm==0) errorquit("no_parameter");
snprintf(pbuf,sizeof(pbuf),"%s",parm);
p1=find_word_start(pbuf); p2=find_word_end(p1);
if(*p2!=0) *p2++=0;
ch=atoi(p1); p1=find_word_start(p2);
if(ch!=2 && ch!=3 && ch!=5 && ch!=7) errorquit("bad_characteristics");
p2=find_word_end(p1); if(*p2!=0) *p2++=0;
p2=find_word_start(p2); *find_word_end(p2)=0;
degree=strlen(p1);
if(degree!=strlen(p2)) errorquit("unequal_degrees");
if(degree>MAX_DEGREE) errorquit("degree_too_high");
dt=pow(ch,degree);
if(dt>=(double) MAX_LENGTH) errorquit("length_overflow");
length=dt-1-degree;
for(i=0;i<degree;i++) {
c1=*(p1+i); c2=*(p2+i);
if(!isdigit(c1) || c1>=ch+'0') errorquit("bad_polynomial");
if(!isdigit(c2) || c2>=ch+'0') errorquit("bad_chain");
poly[i]=ch-(c1-'0'); chain[i]=c2-'0';
}
for(i=0;i<length;i++) {
for(j=k=0;j<degree;k+=poly[j]*chain[j],j++);
k%=ch; printf("%d",k);
memmove(chain,chain+1,degree-1); chain[degree-1]=k;
}
return 0;
parm=getenv("wims_exec_parm");
if(parm==NULL || *parm==0) errorquit("no_parameter");
snprintf(pbuf,sizeof(pbuf),"%s",parm);
p1=find_word_start(pbuf); p2=find_word_end(p1);
if(*p2!=0) *p2++=0;
ch=atoi(p1); p1=find_word_start(p2);
if(ch!=2 && ch!=3 && ch!=5 && ch!=7) errorquit("bad_characteristics");
p2=find_word_end(p1); if(*p2!=0) *p2++=0;
p2=find_word_start(p2); *find_word_end(p2)=0;
degree=strlen(p1);
if(degree!=strlen(p2)) errorquit("unequal_degrees");
if(degree>MAX_DEGREE) errorquit("degree_too_high");
dt=pow(ch,degree);
if(dt>=(double) MAX_LENGTH) errorquit("length_overflow");
length=dt-1-degree;
for(i=0;i<degree;i++) {
c1=*(p1+i); c2=*(p2+i);
if(!isdigit(c1) || c1>=ch+'0') errorquit("bad_polynomial");
if(!isdigit(c2) || c2>=ch+'0') errorquit("bad_chain");
poly[i]=ch-(c1-'0'); chain[i]=c2-'0';
}
for(i=0;i<length;i++) {
for(j=k=0;j<degree;k+=poly[j]*chain[j],j++);
k%=ch; printf("%d",k);
memmove(chain,chain+1,degree-1); chain[degree-1]=k;
}
return 0;
}
/trunk/wims/src/Misc/dicsort.c
36,8 → 36,8
char dicname[1024], suffixname[1024];
 
struct entry {
char *original;
char *replace;
char *original;
char *replace;
} entry[entrylim];
int entrycount;
 
46,43 → 46,44
 
int compare(const void *s1, const void *s2)
{
const struct entry *p1, *p2;
p1=s1; p2=s2;
if(nocase) return strcasecmp(p1->original,p2->original);
else return strcmp(p1->original,p2->original);
const struct entry *p1, *p2;
p1=s1; p2=s2;
if(nocase) return strcasecmp(p1->original,p2->original);
else return strcmp(p1->original,p2->original);
}
 
void sortdic(void)
{
qsort(entry,entrycount,sizeof(entry[0]),compare);
qsort(entry,entrycount,sizeof(entry[0]),compare);
}
 
/* change all spaces into ' ', and collapse multiple occurences */
void singlespace2(char *p)
{
char *pp, *p2;
for(pp=p;*pp;pp++) {
if(!isspace(*pp)) continue;
if(leaveline) {
if(*pp==13) ovlstrcpy(pp,pp+1);
if(*pp=='\n') {
pp++;
gopt: for(p2=pp; isspace(*p2) && *p2!='\n'; p2++);
if(p2>pp) ovlstrcpy(pp,p2);
pp--;
}
else {
pp++; if(!isspace(*pp) || *pp=='\n') continue;
goto gopt;
}
char *pp, *p2;
for(pp=p;*pp;pp++) {
if(!isspace(*pp)) continue;
if(leaveline) {
if(*pp==13) ovlstrcpy(pp,pp+1);
if(*pp=='\n') {
pp++;
gopt: for(p2=pp; isspace(*p2) && *p2!='\n'; p2++);
if(p2>pp) ovlstrcpy(pp,p2);
pp--;
}
else {
if(*pp!=' ') *pp=' ';
pp++; if(!isspace(*pp)) continue;
for(p2=pp;isspace(*p2);p2++);
ovlstrcpy(pp,p2); pp--;
pp++;
if(!isspace(*pp) || *pp=='\n') continue;
goto gopt;
}
}
else {
if(*pp!=' ') *pp=' ';
pp++; if(!isspace(*pp)) continue;
for(p2=pp;isspace(*p2);p2++);
ovlstrcpy(pp,p2); pp--;
}
}
}
 
/* Prepare dictionary */
89,80 → 90,79
static
void prepare_dics(void)
{
int i;
FILE *dicf;
char *p1, *p2, *pp;
long int flen;
int i;
FILE *dicf;
char *p1, *p2, *pp;
long int flen;
 
entrycount=0;
dicf=fopen(dicname,"r"); if(dicf==NULL) return;
fseek(dicf,0,SEEK_END);flen=ftell(dicf); fseek(dicf,0,SEEK_SET);
if(flen>diclim) return;
dicbuf=xmalloc(2*flen+1024);flen=fread(dicbuf,1,flen,dicf);
fclose(dicf);
if(flen>0 && flen<diclim) dicbuf[flen]=0;
else return;
for(i=0,p1=dicbuf;p1!=NULL && *p1!=0 && i<entrylim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,sepchar); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
entry[i].original=p1; entry[i].replace=pp; i++;
}
entrycount=i;
entrycount=0;
dicf=fopen(dicname,"r"); if(dicf==NULL) return;
fseek(dicf,0,SEEK_END);flen=ftell(dicf); fseek(dicf,0,SEEK_SET);
if(flen>diclim) return;
dicbuf=xmalloc(2*flen+1024);flen=fread(dicbuf,1,flen,dicf);
fclose(dicf);
if(flen>0 && flen<diclim) dicbuf[flen]=0;
else return;
for(i=0,p1=dicbuf;p1!=NULL && *p1!=0 && i<entrylim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,sepchar); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
entry[i].original=p1; entry[i].replace=pp; i++;
}
entrycount=i;
}
 
void output(void)
{
int i;
FILE *f;
int i;
FILE *f;
 
ocount=0;
strcat(dicname,".sorted");
f=fopen(dicname,"w"); if(f==NULL) return;
for(i=0;i<entrycount;i++) {
if(i>0 && strcmp(entry[i].original,entry[i-1].original)==0
&& strcmp(entry[i].replace,entry[i-1].replace)==0)
continue;
if(grpchar!=0) {
if(i>0 && strcmp(entry[i].original,entry[i-1].original)==0)
fprintf(f,"%c%s",grpchar, entry[i].replace);
else {
if(i>0) fprintf(f,"\n");
fprintf(f,"%s%c%s",entry[i].original,sepchar,entry[i].replace);
ocount++;
}
 
}
ocount=0;
strcat(dicname,".sorted");
f=fopen(dicname,"w"); if(f==NULL) return;
for(i=0;i<entrycount;i++) {
if(i>0 && strcmp(entry[i].original,entry[i-1].original)==0
&& strcmp(entry[i].replace,entry[i-1].replace)==0)
continue;
if(grpchar!=0) {
if(i>0 && strcmp(entry[i].original,entry[i-1].original)==0)
fprintf(f,"%c%s",grpchar, entry[i].replace);
else {
fprintf(f,"%s%c%s\n",entry[i].original,sepchar,entry[i].replace);
ocount++;
if(i>0) fprintf(f,"\n");
fprintf(f,"%s%c%s",entry[i].original,sepchar,entry[i].replace);
ocount++;
}
}
if(grpchar!=0) fprintf(f,"\n");
fclose(f);
else {
fprintf(f,"%s%c%s\n",entry[i].original,sepchar,entry[i].replace);
ocount++;
}
}
if(grpchar!=0) fprintf(f,"\n");
fclose(f);
}
 
int main(int argc, char *argv[])
{
char *ss, *gr;
if(argc<2) return -1;
char *ss, *gr;
if(argc<2) return -1;
 
ss=getenv("dicsort_separator");
if(ss!=NULL && *ss!=0) sepchar=*ss;
gr=getenv("dicsort_grouping");
if(gr!=NULL && *gr!=0) grpchar=*gr;
snprintf(dicname,sizeof(dicname)-128,"%s",argv[1]); prepare_dics();
if(argc>2) {
snprintf(suffixname,sizeof(suffixname),"%s",argv[2]);
suffix_dic(suffixname); hassuffix=1;
}
else suffixname[0]=hassuffix=0;
sortdic(); output();
printf("%s: sorted %d entries.\n",dicname, ocount);
return 0;
ss=getenv("dicsort_separator");
if(ss!=NULL && *ss!=0) sepchar=*ss;
gr=getenv("dicsort_grouping");
if(gr!=NULL && *gr!=0) grpchar=*gr;
snprintf(dicname,sizeof(dicname)-128,"%s",argv[1]); prepare_dics();
if(argc>2) {
snprintf(suffixname,sizeof(suffixname),"%s",argv[2]);
suffix_dic(suffixname); hassuffix=1;
}
else suffixname[0]=hassuffix=0;
sortdic(); output();
printf("%s: sorted %d entries.\n",dicname, ocount);
return 0;
}
 
/trunk/wims/src/Misc/ftype.c
33,53 → 33,52
/* get the file */
void prepare_file(void)
{
FILE *f;
long int flen;
FILE *f;
long int flen;
 
filelen=0;
f=fopen(filename,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen>0 && flen<buflim) filebuf[flen]=0; else flen=0;
filelen=flen;
filelen=0;
f=fopen(filename,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen>0 && flen<buflim) filebuf[flen]=0; else flen=0;
filelen=flen;
}
 
int main(int argc, char *argv[])
{
char *ftype="text";
char *p;
char *mod, *unt;
char *ftype="text";
char *p;
char *mod, *unt;
 
unt=getenv("untrust");
if(unt!=NULL && strcasecmp(unt,"yes")==0) return 1;
mod=getenv("w_module");
if(mod==NULL) p=argv[1]; else p=getenv("wims_exec_parm");
if(p==NULL || *p==0) return 1;
snprintf(filename,sizeof(filename)-128,"%s",p);
prepare_file();
for(p=filebuf;p<filebuf+filelen;p++) {
if((*p>=0 && *p<=6) || (127&*p)<=1)
{ftype="binary"; goto fin;}
unt=getenv("untrust");
if(unt!=NULL && strcasecmp(unt,"yes")==0) return 1;
mod=getenv("w_module");
if(mod==NULL) p=argv[1]; else p=getenv("wims_exec_parm");
if(p==NULL || *p==0) return 1;
snprintf(filename,sizeof(filename)-128,"%s",p);
prepare_file();
for(p=filebuf;p<filebuf+filelen;p++) {
if((*p>=0 && *p<=6) || (127&*p)<=1)
{ftype="binary"; goto fin;}
}
for(p=strchr(filebuf,'<'); p!=NULL; p=strchr(p,'<')) {
p++;
if((strncasecmp(p,"body",4)==0 && !isalnum(*(p+4))) ||
(strncasecmp(p,"html",4)==0 && !isalnum(*(p+4))) ||
(strncasecmp(p,"img",3)==0 && isspace(*(p+3))) ||
strncasecmp(p,"p>",2)==0 ||
strncasecmp(p,"/a>",3)==0) {
ftype="html"; goto fin;
}
for(p=strchr(filebuf,'<'); p!=NULL; p=strchr(p,'<')) {
p++;
if((strncasecmp(p,"body",4)==0 && !isalnum(*(p+4))) ||
(strncasecmp(p,"html",4)==0 && !isalnum(*(p+4))) ||
(strncasecmp(p,"img",3)==0 && isspace(*(p+3))) ||
strncasecmp(p,"p>",2)==0 ||
strncasecmp(p,"/a>",3)==0) {
ftype="html"; goto fin;
}
}
if(strstr(filebuf,"\\begin{")!=NULL ||
strstr(filebuf,"\\end{")!=NULL ||
(strchr(filebuf,'$')!=NULL && strchr(filebuf,'\\')!=NULL &&
strchr(filebuf,'{')!=NULL)) {
ftype="latex"; goto fin;
}
fin: printf("%s",ftype);
return 0;
}
if(strstr(filebuf,"\\begin{")!=NULL ||
strstr(filebuf,"\\end{")!=NULL ||
(strchr(filebuf,'$')!=NULL && strchr(filebuf,'\\')!=NULL &&
strchr(filebuf,'{')!=NULL)) {
ftype="latex"; goto fin;
}
fin: printf("%s",ftype);
return 0;
}
 
/trunk/wims/src/Misc/html2msg.c
56,222 → 56,222
 
char *find_tag_end(char *p)
{
char *pp, *old;
pp=p; if(*pp=='<') pp++;
for(; *pp && *pp!='>'; pp++) {
if(*pp=='"') {
pp=strchr(pp+1,'"');
if(pp==NULL) {pp=p+strlen(p); break;} else continue;
}
char *pp, *old;
pp=p; if(*pp=='<') pp++;
for(; *pp && *pp!='>'; pp++) {
if(*pp=='"') {
pp=strchr(pp+1,'"');
if(pp==NULL) {pp=p+strlen(p); break;} else continue;
}
}
/* this is probably an syntax error of the page */
if(*pp==0 && pp>p+2048) {
old=p; if(*old=='<') old++;
pp=strchr(old,'>');
if(pp==NULL) pp=strchr(old,'<');
if(pp==NULL) pp=find_word_end(find_word_start(old));
}
if(*pp=='>') pp++;
return pp;
if(*pp==0 && pp>p+2048) {
old=p; if(*old=='<') old++;
pp=strchr(old,'>');
if(pp==NULL) pp=strchr(old,'<');
if(pp==NULL) pp=find_word_end(find_word_start(old));
}
if(*pp=='>') pp++;
return pp;
}
 
char *find_tag(char *p, char *tag)
{
char *pp;
int len;
len=strlen(tag);
for(pp=strchr(p,'<'); pp!=NULL && *pp; pp=strchr(pp+1,'<')) {
if(strncasecmp(pp+1,tag,len)==0 && !isalnum(*(pp+1+len))) return pp;
}
return p+strlen(p);
char *pp;
int len;
len=strlen(tag);
for(pp=strchr(p,'<'); pp!=NULL && *pp; pp=strchr(pp+1,'<')) {
if(strncasecmp(pp+1,tag,len)==0 && !isalnum(*(pp+1+len))) return pp;
}
return p+strlen(p);
}
 
void cutamp(char *p)
{
char *pp;
for(pp=strchr(p,'&'); pp; pp=strchr(pp+1,'&')) {
if(strncmp(pp,"&amp;",5)==0) {
ovlstrcpy(pp+1,pp+5); continue;
}
if(strncmp(pp,"&lt;",4)==0) {
*pp='<'; ovlstrcpy(pp+1,pp+4); continue;
}
if(strncmp(pp,"&gt;",4)==0) {
*pp='>'; ovlstrcpy(pp+1,pp+4); continue;
}
char *pp;
for(pp=strchr(p,'&'); pp; pp=strchr(pp+1,'&')) {
if(strncmp(pp,"&amp;",5)==0) {
ovlstrcpy(pp+1,pp+5); continue;
}
if(strncmp(pp,"&lt;",4)==0) {
*pp='<'; ovlstrcpy(pp+1,pp+4); continue;
}
if(strncmp(pp,"&gt;",4)==0) {
*pp='>'; ovlstrcpy(pp+1,pp+4); continue;
}
 
}
}
}
 
/* get the file */
void prepare_file(void)
{
FILE *f;
long int flen;
FILE *f;
long int flen;
 
filelen=0;
f=fopen(fn1,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen<0 || flen>=buflim) flen=0;
filebuf[flen]=0;
filelen=flen;
outf=fopen(fn2,"w"); if(outf==NULL) return;
filelen=0;
f=fopen(fn1,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen<0 || flen>=buflim) flen=0;
filebuf[flen]=0;
filelen=flen;
outf=fopen(fn2,"w"); if(outf==NULL) return;
}
 
void getmath(char *p)
{
char *pt, *pv;
char *p1, *p2, buf[256];
char *pt, *pv;
char *p1, *p2, buf[256];
 
mathbuf[0]=0;
pt=find_word_start(p);
if(strncmp(pt,"\\begin{displaymath}",
strlen("\\begin{displaymath}"))==0) {
pt=strchr(pt,'}')+1;
pv=strstr(pt,"\\end{displaymath}");
if(pv==NULL) return;
goto insmath;
mathbuf[0]=0;
pt=find_word_start(p);
if(strncmp(pt,"\\begin{displaymath}",
strlen("\\begin{displaymath}"))==0) {
pt=strchr(pt,'}')+1;
pv=strstr(pt,"\\end{displaymath}");
if(pv==NULL) return;
goto insmath;
}
if(*pt=='%') pt=strchr(pt,'$');
if(pt==NULL) return;
if(*pt!='$') return;
do pt++; while(*pt=='$');
pv=strchr(pt,'$'); if(pv==NULL) return;
insmath: if(pv-pt>=MAX_LINELEN-256) return;
memmove(mathbuf,pt,pv-pt); mathbuf[pv-pt]=0;
if(strstr(mathbuf,"...\n...")!=NULL) {
ovlstrcpy(mathbuf,"......"); return;
}
cutamp(mathbuf); latex2html=1;
for(p1=strstr(mathbuf,"\\mathbb");p1;p1=strstr(p1+1,"\\mathbb")) {
char c,*d;
p2=find_word_start(p1+strlen("\\mathbb")); c=0;
if(strchr("NZQRC",*p2)!=NULL) c=*p2;
else
if(*p2=='{' && *(p2+2)=='}' && strchr("NZQRC",*(p2+1))!=NULL) {
c=*(p2+1); p2+=2;
}
if(c) {
p2=find_word_start(++p2);
if(isalnum(*p2)) d=" "; else d="";
string_modify(mathbuf,p1,p2,"\\%c%c%s",c,c,d);
}
if(*pt=='%') pt=strchr(pt,'$');
if(pt==NULL) return;
if(*pt!='$') return;
do pt++; while(*pt=='$');
pv=strchr(pt,'$'); if(pv==NULL) return;
insmath: if(pv-pt>=MAX_LINELEN-256) return;
memmove(mathbuf,pt,pv-pt); mathbuf[pv-pt]=0;
if(strstr(mathbuf,"...\n...")!=NULL) {
ovlstrcpy(mathbuf,"......"); return;
}
cutamp(mathbuf); latex2html=1;
for(p1=strstr(mathbuf,"\\mathbb");p1;p1=strstr(p1+1,"\\mathbb")) {
char c,*d;
p2=find_word_start(p1+strlen("\\mathbb")); c=0;
if(strchr("NZQRC",*p2)!=NULL) c=*p2;
else if(*p2=='{' && *(p2+2)=='}' && strchr("NZQRC",*(p2+1))!=NULL) {
c=*(p2+1); p2+=2;
}
for(p1=strstr(mathbuf,"{\\"); p1; p1=strstr(p1+1,"{\\")) {
if(p1>mathbuf && isalpha(*(p1-1))) continue;
for(p2=p1+2; p2<p1+24 && isalpha(*p2); p2++);
if(*p2!='}' || isalnum(*(p2+1))) continue;
memmove(buf,p1+1,p2-p1-1); buf[p2-p1-1]='\\'; buf[p2-p1]=0;
if(strstr(hmsame,buf)==NULL) continue;
ovlstrcpy(p2,p2+1); ovlstrcpy(p1,p1+1);
}
if(strstr(mathbuf,"\\begin{")!=NULL) return;
for(p1=strchr(mathbuf,'{'); p1; p1=strchr(p1+1,'{')) {
if((p1>mathbuf && isalpha(*(p1-1))) ||
!isalnum(*(p1+1)) || *(p1+2)!='}') continue;
*p1=*(p1+1); ovlstrcpy(p1+1,p1+3);
}
if(strchr(mathbuf,'[')!=NULL) {
char mbuf[MAX_LINELEN+1];
snprintf(mbuf,sizeof(mbuf),"{%s}",mathbuf);
ovlstrcpy(mathbuf,mbuf);
}
/* try to simplify */
if(strchr(mathbuf,'{')==NULL && strchr(mathbuf,'\\')!=NULL) {
int i, tt;
tt=0;
for(p1=strchr(mathbuf,'\\'); p1; p1=strchr(p1+1,'\\')) {
for(p2=p1+1;isalpha(*p2);p2++);
if(p2==p1+1 || p2>p1+24) {tt=1; break;}
memmove(buf,p1,p2-p1);buf[p2-p1]='\\';buf[p2-p1+1]=0;
for(i=0;i<backtransno && strcmp(buf,backtrans[i].name)!=0;i++);
if(i>=backtransno && strstr(hmsame,buf)==NULL) {
tt=1; break;
}
if(c) {
p2=find_word_start(++p2);
if(isalnum(*p2)) d=" "; else d="";
string_modify(mathbuf,p1,p2,"\\%c%c%s",c,c,d);
}
}
for(p1=strstr(mathbuf,"{\\"); p1; p1=strstr(p1+1,"{\\")) {
if(p1>mathbuf && isalpha(*(p1-1))) continue;
for(p2=p1+2; p2<p1+24 && isalpha(*p2); p2++);
if(*p2!='}' || isalnum(*(p2+1))) continue;
memmove(buf,p1+1,p2-p1-1); buf[p2-p1-1]='\\'; buf[p2-p1]=0;
if(strstr(hmsame,buf)==NULL) continue;
ovlstrcpy(p2,p2+1); ovlstrcpy(p1,p1+1);
}
if(strstr(mathbuf,"\\begin{")!=NULL) return;
for(p1=strchr(mathbuf,'{'); p1; p1=strchr(p1+1,'{')) {
if((p1>mathbuf && isalpha(*(p1-1))) ||
!isalnum(*(p1+1)) || *(p1+2)!='}') continue;
*p1=*(p1+1); ovlstrcpy(p1+1,p1+3);
}
if(strchr(mathbuf,'[')!=NULL) {
char mbuf[MAX_LINELEN+1];
snprintf(mbuf,sizeof(mbuf),"{%s}",mathbuf);
ovlstrcpy(mathbuf,mbuf);
}
/* try to simplify */
if(strchr(mathbuf,'{')==NULL && strchr(mathbuf,'\\')!=NULL) {
int i, tt;
tt=0;
if(tt==0) {
for(p1=strchr(mathbuf,'\\'); p1; p1=strchr(p1+1,'\\')) {
for(p2=p1+1;isalpha(*p2);p2++);
if(p2==p1+1 || p2>p1+24) {tt=1; break;}
memmove(buf,p1,p2-p1);buf[p2-p1]='\\';buf[p2-p1+1]=0;
for(i=0;i<backtransno && strcmp(buf,backtrans[i].name)!=0;i++);
if(i>=backtransno && strstr(hmsame,buf)==NULL) {
tt=1; break;
}
for(p2=p1+1;isalpha(*p2);p2++);
if(p2==p1+1 || p2>p1+24) break;
memmove(buf,p1,p2-p1);buf[p2-p1]='\\';buf[p2-p1+1]=0;
for(i=0;i<backtransno && strcmp(buf,backtrans[i].name)!=0;i++);
if(i<backtransno)
string_modify(buf,p1,p2,backtrans[i].trans);
else *p1=' ';
}
if(tt==0) {
for(p1=strchr(mathbuf,'\\'); p1; p1=strchr(p1+1,'\\')) {
for(p2=p1+1;isalpha(*p2);p2++);
if(p2==p1+1 || p2>p1+24) break;
memmove(buf,p1,p2-p1);buf[p2-p1]='\\';buf[p2-p1+1]=0;
for(i=0;i<backtransno && strcmp(buf,backtrans[i].name)!=0;i++);
if(i<backtransno)
string_modify(buf,p1,p2,backtrans[i].trans);
else *p1=' ';
}
}
}
}
}
 
void output(void)
{
char *p, *pp, *p2, *pt;
char buf[MAX_LINELEN+1];
p=filebuf;
restart:
pp=find_tag(p,"body"); if(*pp!=0) {
p=find_tag_end(pp); goto restart;
char *p, *pp, *p2, *pt;
char buf[MAX_LINELEN+1];
p=filebuf;
restart:
pp=find_tag(p,"body");
if(*pp!=0) {
p=find_tag_end(pp); goto restart;
}
pp=find_tag(p,"html");
if(*pp!=0) {
p=find_tag_end(pp); goto restart;
}
*find_tag(p,"/body")=0; *find_tag(p,"/html")=0;
for(pp=strstr(p,"\n\n"); pp; pp=strstr(pp+1,"\n\n")) *pp=' ';
for(pp=strchr(p,'<');pp!=NULL;pp=strchr(find_tag_end(pp),'<')) {
if(pp>p) {fwrite(p,1,pp-p,outf); p=pp;}
if(latex2html && strncasecmp(pp,"<br><hr>",8)==0 &&
*find_word_start(pp+8)==0) break;
if(strncasecmp(pp+1,"!-- MATH",8)==0) {
p2=strstr(pp+8,"-->"); if(p2==NULL) continue;
*p2=0; getmath(pp+9); *p2='-';
p=p2+3; pt=find_word_start(p);
if(mathbuf[0] && strncasecmp(pt,"<IMG",4)==0 && isspace(*(pt+4))) {
p=find_tag_end(pt); pp=pt;
fprintf(outf,"\\(%s\\)",mathbuf);
}
continue;
}
pp=find_tag(p,"html"); if(*pp!=0) {
p=find_tag_end(pp); goto restart;
if(strncasecmp(pp+1,"a",1)==0 && isspace(*(pp+2))) {
continue;
}
*find_tag(p,"/body")=0; *find_tag(p,"/html")=0;
for(pp=strstr(p,"\n\n"); pp; pp=strstr(pp+1,"\n\n")) *pp=' ';
for(pp=strchr(p,'<');pp!=NULL;pp=strchr(find_tag_end(pp),'<')) {
if(pp>p) {fwrite(p,1,pp-p,outf); p=pp;}
if(latex2html && strncasecmp(pp,"<br><hr>",8)==0 &&
*find_word_start(pp+8)==0) break;
if(strncasecmp(pp+1,"!-- MATH",8)==0) {
p2=strstr(pp+8,"-->"); if(p2==NULL) continue;
*p2=0; getmath(pp+9); *p2='-';
p=p2+3; pt=find_word_start(p);
if(mathbuf[0] && strncasecmp(pt,"<IMG",4)==0 && isspace(*(pt+4))) {
p=find_tag_end(pt); pp=pt;
fprintf(outf,"\\(%s\\)",mathbuf);
}
continue;
if(strncasecmp(pp+1,"img",3)==0 && isspace(*(pp+4))) {
p2=find_tag_end(pp);
if(p2-pp>=MAX_LINELEN-256) continue;
memmove(buf,pp+1,p2-pp-2); buf[p2-pp-2]=0;
pt=strstr(buf,"ALT=\""); if(pt==NULL) pt=strstr(buf,"alt=\"");
if(pt!=NULL) {
pt+=strlen("ALT=\"");
getmath(pt); if(mathbuf[0]) {
fprintf(outf,"\\(%s\\)",mathbuf); p=p2;
}
}
if(strncasecmp(pp+1,"a",1)==0 && isspace(*(pp+2))) {
 
 
 
continue;
}
if(strncasecmp(pp+1,"img",3)==0 && isspace(*(pp+4))) {
p2=find_tag_end(pp);
if(p2-pp>=MAX_LINELEN-256) continue;
memmove(buf,pp+1,p2-pp-2); buf[p2-pp-2]=0;
pt=strstr(buf,"ALT=\""); if(pt==NULL) pt=strstr(buf,"alt=\"");
if(pt!=NULL) {
pt+=strlen("ALT=\"");
getmath(pt); if(mathbuf[0]) {
fprintf(outf,"\\(%s\\)",mathbuf); p=p2;
}
}
}
}
if(pp==NULL) fprintf(outf,"%s",p);
}
if(pp==NULL) fprintf(outf,"%s",p);
}
 
int main(int argc, char *argv[])
{
char *p, *pp;
char *mod;
char *p, *pp;
char *mod;
 
mod=getenv("w_module");
if(mod!=NULL && strncmp(mod,"adm/",4)!=0 && strcmp(mod,"home")!=0) return 1;
if(mod==NULL) p=argv[1]; else p=getenv("wims_exec_parm");
if(p==NULL || *p==0) return 1;
p=find_word_start(p); pp=find_word_end(p);
if(pp<=p || pp-p>sizeof(fn1)-1) return 1;
memmove(fn1,p,pp-p); fn1[pp-p]=0;
p=find_word_start(pp); pp=find_word_end(p);
if(pp<=p || pp-p>sizeof(fn2)-1) ovlstrcpy(fn2,fn1);
else {memmove(fn2,p,pp-p); fn2[pp-p]=0;}
prepare_file();
output();
fclose(outf);
return 0;
mod=getenv("w_module");
if(mod!=NULL && strncmp(mod,"adm/",4)!=0 && strcmp(mod,"home")!=0) return 1;
if(mod==NULL) p=argv[1]; else p=getenv("wims_exec_parm");
if(p==NULL || *p==0) return 1;
p=find_word_start(p); pp=find_word_end(p);
if(pp<=p || pp-p>sizeof(fn1)-1) return 1;
memmove(fn1,p,pp-p); fn1[pp-p]=0;
p=find_word_start(pp); pp=find_word_end(p);
if(pp<=p || pp-p>sizeof(fn2)-1) ovlstrcpy(fn2,fn1);
else {memmove(fn2,p,pp-p); fn2[pp-p]=0;}
prepare_file();
output();
fclose(outf);
return 0;
}
/trunk/wims/src/Misc/huffman.c
39,10 → 39,10
#include "../Lib/libwims.h"
 
struct {
double prob;
int ind;
unsigned char code[MAX_CODELEN];
int codelen;
double prob;
int ind;
unsigned char code[MAX_CODELEN];
int codelen;
} maintab[MAX_ITEMS*2];
int itemcnt, origcnt;
 
54,123 → 54,123
 
int indcmp(const void *p1, const void *p2)
{
const int *i1, *i2;
double d1, d2;
const int *i1, *i2;
double d1, d2;
 
i1=p1; i2=p2;
d1=maintab[*i1].prob; d2=maintab[*i2].prob;
if(d1==d2) return 0;
if(d1>d2) return -1;
else return 1;
i1=p1; i2=p2;
d1=maintab[*i1].prob; d2=maintab[*i2].prob;
if(d1==d2) return 0;
if(d1>d2) return -1;
else return 1;
}
 
void huffman(void)
{
int t, i, j, l;
double d;
int t, i, j, l;
double d;
 
while(indcnt>radix) {
qsort(indtab,indcnt,sizeof(indtab[0]),indcmp);
if(radix>2) t=(indcnt+radix-3)%(radix-1)+2;
else t=2;
d=0;
for(i=indcnt-t; i<indcnt; i++) {
d+=maintab[indtab[i]].prob;
maintab[indtab[i]].ind=itemcnt;
}
maintab[itemcnt].prob=d;
maintab[itemcnt].ind=-1;
maintab[itemcnt].codelen=-1;
indtab[indcnt-t]=itemcnt;
indcnt-=t-1; itemcnt++;
while(indcnt>radix) {
qsort(indtab,indcnt,sizeof(indtab[0]),indcmp);
if(radix>2) t=(indcnt+radix-3)%(radix-1)+2;
else t=2;
d=0;
for(i=indcnt-t; i<indcnt; i++) {
d+=maintab[indtab[i]].prob;
maintab[indtab[i]].ind=itemcnt;
}
for(i=0;i<indcnt;i++) {
maintab[indtab[i]].codelen=1;
maintab[indtab[i]].code[0]=i;
maintab[indtab[i]].ind=0;
}
for(i=itemcnt-1;i>=0;i--) {
if(maintab[i].codelen>0) continue;
j=maintab[i].ind; l=maintab[j].codelen;
if(l>=MAX_CODELEN) error("Code too long.");
memmove(maintab[i].code,maintab[j].code,l);
maintab[i].code[l]=maintab[j].ind++;
maintab[i].codelen=l+1;
maintab[i].ind=0;
}
maintab[itemcnt].prob=d;
maintab[itemcnt].ind=-1;
maintab[itemcnt].codelen=-1;
indtab[indcnt-t]=itemcnt;
indcnt-=t-1; itemcnt++;
}
for(i=0;i<indcnt;i++) {
maintab[indtab[i]].codelen=1;
maintab[indtab[i]].code[0]=i;
maintab[indtab[i]].ind=0;
}
for(i=itemcnt-1;i>=0;i--) {
if(maintab[i].codelen>0) continue;
j=maintab[i].ind; l=maintab[j].codelen;
if(l>=MAX_CODELEN) error("Code too long.");
memmove(maintab[i].code,maintab[j].code,l);
maintab[i].code[l]=maintab[j].ind++;
maintab[i].codelen=l+1;
maintab[i].ind=0;
}
}
 
void output(void)
{
int i, j;
double d;
int i, j;
double d;
 
d=0;
for(i=0;i<origcnt;i++) d+=maintab[i].prob*maintab[i].codelen;
printf("%f,%f\n",entropy,d);
for(i=0;i<origcnt;i++) {
for(j=0;j<maintab[i].codelen;j++) printf("%c",codechar[(int) maintab[i].code[j]]);
if(i<origcnt-1) printf(",");
else printf("\n");
}
d=0;
for(i=0;i<origcnt;i++) d+=maintab[i].prob*maintab[i].codelen;
printf("%f,%f\n",entropy,d);
for(i=0;i<origcnt;i++) {
for(j=0;j<maintab[i].codelen;j++) printf("%c",codechar[(int) maintab[i].code[j]]);
if(i<origcnt-1) printf(",");
else printf("\n");
}
}
 
void getparm(char *p)
{
int i;
char *p1, *p2;
double d1, dt;
int i;
char *p1, *p2;
double d1, dt;
 
origcnt=0; dt=0;
for(p1=find_word_start(p);
origcnt=0; dt=0;
for(p1=find_word_start(p);
*p1; p1=find_word_start(p2)) {
for(p2=p1; *p2 && strchr(",;",*p2)==NULL; p2++);
if(*p2) *p2++=0;
d1=strevalue(p1);
if(!isfinite(d1) || d1<0) {
char buf[256];
snprintf(buf,sizeof(buf),"Bad data: %s",p1);
error(buf);
}
maintab[origcnt++].prob=d1;
dt+=d1;
for(p2=p1; *p2 && strchr(",;",*p2)==NULL; p2++);
if(*p2) *p2++=0;
d1=strevalue(p1);
if(!isfinite(d1) || d1<0) {
char buf[256];
snprintf(buf,sizeof(buf),"Bad data: %s",p1);
error(buf);
}
if(dt*1000000<1) error("Empty data sum.");
if(origcnt<2) error("Insufficient data for encoding.");
itemcnt=origcnt;
if(dt!=1) for(i=0; i<origcnt; i++) maintab[i].prob/=dt;
maintab[origcnt++].prob=d1;
dt+=d1;
}
if(dt*1000000<1) error("Empty data sum.");
if(origcnt<2) error("Insufficient data for encoding.");
itemcnt=origcnt;
if(dt!=1) for(i=0; i<origcnt; i++) maintab[i].prob/=dt;
 
entropy=0;
for(i=0;i<origcnt;i++) {
maintab[i].codelen=-1; maintab[i].ind=-1;
indtab[i]=i;
d1=maintab[i].prob;
if(d1>0) entropy-=d1*log(d1);
}
entropy=entropy/log(radix);
indcnt=origcnt;
entropy=0;
for(i=0;i<origcnt;i++) {
maintab[i].codelen=-1; maintab[i].ind=-1;
indtab[i]=i;
d1=maintab[i].prob;
if(d1>0) entropy-=d1*log(d1);
}
entropy=entropy/log(radix);
indcnt=origcnt;
}
 
int main()
{
char *p;
int r;
char *p;
int r;
 
p=getenv("w_huffman_radix");
if(p==NULL || *p==0) p=getenv("huffman_radix");
if(p==NULL || *p==0) radix=2;
else {
r=atoi(p); if(r!=0) radix=r;
}
if(radix<2 || radix>MAX_RADIX) error("Bad radix.");
p=getenv("w_huffman_radix");
if(p==NULL || *p==0) p=getenv("huffman_radix");
if(p==NULL || *p==0) radix=2;
else {
r=atoi(p); if(r!=0) radix=r;
}
if(radix<2 || radix>MAX_RADIX) error("Bad radix.");
 
p=getenv("wims_exec_parm");
if(p==NULL || *p==0) error("No input data.");
getparm(p);
p=getenv("wims_exec_parm");
if(p==NULL || *p==0) error("No input data.");
getparm(p);
 
huffman();
output();
huffman();
output();
 
return 0;
return 0;
}
 
/trunk/wims/src/Misc/modind.c
82,75 → 82,75
*/
void deaccent2(char *p)
{
char *sp;
char *v;
for(sp=p;*sp;sp++) {
if(*sp<0 && (v=strchr(acctab,*sp))!=NULL)
*sp=*(deatab+(v-acctab));
if(!isalnum(*sp) && strchr(",.&$+*",*sp)==0) *sp=' ';
else *sp=tolower(*sp);
}
char *sp;
char *v;
for(sp=p;*sp;sp++) {
if(*sp<0 && (v=strchr(acctab,*sp))!=NULL)
*sp=*(deatab+(v-acctab));
if(!isalnum(*sp) && strchr(",.&$+*",*sp)==0) *sp=' ';
else *sp=tolower(*sp);
}
}
 
/* translate everything non-alphanumeric into space */
void towords(char *p)
{
char *pp;
for(pp=p;*pp;pp++) if(!isalnum(*pp) && strchr("&$+*",*pp)==0) *pp=' ';
char *pp;
for(pp=p;*pp;pp++) if(!isalnum(*pp) && strchr("&$+*",*pp)==0) *pp=' ';
}
 
/* Find first occurrence of word */
char *wordchr2(char *p, char *w)
{
char *r;
char *r;
 
for(r=strstr(p,w);r!=NULL &&
for(r=strstr(p,w);r!=NULL &&
( (r>p && !isspace(*(r-1))) || (!isspace(*(r+strlen(w))) && *(r+strlen(w))!=0) );
r=strstr(r+1,w));
return r;
r=strstr(r+1,w));
return r;
}
 
char *find_tag_end(char *p)
{
char *pp;
pp=p; if(*pp=='<') pp++;
for(; *pp && *pp!='>'; pp++) {
char *pp;
pp=p; if(*pp=='<') pp++;
for(; *pp && *pp!='>'; pp++) {
if(*pp=='<') {
pp=find_tag_end(pp)-1; continue;
pp=find_tag_end(pp)-1; continue;
}
if(*pp=='"') {
pp=strchr(pp+1,'"');
if(pp==NULL) return p+strlen(p); else continue;
pp=strchr(pp+1,'"');
if(pp==NULL) return p+strlen(p); else continue;
}
if(*pp=='\'') {
pp=strchr(pp+1,'\'');
if(pp==NULL) return p+strlen(p); else continue;
pp=strchr(pp+1,'\'');
if(pp==NULL) return p+strlen(p); else continue;
}
}
if(*pp=='>') pp++;
return pp;
}
if(*pp=='>') pp++;
return pp;
}
 
char *find_tag(char *p, char *tag)
{
char *pp;
int len;
len=strlen(tag);
for(pp=strchr(p,'<'); pp!=NULL && *pp; pp=strchr(pp+1,'<')) {
char *pp;
int len;
len=strlen(tag);
for(pp=strchr(p,'<'); pp!=NULL && *pp; pp=strchr(pp+1,'<')) {
if(strncasecmp(pp+1,tag,len)==0 && !isalnum(*(pp+1+len))) return pp;
}
return p+strlen(p);
}
return p+strlen(p);
}
 
/* remove all html tags */
void detag(char *p)
{
char *pp, *p2;
for(pp=strchr(p,'<'); pp!=NULL; pp=strchr(pp,'<')) {
char *pp, *p2;
for(pp=strchr(p,'<'); pp!=NULL; pp=strchr(pp,'<')) {
p2=find_tag_end(pp);
if(*p2==0) {*pp=0; return; }
ovlstrcpy(pp,p2);
}
}
}
 
/* add a space after comma to see end of words */
157,17 → 157,17
 
void comma(char *p)
{
char *pp;
for(pp=strchr(p,','); pp; pp=strchr(pp+1,','))
string_modify3(p,pp,pp+1,", ");
char *pp;
for(pp=strchr(p,','); pp; pp=strchr(pp+1,','))
string_modify3(p,pp,pp+1,", ");
}
 
void _getdef(char buf[], char *name, char value[])
{
char *p1, *p2, *p3;
char *p1, *p2, *p3;
 
value[0]=0;
for(p1=strstr(buf,name); p1!=NULL; p1=strstr(p1+1,name)) {
value[0]=0;
for(p1=strstr(buf,name); p1!=NULL; p1=strstr(p1+1,name)) {
p2=find_word_start(p1+strlen(name));
if((p1>buf && !isspace(*(p1-1))) || *p2!='=') continue;
p3=p1; while(p3>buf && isspace(*(p3-1)) && *(p3-1)!='\n') p3--;
179,7 → 179,7
if(p3!=NULL && p3-p2<MAX_LINELEN) value[p3-p2]=0;
strip_trailing_spaces2(value);
break;
}
}
}
 
/* Get variable definition from a file.
187,18 → 187,18
*/
void getdef(char *fname, char *name, char value[])
{
FILE *f;
char *buf;
int l;
FILE *f;
char *buf;
int l;
 
value[0]=0;
f=fopen(fname,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET);
buf=xmalloc(l+256); l=fread(buf,1,l,f);
fclose(f);
if(l<=0) return; else buf[l]=0;
_getdef(buf,name,value);
free(buf);
value[0]=0;
f=fopen(fname,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET);
buf=xmalloc(l+256); l=fread(buf,1,l,f);
fclose(f);
if(l<=0) return; else buf[l]=0;
_getdef(buf,name,value);
free(buf);
}
 
char *mdicbuf, *gdicbuf, *ddicbuf, *gentry, *mentry, *dentry;
208,104 → 208,104
/* Preparation of data */
void prep(void)
{
char buf[MAX_LINELEN+1];
char *p1,*p2,*s,*old;
int i,l,thislang,t;
FILE *f;
char buf[MAX_LINELEN+1];
char *p1,*p2,*s,*old;
int i,l,thislang,t;
FILE *f;
 
s=getenv("modind_outdir"); if(s!=NULL && *s!=0) outdir=s;
s=getenv("modind_sheetdir"); if(s!=NULL && *s!=0) sheetdir=s;
s=getenv("modind_sheetoutdir"); if(s!=NULL && *s!=0) sheetoutdir=s;
snprintf(buf,sizeof(buf),"%s/addr",outdir);
addrf=fopen(buf,"w");
if(!addrf) { fprintf(stderr,"modind: error creating output files addr.\n"); exit(1);}
snprintf(buf,sizeof(buf),"%s/serial",outdir);
serialf=fopen(buf,"w");
if(!serialf) { fprintf(stderr,"modind: error creating output files serial.\n"); exit(1);}
modcnt=langcnt=0;
s=getenv("modind_outdir"); if(s!=NULL && *s!=0) outdir=s;
s=getenv("modind_sheetdir"); if(s!=NULL && *s!=0) sheetdir=s;
s=getenv("modind_sheetoutdir"); if(s!=NULL && *s!=0) sheetoutdir=s;
snprintf(buf,sizeof(buf),"%s/addr",outdir);
addrf=fopen(buf,"w");
if(!addrf) { fprintf(stderr,"modind: error creating output files addr.\n"); exit(1);}
snprintf(buf,sizeof(buf),"%s/serial",outdir);
serialf=fopen(buf,"w");
if(!serialf) { fprintf(stderr,"modind: error creating output files serial.\n"); exit(1);}
modcnt=langcnt=0;
/* take the langs declared in conffile */
getdef(conffile,"site_languages",buf);
for(p1=buf;*p1;p1++) if(!isalnum(*p1)) *p1=' ';
for(p1=find_word_start(buf); *p1 && langcnt<MAX_LANGS; p1=find_word_start(p2)) {
getdef(conffile,"site_languages",buf);
for(p1=buf;*p1;p1++) if(!isalnum(*p1)) *p1=' ';
for(p1=find_word_start(buf); *p1 && langcnt<MAX_LANGS; p1=find_word_start(p2)) {
p2=find_word_end(p1);
if(p2!=p1+2 || !isalpha(*p1) || !isalpha(*(p1+1))) continue;
memmove(lang[langcnt],p1,2); lang[langcnt++][2]=0;
}
if(langcnt==0) {/* default languages */
}
if(langcnt==0) {/* default languages */
langcnt=DEFAULT_LANGCNT;
}
s=getenv("mlist"); if(s==NULL) exit(1);
l=strlen(s); if(l<0 || l>100*MAX_LINELEN) exit(1);
mlist=xmalloc(l+16); ovlstrcpy(mlist,s); old="";
for(i=0;i<langcnt;i++) {
snprintf(buf,sizeof(buf),"%s/%s.%s",dicdir,ignoredic,lang[i]);
f=fopen(buf,"r"); if(f==NULL) continue;
l=fread(ignore[i],1,MAX_LINELEN,f);fclose(f);
if(l<0 || l>=MAX_LINELEN) l=0;
ignore[i][l]=0;
}
for(t=0, p1=find_word_start(mlist); *p1 && modcnt<MAX_MODULES;
}
s=getenv("mlist"); if(s==NULL) exit(1);
l=strlen(s); if(l<0 || l>100*MAX_LINELEN) exit(1);
mlist=xmalloc(l+16); ovlstrcpy(mlist,s); old="";
for(i=0;i<langcnt;i++) {
snprintf(buf,sizeof(buf),"%s/%s.%s",dicdir,ignoredic,lang[i]);
f=fopen(buf,"r"); if(f==NULL) continue;
l=fread(ignore[i],1,MAX_LINELEN,f);fclose(f);
if(l<0 || l>=MAX_LINELEN) l=0;
ignore[i][l]=0;
}
for(t=0, p1=find_word_start(mlist); *p1 && modcnt<MAX_MODULES;
p1=find_word_start(p2), t++) {
p2=find_word_end(p1);
l=p2-p1; if(*p2) *p2++=0;
fprintf(addrf,"%d:%s\n",t,p1);
fprintf(serialf,"%s:%d\n",p1,t);
thislang=-1;
p2=find_word_end(p1);
l=p2-p1; if(*p2) *p2++=0;
fprintf(addrf,"%d:%s\n",t,p1);
fprintf(serialf,"%s:%d\n",p1,t);
thislang=-1;
/* language is taken from the address */
if(l>3 && p1[l-3]=='.') {
for(i=0;i<langcnt;i++) if(strcasecmp(lang[i],p1+l-2)==0) break;
if(i<langcnt) {p1[l-3]=0; thislang=i;}
else {/* unknown language, not referenced */
if(l>3 && p1[l-3]=='.') {
for(i=0;i<langcnt;i++) if(strcasecmp(lang[i],p1+l-2)==0) break;
if(i<langcnt) {p1[l-3]=0; thislang=i;}
else {/* unknown language, not referenced */
continue;
}
}
if(modcnt>0 && strcmp(old,p1)==0 && thislang>=0) {
if(mod[modcnt-1].langcnt<langcnt) {
}
if(modcnt>0 && strcmp(old,p1)==0 && thislang>=0) {
if(mod[modcnt-1].langcnt<langcnt) {
mod[modcnt-1].langs[mod[modcnt-1].langcnt]=thislang;
mod[modcnt-1].counts[mod[modcnt-1].langcnt]=t;
(mod[modcnt-1].langcnt)++;
}
}
else {
mod[modcnt].name=old=p1;
if(thislang>=0) {
mod[modcnt].langs[0]=thislang;
mod[modcnt].langcnt=1;
}
else mod[modcnt].langcnt=0;
mod[modcnt].counts[0]=t;
modcnt++;
}
}
else {
mod[modcnt].name=old=p1;
if(thislang>=0) {
mod[modcnt].langs[0]=thislang;
mod[modcnt].langcnt=1;
}
else mod[modcnt].langcnt=0;
mod[modcnt].counts[0]=t;
modcnt++;
}
snprintf(buf,sizeof(buf),"%s/language",outdir);
langf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/title",outdir);
titf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/description",outdir);
descf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/author",outdir);
authorf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/version",outdir);
versionf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/%s/robot.phtml",outdir,mlistbase);
robotf=fopen(buf,"w");
fclose(addrf); fclose(serialf);
if(!robotf || !versionf || !authorf || !descf || !titf || !langf) {
fprintf(stderr,"modind: error creating output files.\n");
exit(1);
}
}
snprintf(buf,sizeof(buf),"%s/language",outdir);
langf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/title",outdir);
titf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/description",outdir);
descf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/author",outdir);
authorf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/version",outdir);
versionf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/%s/robot.phtml",outdir,mlistbase);
robotf=fopen(buf,"w");
fclose(addrf); fclose(serialf);
if(!robotf || !versionf || !authorf || !descf || !titf || !langf) {
fprintf(stderr,"modind: error creating output files.\n");
exit(1);
}
}
 
void sprep(void)
{
char *p1,*p2,*s;
int i,l,thislang;
char *p1,*p2,*s;
int i,l,thislang;
 
modcnt=0;
s=getenv("slist"); if(s==NULL) return;
l=strlen(s); if(l<0 || l>100*MAX_LINELEN) return;
mlist=xmalloc(l+16); ovlstrcpy(mlist,s);
for(p1=find_word_start(mlist); *p1 && modcnt<MAX_MODULES; p1=find_word_start(p2)) {
modcnt=0;
s=getenv("slist"); if(s==NULL) return;
l=strlen(s); if(l<0 || l>100*MAX_LINELEN) return;
mlist=xmalloc(l+16); ovlstrcpy(mlist,s);
for(p1=find_word_start(mlist); *p1 && modcnt<MAX_MODULES; p1=find_word_start(p2)) {
p2=find_word_end(p1);
l=p2-p1; if(*p2) *p2++=0;
for(i=0;i<langcnt;i++) if(strncasecmp(lang[i],p1,2)==0) break;
314,20 → 314,20
mod[modcnt].langs[0]=thislang;
mod[modcnt].langcnt=1;
modcnt++;
}
}
}
 
void clean(void)
{
fclose(langf); fclose(titf); fclose(descf); fclose(robotf);
fclose(authorf); fclose(versionf);
fclose(langf); fclose(titf); fclose(descf); fclose(robotf);
fclose(authorf); fclose(versionf);
}
 
char *sheetindex[]={
"title", "description",
"duration", "severity",
"level", "domain",
"keywords", "reserved1", "reserved2", "information"
"title", "description",
"duration", "severity",
"level", "domain",
"keywords", "reserved1", "reserved2", "information"
};
#define SHEETINDEX_NO (sizeof(sheetindex)/sizeof(sheetindex[0]))
char sindbuf[SHEETINDEX_NO][MAX_LINELEN+1];
339,27 → 339,27
};
 
char *modindex[]={
"title", "description",
"author", "address", "copyright",
"version", "wims_version", "language",
"category", "level", "domain", "keywords",
"keywords_ca", "keywords_en", "keywords_fr", "keywords_it", "keywords_nl",
"title_ca", "title_en", "title_fr", "title_it", "title_nl",
"require"
"title", "description",
"author", "address", "copyright",
"version", "wims_version", "language",
"category", "level", "domain", "keywords",
"keywords_ca", "keywords_en", "keywords_fr", "keywords_it", "keywords_nl",
"title_ca", "title_en", "title_fr", "title_it", "title_nl",
"require"
};
#define MODINDEX_NO (sizeof(modindex)/sizeof(modindex[0]))
char indbuf[MODINDEX_NO][MAX_LINELEN+1];
enum{i_title, i_description,
i_author,i_address,i_copyright,
i_version,i_wims_version,i_language,
i_category,i_level,i_domain,i_keywords,
i_keywords_ca,i_keywords_en,i_keywords_fr,i_keywords_it,i_keywords_nl,
i_title_ca,i_title_en,i_title_fr,i_title_it,i_title_nl,
i_require
i_author,i_address,i_copyright,
i_version,i_wims_version,i_language,
i_category,i_level,i_domain,i_keywords,
i_keywords_ca,i_keywords_en,i_keywords_fr,i_keywords_it,i_keywords_nl,
i_title_ca,i_title_en,i_title_fr,i_title_it,i_title_nl,
i_require
};
 
char *module_special_file[]={
"intro","help","about"
"intro","help","about"
};
#define MODSPEC_NO (sizeof(module_special_file)/sizeof(module_special_file[0]))
char module_language[4];
367,56 → 367,56
/* read and treat module's INDEX file */
int module_index(const char *name)
{
char *p, fbuf[MAX_LINELEN+1], ibuf[MAX_LINELEN+1];
FILE *indf;
int i,l;
char *p, fbuf[MAX_LINELEN+1], ibuf[MAX_LINELEN+1];
FILE *indf;
int i,l;
 
snprintf(fbuf,sizeof(fbuf),"%s/%s/INDEX",moduledir,name);
indf=fopen(fbuf,"r");
if(indf==NULL) {
fprintf(stderr,"modind: INDEX of %s not found\n",fbuf); return -1;
}
l=fread(ibuf,1,MAX_LINELEN,indf); fclose(indf);
if(l>0 && l<MAX_LINELEN) ibuf[l]=0; else return -1;
snprintf(fbuf,sizeof(fbuf),"%s/%s/INDEX",moduledir,name);
indf=fopen(fbuf,"r");
if(indf==NULL) {
fprintf(stderr,"modind: INDEX of %s not found\n",fbuf); return -1;
}
l=fread(ibuf,1,MAX_LINELEN,indf); fclose(indf);
if(l>0 && l<MAX_LINELEN) ibuf[l]=0; else return -1;
/* treate all fields in *modindex */
for(i=0;i<MODINDEX_NO;i++) {
_getdef(ibuf,modindex[i],indbuf[i]);
for(i=0;i<MODINDEX_NO;i++) {
_getdef(ibuf,modindex[i],indbuf[i]);
/* compatibility precaution */
if(indbuf[i][0]==':') indbuf[i][0]='.';
}
p=find_word_start(indbuf[i_language]);
if(isalpha(*p) && isalpha(*(p+1))) {
memmove(module_language,p,2); module_language[2]=0;
}
else ovlstrcpy(module_language,"en");
return 0;
if(indbuf[i][0]==':') indbuf[i][0]='.';
}
p=find_word_start(indbuf[i_language]);
if(isalpha(*p) && isalpha(*(p+1))) {
memmove(module_language,p,2); module_language[2]=0;
}
else ovlstrcpy(module_language,"en");
return 0;
}
 
int sheet_index(int serial)
{
char *p1, *p2, fbuf[MAX_LINELEN+1], ibuf[MAX_LINELEN+1];
FILE *indf;
int i,l;
char *p1, *p2, fbuf[MAX_LINELEN+1], ibuf[MAX_LINELEN+1];
FILE *indf;
int i,l;
 
snprintf(fbuf,sizeof(fbuf),"%s/%s.def",sheetdir,mod[serial].name);
indf=fopen(fbuf,"r"); if(indf==NULL) return -1;
l=fread(ibuf,1,MAX_LINELEN,indf); fclose(indf);
if(l>0 && l<MAX_LINELEN) ibuf[l]=0; else return -1;
for(i=0;i<SHEETINDEX_NO;i++) sindbuf[i][0]=0;
for(i=0,p1=find_word_start(ibuf);
snprintf(fbuf,sizeof(fbuf),"%s/%s.def",sheetdir,mod[serial].name);
indf=fopen(fbuf,"r"); if(indf==NULL) return -1;
l=fread(ibuf,1,MAX_LINELEN,indf); fclose(indf);
if(l>0 && l<MAX_LINELEN) ibuf[l]=0; else return -1;
for(i=0;i<SHEETINDEX_NO;i++) sindbuf[i][0]=0;
for(i=0,p1=find_word_start(ibuf);
i<SHEETINDEX_NO-1 && *p1!=':' && *p1!=0;
i++,p1=p2) {
p2=strchr(p1,'\n');
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
p1=find_word_start(p1); strip_trailing_spaces2(p1);
snprintf(sindbuf[i],MAX_LINELEN,"%s",p1);
}
p2=strstr(p1,"\n:"); if(p2==NULL) p2=p1+strlen(p1);
else *p2=0;
p2=strchr(p1,'\n');
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
p1=find_word_start(p1); strip_trailing_spaces2(p1);
for(p2=p1;*p2;p2++) if(*p2=='\n') *p2=' ';
ovlstrcpy(sindbuf[s_information],p1);
return 0;
snprintf(sindbuf[i],MAX_LINELEN,"%s",p1);
}
p2=strstr(p1,"\n:"); if(p2==NULL) p2=p1+strlen(p1);
else *p2=0;
p1=find_word_start(p1); strip_trailing_spaces2(p1);
for(p2=p1;*p2;p2++) if(*p2=='\n') *p2=' ';
ovlstrcpy(sindbuf[s_information],p1);
return 0;
}
 
unsigned char categories[16];
425,28 → 425,28
 
void appenditem(char *word, int lind, int serial, int weight, char *l)
{
char nbuf[MAX_LINELEN+1], buf[MAX_LINELEN+1];
int i, ll;
char *p;
FILE *f;
char nbuf[MAX_LINELEN+1], buf[MAX_LINELEN+1];
int i, ll;
char *p;
FILE *f;
 
if(!isalnum(*word) || (ll=strlen(word))<2 ||
wordchr2(taken,word)!=NULL ||
wordchr2(ignore[lind],word)!=NULL ||
takenlen>=MAX_LINELEN-ll-16)
return;
if(ll==2 && (!isdigit(word[0]) || !isalpha(word[1]))) return;
for(p=word;*p;p++) if(!isalnum(*p) && *p!=' ') return;
taken[takenlen++]=' '; taken[takenlen++]=' ';
ovlstrcpy(taken+takenlen,word);
takenlen+=ll; tweight+=weight;
snprintf(buf,sizeof(buf),"%s:%d?%d\n",word,serial,weight);
for(i=0;i<catcnt;i++) {
if(!isalnum(*word) || (ll=strlen(word))<2 ||
wordchr2(taken,word)!=NULL ||
wordchr2(ignore[lind],word)!=NULL ||
takenlen>=MAX_LINELEN-ll-16)
return;
if(ll==2 && (!isdigit(word[0]) || !isalpha(word[1]))) return;
for(p=word;*p;p++) if(!isalnum(*p) && *p!=' ') return;
taken[takenlen++]=' '; taken[takenlen++]=' ';
ovlstrcpy(taken+takenlen,word);
takenlen+=ll; tweight+=weight;
snprintf(buf,sizeof(buf),"%s:%d?%d\n",word,serial,weight);
for(i=0;i<catcnt;i++) {
snprintf(nbuf,sizeof(nbuf),"%s/%c.%s",
outdir,categories[i],lang[lind]);
outdir,categories[i],lang[lind]);
f=fopen(nbuf,"a");
if(f!=NULL) {fputs(buf,f); fclose(f);}
}
}
}
 
void appenditem1 (char *buf, int lind, int serial, int weight, char *l )
464,7 → 464,7
{
char *p1, *p2 ;
for(p1=find_word_start(buf);*p1;
p1=find_word_start(p2)) {
p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
appenditem(p1,lind,serial,weight,module_language);
}
471,52 → 471,52
}
void onemodule(const char *name, int serial, int lind)
{
int i;
unsigned char trlist[]={
i_title,i_description,i_category,i_domain,i_keywords,
i_require,i_author,
i_keywords_ca,i_keywords_en,i_keywords_fr,i_keywords_it,i_keywords_nl,
i_title_ca,i_title_en,i_title_fr,i_title_it,i_title_nl
};
#define trcnt (sizeof(trlist)/sizeof(trlist[0]))
char *p1, *p2, *pp, *q, buf[MAX_LINELEN+1], lbuf[16];
FILE *f;
int i;
unsigned char trlist[]={
i_title,i_description,i_category,i_domain,i_keywords,
i_require,i_author,
i_keywords_ca,i_keywords_en,i_keywords_fr,i_keywords_it,i_keywords_nl,
i_title_ca,i_title_en,i_title_fr,i_title_it,i_title_nl
};
#define trcnt (sizeof(trlist)/sizeof(trlist[0]))
char *p1, *p2, *pp, *q, buf[MAX_LINELEN+1], lbuf[16];
FILE *f;
 
if(module_index(name)) return;
towords(indbuf[i_category]);
if(module_index(name)) return;
towords(indbuf[i_category]);
/* list the categories (among A=all,X=eXercise,O,D,...) corresponding
* to this module
*/
for(i=catcnt=0;i<catno && catcnt<16;i++) {
if(wordchr2(indbuf[i_category],cat[i].name)!=NULL)
categories[catcnt++]=cat[i].typ;
}
if(catcnt==0) return;
if(categories[0]!=cat[0].typ)
categories[catcnt++]=cat[0].typ;
for(i=catcnt=0;i<catno && catcnt<16;i++) {
if(wordchr2(indbuf[i_category],cat[i].name)!=NULL)
categories[catcnt++]=cat[i].typ;
}
if(catcnt==0) return;
if(categories[0]!=cat[0].typ)
categories[catcnt++]=cat[0].typ;
/* write module's name in the category.language files, for instance lists/X.fr
* for french exercises
*/
for(i=0;i<catcnt;i++) {
snprintf(buf,sizeof(buf),"%s/%s/%c.%s",
outdir,mlistbase,categories[i],lang[lind]);
f=fopen(buf,"a");
if(f!=NULL) {fprintf(f,"%s\n",name); fclose(f);}
}
for(i=0;i<catcnt;i++) {
snprintf(buf,sizeof(buf),"%s/%s/%c.%s",
outdir,mlistbase,categories[i],lang[lind]);
f=fopen(buf,"a");
if(f!=NULL) {fprintf(f,"%s\n",name); fclose(f);}
}
/* add serial number and language (resp.title, ...) to corresponding file */
fprintf(langf,"%d:%s\n",serial,module_language);
fprintf(titf,"%d:%s\n",serial,indbuf[i_title]);
fprintf(descf,"%d:%s\n",serial,indbuf[i_description]);
fprintf(authorf,"%d:%s\n",serial,indbuf[i_author]);
fprintf(versionf,"%d:%s\n",serial,indbuf[i_version]);
fprintf(langf,"%d:%s\n",serial,module_language);
fprintf(titf,"%d:%s\n",serial,indbuf[i_title]);
fprintf(descf,"%d:%s\n",serial,indbuf[i_description]);
fprintf(authorf,"%d:%s\n",serial,indbuf[i_author]);
fprintf(versionf,"%d:%s\n",serial,indbuf[i_version]);
 
/* add module's information in html page for robots */
snprintf(buf,sizeof(buf),"%s",indbuf[i_description]);
for(pp=strchr(buf,','); pp; pp=strchr(pp,','))
string_modify3(buf,pp,pp+1,"&#44;");
if(strcmp(module_language,lang[lind])==0)
fprintf(robotf,"%s ,%s,%s,%s,%s\n",name,module_language,name,
indbuf[i_title], buf);
snprintf(buf,sizeof(buf),"%s",indbuf[i_description]);
for(pp=strchr(buf,','); pp; pp=strchr(pp,','))
string_modify3(buf,pp,pp+1,"&#44;");
if(strcmp(module_language,lang[lind])==0)
fprintf(robotf,"%s ,%s,%s,%s,%s\n",name,module_language,name,
indbuf[i_title], buf);
 
/* Normalize the information of trlist, using dictionary
* -- bases/sys/domain.xx without suffix translation (--> english version)
525,11 → 525,11
memmove(entry,dentry,dentrycount*sizeof(entry[0]));
unknown_type=unk_leave;
for(i=0;i<trcnt;i++) {
detag(indbuf[trlist[i]]);
deaccent2(indbuf[trlist[i]]);
comma(indbuf[trlist[i]]);
singlespace2(indbuf[trlist[i]]);
translate(indbuf[trlist[i]]);
detag(indbuf[trlist[i]]);
deaccent2(indbuf[trlist[i]]);
comma(indbuf[trlist[i]]);
singlespace2(indbuf[trlist[i]]);
translate(indbuf[trlist[i]]);
}
/* Normalize the information, using dictionary
* bases/sys/words.xx with suffix translation
563,59 → 563,59
* with a g (groupdic), not an m (maindic) . see below main, suffix, group.
* and delete unknown ?? and translate
*/
entrycount=gentrycount; dicbuf=gdicbuf;
memmove(entry,gentry,gentrycount*sizeof(entry[0]));
entrycount=gentrycount; dicbuf=gdicbuf;
memmove(entry,gentry,gentrycount*sizeof(entry[0]));
 
/* append words of every title information */
ovlstrcpy(buf,indbuf[i_title]);
unknown_type=unk_delete;
translate(buf);
appenditem1(buf,lind,serial,2,module_language);
ovlstrcpy(buf,indbuf[i_title]);
unknown_type=unk_delete;
translate(buf);
appenditem1(buf,lind,serial,2,module_language);
 
/* append words of information of description except level */
snprintf(buf,sizeof(buf),"%s", indbuf[i_description]);
unknown_type=unk_delete;
translate(buf);
appenditem1(buf,lind,serial,4,module_language);
snprintf(buf,sizeof(buf),"%s", indbuf[i_description]);
unknown_type=unk_delete;
translate(buf);
appenditem1(buf,lind,serial,4,module_language);
 
/* append words (or group of words) of keywords and domain */
snprintf(buf,sizeof(buf),"%s, %s, %s, %s, %s, %s, %s",
snprintf(buf,sizeof(buf),"%s, %s, %s, %s, %s, %s, %s",
indbuf[i_domain],indbuf[i_keywords],
indbuf[i_keywords_ca], indbuf[i_keywords_en],indbuf[i_keywords_fr],
indbuf[i_keywords_it], indbuf[i_keywords_nl]);
unknown_type=unk_leave;
translate(buf);
appenditem1(buf,lind,serial,2,module_language);
unknown_type=unk_leave;
translate(buf);
appenditem1(buf,lind,serial,2,module_language);
 
/* append level information, with weight 2 */
snprintf(buf,sizeof(buf),"%s",indbuf[i_level]);
ovlstrcpy(lbuf,"level");
for(p1=buf; *p1; p1++) if(!isalnum(*p1)) *p1=' ';
q=buf+strlen(buf);
for(p1=find_word_start(buf); (*p1) && (p1 < q) ;
p1=find_word_start(p2)) {
p2=find_word_end(p1);
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
if(strncmp(p1, "Lang" , p2-p1) &&
(!isalpha(*p1) ||
(!isdigit(*(p1+1)) && *(p1+1)!=0) ||
(*(p1+1)!=0 && *(p1+2)!=0)))
continue;
*p1=tolower(*p1);
ovlstrcpy(lbuf+strlen("level"),p1);
appenditem(lbuf,lind,serial,2,module_language);
}
snprintf(buf,sizeof(buf),"%s",indbuf[i_level]);
ovlstrcpy(lbuf,"level");
for(p1=buf; *p1; p1++) if(!isalnum(*p1)) *p1=' ';
q=buf+strlen(buf);
for(p1=find_word_start(buf); (*p1) && (p1 < q) ;
p1=find_word_start(p2)) {
p2=find_word_end(p1);
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
if(strncmp(p1, "Lang" , p2-p1) &&
(!isalpha(*p1) ||
(!isdigit(*(p1+1)) && *(p1+1)!=0) ||
(*(p1+1)!=0 && *(p1+2)!=0)))
continue;
*p1=tolower(*p1);
ovlstrcpy(lbuf+strlen("level"),p1);
appenditem(lbuf,lind,serial,2,module_language);
}
/* append total weight of module to weight file site2/weight.xx */
fprintf(weightf,"%d:%d\n",serial,tweight);
fprintf(weightf,"%d:%d\n",serial,tweight);
}
 
void modules(void)
{
int i,j,k,d;
char namebuf[MAX_LINELEN+1];
char mdic[MAX_LINELEN+1], sdic[MAX_LINELEN+1], gdic[MAX_LINELEN+1], ddic[MAX_LINELEN+1];
int i,j,k,d;
char namebuf[MAX_LINELEN+1];
char mdic[MAX_LINELEN+1], sdic[MAX_LINELEN+1], gdic[MAX_LINELEN+1], ddic[MAX_LINELEN+1];
 
for(j=0;j<langcnt;j++) {
for(j=0;j<langcnt;j++) {
snprintf(namebuf,sizeof(namebuf),"%s/weight.%s",outdir,lang[j]);
weightf=fopen(namebuf,"w");
snprintf(mdic,sizeof(mdic),"%s/%s.%s",dicdir,maindic,lang[j]);
633,18 → 633,18
memmove(dentry,entry,dentrycount*sizeof(entry[0]));
unknown_type=unk_leave; translate(ignore[j]);
for(i=0;i<modcnt;i++) {
if(mod[i].langcnt>0) {
if(mod[i].langcnt>0) {
for(d=k=0;k<mod[i].langcnt;k++)
if(mod[i].langs[k]<mod[i].langs[d]) d=k;
if(mod[i].langs[k]<mod[i].langs[d]) d=k;
for(k=0;k<mod[i].langcnt && mod[i].langs[k]!=j;k++);
if(k>=mod[i].langcnt) k=d;
snprintf(namebuf,MAX_LINELEN,"%s.%s",mod[i].name,
lang[mod[i].langs[k]]);
lang[mod[i].langs[k]]);
onemodule(namebuf,mod[i].counts[k],j);
}
else {
}
else {
onemodule(mod[i].name,mod[i].counts[0],j);
}
}
}
if(mentrycount>0) free(mdicbuf);
if(gentrycount>0) free(gdicbuf);
651,132 → 651,132
if(suffixcnt>0) free(sufbuf);
if(dentrycount>0) free(ddicbuf);
if(weightf) fclose(weightf);
}
}
}
 
/* FIXME ? differences with appenditem - use fprintf instead of snprintf */
void sappenditem(char *word, int lind, int serial, int weight)
{
int ll;
char *p;
int ll;
char *p;
 
if(!isalnum(*word) || (ll=strlen(word))<2 ||
wordchr2(taken,word)!=NULL ||
wordchr2(ignore[lind],word)!=NULL ||
takenlen>=MAX_LINELEN-ll-16)
return;
if(ll==2 && (!isdigit(word[0]) || !isalpha(word[1]))) return;
for(p=word;*p;p++) if(!isalnum(*p) && *p!=' ') return;
taken[takenlen++]=' ';taken[takenlen++]=' ';
ovlstrcpy(taken+takenlen,word);
takenlen+=ll; tweight+=weight;
fprintf(indf,"%s:%d?%d\n",word,serial,weight);
if(!isalnum(*word) || (ll=strlen(word))<2 ||
wordchr2(taken,word)!=NULL ||
wordchr2(ignore[lind],word)!=NULL ||
takenlen>=MAX_LINELEN-ll-16)
return;
if(ll==2 && (!isdigit(word[0]) || !isalpha(word[1]))) return;
for(p=word;*p;p++) if(!isalnum(*p) && *p!=' ') return;
taken[takenlen++]=' ';taken[takenlen++]=' ';
ovlstrcpy(taken+takenlen,word);
takenlen+=ll; tweight+=weight;
fprintf(indf,"%s:%d?%d\n",word,serial,weight);
}
 
void onesheet(int serial, int lind)
{
int i;
unsigned char trlist[]={
s_title,s_description,s_domain,s_keywords,s_information
};
#define trcnt (sizeof(trlist)/sizeof(trlist[0]))
char *p1, *p2, buf[MAX_LINELEN+1];
int i;
unsigned char trlist[]={
s_title,s_description,s_domain,s_keywords,s_information
};
#define trcnt (sizeof(trlist)/sizeof(trlist[0]))
char *p1, *p2, buf[MAX_LINELEN+1];
 
if(sheet_index(serial)) return;
fprintf(listf,"%s\n",mod[serial].name+3);
fprintf(titf,"%d:%s\n",serial,sindbuf[s_title]);
fprintf(descf,"%d:%s\n",serial,sindbuf[s_description]);
fprintf(remf,"%d:%s\n",serial,sindbuf[s_information]);
fprintf(titlef,"%s:%s\n",mod[serial].name,sindbuf[s_title]);
if(sheet_index(serial)) return;
fprintf(listf,"%s\n",mod[serial].name+3);
fprintf(titf,"%d:%s\n",serial,sindbuf[s_title]);
fprintf(descf,"%d:%s\n",serial,sindbuf[s_description]);
fprintf(remf,"%d:%s\n",serial,sindbuf[s_information]);
fprintf(titlef,"%s:%s\n",mod[serial].name,sindbuf[s_title]);
 
entrycount=dentrycount; dicbuf=ddicbuf;
memmove(entry,dentry,dentrycount*sizeof(entry[0]));
unknown_type=unk_leave;
for(i=0;i<trcnt;i++) {
entrycount=dentrycount; dicbuf=ddicbuf;
memmove(entry,dentry,dentrycount*sizeof(entry[0]));
unknown_type=unk_leave;
for(i=0;i<trcnt;i++) {
detag(sindbuf[trlist[i]]);
deaccent2(sindbuf[trlist[i]]);
comma(sindbuf[trlist[i]]);
singlespace2(sindbuf[trlist[i]]);
translate(sindbuf[trlist[i]]);
}
}
 
entrycount=mentrycount; dicbuf=mdicbuf;
memmove(entry,mentry,mentrycount*sizeof(entry[0]));
unknown_type=unk_leave;
for(i=0;i<trcnt;i++) {
entrycount=mentrycount; dicbuf=mdicbuf;
memmove(entry,mentry,mentrycount*sizeof(entry[0]));
unknown_type=unk_leave;
for(i=0;i<trcnt;i++) {
suffix_translate(sindbuf[trlist[i]]);
translate(sindbuf[trlist[i]]);
}
taken[0]=0; takenlen=tweight=0;
ovlstrcpy(buf,sindbuf[s_title]); towords(buf);
for(p1=find_word_start(buf);*p1;
p1=find_word_start(p2)) {
}
taken[0]=0; takenlen=tweight=0;
ovlstrcpy(buf,sindbuf[s_title]); towords(buf);
for(p1=find_word_start(buf);*p1;
p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
sappenditem(p1,lind,serial,4);
}
snprintf(buf,sizeof(buf),"%s %s %s %s",
}
snprintf(buf,sizeof(buf),"%s %s %s %s",
sindbuf[s_description],sindbuf[s_keywords],
sindbuf[s_domain],sindbuf[s_information]);
towords(buf);
for(p1=find_word_start(buf);*p1;
p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
sappenditem(p1,lind,serial,2);
}
entrycount=gentrycount; dicbuf=gdicbuf;
memmove(entry,gentry,gentrycount*sizeof(entry[0]));
unknown_type=unk_delete;
ovlstrcpy(buf,sindbuf[s_title]); translate(buf);
for(p1=find_word_start(buf); *p1;
p1=find_word_start(p2)) {
towords(buf);
for(p1=find_word_start(buf);*p1;
p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
sappenditem(p1,lind,serial,2);
}
entrycount=gentrycount; dicbuf=gdicbuf;
memmove(entry,gentry,gentrycount*sizeof(entry[0]));
unknown_type=unk_delete;
ovlstrcpy(buf,sindbuf[s_title]); translate(buf);
for(p1=find_word_start(buf); *p1;
p1=find_word_start(p2)) {
p2=strchr(p1,',');
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
if(strlen(p1)<=0) continue;
sappenditem(p1,lind,serial,4);
}
unknown_type=unk_leave;
snprintf(buf,sizeof(buf),"%s, %s",
sindbuf[s_keywords],
sindbuf[s_domain]);
translate(buf);
for(p1=find_word_start(buf); *p1;
p1=find_word_start(p2)) {
p2=strchr(p1,',');
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
if(strlen(p1)<=0) continue;
sappenditem(p1,lind,serial,4);
}
unknown_type=unk_leave;
snprintf(buf,sizeof(buf),"%s, %s",
sindbuf[s_keywords],
sindbuf[s_domain]);
translate(buf);
for(p1=find_word_start(buf); *p1;
p1=find_word_start(p2)) {
p2=strchr(p1,',');
if(p2!=NULL) *p2++=0; else p2=p1+strlen(p1);
if(strlen(p1)<=0) continue;
sappenditem(p1,lind,serial,2);
}
fprintf(weightf,"%d:%d\n",serial,tweight);
}
fprintf(weightf,"%d:%d\n",serial,tweight);
}
 
void sheets(void)
{
int i,j;
char mdic[MAX_LINELEN+1], sdic[MAX_LINELEN+1], gdic[MAX_LINELEN+1], ddic[MAX_LINELEN+1];
char buf[MAX_LINELEN+1];
int i,j;
char mdic[MAX_LINELEN+1], sdic[MAX_LINELEN+1], gdic[MAX_LINELEN+1], ddic[MAX_LINELEN+1];
char buf[MAX_LINELEN+1];
 
for(j=0;j<langcnt;j++) {
snprintf(buf,sizeof(buf),"%s/title.%s",sheetoutdir,lang[j]);
titf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/description.%s",sheetoutdir,lang[j]);
descf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/%s",sheetoutdir,lang[j]);
indf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/list.%s",sheetoutdir,lang[j]);
listf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/weight.%s",sheetoutdir,lang[j]);
weightf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/addr.%s",sheetoutdir,lang[j]);
addrf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/information.%s",sheetoutdir,lang[j]);
remf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/serial.%s",sheetoutdir,lang[j]);
serialf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/tit.%s",sheetoutdir,lang[j]);
titlef=fopen(buf,"w");
if(!titlef || !serialf || !remf || !addrf || !weightf || !listf
|| !indf || !descf || !titf ) {
fprintf(stderr,"modind: error creating output files for sheet %s.\n",sheetoutdir); exit(1);
for(j=0;j<langcnt;j++) {
snprintf(buf,sizeof(buf),"%s/title.%s",sheetoutdir,lang[j]);
titf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/description.%s",sheetoutdir,lang[j]);
descf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/%s",sheetoutdir,lang[j]);
indf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/list.%s",sheetoutdir,lang[j]);
listf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/weight.%s",sheetoutdir,lang[j]);
weightf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/addr.%s",sheetoutdir,lang[j]);
addrf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/information.%s",sheetoutdir,lang[j]);
remf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/serial.%s",sheetoutdir,lang[j]);
serialf=fopen(buf,"w");
snprintf(buf,sizeof(buf),"%s/tit.%s",sheetoutdir,lang[j]);
titlef=fopen(buf,"w");
if(!titlef || !serialf || !remf || !addrf || !weightf || !listf
|| !indf || !descf || !titf ) {
fprintf(stderr,"modind: error creating output files for sheet %s.\n",sheetoutdir); exit(1);
}
snprintf(mdic,sizeof(mdic),"%s/%s.%s",dicdir,maindic,lang[j]);
snprintf(sdic,sizeof(sdic),"%s/%s.%s",dicdir,suffixdic,lang[j]);
793,10 → 793,10
memmove(dentry,entry,dentrycount*sizeof(entry[0]));
unknown_type=unk_leave; translate(ignore[j]);
for(i=0;i<modcnt;i++) {
if(mod[i].langs[0]!=j) continue;
fprintf(addrf,"%d:%s\n",i,mod[i].name+3);
fprintf(serialf,"%s:%d\n",mod[i].name+3,i);
onesheet(i,j);
if(mod[i].langs[0]!=j) continue;
fprintf(addrf,"%d:%s\n",i,mod[i].name+3);
fprintf(serialf,"%s:%d\n",mod[i].name+3,i);
onesheet(i,j);
}
if(mentrycount>0) free(mdicbuf);
if(gentrycount>0) free(gdicbuf);
804,19 → 804,19
if(dentrycount>0) free(ddicbuf);
fclose(titf); fclose(descf); fclose(indf); fclose(listf);
fclose(weightf); fclose(addrf); fclose(serialf);
}
}
}
 
int main()
{
gentry=xmalloc(entry_size);
dentry=xmalloc(entry_size);
mentry=xmalloc(entry_size);
prep();
if(modcnt>0) modules();
clean();
sprep();
if(modcnt>0) sheets();
return 0;
gentry=xmalloc(entry_size);
dentry=xmalloc(entry_size);
mentry=xmalloc(entry_size);
prep();
if(modcnt>0) modules();
clean();
sprep();
if(modcnt>0) sheets();
return 0;
}
 
/trunk/wims/src/Misc/modstat.c
37,97 → 37,97
 
void getlangs(void)
{
char *p;
char *p;
 
langs=getenv("w_wims_site_languages"); if(langs==NULL) langs="";
for(p=langs;strlen(p)>=2 && languagecnt<MAX_LANGS;
langs=getenv("w_wims_site_languages"); if(langs==NULL) langs="";
for(p=langs;strlen(p)>=2 && languagecnt<MAX_LANGS;
p=find_word_start(find_word_end(p))) {
if(!isalpha(*p) || !isalpha(*(p+1))) continue;
memmove(language[languagecnt],p,2);
language[languagecnt][2]=0;
languagecnt++;
}
if(!isalpha(*p) || !isalpha(*(p+1))) continue;
memmove(language[languagecnt],p,2);
language[languagecnt][2]=0;
languagecnt++;
}
}
 
int onefile(char *name)
{
FILE *f;
char *buf, *p, *pe, *p2, *p3;
long int len,len2;
int s,i,j,k,t,u;
FILE *f;
char *buf, *p, *pe, *p2, *p3;
long int len,len2;
int s,i,j,k,t,u;
 
f=fopen(name,"r"); if(f==NULL) return 0;
fseek(f,0,SEEK_END);len=ftell(f);
if(len<=0 || len>MAX_FLEN) return 0;
fseek(f,0,SEEK_SET);buf=xmalloc(len+1);
len2=fread(buf,1,len,f);
if(len2<=0 || len2>len) {
free(buf); return 0;
}
buf[len2]=0; fclose(f); s=t=u=0;
for(p=buf;p!=NULL && p<buf+len2;p=pe) {
p=find_word_start(p); pe=strchr(p,'\n');
if(pe!=NULL) *pe++=0;
p2=find_word_end(p);
if(*p2!=0) *p2++=0;
p2=find_word_start(p2);
p3=find_word_start(find_word_end(p2));
*find_word_end(p3)=0;
if(*p!=0) i=atoi(p); else i=0;
if(*p2!=0) j=atoi(p2); else j=0;
if(*p3!=0) k=atoi(p3); else k=0;
if(t==0 && i<mstart) mstart=i;
f=fopen(name,"r"); if(f==NULL) return 0;
fseek(f,0,SEEK_END);len=ftell(f);
if(len<=0 || len>MAX_FLEN) return 0;
fseek(f,0,SEEK_SET);buf=xmalloc(len+1);
len2=fread(buf,1,len,f);
if(len2<=0 || len2>len) {
free(buf); return 0;
}
buf[len2]=0; fclose(f); s=t=u=0;
for(p=buf;p!=NULL && p<buf+len2;p=pe) {
p=find_word_start(p); pe=strchr(p,'\n');
if(pe!=NULL) *pe++=0;
p2=find_word_end(p);
if(*p2!=0) *p2++=0;
p2=find_word_start(p2);
p3=find_word_start(find_word_end(p2));
*find_word_end(p3)=0;
if(*p!=0) i=atoi(p); else i=0;
if(*p2!=0) j=atoi(p2); else j=0;
if(*p3!=0) k=atoi(p3); else k=0;
if(t==0 && i<mstart) mstart=i;
if(i>=start && i<=end) {s+=j; u+=k;}
t=1;
}
reqs+=s; sites+=u;
if(modtype==3) return u;
else return s;
}
reqs+=s; sites+=u;
if(modtype==3) return u;
else return s;
}
 
void onemodule(char *mod)
{
char ibuf[MAX_LINELEN+5];
int i,k,sum;
char ibuf[MAX_LINELEN+5];
int i,k,sum;
 
sum=reqs=sites=0;mstart=end;
k=onefile(mod);sum+=k;
for(i=0;i<languagecnt;i++) {
snprintf(ibuf,sizeof(ibuf),"%s.%s",mod,language[i]);
k=onefile(ibuf);sum+=k;
count[i]=k;
}
if(modtype!=2) tcount=sum;
else {
if(sites>0) tcount=(double) (100*reqs/sites+0.5);
else tcount=0;
}
sum=reqs=sites=0;mstart=end;
k=onefile(mod);sum+=k;
for(i=0;i<languagecnt;i++) {
snprintf(ibuf,sizeof(ibuf),"%s.%s",mod,language[i]);
k=onefile(ibuf);sum+=k;
count[i]=k;
}
if(modtype!=2) tcount=sum;
else {
if(sites>0) tcount=(double) (100*reqs/sites+0.5);
else tcount=0;
}
}
 
int main()
{
char mmbuf[MAX_LINELEN+1];
char *p1, *p2, *pp;
int i;
char mmbuf[MAX_LINELEN+1];
char *p1, *p2, *pp;
int i;
 
mlist=getenv("ll");
if(mlist==NULL || *mlist==0) return 1;
pp=getenv("start"); if(pp==NULL || *pp==0) return 1;
start=atoi(pp);
pp=getenv("end"); if(pp==NULL || *pp==0) return 1;
end=atoi(pp);
pp=getenv("w_module_type");
if(pp==NULL || (*pp!='2' && *pp!='3')) modtype=1; else modtype=*pp-'0';
getlangs();
for(p1=find_word_start(mlist);*p1!=0 && !isspace(*p1); p1=find_word_start(p2)) {
p2=find_word_end(p1);
if(p2-p1>MAX_LINELEN) continue;
memmove(mmbuf,p1,p2-p1);mmbuf[p2-p1]=0;
onemodule(mmbuf);
printf("%d %d %s",tcount,mstart,mmbuf);
for(i=0;i<languagecnt;i++) printf(" %d",count[i]);
printf("\n");
}
return 0;
mlist=getenv("ll");
if(mlist==NULL || *mlist==0) return 1;
pp=getenv("start"); if(pp==NULL || *pp==0) return 1;
start=atoi(pp);
pp=getenv("end"); if(pp==NULL || *pp==0) return 1;
end=atoi(pp);
pp=getenv("w_module_type");
if(pp==NULL || (*pp!='2' && *pp!='3')) modtype=1; else modtype=*pp-'0';
getlangs();
for(p1=find_word_start(mlist);*p1!=0 && !isspace(*p1); p1=find_word_start(p2)) {
p2=find_word_end(p1);
if(p2-p1>MAX_LINELEN) continue;
memmove(mmbuf,p1,p2-p1);mmbuf[p2-p1]=0;
onemodule(mmbuf);
printf("%d %d %s",tcount,mstart,mmbuf);
for(i=0;i<languagecnt;i++) printf(" %d",count[i]);
printf("\n");
}
return 0;
}
 
/trunk/wims/src/Misc/oncechar.c
32,38 → 32,38
 
int getword(void)
{
int t,c;
int t,c;
 
do c=getchar(); while(isspace(c));
for(t=0; t<MAX_WORDLEN && isalnum(c); t++, c=getchar()) wbuf[t]=c;
wbuf[t]=0; return c;
do c=getchar(); while(isspace(c));
for(t=0; t<MAX_WORDLEN && isalnum(c); t++, c=getchar()) wbuf[t]=c;
wbuf[t]=0; return c;
}
 
void checkword(void)
{
char sbuf[256];
char *p, *pt;
memmove(sbuf,selbuf,sizeof(sbuf));
for(p=wbuf; *p; p++) {
pt=strchr(sbuf,*p); if(pt==NULL) return;
else *pt=' ';
}
printf("%s\n",wbuf);
char sbuf[256];
char *p, *pt;
memmove(sbuf,selbuf,sizeof(sbuf));
for(p=wbuf; *p; p++) {
pt=strchr(sbuf,*p); if(pt==NULL) return;
else *pt=' ';
}
printf("%s\n",wbuf);
}
 
int main(int argc, char *argv[])
{
int c;
char *p;
int c;
char *p;
 
p=getenv("oncechar"); if(p==NULL || *p==0) return 0;
snprintf(selbuf,sizeof(selbuf),"%s",p);
for(p=selbuf; *p; p++)
if(isspace(*p) || strchr("^?*.${}[]()\\",*p)!=NULL) ovlstrcpy(p,p+1);
do{
c=getword(); checkword();
}
while(c!=EOF);
return 0;
p=getenv("oncechar"); if(p==NULL || *p==0) return 0;
snprintf(selbuf,sizeof(selbuf),"%s",p);
for(p=selbuf; *p; p++)
if(isspace(*p) || strchr("^?*.${}[]()\\",*p)!=NULL) ovlstrcpy(p,p+1);
do{
c=getword(); checkword();
}
while(c!=EOF);
return 0;
}
 
/trunk/wims/src/Misc/phtmltext.c
32,101 → 32,101
/* get the file */
void prepare_file(void)
{
FILE *f;
long int flen;
FILE *f;
long int flen;
 
filelen=0;
f=fopen(filename,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen>0 && flen<buflim) filebuf[flen]=0; else flen=0;
filelen=flen;
filelen=0;
f=fopen(filename,"r"); if(f==NULL) return;
fseek(f,0,SEEK_END);flen=ftell(f); fseek(f,0,SEEK_SET);
if(flen>buflim) return;
filebuf=xmalloc(2*flen+1024);flen=fread(filebuf,1,flen,f);
fclose(f);
if(flen>0 && flen<buflim) filebuf[flen]=0; else flen=0;
filelen=flen;
}
 
void processbuf(void)
{
char *p;
deaccent(filebuf);
for(p=filebuf; *p; p++) *p=tolower(*p);
for(p=strpbrk(filebuf,"'-"); p!=NULL; p=strpbrk(p+1,"'-")) *p=' ';
for(p=strstr(filebuf,"&nbsp;"); p!=NULL; p=strstr(p+1,"&nbsp;")) {
*p=' '; ovlstrcpy(p+1,p+6);
}
char *p;
deaccent(filebuf);
for(p=filebuf; *p; p++) *p=tolower(*p);
for(p=strpbrk(filebuf,"'-"); p!=NULL; p=strpbrk(p+1,"'-")) *p=' ';
for(p=strstr(filebuf,"&nbsp;"); p!=NULL; p=strstr(p+1,"&nbsp;")) {
*p=' '; ovlstrcpy(p+1,p+6);
}
}
 
void output(void)
{
char *p, *pp, lastc;
p=find_word_start(filebuf); lastc=0;
if(*p=='!' || *p==':') goto cont1;
for(;*p;p++) {
if(*p=='\n') {
if(!isspace(lastc)) {printf(" "); lastc=' ';}
cont2: p=find_word_start(p);
if(*p=='!' || *p==':') {
if(lastc!=' ') printf(". ");
lastc=' ';
cont1: p=strchr(p,'\n');
if(p==NULL) return;
if(*(p-1)=='\\') {p++; goto cont1;}
goto cont2;
}
for(pp=p; isalnum(*pp) || *pp=='_' || *pp=='$'; pp++);
pp=find_word_start(pp);
if(*pp=='=') goto cont1;
char *p, *pp, lastc;
p=find_word_start(filebuf); lastc=0;
if(*p=='!' || *p==':') goto cont1;
for(;*p;p++) {
if(*p=='\n') {
if(!isspace(lastc)) {printf(" "); lastc=' ';}
cont2: p=find_word_start(p);
if(*p=='!' || *p==':') {
if(lastc!=' ') printf(". ");
lastc=' ';
cont1: p=strchr(p,'\n');
if(p==NULL) return;
if(*(p-1)=='\\') {p++; goto cont1;}
goto cont2;
}
if(*p=='\\' && *(p+1)=='\n') {
printf("\n"); p++; continue;
for(pp=p; isalnum(*pp) || *pp=='_' || *pp=='$'; pp++);
pp=find_word_start(pp);
if(*pp=='=') goto cont1;
}
if(*p=='\\' && *(p+1)=='\n') {
printf("\n"); p++; continue;
}
if(*p=='<' && (isalpha(*(p+1)) || *(p+1)=='/')) {
p=strchr(p,'>'); goto nextp;
}
if(*p=='$') {
if(lastc != ' ') {
if(!isspace(lastc)) printf(" ");
printf(". "); lastc=' ';
}
if(*p=='<' && (isalpha(*(p+1)) || *(p+1)=='/')) {
p=strchr(p,'>'); goto nextp;
p++;
if(*p=='(') {p=find_matching(p+1,')'); goto nextp;}
if(*p=='[') {p=find_matching(p+1,']'); goto nextp;}
while(isalnum(*p) || *p=='_') p++;
p--; continue;
}
if(*p=='&') {
char *p2;
for(p2=p+1; isalnum(*p2) || *p2=='#'; p2++);
if(*p2==';') {
p++; if(isalpha(*p)) {printf("%c",*p); lastc=*p;}
p=p2; continue;
}
if(*p=='$') {
if(lastc != ' ') {
if(!isspace(lastc)) printf(" ");
printf(". "); lastc=' ';
}
p++;
if(*p=='(') {p=find_matching(p+1,')'); goto nextp;}
if(*p=='[') {p=find_matching(p+1,']'); goto nextp;}
while(isalnum(*p) || *p=='_') p++;
p--; continue;
}
if(!isspace(*p) && strchr(":!?.;,\"()[]{}=/\\+*^%@~`<>|",*p)==NULL)
{printf("%c",*p); lastc=*p;}
else {
if(isspace(*p) && !isspace(lastc)) {
printf(" "); lastc=' ';
}
if(*p=='&') {
char *p2;
for(p2=p+1; isalnum(*p2) || *p2=='#'; p2++);
if(*p2==';') {
p++; if(isalpha(*p)) {printf("%c",*p); lastc=*p;}
p=p2; continue;
}
if(!isspace(*p)) {
switch(lastc) {
case ' ': printf(". "); lastc=' '; break;
case ' ': break;
default: printf(" . "); lastc=' '; break;
}
}
if(!isspace(*p) && strchr(":!?.;,\"()[]{}=/\\+*^%@~`<>|",*p)==NULL)
{printf("%c",*p); lastc=*p;}
else {
if(isspace(*p) && !isspace(lastc)) {
printf(" "); lastc=' ';
}
if(!isspace(*p)) {
switch(lastc) {
case ' ': printf(". "); lastc=' '; break;
case ' ': break;
default: printf(" . "); lastc=' '; break;
}
}
}
nextp: if(p==NULL || *p==0) break;
}
nextp: if(p==NULL || *p==0) break;
}
}
 
int main(int argc, char *argv[])
{
if(argc<=1) return 0;
snprintf(filename,sizeof(filename)-128,"%s",argv[1]);
prepare_file();
processbuf();
output();
return 0;
if(argc<=1) return 0;
snprintf(filename,sizeof(filename)-128,"%s",argv[1]);
prepare_file();
processbuf();
output();
return 0;
}
 
/trunk/wims/src/Misc/shortpath.c
54,290 → 54,291
/* reverse a subchain */
void reverse(int i, int j)
{
int k,t;
for(k=0;k<(j-i+1)/2;k++) {
t=chain[i+k]; chain[i+k]=chain[j-k];
chain[j-k]=t;
}
int k,t;
for(k=0;k<(j-i+1)/2;k++) {
t=chain[i+k]; chain[i+k]=chain[j-k];
chain[j-k]=t;
}
}
 
/* move point i to position j */
void reinsert(int i, int j)
{
int t;
t=chain[i];
if(j>i) {
j--;
memmove(chain+i,chain+i+1,(j-i)*sizeof(chain[0]));
chain[j]=t;
}
else {
memmove(chain+j+1,chain+j,(i-j)*sizeof(chain[0]));
chain[j]=t;
}
int t;
t=chain[i];
if(j>i) {
j--;
memmove(chain+i,chain+i+1,(j-i)*sizeof(chain[0]));
chain[j]=t;
}
else {
memmove(chain+j+1,chain+j,(i-j)*sizeof(chain[0]));
chain[j]=t;
}
}
 
int _fcalc(void)
{
int modif;
int i,j;
int modif;
int i,j;
 
modif=0;
modif=0;
/* four-configuration optimize */
for(i=1;i<pointcnt-2;i++) {
for(j=i+1;j<pointcnt-1;j++) {
if(dist[chain[i-1]][chain[i]]+dist[chain[j]][chain[j+1]]
>dist[chain[i-1]][chain[j]]+dist[chain[i]][chain[j+1]]
+tolerance) {
reverse(i,j); modif=1;
}
}
for(i=1;i<pointcnt-2;i++) {
for(j=i+1;j<pointcnt-1;j++) {
if(dist[chain[i-1]][chain[i]]+dist[chain[j]][chain[j+1]]
>dist[chain[i-1]][chain[j]]+dist[chain[i]][chain[j+1]]
+tolerance) {
reverse(i,j); modif=1;
}
}
}
/* Point relink */
for(i=1;i<pointcnt-1;i++) {
double dd;
int th;
th=chain[i];
dd=dist[chain[i-1]][th]+dist[th][chain[i+1]]
-dist[chain[i-1]][chain[i+1]];
for(j=0;j<pointcnt-1;j++) {
if(j==i || j==i-1) continue;
if(dd>dist[chain[j]][th]+dist[chain[j+1]][th]
-dist[chain[j]][chain[j+1]]+tolerance) {
reinsert(i,j+1); modif=1;
}
for(i=1;i<pointcnt-1;i++) {
double dd;
int th;
th=chain[i];
dd=dist[chain[i-1]][th]+dist[th][chain[i+1]]
-dist[chain[i-1]][chain[i+1]];
for(j=0;j<pointcnt-1;j++) {
if(j==i || j==i-1) continue;
if(dd>dist[chain[j]][th]+dist[chain[j+1]][th]
-dist[chain[j]][chain[j+1]]+tolerance) {
reinsert(i,j+1); modif=1;
}
}
for(i=0;i<pointcnt;i++) shpath[shortcnt][i]=chain[i];
shortcnt+=modif; return modif;
}
for(i=0;i<pointcnt;i++) shpath[shortcnt][i]=chain[i];
shortcnt+=modif; return modif;
}
 
void fastcalc(void)
{
int i,j;
int i,j;
 
for(i=0;i<pointcnt;i++) chain[i]=i;
shortcnt=1;
for(i=0,j=1;i<10 && j!=0;i++) j=_fcalc();
for(i=0;i<pointcnt;i++) chain[i]=i;
shortcnt=1;
for(i=0,j=1;i<10 && j!=0;i++) j=_fcalc();
 
for(shortest=0,i=0;i<pointcnt-1;i++) shortest+=dist[chain[i]][chain[i+1]];
if(style==0) shortest+=dist[chain[0]][chain[pointcnt-1]];
for(i=0;i<pointcnt;i++) shpath[0][i]=chain[i];
for(shortest=0,i=0;i<pointcnt-1;i++) shortest+=dist[chain[i]][chain[i+1]];
if(style==0) shortest+=dist[chain[0]][chain[pointcnt-1]];
for(i=0;i<pointcnt;i++) shpath[0][i]=chain[i];
}
 
void _calc(int level, double dis, long used, int utab[])
{
int current[MAX_POINTS];
double dd,d1,d3,d2,dthis;
int i;
long l;
int current[MAX_POINTS];
double dd,d1,d3,d2,dthis;
int i;
long l;
 
dd=dis; d1=d2=d3=0;
if(level<pointcnt-2) {
int j,b,prec;
double btab[MAX_POINTS];
if(level>0) prec=utab[level-1]; else prec=0;
if(level>2) {
for(i=0;i<level-2;i++)
btab[i]=dist[utab[i]][prec];
if(level>3) {
d1=ds[level-4]+ds[level-3]+ds[level-2];
d3=dist[utab[level-4]][utab[level-2]]
+ds[level-2]
+dist[prec][utab[level-3]];
d2=dist[utab[level-4]][prec]
+dist[prec][utab[level-3]]
+ds[level-3];
}
dd=dis; d1=d2=d3=0;
if(level<pointcnt-2) {
int j,b,prec;
double btab[MAX_POINTS];
if(level>0) prec=utab[level-1]; else prec=0;
if(level>2) {
for(i=0;i<level-2;i++)
btab[i]=dist[utab[i]][prec];
if(level>3) {
d1=ds[level-4]+ds[level-3]+ds[level-2];
d3=dist[utab[level-4]][utab[level-2]]
+ds[level-2]
+dist[prec][utab[level-3]];
d2=dist[utab[level-4]][prec]
+dist[prec][utab[level-3]]
+ds[level-3];
}
if(level==0 || (level==1 && style==0)) b=last+1; else b=0;
for(i=b,l=(long) 1<<b;i<pointcnt;i++,l<<=1) {
if(used&l) continue;
dthis=dist[prec][i];
if(optimize) {
if(style==0) {
if(level>1 &&
firstlast+dthis>dist[prec][last]+dist[first][i])
continue;
}
else if(level>0) {
}
if(level==0 || (level==1 && style==0)) b=last+1; else b=0;
for(i=b,l=(long) 1<<b;i<pointcnt;i++,l<<=1) {
if(used&l) continue;
dthis=dist[prec][i];
if(optimize) {
if(style==0) {
if(level>1 &&
firstlast+dthis>dist[prec][last]+dist[first][i])
continue;
}
else if(level>0) {
/* cut differently */
if(style==1 && dthis>firstlast) continue;
if(style==1 && dthis>firstlast) continue;
/* switch with first */
if((style&1) && level>1 && dist[first][i]<dthis) continue;
if((style&1) && level>1 && dist[first][i]<dthis) continue;
/* switch with last */
if(style<3 && dist[prec][last]<dthis) continue;
}
if(style<3 && dist[prec][last]<dthis) continue;
}
/* already too long */
if(level>0 && shortcnt>0 &&
if(level>0 && shortcnt>0 &&
dthis+dis+distmin*(pointcnt-level-1)>shortest)
continue;
continue;
/* four-config optimize */
for(j=0;j<=level-3;j++) {
if(ds[j]+dthis>btab[j]+dist[utab[j+1]][i])
goto next;
}
for(j=0;j<=level-3;j++) {
if(ds[j]+dthis>btab[j]+dist[utab[j+1]][i])
goto next;
}
/* five-config optimize */
if(level>3 &&
if(level>3 &&
(d1+dthis>d2+dist[utab[level-2]][i] ||
d1+dthis>d3+dist[utab[level-3]][i]))
continue;
continue;
/* try prec elsewhere in the chain */
if(level>3) {
double dt;
dt=dist[prec][i]+ds[level-2]-dist[utab[level-2]][i];
for(j=0;j<level-3;j++) {
if(dt>dist[prec][utab[j]]+dist[prec][utab[j+1]]-ds[j])
goto next;
}
if(level>3) {
double dt;
dt=dist[prec][i]+ds[level-2]-dist[utab[level-2]][i];
for(j=0;j<level-3;j++) {
if(dt>dist[prec][utab[j]]+dist[prec][utab[j+1]]-ds[j])
goto next;
}
}
memmove(current,utab,level*sizeof(utab[0]));
current[level]=i;
if(level>0) {dd=dis+dthis; ds[level-1]=dthis;}
else {
first=i; firstlast=dist[first][last];
}
_calc(level+1,dd,used|l,current);
next: ;
}
}
memmove(current,utab,level*sizeof(utab[0]));
current[level]=i;
if(level>0) {dd=dis+dthis; ds[level-1]=dthis;}
else {
first=i; firstlast=dist[first][last];
}
_calc(level+1,dd,used|l,current);
next: ;
}
 
}
else {
count++;
for(i=0,l=(long) 1;i<pointcnt && used&l; i++,l<<=1);
if(i>=pointcnt) {
printf("ERROR: Internal error.\n"); exit(1);
}
else {
count++;
for(i=0,l=(long) 1;i<pointcnt && used&l; i++,l<<=1);
if(i>=pointcnt) {
printf("ERROR: Internal error.\n"); exit(1);
}
utab[pointcnt-2]=i; utab[pointcnt-1]=last;
dis+=dist[utab[pointcnt-3]][i]+dist[i][last];
if(shortest==0 || dis<shortest-tolerance) {
shortest=dis; shortcnt=0;
memmove(shpath[shortcnt++],utab,MAX_POINTS*sizeof(utab[0]));
}
else if(dis<shortest+tolerance && shortcnt<MAX_SHORT)
memmove(shpath[shortcnt++],utab,MAX_POINTS*sizeof(utab[0]));
utab[pointcnt-2]=i; utab[pointcnt-1]=last;
dis+=dist[utab[pointcnt-3]][i]+dist[i][last];
if(shortest==0 || dis<shortest-tolerance) {
shortest=dis; shortcnt=0;
memmove(shpath[shortcnt++],utab,MAX_POINTS*sizeof(utab[0]));
}
else if(dis<shortest+tolerance && shortcnt<MAX_SHORT)
memmove(shpath[shortcnt++],utab,MAX_POINTS*sizeof(utab[0]));
}
}
 
/* main calculation loops */
void calc(void)
{
int i;
long used;
int utab[MAX_POINTS];
int i;
long used;
int utab[MAX_POINTS];
 
if(fast) {
fastcalc(); return;
if(fast) {
fastcalc(); return;
}
count=0; shortest=0; shortcnt=0;
memset(utab,0,sizeof(utab));
switch(style) {
case 0: { /* loop to the start */
first=0; utab[0]=0;
for(i=1;i<pointcnt;i++) {
last=i; used=(long) 1<<i; used|=(long) 1;
firstlast=dist[first][last];
_calc(1,firstlast,used,utab);
}
break;
}
count=0; shortest=0; shortcnt=0;
memset(utab,0,sizeof(utab));
switch(style) {
case 0: { /* loop to the start */
first=0; utab[0]=0;
for(i=1;i<pointcnt;i++) {
last=i; used=(long) 1<<i; used|=(long) 1;
firstlast=dist[first][last];
_calc(1,firstlast,used,utab);
}
break;
case 1: { /* arbitrary open path */
for(i=0;i<pointcnt;i++) {
last=i; used=(long) 1<<i;
_calc(0,0,used,utab);
}
case 1: { /* arbitrary open path */
for(i=0;i<pointcnt;i++) {
last=i; used=(long) 1<<i;
_calc(0,0,used,utab);
}
break;
}
case 2: { /* open path with fixed start */
first=0; utab[0]=0;
for(i=1;i<pointcnt;i++) {
last=i; used=(long) 1|(1<<i);
firstlast=dist[0][last];
_calc(1,0,used,utab);
}
break;
}
case 3: { /* open path with fixed end */
last=0; used=(long) 1;
_calc(0,0,used,utab);
break;
}
case 4: { /* open path with fixed start and end */
first=0; utab[0]=0;
last=pointcnt-1; used=(long) 1|(1<<last);
firstlast=dist[first][last];
break;
}
case 2: { /* open path with fixed start */
first=0; utab[0]=0;
for(i=1;i<pointcnt;i++) {
last=i; used=(long) 1|(1<<i);
firstlast=dist[0][last];
_calc(1,0,used,utab);
break;
}
}
break;
}
case 3: { /* open path with fixed end */
last=0; used=(long) 1;
_calc(0,0,used,utab);
break;
}
case 4: { /* open path with fixed start and end */
first=0; utab[0]=0;
last=pointcnt-1; used=(long) 1|(1<<last);
firstlast=dist[first][last];
_calc(1,0,used,utab);
break;
}
}
}
 
/* Print the result */
void printresult(void)
{
int i,j;
int i,j;
 
printf("%f %d %d\n",shortest,shortcnt,count);
for(j=0;j<shortcnt;j++) {
for(i=0;i<pointcnt;i++) printf("%d ",shpath[j][i]+1);
printf("\n");
}
printf("%f %d %d\n",shortest,shortcnt,count);
for(j=0;j<shortcnt;j++) {
for(i=0;i<pointcnt;i++) printf("%d ",shpath[j][i]+1);
printf("\n");
}
}
 
/* prepare distance table */
void makedist(void)
{
int i,j,k;
double d;
int i,j,k;
double d;
 
distmin=-1;
for(i=0;i<pointcnt-1;i++) {
for(j=i+1;j<pointcnt;j++) {
d=0;
for(k=0;k<dimension;k++) {
d+=pow(coord[i][k]-coord[j][k],2);
}
d=sqrt(d); dist[i][j]=dist[j][i]=d;
if(distmin<0 || distmin>d) distmin=d;
distmin=-1;
for(i=0;i<pointcnt-1;i++) {
for(j=i+1;j<pointcnt;j++) {
d=0;
for(k=0;k<dimension;k++) {
d+=pow(coord[i][k]-coord[j][k],2);
}
d=sqrt(d); dist[i][j]=dist[j][i]=d;
if(distmin<0 || distmin>d) distmin=d;
}
tolerance=distmin*0.000001;
}
tolerance=distmin*0.000001;
}
 
int main(int argc, char *argv[])
{
char *p,*p2,*p3;
int dim;
input=getenv("wims_exec_parm");
char *p,*p2,*p3;
int dim;
input=getenv("wims_exec_parm");
/* nothing to do if no problem */
if(input==NULL || *input==0) return 0;
if(input==NULL || *input==0) return 0;
 
for(p=input+strlen(input);p>input && isspace(*(p-1));p--);
*p=0; dimension=0;
for(pointcnt=0,p=input;*p!=0 && pointcnt<MAX_POINTS;p=p3) {
p2=strchr(p,'\n');
if(p2==NULL) p3=p+strlen(p);
else {p3=p2+1; *p2=0;}
dim=0;
for(p2=strchr(p,','); p2!=NULL && dim<MAX_DIM;
p=p2+1,dim++,p2=strchr(p,',')) {
*p2=0; coord[pointcnt][dim]=strtod(p,NULL);
}
if(dim<MAX_DIM) coord[pointcnt][dim++]=strtod(p,NULL);
if(dim<2) continue; /* bad line */
if(dimension==0) dimension=dim;
pointcnt++;
for(p=input+strlen(input);p>input && isspace(*(p-1));p--);
*p=0; dimension=0;
for(pointcnt=0,p=input;*p!=0 && pointcnt<MAX_POINTS;p=p3) {
p2=strchr(p,'\n');
if(p2==NULL) p3=p+strlen(p);
else {p3=p2+1; *p2=0;}
dim=0;
for(p2=strchr(p,','); p2!=NULL && dim<MAX_DIM;
p=p2+1,dim++,p2=strchr(p,',')) {
*p2=0; coord[pointcnt][dim]=strtod(p,NULL);
}
if(pointcnt<3) {
printf("ERROR: Not enough points.\n"); exit(1);
}
p=getenv("w_shortpath_style");
if(p!=NULL) style=atoi(p);
if(style<0 || style>4) style=0;
makedist();
optimize=1; calc();printresult();
if(dim<MAX_DIM) coord[pointcnt][dim++]=strtod(p,NULL);
if(dim<2) continue; /* bad line */
if(dimension==0) dimension=dim;
pointcnt++;
}
if(pointcnt<3) {
printf("ERROR: Not enough points.\n"); exit(1);
}
p=getenv("w_shortpath_style");
if(p!=NULL) style=atoi(p);
if(style<0 || style>4) style=0;
makedist();
optimize=1; calc();printresult();
/* optimize=0; calc();printresult();
*/ return 0;
*/
return 0;
}
 
/trunk/wims/src/Misc/suffix.c
23,9 → 23,9
 
int suffixcnt;
struct {
unsigned char *original;
int olen;
unsigned char *replace;
unsigned char *original;
int olen;
unsigned char *replace;
}
suf[suflim];
char *sufbuf;
35,14 → 35,14
 
int sufcomp(int t, const unsigned char *s2)
{
int k;
int k;
 
for(k=0;k<suf[t].olen && k<sufwordlen
&& suf[t].original[k]==s2[sufwordlen-k-1];k++);
if(k>=suf[t].olen) {
if(sufwordlen>k) return -1; else return 0;
}
else return suf[t].original[k]-s2[sufwordlen-k-1];
for(k=0;k<suf[t].olen && k<sufwordlen
&& suf[t].original[k]==s2[sufwordlen-k-1];k++);
if(k>=suf[t].olen) {
if(sufwordlen>k) return -1; else return 0;
}
else return suf[t].original[k]-s2[sufwordlen-k-1];
}
 
/* searches a list. Returns index if found, -1 if nomatch.
51,65 → 51,65
*/
int suffix_list(void *list, int items, size_t item_size, const unsigned char *str)
{
int i1,i2,j,k,t,v;
unsigned char c,d;
int i1,i2,j,k,t,v;
unsigned char c,d;
 
if(items<=0) return -1;
k=sufcomp(0,str);
if(k==0) return 0;
if(k>0) return -1;
j=items-1; k=sufcomp(j,str);
if(items<=0) return -1;
k=sufcomp(0,str);
if(k==0) return 0;
if(k>0) return -1;
j=items-1; k=sufcomp(j,str);
if(k==0) return j;
if(k>0) for(i1=0,i2=j;i2>i1+1;) {
j=i1+(i2-i1)/2; k=sufcomp(j,str);
if(k==0) return j;
if(k>0) for(i1=0,i2=j;i2>i1+1;) {
j=i1+(i2-i1)/2; k=sufcomp(j,str);
if(k==0) return j;
if(k>0) {i2=j; continue;}
if(k<0) {i1=j; continue;}
}
if(k>0 && j>0) j--;
backcheck:
v=j;for(t=0;t<suf[j].olen && t<sufwordlen
&& suf[j].original[t]==str[sufwordlen-t-1];t++);
if(t<sufminlen) return -1;
if(t>=suf[j].olen) return j;
for(j--,c=str[sufwordlen-1],d=str[sufwordlen-t];
j>=0 && suf[j].original[0]==c && suf[j].olen>t
&& suf[j].original[t-1]==d;j--);
if(j>=0 && suf[j].original[0]==c &&
if(k>0) {i2=j; continue;}
if(k<0) {i1=j; continue;}
}
if(k>0 && j>0) j--;
backcheck:
v=j;for(t=0;t<suf[j].olen && t<sufwordlen
&& suf[j].original[t]==str[sufwordlen-t-1];t++);
if(t<sufminlen) return -1;
if(t>=suf[j].olen) return j;
for(j--,c=str[sufwordlen-1],d=str[sufwordlen-t];
j>=0 && suf[j].original[0]==c && suf[j].olen>t
&& suf[j].original[t-1]==d;j--);
if(j>=0 && suf[j].original[0]==c &&
strncmp((char*)suf[j].original,(char*)suf[v].original,suf[j].olen)==0)
return j;
else goto backcheck;
return j;
else goto backcheck;
}
 
/* Prepare dictionary. */
void suffix_dic(char *sdicname)
{
int i,l;
FILE *suff;
char *p1, *p2, *pp;
long int flen;
int i,l;
FILE *suff;
char *p1, *p2, *pp;
long int flen;
 
suffixcnt=0; sufminlen=100000;
suff=fopen(sdicname,"r"); if(suff==NULL) return;
fseek(suff,0,SEEK_END);flen=ftell(suff); fseek(suff,0,SEEK_SET);
if(flen>sufbuflim) return;
sufbuf=xmalloc(flen+16);flen=fread(sufbuf,1,flen,suff);
fclose(suff);
if(flen>0 && flen<sufbuflim) sufbuf[flen]=0;
else return;
for(i=0,p1=sufbuf;p1!=NULL && *p1!=0 && i<suflim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,':'); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
suf[i].original=(unsigned char*)p1; suf[i].olen=l=strlen(p1);
if(l<sufminlen) sufminlen=l;
suf[i].replace=(unsigned char*)pp; i++;
}
suffixcnt=i;
suffixcnt=0; sufminlen=100000;
suff=fopen(sdicname,"r"); if(suff==NULL) return;
fseek(suff,0,SEEK_END);flen=ftell(suff); fseek(suff,0,SEEK_SET);
if(flen>sufbuflim) return;
sufbuf=xmalloc(flen+16);flen=fread(sufbuf,1,flen,suff);
fclose(suff);
if(flen>0 && flen<sufbuflim) sufbuf[flen]=0;
else return;
for(i=0,p1=sufbuf;p1!=NULL && *p1!=0 && i<suflim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,':'); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
suf[i].original=(unsigned char*)p1; suf[i].olen=l=strlen(p1);
if(l<sufminlen) sufminlen=l;
suf[i].replace=(unsigned char*)pp; i++;
}
suffixcnt=i;
}
 
/* Suffix translation. */
119,26 → 119,26
 
void suffix_translate(char *p)
{
char *p1, *p2;
int t;
char *p1, *p2;
int t;
 
for(p1=find_word_start(p);
p1!=NULL && p1-p<MAX_LINELEN && *p1!=0;
p1=p2) {
if(!isalpha(*p1)) {p2=p1+1; continue;}
for(p2=p1;isalpha(*p2);p2++);
if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
sufwordlen=p2-p1;
t=suffix_list(suf,suffixcnt,sizeof(suf[0]),(unsigned char*)p1);
if(t<0) continue;
string_modify3(p,p2-suf[t].olen,p2,(char*)suf[t].replace);
p2=p2-suf[t].olen+strlen((char*)suf[t].replace);
}
p[MAX_LINELEN]=0;
for(p1=find_word_start(p);
p1!=NULL && p1-p<MAX_LINELEN && *p1!=0;
p1=p2) {
if(!isalpha(*p1)) {p2=p1+1; continue;}
for(p2=p1;isalpha(*p2);p2++);
if(*p2!=0 && strchr(" ,.?!'\"\n`:;()[]{}<>",*p2)==NULL) continue;
sufwordlen=p2-p1;
t=suffix_list(suf,suffixcnt,sizeof(suf[0]),(unsigned char*)p1);
if(t<0) continue;
string_modify3(p,p2-suf[t].olen,p2,(char*)suf[t].replace);
p2=p2-suf[t].olen+strlen((char*)suf[t].replace);
}
p[MAX_LINELEN]=0;
}
 
void suffix(char *p, char *sdicname)
{
suffix_dic(sdicname); if(suffixcnt>0) suffix_translate(p);
suffix_dic(sdicname); if(suffixcnt>0) suffix_translate(p);
}
 
/trunk/wims/src/Misc/test.c
7,5 → 7,5
 
int main()
{
return 0;
return 0;
}
/trunk/wims/src/Misc/translator.c
50,16 → 50,16
/* Exit without translating anything */
void escape(void)
{
printf("%s",inpbuf); exit(0);
printf("%s",inpbuf); exit(0);
}
 
int compare(int i1, const char *s2)
{
int k;
if(nocase) k=strncasecmp((char*)entry[i1].original,s2,entry[i1].olen);
else k=strncmp((char*)entry[i1].original,s2,entry[i1].olen);
if(k==0 && (isalnum(*(s2+entry[i1].olen)) || (*(s2+entry[i1].olen)&128)!=0)) return -1;
else return k;
int k;
if(nocase) k=strncasecmp((char*)entry[i1].original,s2,entry[i1].olen);
else k=strncmp((char*)entry[i1].original,s2,entry[i1].olen);
if(k==0 && (isalnum(*(s2+entry[i1].olen)) || (*(s2+entry[i1].olen)&128)!=0)) return -1;
else return k;
}
 
/* searches a list. Returns index if found, -1 if nomatch.
67,215 → 67,216
*/
int search_list2(struct entry *list, int items, size_t item_size, const char *str)
{
int i1,i2,j,k,t,t1;
unsigned char c;
int i1,i2,j,k,t,t1;
unsigned char c;
 
if(items<=0) return -1;
j=0; c=str[0];
k=list[0].original[0]-c; if(k==0) k=compare(0,str);
if(items<=0) return -1;
j=0; c=str[0];
k=list[0].original[0]-c; if(k==0) k=compare(0,str);
if(k==0) goto more;
if(k>0) return -1;
j=items-1; k=list[j].original[0]-c; if(k==0) k=compare(j,str);
if(k==0) return j;
if(k>0) for(i1=0,i2=j;i2>i1+1;) {
j=i1+(i2-i1)/2;
k=list[j].original[0]-c; if(k==0) k=compare(j,str);
if(k==0) goto more;
if(k>0) return -1;
j=items-1; k=list[j].original[0]-c; if(k==0) k=compare(j,str);
if(k==0) return j;
if(k>0) for(i1=0,i2=j;i2>i1+1;) {
j=i1+(i2-i1)/2;
k=list[j].original[0]-c; if(k==0) k=compare(j,str);
if(k==0) goto more;
if(k>0) {i2=j; continue;}
if(k<0) {i1=j; continue;}
}
if(k>0) {j--;k=compare(j,str);}
more:
if((t=list[j].earlier)<0) {
if(k==0) return j; else return -1;
}
if(compare(t,str)!=0) return -1;
for(j=t1=t,k=0;j<items && list[j].earlier==t1 && (k=compare(j,str))<=0; j++) {
if(k==0) t=j;
}
return t;
if(k>0) {i2=j; continue;}
if(k<0) {i1=j; continue;}
}
if(k>0) {j--;k=compare(j,str);}
more:
if((t=list[j].earlier)<0) {
if(k==0) return j; else return -1;
}
if(compare(t,str)!=0) return -1;
for(j=t1=t,k=0;j<items && list[j].earlier==t1 && (k=compare(j,str))<=0; j++) {
if(k==0) t=j;
}
return t;
}
 
/* change all spaces into ' ', and collapse multiple occurences */
void singlespace2(char *p)
{
char *pp, *p2;
for(pp=p;*pp;pp++) {
if(!isspace(*pp)) continue;
if(leaveline) {
if(*pp==13) ovlstrcpy(pp,pp+1);
if(*pp=='\n') {
pp++;
gopt: for(p2=pp; isspace(*p2) && *p2!='\n'; p2++);
if(p2>pp) ovlstrcpy(pp,p2);
pp--;
}
else {
pp++; if(!isspace(*pp) || *pp=='\n') continue;
goto gopt;
}
char *pp, *p2;
for(pp=p;*pp;pp++) {
if(!isspace(*pp)) continue;
if(leaveline) {
if(*pp==13) ovlstrcpy(pp,pp+1);
if(*pp=='\n') {
pp++;
gopt: for(p2=pp; isspace(*p2) && *p2!='\n'; p2++);
if(p2>pp) ovlstrcpy(pp,p2);
pp--;
}
else {
if(*pp!=' ') *pp=' ';
pp++; if(!isspace(*pp)) continue;
for(p2=pp;isspace(*p2);p2++);
ovlstrcpy(pp,p2); pp--;
pp++; if(!isspace(*pp) || *pp=='\n') continue;
goto gopt;
}
}
else {
if(*pp!=' ') *pp=' ';
pp++; if(!isspace(*pp)) continue;
for(p2=pp;isspace(*p2);p2++);
ovlstrcpy(pp,p2); pp--;
}
}
}
 
/* Prepare dictionary */
static void prepare_dict(void)
{
int i,l;
FILE *dicf;
char *fname, *p1, *p2, *pp, buf[1024];
long int flen;
fname=getenv("w_dictionary");
if(fname==NULL || *fname==0 || *fname=='/' || strstr(fname,"..")) {
p1=getenv("w_module"); if(p1 && strncmp(p1,"classes/",strlen("classes/"))==0) {
p1=getenv("w_wims_class"); p2=getenv("w_wims_home");
if(p1 && p2) {
snprintf(buf,sizeof(buf),"%s/log/classes/%s/",p2,p1);
if(strncmp(fname,buf,strlen(buf))!=0) escape();
}
else escape();
int i,l;
FILE *dicf;
char *fname, *p1, *p2, *pp, buf[1024];
long int flen;
fname=getenv("w_dictionary");
if(fname==NULL || *fname==0 || *fname=='/' || strstr(fname,"..")) {
p1=getenv("w_module");
if(p1 && strncmp(p1,"classes/",strlen("classes/"))==0) {
p1=getenv("w_wims_class"); p2=getenv("w_wims_home");
if(p1 && p2) {
snprintf(buf,sizeof(buf),"%s/log/classes/%s/",p2,p1);
if(strncmp(fname,buf,strlen(buf))!=0) escape();
}
else {
p1=getenv("untrust"); if(p1 && strstr(p1,"yes")) escape();
}
else escape();
}
else {
p1=getenv("untrust"); if(p1 && strstr(p1,"yes")) escape();
}
}
/* replace escape() by return if there is some suffix dictionary, */
 
dicf=fopen(fname,"r"); if(dicf==NULL) return;
fseek(dicf,0,SEEK_END);flen=ftell(dicf); fseek(dicf,0,SEEK_SET);
if(flen>diclim) escape();
dicbuf=xmalloc(flen+16);flen=fread(dicbuf,1,flen,dicf);
fclose(dicf);
if(flen>0 && flen<diclim) dicbuf[flen]=0;
else escape();
for(i=0,p1=dicbuf;p1!=NULL && *p1!=0 && i<entrylim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,':'); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
if(has_digits==0) {
char *p;
for(p=p1;*p!=0 && p<pp && !isdigit(*p);p++);
if(isdigit(*p)) has_digits=1;
}
entry[i].original=(unsigned char*)p1;
entry[i].replace=(unsigned char*)pp;
entry[i].olen=l=strlen(p1); entry[i].earlier=-1;
if(i>0) {
int l1,l2;
l1=entry[i-1].earlier; if(l1>=0) l2=entry[l1].olen;
else {l2=entry[i-1].olen;l1=i-1;}
if(l>l2 && isspace(p1[l2])
&& strncmp((char*)entry[l1].original,p1,l2)==0)
entry[i].earlier=entry[i-1].earlier=l1;
}
i++;
dicf=fopen(fname,"r"); if(dicf==NULL) return;
fseek(dicf,0,SEEK_END);flen=ftell(dicf); fseek(dicf,0,SEEK_SET);
if(flen>diclim) escape();
dicbuf=xmalloc(flen+16);flen=fread(dicbuf,1,flen,dicf);
fclose(dicf);
if(flen>0 && flen<diclim) dicbuf[flen]=0;
else escape();
for(i=0,p1=dicbuf;p1!=NULL && *p1!=0 && i<entrylim;p1=p2) {
p2=strchr(p1+1,'\n'); if(p2>p1) *p2++=0;
pp=strchr(p1,':'); if(pp==NULL) continue;
*pp++=0;
strip_trailing_spaces2(p1); strip_trailing_spaces2(pp);
singlespace2(p1);
p1=find_word_start(p1); pp=find_word_start(pp);
if(*p1==0) continue;
if(has_digits==0) {
char *p;
for(p=p1;*p!=0 && p<pp && !isdigit(*p);p++);
if(isdigit(*p)) has_digits=1;
}
entrycount=i; if(entrycount<=0) escape();
entry[i].original=(unsigned char*)p1;
entry[i].replace=(unsigned char*)pp;
entry[i].olen=l=strlen(p1); entry[i].earlier=-1;
if(i>0) {
int l1,l2;
l1=entry[i-1].earlier; if(l1>=0) l2=entry[l1].olen;
else {l2=entry[i-1].olen;l1=i-1;}
if(l>l2 && isspace(p1[l2])
&& strncmp((char*)entry[l1].original,p1,l2)==0)
entry[i].earlier=entry[i-1].earlier=l1;
}
i++;
}
entrycount=i; if(entrycount<=0) escape();
}
 
/* now make the translation. */
void translate(void)
{
char *p1, *p2, *pp;
int t;
char *p1, *p2, *pp;
int t;
 
for(p1=find_word_start(outbuf);
for(p1=find_word_start(outbuf);
p1!=NULL && p1-outbuf<MAX_LINELEN && *p1!=0;
p1=p2) {
p2=find_word_end(p1);
for(pp=p1;pp<p2 &&
((!has_digits && isalpha(*pp)) ||
(has_digits && isalnum(*pp)) || (*pp&128)!=0 ||
strchr("_",*pp)!=NULL);pp++);
p2=find_word_start(p2);
if(pp==p1 ||
(has_digits==0 && isdigit(*pp)) ||
(*pp!=0 && !isspace(*pp) && strchr(",.?!/;",*pp)==NULL)) continue;
t=search_list2(entry,entrycount,sizeof(entry[0]),p1);
if(t<0) {
switch(unknown_type) {
case unk_leave: break;
case unk_delete: {
ovlstrcpy(p1,find_word_start(pp)); p2=p1;
break;
}
case unk_replace: {
string_modify3(outbuf,p1,pp,unkbuf);
p2=find_word_start(p1+strlen(unkbuf));
}
}
continue;
p2=find_word_end(p1);
for(pp=p1;pp<p2 &&
((!has_digits && isalpha(*pp)) ||
(has_digits && isalnum(*pp)) || (*pp&128)!=0 ||
strchr("_",*pp)!=NULL);pp++);
p2=find_word_start(p2);
if(pp==p1 ||
(has_digits==0 && isdigit(*pp)) ||
(*pp!=0 && !isspace(*pp) && strchr(",.?!/;",*pp)==NULL)) continue;
t=search_list2(entry,entrycount,sizeof(entry[0]),p1);
if(t<0) {
switch(unknown_type) {
case unk_leave: break;
case unk_delete: {
ovlstrcpy(p1,find_word_start(pp)); p2=p1;
break;
}
case unk_replace: {
string_modify3(outbuf,p1,pp,unkbuf);
p2=find_word_start(p1+strlen(unkbuf));
}
string_modify3(outbuf,p1,p1+strlen((char*)entry[t].original),
(char*)entry[t].replace);
p2=find_word_start(p1+strlen((char*)entry[t].replace));
}
outbuf[MAX_LINELEN]=0; printf("%s",outbuf);
continue;
}
string_modify3(outbuf,p1,p1+strlen((char*)entry[t].original),
(char*)entry[t].replace);
p2=find_word_start(p1+strlen((char*)entry[t].replace));
}
outbuf[MAX_LINELEN]=0; printf("%s",outbuf);
}
 
void switches(void)
{
char *sw;
unknown=getenv("w_translator_unknown");
if(unknown==NULL) unknown="";
snprintf(unkbuf,sizeof(unkbuf),"%s",find_word_start(unknown));
*find_word_end(unkbuf)=0;
if(strcasecmp(unkbuf,"leave")==0) unknown_type=unk_leave;
else if(unkbuf[0]!=0) unknown_type=unk_replace;
sw=getenv("w_translator_switch");
if(sw==NULL) return;
if(strstr(sw,"leaveline")) leaveline=1;
if(strstr(sw,"nocase")) nocase=1;
if(strstr(sw,"file")) fromfile=1;
char *sw;
unknown=getenv("w_translator_unknown");
if(unknown==NULL) unknown="";
snprintf(unkbuf,sizeof(unkbuf),"%s",find_word_start(unknown));
*find_word_end(unkbuf)=0;
if(strcasecmp(unkbuf,"leave")==0) unknown_type=unk_leave;
else if(unkbuf[0]!=0) unknown_type=unk_replace;
sw=getenv("w_translator_switch");
if(sw==NULL) return;
if(strstr(sw,"leaveline")) leaveline=1;
if(strstr(sw,"nocase")) nocase=1;
if(strstr(sw,"file")) fromfile=1;
}
 
int main()
{
char c, *p1, *p2, *s;
unsigned int l;
char c, *p1, *p2, *s;
unsigned int l;
 
switches();
if(!fromfile) {
s=getenv("wims_exec_parm");
if(s==NULL || *s==0) return 0; /* Nothing to translate */
l=strlen(s); if(l<=0 || l>sourcelim) return 0; /* too long */
inpbuf=xmalloc(l+16); memmove(inpbuf,s,l+1);
switches();
if(!fromfile) {
s=getenv("wims_exec_parm");
if(s==NULL || *s==0) return 0; /* Nothing to translate */
l=strlen(s); if(l<=0 || l>sourcelim) return 0; /* too long */
inpbuf=xmalloc(l+16); memmove(inpbuf,s,l+1);
}
else {
FILE *f;
s=getenv("translator_input"); if(s==NULL || *s==0) return 0;
f=fopen(s,"r"); if(f==NULL) return 0; /* no file */
fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET);
if(l<=0 || l>sourcelim) return 0; /* too long */
inpbuf=xmalloc(l+16); (void)fread(inpbuf,1,l,f); fclose(f); inpbuf[l]=0;
}
p1=inpbuf; prepare_dict();
if(leaveline) c='\n'; else c=' ';
do {
l=strlen(p1);
if(l>MAX_LINELEN-1024) l=MAX_LINELEN-1024;
p2=p1+l;
if(*p2) {
while(p2>p1 && *p2!=c) p2--;
}
else {
FILE *f;
s=getenv("translator_input"); if(s==NULL || *s==0) return 0;
f=fopen(s,"r"); if(f==NULL) return 0; /* no file */
fseek(f,0,SEEK_END); l=ftell(f); fseek(f,0,SEEK_SET);
if(l<=0 || l>sourcelim) return 0; /* too long */
inpbuf=xmalloc(l+16); (void)fread(inpbuf,1,l,f); fclose(f); inpbuf[l]=0;
}
p1=inpbuf; prepare_dict();
if(leaveline) c='\n'; else c=' ';
do {
l=strlen(p1);
if(l>MAX_LINELEN-1024) l=MAX_LINELEN-1024;
p2=p1+l;
if(*p2) {
while(p2>p1 && *p2!=c) p2--;
}
if(p2<=p1) return 0;
memmove(outbuf,p1,p2-p1); outbuf[p2-p1]=0;
singlespace2(outbuf);
s=getenv("w_suffix_dictionary");
if(s!=NULL && *s!=0) suffix(outbuf,s);
translate();
if(*p2==c) {printf("%c",c); p1=++p2;}
}
while(*p2);
return 0;
if(p2<=p1) return 0;
memmove(outbuf,p1,p2-p1); outbuf[p2-p1]=0;
singlespace2(outbuf);
s=getenv("w_suffix_dictionary");
if(s!=NULL && *s!=0) suffix(outbuf,s);
translate();
if(*p2==c) {printf("%c",c); p1=++p2;}
}
while(*p2);
return 0;
}
/trunk/wims/src/Misc/translator_.c
158,42 → 158,41
/* now make the translation. */
void translate(char *p)
{
char *p1, *p2, *pp;
int t;
char *p1, *p2, *pp;
int t;
 
if(entrycount<=0 && suffixcnt<=0) return;
snprintf(outbuf,sizeof(outbuf),"%s",p);
for(p1=find_word_start(outbuf);
p1!=NULL && p1-outbuf<MAX_LINELEN && *p1!=0;
p1=p2) {
p2=find_word_end(p1);
for(pp=p1;pp<p2 &&
((!has_digits && isalpha(*pp)) ||
(has_digits && isalnum(*pp)) || (*pp&128)!=0 ||
strchr("_",*pp)!=NULL);pp++);
p2=find_word_start(p2);
if(pp==p1 ||
(has_digits==0 && isdigit(*pp)) ||
(*pp!=0 && !isspace(*pp) && strchr(",.?!/;",*pp)==NULL)) continue;
t=search_list2(entry,entrycount,sizeof(entry[0]),p1);
if(t<0) {
switch(unknown_type) {
case unk_leave: break;
case unk_delete: {
ovlstrcpy(p1,find_word_start(pp)); p2=p1;
break;
}
case unk_replace: {
string_modify3(outbuf,p1,pp,unkbuf);
p2=find_word_start(p1+strlen(unkbuf));
}
}
continue;
if(entrycount<=0 && suffixcnt<=0) return;
snprintf(outbuf,sizeof(outbuf),"%s",p);
for(p1=find_word_start(outbuf);
p1!=NULL && p1-outbuf<MAX_LINELEN && *p1!=0;
p1=p2) {
p2=find_word_end(p1);
for(pp=p1;pp<p2 &&
((!has_digits && isalpha(*pp)) ||
(has_digits && isalnum(*pp)) || (*pp&128)!=0 ||
strchr("_",*pp)!=NULL);pp++);
p2=find_word_start(p2);
if(pp==p1 ||
(has_digits==0 && isdigit(*pp)) ||
(*pp!=0 && !isspace(*pp) && strchr(",.?!/;",*pp)==NULL)) continue;
t=search_list2(entry,entrycount,sizeof(entry[0]),p1);
if(t<0) {
switch(unknown_type) {
case unk_leave: break;
case unk_delete: {
ovlstrcpy(p1,find_word_start(pp)); p2=p1;
break;
}
case unk_replace: {
string_modify3(outbuf,p1,pp,unkbuf);
p2=find_word_start(p1+strlen(unkbuf));
}
}
string_modify3(outbuf,p1,p1+strlen((char*)entry[t].original),
continue;
}
string_modify3(outbuf,p1,p1+strlen((char*)entry[t].original),
(char*)entry[t].replace);
p2=find_word_start(p1+strlen((char*)entry[t].replace));
}
snprintf(p,MAX_LINELEN,"%s",outbuf);
p2=find_word_start(p1+strlen((char*)entry[t].replace));
}
snprintf(p,MAX_LINELEN,"%s",outbuf);
}
 
/trunk/wims/src/Misc/webget.c
41,44 → 41,44
 
void errorquit(char *msg)
{
fprintf(stderr,"%s: %s\n",msg,strerror(errno)); exit(1);
fprintf(stderr,"%s: %s\n",msg,strerror(errno)); exit(1);
}
 
/* Points to the end of the word */
char *find_word_end(char *p)
{
int i;
for(i=0;!isspace(*p) && *p!=0 && i<MAX_LINELEN; p++,i++);
return p;
int i;
for(i=0;!isspace(*p) && *p!=0 && i<MAX_LINELEN; p++,i++);
return p;
}
 
/* Strips leading spaces */
char *find_word_start(char *p)
{
int i;
for(i=0; isspace(*p) && i<MAX_LINELEN; p++,i++);
return p;
int i;
for(i=0; isspace(*p) && i<MAX_LINELEN; p++,i++);
return p;
}
 
/* Secured execution */
void secure(char *host)
{
char *p1, *p2, *p3, buf[MAX_LINELEN+1];
long int l;
FILE *f;
char *p1, *p2, *p3, buf[MAX_LINELEN+1];
long int l;
FILE *f;
 
p1=getenv("w_module"); if(p1==NULL || *p1==0) return;
p1=getenv("untrust"); if(p1==NULL || *p1==0) return;
f=fopen("webget.sites","r"); if(f==NULL) return;
l=fread(buf,1,MAX_LINELEN,f); fclose(f);
if(l<=0 || l>MAX_LINELEN) return;
buf[l]=0;
for(p1=find_word_start(buf);*p1;p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
p3=strstr(host,p1); if(p3==NULL) continue;
if((p3==host || *(p3-1)=='.') && *(p3+strlen(p1))==0) return;
}
exit(1); /* unauthorized sites refused. */
p1=getenv("w_module"); if(p1==NULL || *p1==0) return;
p1=getenv("untrust"); if(p1==NULL || *p1==0) return;
f=fopen("webget.sites","r"); if(f==NULL) return;
l=fread(buf,1,MAX_LINELEN,f); fclose(f);
if(l<=0 || l>MAX_LINELEN) return;
buf[l]=0;
for(p1=find_word_start(buf);*p1;p1=find_word_start(p2)) {
p2=find_word_end(p1); if(*p2) *p2++=0;
p3=strstr(host,p1); if(p3==NULL) continue;
if((p3==host || *(p3-1)=='.') && *(p3+strlen(p1))==0) return;
}
exit(1); /* unauthorized sites refused. */
}
 
/* open a TCP/IP socket with host/port
85,131 → 85,136
* returns the file descriptor for the socket */
int net_connect(char *host)
{
struct hostent *hp;
struct sockaddr_in sin;
int soc;
struct hostent *hp;
struct sockaddr_in sin;
int soc;
 
secure(host);
if(!(hp = gethostbyname(host))) errorquit("unknown host.");
if((soc = socket(hp->h_addrtype,SOCK_STREAM,0))<0)
errorquit("socket() error");
memmove(&sin.sin_addr,hp->h_addr,hp->h_length);
sin.sin_port=htons(port);
sin.sin_family = hp->h_addrtype;
if(connect(soc,(struct sockaddr *)&sin,sizeof(sin))<0) {
close(soc); errorquit("connect() error");
}
return soc;
secure(host);
if(!(hp = gethostbyname(host))) errorquit("unknown host.");
if((soc = socket(hp->h_addrtype,SOCK_STREAM,0))<0)
errorquit("socket() error");
memmove(&sin.sin_addr,hp->h_addr,hp->h_length);
sin.sin_port=htons(port);
sin.sin_family = hp->h_addrtype;
if(connect(soc,(struct sockaddr *)&sin,sizeof(sin))<0) {
close(soc); errorquit("connect() error");
}
return soc;
}
 
int gethttps(char *host)
{
char buf[65536];
char *tp;
char buf[65536];
char *tp;
 
tp=getenv("tmp_dir"); if(tp!=NULL && *tp!=0) tmpdir=tp;
snprintf(tfname,sizeof(tfname),"%s/https.tmp",tmpdir);
snprintf(buf,sizeof(buf),"\
tp=getenv("tmp_dir"); if(tp!=NULL && *tp!=0) tmpdir=tp;
snprintf(tfname,sizeof(tfname),"%s/https.tmp",tmpdir);
snprintf(buf,sizeof(buf),"\
mkdir -p %s\n\
openssl s_client -connect %s:%d -quiet 2>/dev/null >%s <<@\n\
%s\n\
@\n", tmpdir,host,port,tfname,tbuf);
if (system(buf))
errorquit("system() error");
return open(tfname,O_RDONLY);
if (system(buf))
errorquit("system() error");
return open(tfname,O_RDONLY);
}
 
int main(int argc, char *argv[])
{
char *parm, *pt, *p1, *p2, *p3, *p4, *dp, *pre;
char nbuf[4096], *pp1, *pp2;
char c;
char *parm, *pt, *p1, *p2, *p3, *p4, *dp, *pre;
char nbuf[4096], *pp1, *pp2;
char c;
 
parm=getenv("wims_exec_parm");
if(parm==NULL || *parm==0) errorquit("no_parameter");
snprintf(pbuf,sizeof(pbuf),"%s",parm);
p1=find_word_start(pbuf); p2=find_word_end(p1);
if(*p2!=0) *p2++=0;
https=0;
outf=stdout; pp1=getenv("w_webget_output");
pp2=getenv("session_dir");
if(pp1!=NULL && strstr(pp1,"..")==NULL && isalnum(*pp1) && pp2!=NULL) {
snprintf(nbuf,sizeof(nbuf),"%s/%s",pp2,pp1);
outf=fopen(nbuf,"w"); if(outf==NULL) outf=stdout;
parm=getenv("wims_exec_parm");
if(parm==NULL || *parm==0) errorquit("no_parameter");
snprintf(pbuf,sizeof(pbuf),"%s",parm);
p1=find_word_start(pbuf); p2=find_word_end(p1);
if(*p2!=0) *p2++=0;
https=0;
outf=stdout; pp1=getenv("w_webget_output");
pp2=getenv("session_dir");
if(pp1!=NULL && strstr(pp1,"..")==NULL && isalnum(*pp1) && pp2!=NULL) {
snprintf(nbuf,sizeof(nbuf),"%s/%s",pp2,pp1);
outf=fopen(nbuf,"w"); if(outf==NULL) outf=stdout;
}
dp=getenv("w_webget_option");
if(dp!=NULL && strstr(dp,"direct")!=NULL) { /* direct get */
p1=getenv("w_webget_host");
p2=getenv("w_webget_port");
if(p1==NULL || p2==NULL) errorquit("incomplete_request");
port=atoi(p2);
soc=net_connect(p1); if(soc==-1) return 1;
c=' ';
for(p3=parm; *p3; p3++) {
if(*p3=='\n' && c!='\r') (void)write(soc,"\r",1);
(void)write(soc,p3,1); c=*p3;
}
dp=getenv("w_webget_option");
if(dp!=NULL && strstr(dp,"direct")!=NULL) { /* direct get */
p1=getenv("w_webget_host");
p2=getenv("w_webget_port");
if(p1==NULL || p2==NULL) errorquit("incomplete_request");
port=atoi(p2);
soc=net_connect(p1); if(soc==-1) return 1;
c=' '; for(p3=parm; *p3; p3++) {
if(*p3=='\n' && c!='\r') (void)write(soc,"\r",1);
(void)write(soc,p3,1); c=*p3;
(void)write(soc,"\r\n\r\n",4);
pt=getenv("w_module");
if(pt==NULL || *pt==0 || strncmp(pt,"adm/",4)==0 ) { /* File to post? */
pt=getenv("w_webget_post");
if(pt!=NULL && *pt!=0) {
FILE *f;
char buf[4096];
size_t l;
f=fopen(pt,"r"); if(f!=NULL) {
do {
l=fread(buf,1,sizeof(buf),f);
if(l>0 && l<=sizeof(buf)) (void)write(soc,buf,l);
}
while(l==sizeof(buf));
fclose(f);
}
(void)write(soc,"\r\n\r\n",4);
pt=getenv("w_module");
if(pt==NULL || *pt==0 || strncmp(pt,"adm/",4)==0 ) { /* File to post? */
pt=getenv("w_webget_post"); if(pt!=NULL && *pt!=0) {
FILE *f;
char buf[4096];
size_t l;
f=fopen(pt,"r"); if(f!=NULL) {
do {
l=fread(buf,1,sizeof(buf),f);
if(l>0 && l<=sizeof(buf)) (void)write(soc,buf,l);
} while(l==sizeof(buf));
fclose(f);
}
}
}
if(strstr(dp,"normalread")!=NULL) goto read;
charcnt=0;
while(read(soc,pbuf,1)>0 && charcnt<10240) {
fputc(pbuf[0],outf); charcnt++;
}
close(soc);
return 0;
}
if(strncasecmp(p1,"http://",strlen("http://"))==0) p1+=strlen("http://");
else if(strncasecmp(p1,"https://",strlen("https://"))==0) {
}
if(strstr(dp,"normalread")!=NULL) goto read;
charcnt=0;
while(read(soc,pbuf,1)>0 && charcnt<10240) {
fputc(pbuf[0],outf); charcnt++;
}
close(soc);
return 0;
}
if(strncasecmp(p1,"http://",strlen("http://"))==0) p1+=strlen("http://");
else
if(strncasecmp(p1,"https://",strlen("https://"))==0) {
https=1; p1+=strlen("https://");
}
p3=strchr(p1,'/'); if(p3==NULL) p3="";
else {*p3++=0; while(*p3=='/') p3++;}
if(strncasecmp(p3,"http://",strlen("http://"))==0 ||
strncasecmp(p3,"https://",strlen("https://"))==0) pre="";
else pre="/";
snprintf(tbuf,sizeof(tbuf),"GET %s%s HTTP/1.0\r\n%s\r\n\
p3=strchr(p1,'/'); if(p3==NULL) p3="";
else {*p3++=0; while(*p3=='/') p3++;}
if(strncasecmp(p3,"http://",strlen("http://"))==0 ||
strncasecmp(p3,"https://",strlen("https://"))==0) pre="";
else pre="/";
snprintf(tbuf,sizeof(tbuf),"GET %s%s HTTP/1.0\r\n%s\r\n\
Host: %s\r\n\
%s\r\n\r\n",
pre,p3,cheater1,p1,cheater2);
p4=strchr(p1,':'); if(p4==NULL) {
if(https) port=443; else port=80;
}
else {*p4++=0; port=atoi(p4);}
if(https) {
soc=gethttps(p1); goto read;
}
soc=net_connect(p1);
(void)write(soc,tbuf,strlen(tbuf));
p4=strchr(p1,':');
if(p4==NULL) {
if(https) port=443; else port=80;
}
else {*p4++=0; port=atoi(p4);}
if(https) {
soc=gethttps(p1); goto read;
}
soc=net_connect(p1);
(void)write(soc,tbuf,strlen(tbuf));
/* header */
read: if(soc==-1) return 1;
c=-1;
while(read(soc,pbuf,1)>0) {
if(pbuf[0]=='\r') continue;
fputc(pbuf[0],stderr);
if((c=='\n') && (pbuf[0]=='\n')) break; else c=pbuf[0];
}
read: if(soc==-1) return 1;
c=-1;
while(read(soc,pbuf,1)>0) {
if(pbuf[0]=='\r') continue;
fputc(pbuf[0],stderr);
if((c=='\n') && (pbuf[0]=='\n')) break; else c=pbuf[0];
}
/* body */
charcnt=0;
while(read(soc,pbuf,1)>0 && charcnt<MAX_WEBGETFLEN) {
fputc(pbuf[0],outf); charcnt++;
}
close(soc);
if(outf!=stdout) fclose(outf);
if(https) unlink(tfname);
return 0;
charcnt=0;
while(read(soc,pbuf,1)>0 && charcnt<MAX_WEBGETFLEN) {
fputc(pbuf[0],outf); charcnt++;
}
close(soc);
if(outf!=stdout) fclose(outf);
if(https) unlink(tfname);
return 0;
}
 
/trunk/wims/src/Misc/wrap.c
22,21 → 22,21
 
int main(int argc,char *argv[])
{
char *args[1024];
int i, uid1, uid2, gid1, gid2;
char *args[1024];
int i, uid1, uid2, gid1, gid2;
 
if(argc<2) return 0;
for(i=0;i<1000 && i<argc; i++) args[i]=argv[i+1];
args[i]=NULL;
uid1=geteuid(); uid2=getuid(); gid1=getegid(); gid2=getgid();
if(strchr(args[0],'/')) {
setreuid(uid1,uid2); setregid(gid1,gid2);
execv(args[0],args);
}
else {
setreuid(uid1,uid1); setregid(gid1,gid1);
execvp(args[0],args);
}
return 127;
if(argc<2) return 0;
for(i=0;i<1000 && i<argc; i++) args[i]=argv[i+1];
args[i]=NULL;
uid1=geteuid(); uid2=getuid(); gid1=getegid(); gid2=getgid();
if(strchr(args[0],'/')) {
setreuid(uid1,uid2); setregid(gid1,gid2);
execv(args[0],args);
}
else {
setreuid(uid1,uid1); setregid(gid1,gid1);
execvp(args[0],args);
}
return 127;
}