001: #include <stdio.h>
002: #include <stdlib.h>
003: #include <string.h>
004: #include "common.h"
005: //-----------------------------------------------------------------
006: //
007: // 一般関数
008: //
009: //-----------------------------------------------------------------
010: //-----------------------------------------------------------------
011: // パス名の分割
012: //-----------------------------------------------------------------
013: void split_path(char* fpath,char* dir,char* file,char* ext)
014: {
015:     int i,len=strlen(fpath);
016:     // file and ext
017:     for(i=len-1;i>=0;i--)
018:         if(fpath[i]=='.') break;
019:     strncpy(ext,fpath+i,len-i);
020:     strncpy(file,fpath,i);
021:     ext[len-i] = '\0'; file[i] = '\0';
022:     // dir
023:     len = i;
024:     for(i=len-1;i>=0;i--)
025:         if(file[i]=='/') break;
026:     i++;
027:     strncpy(dir,file,i);
028:     strncpy(file,file+i,len-i);
029:     dir[i] = '\0'; file[len-i] = '\0';
030: }
031: //-----------------------------------------------------------------
032: // ファイル中の文字数のカウント
033: //-----------------------------------------------------------------
034: int Fstr_count(char* fname)
035: {
036:     FILE* fp;
037:     int rsc,sum_sc = 0;
038:     char buf[BUFSIZ];
039:     memset(buf,0,BUFSIZ);
040:     if((fp=fopen(fname,"r"))==NULL){
041:         fprintf(stderr,"read file[%s]: No such file or directory\n",fname);
042:         return 0;
043:     }
044:     while((rsc=fread(buf,sizeof(char),BUFSIZ,fp))){
045:         sum_sc += rsc;
046:     }
047:     sum_sc += rsc;
048:     fclose(fp);
049:     return sum_sc;
050: }
051: //-----------------------------------------------------------------
052: // ファイル中の文字数[タブ数,行数]のカウント
053: //-----------------------------------------------------------------
054: void Fstr_count(char* fname,int& sum_sc,int& sum_lc,int& sum_tc)
055: {
056:     FILE* fp;
057:     int i,rsc;
058:     char buf[BUFSIZ];
059:     memset(buf,0,BUFSIZ);
060:     sum_sc = sum_lc = sum_tc = 0;
061:     if((fp=fopen(fname,"r"))==NULL){
062:         fprintf(stderr,"read file[%s]: No such file or directory\n",fname);
063:         return;
064:     }
065:     while((rsc=fread(buf,sizeof(char),BUFSIZ,fp))){
066:         for(i=0;i<rsc;i++){
067:             if(buf[i]=='\n') sum_lc++;
068:             if(buf[i]=='t')  sum_tc++;
069:         }
070:         sum_sc += rsc;
071:     }
072:     sum_sc += rsc;
073:     fclose(fp);
074: }
075: //-----------------------------------------------------------------
076: // 配列中の文字数[タブ数,行数]のカウント
077: //-----------------------------------------------------------------
078: void str_count(char* code,int& sum_sc,int& sum_lc,int& sum_tc)
079: {
080:     int i;
081:     sum_sc = sum_lc = sum_tc = 0;
082:     sum_sc = strlen(code);
083:     for(i=0;i<sum_sc;i++){
084:         if(code[i]=='\n') sum_lc++;
085:         if(code[i]=='t')  sum_tc++;
086:     }
087: }
088: //-----------------------------------------------------------------
089: // 入力ファイルから文字列の取得
090: //-----------------------------------------------------------------
091: int read_string(char* fname,int read_sc,char* inbuf)
092: {
093:     FILE* fp;
094:     int rsc;
095:     if((fp=fopen(fname,"r"))==NULL){
096:         perror("read file open");
097:         return 0;
098:     }
099:     rsc = fread(inbuf,sizeof(char),read_sc,fp);
100:     if(rsc!=read_sc) perror("read size");
101:     fclose(fp);
102:     return 1;
103: }
104: //-----------------------------------------------------------------
105: // qsort 用(昇順)
106: //-----------------------------------------------------------------
107: int kwd_compare(const void *x, const void *y){
108:     return strlen(*(char **)y) - strlen(*(char **)x);
109: }
110: //-----------------------------------------------------------------
111: // キーワードの検索
112: //-----------------------------------------------------------------
113: int kwd_sch(char* code,int str_len,int ki,char* kwd)
114: {
115:     int i,klen = strlen(kwd);
116:     if(ki+klen > str_len) return 0;
117:     for(i=0;i<klen;i++){
118:         if(code[ki+i] != kwd[i]) break;
119:     }
120:     if(i==klen) return 1;
121:     return 0;
122: }
123: //-----------------------------------------------------------------
124: // キーワードの検索[大文字・小文字を区別しない]
125: //-----------------------------------------------------------------
126: int Kwd_sch(char* code,int str_len,int ki,char* kwd)
127: {
128:     int i,klen = strlen(kwd);
129:     if(ki+klen > str_len) return 0;
130:     for(i=0;i<klen;i++){
131:         if((code[ki+i]) != kwd[i] &&
132:            (code[ki+i]|32) != kwd[i])
133:             break;
134:     }
135:     if(i==klen) return 1;
136:     return 0;
137: }
138: //-----------------------------------------------------------------
139: // 1行の先頭文字の取得
140: //-----------------------------------------------------------------
141: int line_schtop(char* code,int str_len,int ki)
142: {
143:     for(int i=0;ki+i<str_len;i++){
144:         if(code[ki+i] == '\n') return -1;
145:         if(code[ki+i] != ' ' && code[ki+i] != '\t') return i;
146:     }
147:     return -1;
148: }
149: //-----------------------------------------------------------------
150: // 1行中から目的の文字を検索
151: //-----------------------------------------------------------------
152: int line_schchar(char* c_code,int str_len,int ki,char fc)
153: {
154:     int i;
155:     unsigned char c;
156:     for(i=0;ki+i<str_len;i++){
157:         c = c_code[ki+i];
158:         if(c == fc)   break;
159:         if(c == '\n') return -1;
160:     }
161:     return i;
162: }
163: //-----------------------------------------------------------------
164: // 1行中から目的の文字列を検索
165: //-----------------------------------------------------------------
166: int line_schstr(char* c_code,int str_len,int ki,char* kwd)
167: {
168:     for(int i=0;ki+i<str_len;i++){
169:         if(kwd_sch(c_code,str_len,ki+i,kwd)){
170:             return i;
171:         }
172:         if(c_code[ki+i] == '\n') return -1;
173:     }
174:     return -1;
175: }
176: //-----------------------------------------------------------------
177: // mail アカウント中に含まれる文字かどうか
178: //-----------------------------------------------------------------
179: int ismailstr(char schstr)
180: {
181:     if(schstr >= 0x30 && schstr <= 0x39)// 0:0x30,0:0x39
182:         return 1;
183:     if(schstr >= 0x41 && schstr <= 0x5A)// A:0x41,Z:0x5A
184:         return 1;
185:     if(schstr >= 0x61 && schstr <= 0x7A)// a:0x61,z:0x7A
186:         return 1;
187:     if(schstr == 0x5F || schstr == 0x2D || schstr == 0x2E)
188:         // _:0x5F,-:0x2D,.:0x2E
189:         return 1;
190:     return 0;
191: }
192: //-----------------------------------------------------------------
193: // URL 中に含まれる文字かどうか
194: //-----------------------------------------------------------------
195: int isurlstr(char schstr)
196: {
197:     if(schstr == 0x32) return 0;
198:     if(schstr >= 0x30 && schstr <= 0x39)// 0:0x30,0:0x39
199:         return 1;
200:     if(schstr >= 0x41 && schstr <= 0x5A)// A:0x41,Z:0x5A
201:         return 1;
202:     if(schstr >= 0x61 && schstr <= 0x7A)// a:0x61,z:0x7A
203:         return 1;
204:     /* 後はかなり適当だが..CGI等で生成されるURLにも大体は対応 */
205:     if(schstr == 0x5F || schstr == 0x2D || schstr == 0x2E ||
206:         schstr == 0x7E || schstr == 0x25 || schstr == 0x26 || 
207:         schstr == 0x3F || schstr == 0x2F || schstr == 0x3D || 
208:         schstr == 0x3a)
209:         // _:0x5F,-:0x2D,.:0x2E,~:0x7E,%:0x25,&:0x26,?:0x3F,/:0x2F,=:0x3D
210:         // ::0x3a
211:         return 1;
212:     return 0;
213: }
inserted by FC2 system