/* Ptt : 常用字串函式整理 */
#include "mod_ptt.h"
// 缺少 escape_url的東西
/*
* 檔案判別
*/
/* 傳回:路徑大小 */
off_t
dashs(fname)
char *fname;
{
struct stat st;
if (!stat(fname, &st))
return (st.st_size);
else
return 0; /* 無此檔是 size 0 */
}
/* 傳回:路徑時間 */
long
dasht(char *fname)
{
struct stat st;
if (!stat(fname, &st))
return (st.st_mtime);
else
return -1;
}
/* 傳回:路徑是否為link檔 */
int
dashl(char *fname)
{
struct stat st;
return (lstat(fname, &st) == 0 && S_ISLNK(st.st_mode));
}
/* 傳回:路徑是否為檔案 */
dashf(char *fname)
{
struct stat st;
return (stat(fname, &st) == 0 && S_ISREG(st.st_mode));
}
/* 字串的小寫 */
#define char_lower(c) ((c >= 'A' && c <= 'Z') ? c|32 : c)
void
str_lower(t, s)
char *t, *s;
{
register char ch;
do
{
ch = *s++;
*t++ = char_lower(ch);
} while (ch);
}
int
str_ncmp(s1, s2, n)
char *s1, *s2;
int n;
{
int c1, c2;
while (n--)
{
c1 = *s1++;
if (c1 >= 'A' && c1 <= 'Z')
c1 |= 32;
c2 = *s2++;
if (c2 >= 'A' && c2 <= 'Z')
c2 |= 32;
if (c1 -= c2)
return (c1);
if (!c2)
break;
}
return 0;
}
char *
memstr(char *mem, char *str, int size)
{
char *loc, *ptr=mem, *end=mem+size;
int len = strlen(str);
while((loc = memchr(ptr, *str, size)))
{
if(!strncmp(loc, str, len))
return loc;
ptr = loc +1;
size = (end - ptr);
if(size <=0 ) return NULL;
}
return NULL;
}
/* 傳回: strstr的比較但不計大小寫的結果 */
/*
char *
strcasestr(str, tag)
char *str, *tag;
{
char buf[BUFLEN];
str_lower(buf, str);
return strstr(buf, tag);
}
*/
/* 傳回: 一個checksum 給字串比較用 */
int str_checksum(char *str)
{
int n=1;
if(strlen(str) < 6) return 0;
while(*str)
n += *str++ ^ n;
return n;
}
int
not_alpha(ch)
register char ch;
{
return (ch < 'A' || (ch > 'Z' && ch < 'a') || ch > 'z');
}
int
not_alnum(ch)
register char ch;
{
return (ch < '0' || (ch > '9' && ch < 'A') ||
(ch > 'Z' && ch < 'a') || ch > 'z');
}
char
ch2ph(char ch)
{
static const
// a b c d e f g h i j k l m n o
char table[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6',
// p q r s t u v w x y z
'7','1','7','7','8','8','8','9','9','9','1'};
static char d;
d = char_lower(ch);
if(d>='a' && d<='z') d=table[d-'a'];
return d;
}
void
archiv32(chrono, fname)
time_t chrono; /* 32 bits */
char *fname; /* 7 chars */
{
char *str;
char radix32[32] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
};
str = fname + 7;
*str = '\0';
for (;;)
{
*(--str) = radix32[chrono & 31];
if (str == fname)
return;
chrono >>= 5;
}
}
/* ARPANET時間格式 */
char *
Atime(clock)
time_t *clock;
{
static char datemsg[40];
/* ARPANET format: Thu, 11 Feb 1999 06:00:37 +0800 (CST) */
/* strftime(datemsg, 40, "%a, %d %b %Y %T %Z", localtime(clock)); */
/* time zone的傳回值不知和ARPANET格式是否一樣,先硬給,同sendmail*/
strftime(datemsg, 40, "%a, %d %b %Y %T +0800 (CST)", localtime(clock));
return (datemsg);
}
/* userid是否合法 */
int
bad_user_id(userid)
char *userid;
{
register char ch;
if (strlen(userid) < 2)
return 1;
if (not_alpha(*userid))
return 1;
if (!strcasecmp(userid, "new") || !strcasecmp(userid, "guest") ||
!strcasecmp(userid, "root") || !strcasecmp(userid, "webadm") ||
!strncasecmp(userid,"yam",3)
)
return 1;
while (ch = *(++userid))
{
if (not_alnum(ch) || ch == '0')
return 1;
}
return 0;
}
int
logfile(pool *p, char *filename,char *buf)
{
FILE *fp;
time_t now;
if( (fp = ap_pfopen(p, filename, "a" )) ) {
fputs( buf, fp );
if(!strchr(buf,'\n'))
{
now = time(NULL);
fputs(ctime(&now), fp);
}
ap_pfclose(p, fp );
return 0;
}
else{
printf("error open file");
return -1;
}
}
/* 檢查中文斷字問題 */
char *strexam(char *s)
{
int i;
int odd;
for (i = 0, odd = 0; s[i]; i++)
if (odd) odd = 0;
else if (s[i] & 128) odd = 1;
if (odd) s[--i] = 0;
return s;
}
int
maxline(char *data,char *newline, int max)
{
register int n, nlen=strlen(newline);
register char *po;
for(n=0, po = data; (po = strstr(po, newline)); po+=nlen)
{
if(++n>=max) {*po=0; return -1;}
}
return n;
}