#include <files.h>#include <wizlevels.h>#include <logging.h>#include <magier.h>#include <thing/properties.h>#include <player.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | NEED_PROTOTYPES |
Funktionen | |
| static string | glob2regexp (string str) |
| static mixed | to_filename (string str) |
| static private void | _parseargs (string str, string *line, int flags, string opts, int build_fn) |
| static string * | parseargs (string cmdline, int flags, string opts, int build_fn) |
| private int * | _vc_map (object ob, mixed *list) |
| private varargs mixed * | _get_files (string dirname, string mask, int mode, string dest) |
| private mixed * | _get_matching (string *pathmask, int depth, string path, int mode, int recursive, string dest, string filemask) |
| static varargs mixed * | get_files (string filename, int mode, int recursive, string dest, string filemask) |
| static varargs mixed * | file_list (string *files, int mode, int recursive, string dest, string mask) |
| private varargs mixed* _get_files | ( | string | dirname, | |
| string | mask, | |||
| int | mode, | |||
| string | dest | |||
| ) |
Definiert in Zeile 138 der Datei parsing.c.
00139 { 00140 mixed *files,*tmp,*data; 00141 string fullname,base; 00142 00143 //DEBUG("_GF: DIRNAME " + dirname); 00144 data=get_dir(dirname+"*",7); 00145 if(!sizeof(data)) return ({}); 00146 files=({}); 00147 00148 while(sizeof(data)) 00149 { 00150 tmp=({}); 00151 base=data[BASENAME]; 00152 fullname=dirname+base; 00153 if (base!="."&&base!=".."&&(!(mode==MODE_GREP&&base=="RCS"))&& 00154 ((data[FILESIZE]==-2&& 00155 sizeof(tmp=_get_files(fullname+"/",mask,mode, 00156 dest+base+"/"))&&mode!=MODE_RM)||!mask||sizeof(regexp(({ base }),mask)))) 00157 { 00158 //DEBUG("_GF: ADDING FILE " + fullname); 00159 files+= ({ data[0..2]+({ fullname,dirname,dest+base, 00160 sizeof(tmp) }) }); 00161 } 00162 if (sizeof(files)+sizeof(tmp)>MAX_ARRAY_SIZE) 00163 raise_error("Zu viele Files (>3000)!! Abgebrochen!\n"); 00164 files+=tmp; 00165 data=data[3..]; 00166 } 00167 00168 if(sizeof(files)>300&&!IS_ARCH(this_object())) 00169 // Tod allen Laggern :o) 00170 raise_error("Zu viele Files (>300)!! Abgebrochen!\n"); 00171 return files; 00172 }
| private mixed* _get_matching | ( | string * | pathmask, | |
| int | depth, | |||
| string | path, | |||
| int | mode, | |||
| int | recursive, | |||
| string | dest, | |||
| string | filemask | |||
| ) |
Definiert in Zeile 189 der Datei parsing.c.
00191 { 00192 mixed *data,*tmp,*files; 00193 string base,full; 00194 00195 //DEBUG("_GM: PM: " + pathmask[depth]); 00196 //DEBUG("_GM: FM: " + filemask); 00197 data=get_dir(path+pathmask[depth++],GETDIR_NAMES|GETDIR_SIZES|GETDIR_DATES)||({}); 00198 if (!sizeof(data)) return ({}); 00199 files=({}); 00200 while(sizeof(data)) 00201 { 00202 if ((base=data[BASENAME])=="."||base=="..") 00203 { 00204 data=data[3..]; 00205 continue; 00206 } 00207 full=path+base; 00208 //DEBUG("_GM: FULL: " + full); 00209 if ((data[FILESIZE]==-2)&&(sizeof(pathmask)>depth)&& 00210 (!(mode==MODE_GREP&&base=="RCS"))) 00211 { 00212 //DEBUG("DESCEND INTO " + full); 00213 tmp=_get_matching(pathmask,depth,full+"/",mode,recursive, 00214 (recursive?dest+base+"/":dest),filemask); 00215 } 00216 else tmp=({}); 00217 //DEBUG("DEPTH: " + depth + " : " + sizeof(pathmask)); 00218 if((!filemask&&(depth==sizeof(pathmask)))|| 00219 (filemask&&(depth+2>sizeof(pathmask))&& 00220 sizeof(regexp(({ base }),filemask)))|| 00221 ((mode==MODE_CP||mode==MODE_MV||(filemask&& 00222 (mode==MODE_RM)&&sizeof(regexp(({ base}),filemask))))&& 00223 sizeof(tmp))) 00224 { 00225 //DEBUG("ADDING: " + base+ " : "+ full ); 00226 files+=({ data[0..2]+({ full, path, dest+base,sizeof(tmp)}) }); 00227 } 00228 if (sizeof(files)+sizeof(tmp)>MAX_ARRAY_SIZE) 00229 raise_error("Zu viele Files (>3000)!! Abgebrochen!\n"); 00230 files+=tmp; 00231 data=data[3..]; 00232 } 00233 if(sizeof(files)>300&&!IS_ARCH(this_object())) 00234 // Tod allen Laggern! 00235 raise_error("Zu viele Files (>300)!! Abgebrochen!\n"); 00236 return files; 00237 }
| static private void _parseargs | ( | string | str, | |
| string * | line, | |||
| int | flags, | |||
| string | opts, | |||
| int | build_fn | |||
| ) | [static] |
Definiert in Zeile 59 der Datei parsing.c.
Benutzt i und to_filename().
00061 { 00062 00063 // Strings in "" erhalten 00064 if(str[0] == "\""[0]) 00065 { 00066 line += ({ str[1..<2] }); 00067 return; 00068 } 00069 // Flags parsen 00070 if(str[0] == '-') 00071 { 00072 int i,j; 00073 i=strlen(str); 00074 while(i--) 00075 if (str[i]!='-') 00076 { 00077 if((j = member(opts, str[i])) != -1) 00078 flags |= (1 << j); 00079 else 00080 { 00081 flags=-1; 00082 printf("Das Flag '-%c' wird von dem Befehl '%s' nicht " 00083 "unterstuetzt.\n",str[i],query_verb()||""); 00084 } 00085 } 00086 return; 00087 } 00088 if (build_fn) 00089 { 00090 if (str=(string)to_filename(str)) line+=({ str }); 00091 } 00092 else 00093 line+= ({ str }); 00094 }

| private int* _vc_map | ( | object | ob, | |
| mixed * | list | |||
| ) |
| static varargs mixed* file_list | ( | string * | files, | |
| int | mode, | |||
| int | recursive, | |||
| string | dest, | |||
| string | mask | |||
| ) | [static] |
Definiert in Zeile 336 der Datei parsing.c.
Benutzt _unparsed_args(), dtime(), err, get_files(), glob2regexp(), i, list, log_file, result() und SHELLLOG.
Wird benutzt von _cd2(), _clone(), _ed(), _more(), _rmdir() und _upd().
00337 { 00338 string *list,err,*result; 00339 int i,j; 00340 list=({}); 00341 if (mask) mask=glob2regexp(mask); 00342 j=sizeof(files); 00343 for(i=0;i<j;i++) 00344 { 00345 if (err=catch(list+=get_files(files[i],mode,recursive,dest,mask))) 00346 { 00347 printf("Fehler aufgetreten: %s\n",err); 00348 log_file(SHELLLOG("FILE_LIST"), 00349 sprintf("%s fuehrte folgendes Kommando aus: (Zeit: %s)\n" 00350 " >>%s %s<<\n" 00351 " Folgender Fehler trat dabei auf:\n" 00352 " %s\n\n", 00353 capitalize(getuid())||"<Unbekannt>",dtime(time()), 00354 query_verb()||"*",_unparsed_args()||"*",err||"*")); 00355 return ({}); 00356 } 00357 } 00358 return list; 00359 }


| static varargs mixed* get_files | ( | string | filename, | |
| int | mode, | |||
| int | recursive, | |||
| string | dest, | |||
| string | filemask | |||
| ) | [static] |
Definiert in Zeile 251 der Datei parsing.c.
Wird benutzt von file_list().
00252 { 00253 string full,path,base,*patharray,*vrooms,dest2; 00254 object vcompiler; 00255 mixed *files,*data; 00256 00257 // DEBUG("GF: " + filename); 00258 // DEBUG("REC: " + recursive + " MODE: " + mode); 00259 // if (dest[<1..<1]!="/") DEBUG("DEST: " + dest); 00260 if (filename=="/") 00261 { 00262 switch (mode) 00263 { 00264 case MODE_LSA: return ({({ "", -2, 0,"","","",0 })}); 00265 default: if (!recursive) return ({}); 00266 break; 00267 } 00268 } 00269 patharray=explode(filename,"/"); 00270 if(!sizeof(data=get_dir(filename,7)||({}))&& 00271 (mode==MODE_UPD||mode==MODE_MORE||mode==MODE_ED)) 00272 data=get_dir(filename+".c",7)||({}); 00273 if ((mode==MODE_LSA||mode==MODE_LSB)&& 00274 (vcompiler = find_object(implode(patharray[0..<2],"/")+"/virtual_compiler")) && 00275 pointerp(vrooms=(mixed *)vcompiler->QueryObjects())) 00276 map(vrooms,#'_vc_map,&data); 00277 files=({}); 00278 if (sizeof(data)) // passende files 00279 { 00280 mixed *subfiles; 00281 subfiles=({}); 00282 path=implode(patharray[0..<2],"/")+"/"; 00283 while (sizeof(data)) 00284 { 00285 subfiles=({}); 00286 base=data[BASENAME]; 00287 if (mode==MODE_LSB||(base!="."&&base!="..")) 00288 { 00289 //DEBUG("PATH: " + path+" BASE: " + base + " MODE: " + mode); 00290 full=path+base; 00291 dest2=((dest=="/"||file_size(dest[0..<2])==-2)? 00292 (dest+base):(dest=="/"?"/":dest[0..<2])); 00293 //DEBUG("DEST: " + dest); 00294 if (recursive&&data[FILESIZE]==-2) // Verzeichnis, Rekursiv 00295 subfiles=_get_files(full+"/",filemask,mode,dest2+"/"); 00296 if (!(filemask&&!sizeof(subfiles)&&!sizeof(regexp(({ base }),filemask)))) 00297 { 00298 if (!filemask||mode!=MODE_RM) 00299 files+=({ data[0..2]+({ full, path, dest2,sizeof(subfiles)}) }); 00300 if (sizeof(files)+sizeof(subfiles)>MAX_ARRAY_SIZE) 00301 raise_error("Zu viele Files (>3000)!! Abgebrochen!\n"); 00302 files+=subfiles; 00303 } 00304 } 00305 data=data[3..]; 00306 } 00307 return files; 00308 } 00309 // File existiert nicht -> Wildcard oder tatsaechlich nicht existent 00310 // Behandeln je nach mode 00311 switch(mode) 00312 { 00313 case MODE_CP: 00314 case MODE_MV: 00315 case MODE_CD: 00316 case MODE_LSA: 00317 files=_get_matching(patharray+(filemask?({ "*" }):({})),1,"/",mode, 00318 recursive,dest,filemask); 00319 break; 00320 default: break; 00321 } 00322 return files; 00323 }

| static string glob2regexp | ( | string | str | ) | [static] |
Definiert in Zeile 21 der Datei parsing.c.
Wird benutzt von file_list().
00022 { 00023 str=regreplace(str,"([\\.\\^\\$\\[\\]\\(\\)])","\\\\\\1",1); 00024 str=regreplace(str,"\\*",".*",1); 00025 return sprintf("^%s$",regreplace(str,"?",".",1)); 00026 }

| static string* parseargs | ( | string | cmdline, | |
| int | flags, | |||
| string | opts, | |||
| int | build_fn | |||
| ) | [static] |
Definiert in Zeile 107 der Datei parsing.c.
Benutzt i.
Wird benutzt von _cd2(), _clone(), _cp(), _ed(), _man(), _more(), _rman(), _rmdir() und _upd().
00108 { 00109 int i; 00110 string *line; 00111 line=({}); 00112 if (!strlen(cmdline)) return ({}); 00113 map(regexplode(cmdline,"[\"][^\"]*[\"]| ")-({" ", ""}), 00114 #'_parseargs, &line, &flags,opts, build_fn); 00115 return line - ({""}); 00116 }

| static mixed to_filename | ( | string | str | ) | [static] |
Definiert in Zeile 35 der Datei parsing.c.
Benutzt i, master, p, P_VARIABLES und QueryProp().
Wird benutzt von _cp() und _parseargs().
00036 { 00037 string *tmp,p,newfn; 00038 int i; 00039 // Testen ob .. in einem Filenamenabschnitt, falls Version <3.2.5 00040 tmp=explode(str,"/"); 00041 // Testen auf Pfadvariable 00042 if (strlen(tmp[0]) && tmp[0][0]=='$' 00043 && m_contains(&p,QueryProp(P_VARIABLES),tmp[0][1..])) 00044 tmp[0]=p; 00045 // Pfad absolut machen (Hat danach noch Wildcards drinnen) oder auch nicht 00046 return master()->make_path_absolute(implode(tmp,"/")); 00047 }


1.6.3