root/unique.d

Revision 741:3f45fca47bec, 2.2 kB (checked in by thomask, 7 years ago)

added reporter and list features

Line 
1 module cn.kuehne.uniquefile;
2
3 private import std.file;
4 private import std.stdio;
5 private import std.path;
6
7 private char[][char[]] known;
8 private uint doppelgaenger;
9
10 version(reporters){
11     private import std.string;
12     private uint[char[]] reporters;
13 }
14
15 private char[] lastPathElem(char[] path){
16     size_t end=path.length-1;
17     size_t start;
18    
19     for(end = path.length-1; path[end]==std.path.sep[0]; end--){
20         if(end==0){
21             return std.path.sep;
22         }
23     }
24
25     for(start = end-1; start<start.max; start--){
26         if(path[start]==std.path.sep[0]){
27             break;
28         }
29     }
30    
31     if(start==start.max){
32         start=0;
33     }else{
34         start+=1;
35     }
36     return path[start .. end+1];
37 }
38
39 private void add(char[] file){
40     char[] base = lastPathElem(file);
41    
42     if(isfile(file)){
43         char[]* tmp = base in known;
44         if(tmp){
45             fwritef(stdout, "%s :\n\t%s\n\t%s\n", base, file, *tmp);
46             doppelgaenger++;
47         }else{
48             known[base] = file;
49         }
50        
51         version(reporters){
52             // only works for UTF-8
53             char[] data=cast(char[]) read(file);
54            
55             size_t index = find(data, "@author@");
56             if(index != index.max){             
57                 data = data[index + "@author@".length .. data.length];
58                
59                 foreach(char end; "\r\n\x00\x0A"){
60                     index = find(data, end);
61                     if(index != index.max){
62                         data = data[0 .. index];
63                     }
64                 }
65        
66                 data = strip(data);
67                
68                 version(verbose){
69                     if(data in reporters){
70                         reporters[data]++;
71                     }else{
72                         reporters[data]=1;
73                     }
74                 }else{
75                     reporters[data]=1;
76                 }
77             }
78         }
79     }
80    
81     if(isdir(file) && (base[0]!='.')){
82         foreach(char[] entry; listdir(file)){
83             add(file~std.path.sep~entry);
84         }
85     }
86 }
87
88 int main(char[][] args){
89     if(args.length<2){
90         fwritef(stderr, "at least one directory name is required as argument\n");
91         return -1;
92     }
93    
94     doppelgaenger = 0;
95    
96     foreach(char[] file; args[1 .. args.length]){
97         if(file=="."){
98             file=getcwd();
99         }
100         add(file);
101     }
102
103     version(verbose){
104         foreach(char[] entry; known.keys.sort){
105             fwritef(stderr, "\t%s\n", known[entry]);
106         }
107     }
108    
109     version(reporters){
110         foreach(char[] entry; reporters.keys.sort){
111             version(verbose){
112                 fprintf(stderr, "%i\t%.*s\n", reporters[entry], entry);
113             }else{
114                 fprintf(stderr, "%.*s\n", entry);
115             }
116         }   
117     }
118    
119     fwritef(stdout, "hits : %s\n", doppelgaenger);
120
121     return doppelgaenger > 0;
122 }
Note: See TracBrowser for help on using the browser.