root/OpenSceneGraph/trunk/applications/osgversion/osgversion.cpp @ 9964

Revision 9964, 32.7 kB (checked in by robert, 5 years ago)

Updated AUTHORS.txt for 2.9.2 dev release

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <osg/Notify>
2#include <osg/Version>
3#include <osg/ArgumentParser>
4#include <osg/ApplicationUsage>
5
6#include <osg/Matrix>
7#include <osg/Plane>
8#include <osg/BoundingBox>
9#include <osg/BoundingSphere>
10
11#include <osgDB/fstream>
12
13#include <OpenThreads/Version>
14
15#include <set>
16#include <vector>
17#include <iostream>
18
19// the majority of the application is dedicated to building the
20// current contribitors list by parsing the ChangeLog, it just takes
21// one line in the main itself to report the version number.
22
23#if defined(_MSC_VER)
24    #pragma setlocale("C")
25#endif
26
27typedef std::pair<std::string, std::string> NamePair;
28typedef std::map<NamePair,unsigned int> NameMap;
29typedef std::vector< std::string > Words;
30
31NamePair EmptyNamePair;
32NamePair NameRobertOsfield("Robert","Osfield");
33NamePair NameDonBurns("Don","Burns");
34
35bool validName(const std::string& first)
36{
37    if (first=="de") return true;
38    if (first=="den") return true;
39    if (first=="van") return true;
40
41
42    if (first.empty()) return false;
43    if (first[0]<'A' || first[0]>'Z') return false;
44   
45    if (first.size()>=2 && (first[1]<'a' || first[1]>'z') && (first[1]!='.')  && (first[1]!=',')) return false;
46
47    if (first=="Xcode") return false;
48    if (first=="Added") return false;
49    if (first=="Camera") return false;
50    if (first=="CameraNode") return false;
51    if (first=="CopyOp") return false;
52    if (first=="Fixed") return false;
53    if (first=="View") return false;
54    if (first=="GraphicsContext") return false;
55    if (first=="WindowData") return false;
56    if (first=="ViewPoint") return false;
57    if (first=="PickHandler") return false;
58    if (first=="Program") return false;
59    if (first=="Object") return false;
60    if (first=="OpenSceneGraph") return false;
61    if (first=="SpotExponent") return false;
62    if (first=="Framstamp") return false;
63    if (first=="Stats") return false;
64    if (first=="Group") return false;
65    if (first=="Texture") return false;
66    if (first=="Texture2DArray") return false;
67    if (first=="Creator") return false;
68    if (first=="CullVisitor") return false;
69    if (first=="Drawable") return false;
70    if (first=="Geode") return false;
71    if (first=="GeoSet") return false;
72    if (first=="Image") return false;
73    if (first=="Face") return false;
74    if (first=="Images/SolarSystem") return false;
75    if (first=="IntersectVisitor") return false;
76    if (first=="LongIDRecord") return false;
77    if (first=="Makefile") return false;
78    if (first=="Matrix") return false;
79    if (first=="MemoryManager") return false;
80    if (first=="MeshRecord") return false;
81    if (first=="Multigen") return false;
82    if (first=="NewCullVisitor") return false;
83    if (first=="Output") return false;
84    if (first=="PageLOD") return false;
85    if (first=="Improved") return false;
86    if (first=="PagedLOD") return false;
87    if (first=="Referenced") return false;
88    if (first=="StateAttribute") return false;
89    if (first=="Switch") return false;
90    if (first=="TechniqueEventHandler") return false;
91    if (first=="Uniform") return false;
92    if (first=="Vec*") return false;
93    if (first=="Viewer") return false;
94    if (first=="VisualStudio") return false;
95    if (first=="X") return false;
96    if (first=="Y") return false;
97    if (first=="Producer") return false;
98    if (first=="New") return false;
99    if (first=="Removed") return false;
100    if (first=="Ouput") return false;
101    if (first=="ReaderWriters") return false;
102    if (first=="NodeVisitor") return false;
103    if (first=="Fixes") return false;
104    if (first=="FontImplementation") return false;
105    if (first=="DisplaySettings") return false;
106    if (first=="AnimationPath") return false;
107    if (first=="AnimationPathCallback") return false;
108    if (first=="AnimationPathManipulator") return false;
109    if (first=="ArgumentParser") return false;
110    if (first=="AttrData") return false;
111    if (first=="Azimuth") return false;
112    if (first=="CluserCullingCallback") return false;
113    if (first=="ClusterCullingCallback") return false;
114    if (first=="CoordinateSystem") return false;
115    if (first=="CoordinateSystemNode") return false;
116    if (first=="CoordinateSystemNode&") return false;
117    if (first=="Copyright") return false;
118    if (first=="Cygwin") return false;
119    if (first=="CullCallbacks") return false;
120    if (first=="CullingSettngs") return false;
121    if (first=="DataVariance") return false;
122    if (first=="DatabasePager") return false;
123    if (first=="DrawElementsUByte") return false;
124    if (first=="Escape") return false;
125    if (first=="FluidProgram") return false;
126    if (first=="FrameStats") return false;
127    if (first=="FreeBSD") return false;
128    if (first=="GraphicsContextImplementation") return false;
129    if (first=="GraphicsThread") return false;
130    if (first=="Images") return false;
131    if (first=="IndexBlock") return false;
132    if (first=="Inventor") return false;
133    if (first=="Make") return false;
134    if (first=="Material") return false;
135    if (first=="MergeGeometryVisitor") return false;
136    if (first=="Mode") return false;
137    if (first=="Prodcuer") return false;
138    if (first=="ProxyNode") return false;
139    if (first=="ReentrantMutex") return false;
140    if (first=="ReferenceFrame") return false;
141    if (first=="RemoveLoadedProxyNodes") return false;
142    if (first=="RenderTargetFallback") return false;
143    if (first=="RenderToTextureStage") return false;
144    if (first=="Sequence") return false;
145    if (first=="Shape") return false;
146    if (first=="TessellationHints") return false;
147    if (first=="Support") return false;
148    if (first=="State") return false;
149    if (first=="SmokeTrailEffect") return false;
150    if (first=="TexEnv") return false;
151    if (first=="Texture3D") return false;
152    if (first=="TextureCubeMap") return false;
153    if (first=="TextureObjectManager") return false;
154    if (first=="TextureRectangle(Image*") return false;
155    if (first=="TextureType") return false;
156    if (first=="Texuture") return false;
157    if (first=="TriStripVisitor") return false;
158    if (first=="UserData") return false;
159    if (first=="Viewport") return false;
160    if (first=="Visual") return false;
161    if (first=="Studio") return false;
162    if (first=="Vec2d") return false;
163    if (first=="Vec3d") return false;
164    if (first=="Windows") return false;
165    if (first=="Version") return false;
166    if (first=="Viewport") return false;
167    if (first=="Core") return false;
168    if (first=="DataSet") return false;
169    if (first=="Endian") return false;
170    if (first=="ImageOptions") return false;
171    if (first=="ImageStream") return false;
172    if (first=="KeyboardMouse") return false;
173    if (first=="KeyboardMouseCallback") return false;
174    if (first=="AutoTransform") return false;
175    if (first=="AutoTransform.") return false;
176    if (first=="LightModel") return false;
177    if (first=="MatrixManipulator") return false;
178    if (first=="MatrixTransform") return false;
179    if (first=="OpenDX") return false;
180    if (first=="ParentList") return false;
181    if (first=="TerraPage") return false;
182    if (first=="OveralyNode") return false;
183    if (first=="OpenThreads") return false;
184    if (first=="PolygonStipple") return false;
185    if (first=="SceneView") return false;
186    if (first=="PrimitiveIndexFunctor") return false;
187    if (first=="PolytopeVisitor") return false;
188    if (first=="Performer") return false;
189    if (first=="Paging") return false;
190    if (first=="CameraBarrierCallback") return false;
191    if (first=="TestSupportCallback") return false;
192    if (first=="Quake3") return false;
193    if (first=="BlenColour(Vec4") return false;
194    if (first=="UseFarLineSegments") return false;
195    if (first=="TextureRectangle") return false;
196    if (first=="DeleteHandler") return false;
197    if (first=="EventQueue") return false;
198    if (first=="TrPageViewer") return false;
199    if (first=="TestManipulator") return false;
200    if (first=="ProducerEventCallback") return false;
201    if (first=="OrientationConverter") return false;
202    if (first=="Logos") return false;
203    if (first=="StatsVisitor") return false;
204    if (first=="LineStipple") return false;
205    if (first=="Files") return false;
206    if (first=="Mr") return false;
207    if (first=="Osfields") return false;
208    if (first=="Optimizer") return false;
209    if (first=="RenderStage") return false;
210    if (first=="Matrix*") return false;
211    if (first=="Vec4ub") return false;
212    if (first=="Proxy") return false;
213    if (first=="CullVistor") return false;
214    if (first=="SimpleViewer") return false;
215    if (first=="TexMat(Matrix") return false;
216    if (first=="GraphicsWindowX11") return false;
217    if (first=="OperationThread") return false;
218    if (first=="SimpleViewer") return false;
219    if (first=="IndexFaceSets") return false;
220    if (first=="Quicktime") return false;
221    if (first=="SceneGraphBuilder") return false;
222    if (first=="LightPointNode") return false;
223    if (first=="GeometryTechnique") return false;
224    if (first=="GeoemtryTechnique") return false;
225    if (first=="KdTree") return false;
226    if (first=="LineSegment") return false;
227    if (first=="Canvas") return false;
228    if (first=="OpenSceneGraph-2") return false;
229    if (first=="OpenSceneGraph-osgWidget-dev") return false;
230    if (first=="Valve") return false;
231    if (first=="Source") return false;
232    if (first=="PixelDataBufferObject") return false;
233    return true;
234}
235
236std::string typoCorrection(const std::string& name)
237{
238#if 0
239    if (name=="") return "";
240    if (name=="") return "";
241    if (name=="") return "";
242    if (name=="") return "";
243#endif
244    if (name=="Aderian"return "Adrian";
245    if (name=="Adndre") return "Andre";
246    if (name=="Adrain") return "Adrian";
247    if (name=="Andew") return "Andrew";
248    if (name=="André") return "André";
249    if (name=="Antione") return "Antoine";
250    if (name=="Antonoine") return "Antoine";
251    if (name=="Atr"return "Art";
252    if (name=="Baverage") return "Beverage";
253    if (name=="Bistroviae") return "Bistrovic";
254    if (name=="Callue"return "Callu";
255    if (name=="Christaiansen") return "Christiansen";
256    if (name=="Cobin") return "Corbin";
257    if (name=="Comporesi") return "Camporesi";
258    if (name=="Connel") return "Connell";
259    if (name=="Cullu") return "Callu";
260    if (name=="Daneil") return "Daniel";
261    if (name=="Daust") return "Daoust";
262    if (name=="Daved") return "David";
263    if (name=="Drederic") return "Frederic";
264    if (name=="Eileman") return "Eilemann";
265    if (name=="Elgi") return "Egli";
266    if (name=="Frashid") return "Farshid";
267    if (name=="Fred") return "Frederic";
268    if (name=="Fredrick") return "Frederic";
269    if (name=="Fredric") return "Frederic";
270    if (name=="Froechlich") return "Fröhlich";
271    if (name=="Froehilch") return "Fröhlich";
272    if (name=="Froehlich") return "Fröhlich";
273    if (name=="Froelich") return "Fröhlich";   
274    if (name=="Froenlich") return "Fröhlich";
275    if (name=="Fröhlich") return "Fröhlich";
276    if (name=="Fruciel") return "Frauciel";
277    if (name=="García") return "Garcea";
278    if (name=="Garrat") return "Garrett";
279    if (name=="Garret") return "Garrett";
280    if (name=="Geof") return "Geoff";
281    if (name=="Giatan") return "Gaitan";
282    if (name=="Gronenger") return "Gronager";
283    if (name=="Gronger") return "Gronager";
284    if (name=="Hebelin") return "Herbelin";
285    if (name=="Heirtlein") return "Hertlein";
286    if (name=="Heirtlein") return "Hertlein";
287    if (name=="Heirtlein") return "Hertlein";
288    if (name=="Hertleinm") return "Hertlein";
289    if (name=="Hertlien") return "Hertlein";
290    if (name=="Hi") return "He";
291    if (name=="Hooper") return "Hopper";
292    if (name=="Inverson") return "Iverson";
293    if (name=="Iversion") return "Iverson";
294    if (name=="Jean-Sebastian") return "Jean-Sebastien";
295    if (name=="Jean-Sebastirn") return "Jean-Sebastien";
296    if (name=="Jea-Sebastien") return "Jean-Sebastien";
297    if (name=="Johhansen") return "Johansen";
298    if (name=="Johnansen") return "Johansen";
299    if (name=="Johnasen") return "Johansen";
300    if (name=="Jolly") return "Jolley";
301    if (name=="Jose") return "José";
302    if (name=="José") return "José";
303    if (name=="Joson") return "Jason";
304    if (name=="J") return "José";
305    if (name=="Keuhne") return "Kuehne";
306    if (name=="Kheune") return "Kuehne";
307    if (name=="Lagrade") return "Lagarde";
308    if (name=="Larshkari") return "Lashkari";
309    if (name=="Lashakari") return "Lashkari";
310    if (name=="Lashari") return "Lashkari";
311    if (name=="Lasharki") return "Lashkari";
312    if (name=="Laskari") return "Lashkari";
313    if (name=="Leandowski" || name=="Lawandowski"return "Lewandowski";
314    if (name=="Lucas") return "Luaces";
315    if (name=="Lugi") return "Luigi";
316    if (name=="Lweandowski"return "Lewandowski";
317    if (name=="Machler") return "Mächler";
318    if (name=="Macro") return "Marco";
319    if (name=="Maechler") return "Mächler";
320    if (name=="Mahai"return "Mihai";
321    if (name=="Mammond") return "Marmond";
322    if (name=="March") return "Marco";
323    if (name=="Martsz") return "Martz";
324    if (name=="Marz") return "Martz";
325    if (name=="Matz"return "Martz";
326    if (name=="Melchoir") return "Melchior";
327    if (name=="Mellis") return "Melis";
328    if (name=="Messerschimdt") return "Messerschmidt";
329    if (name=="Micheal") return "Michael";
330    if (name=="Mihair"return "Mihai";
331    if (name=="Molishtan") return "Moloshtan";
332    if (name=="Molishtan") return "Moloshtan";
333    if (name=="Moloshton") return "Moloshtan";
334    if (name=="Morné") return "Morné";
335    if (name=="Morne") return "Morné";
336    if (name=="Moule") return "Moiule";
337    if (name=="Narache") return "Marache";
338    if (name=="Nicklov") return "Nikolov";
339    if (name=="Nickolov") return "Nikolov";
340    if (name=="Olad") return "Olaf";
341    if (name=="Olar") return "Olaf";
342    if (name=="Oritz") return "Ortiz";
343    if (name=="Osfeld"return "Osfield";
344    if (name=="Osfied") return "Osfield";
345    if (name=="Pail") return "Paul";
346    if (name=="Rajce") return "Trajce";
347    if (name=="Randal") return "Randall";
348    if (name=="Robet") return "Robert";
349    if (name=="Rodger") return "Roger";
350    if (name=="Rolad") return "Roland";
351    if (name=="Rucard"return "Richard";
352    if (name=="Sekender") return "Sukender";
353    if (name=="Sewel") return "Sewell";
354    if (name=="Simmonson") return "Simonsson";
355    if (name=="Simmonsson") return "Simonsson";
356    if (name=="Sjolie") return "Sjölie";
357    if (name=="Sjölie") return "Sjölie";
358    if (name=="Skinnder") return "Skinner";
359    if (name=="Sokolosky") return "Sokolowsky";
360    if (name=="Sokolowki") return "Sokolowsky";
361    if (name=="Sokolowski") return "Sokolowsky";
362    if (name=="Sokolsky") return "Sokolowsky";
363    if (name=="Sokolwsky") return "Sokolowsky";
364    if (name=="Sonda") return "Sondra";
365    if (name=="Stansilav") return "Stanislav";
366    if (name=="Stefan") return "Stephan";
367    if (name=="Stell") return "Steel";
368    if (name=="Sylvan") return "Sylvain";
369    if (name=="Takeahei") return "Takahei";
370    if (name=="Takehei") return "Takahei";
371    if (name=="Tarantilils") return "Tarantilis";
372    if (name=="Trastenjak") return "Trstenjak";
373    if (name=="Urlich") return "Ulrich";
374    if (name=="Vines") return "Vine";
375    if (name=="Waldrom"return "Waldron";
376    if (name=="Wedner") return "Weidner";
377    if (name=="Weidemann") return "Wiedemann";
378    if (name=="Wieblen") return "Weiblen";
379    if (name=="Woesnner") return "Woessner";
380    if (name=="Wojiech" || name=="Wojchiech"return "Wojciech";
381    if (name=="Xennon") return "Hanson";
382    if (name=="Yefrei") return "Yefei";
383    if (name=="Yfei") return "Yefei";
384    if (name=="Jean-Sebastein") return "Jean-Sebastien";
385    if (name=="Haritchablaet") return "Haritchabalet";
386    if (name=="Fautre") return "Fautré";
387    if (name=="Maceij") return "Maciej";
388    if (name=="Fabian") return "Fabien";
389    return name;
390}
391
392void nameCorrection(NamePair& name)
393{
394    if (name.first=="Michale" && name.second=="Platings")
395    {
396        name.first = "Michael";
397        name.second = "Platings";
398    }
399   
400    if (name.first=="Mick" && name.second=="")
401    {
402        name.first = "Maik";
403        name.second = "Keller";
404    }
405   
406    if (name.first=="Gary" && name.second=="Quin")
407    {
408        name.first = "Gary";
409        name.second = "Quinn";
410    }
411   
412    if (name.first=="BjornHein" && name.second=="")
413    {
414        name.first = "Björn";
415        name.second = "Hein";
416    }
417   
418    if (name.first=="Mattias" && name.second=="Fröhlich")
419    {
420        name.first = "Mathias";
421        name.second = "Fröhlich";
422    }
423   
424    if (name.first=="Mathias"  && name.second=="Helsing")
425    {
426        name.first = "Mattias";
427        name.second = "Helsing";
428    }
429   
430    if (name.first=="Bjorn" && name.second=="Hein")
431    {
432        name.first = "Björn";
433        name.second = "Hein";
434    }
435
436    if (name.first=="Erik" && name.second=="van")
437    {
438        name.first = "Erik";
439        name.second = "den Dekker";
440    }
441   
442    if (name.first=="Erik" && name.second=="den")
443    {
444        name.first = "Erik";
445        name.second = "den Dekker";
446    }
447   
448    if (name.first=="Jeoen" && name.second=="den")
449    {
450        name.first = "Jeoen";
451        name.second = "den Dekker";
452    }
453   
454    if (name.first=="John" && name.second=="Vidar")
455    {
456        name.first = "John";
457        name.second = "Vidar Larring";
458    }
459
460    if (name.first=="John" && name.second=="Vida")
461    {
462        name.first = "John";
463        name.second = "Vidar Larring";
464    }
465
466    if (name.first=="Sebastien" && name.second=="Messerschmidt")
467    {
468        name.first = "Sebastian";
469        name.second = "Messerschmidt";
470    }
471
472    if ((name.first=="Jose" || name.first=="José") && name.second=="Delport")
473    {
474        name.first = "J.P.";
475        name.second = "Delport";
476    }
477    if (name.first=="Franz" && name.second=="Melchior")
478    {
479        name.first = "Melchior";
480        name.second = "Franz";
481    }
482    if (name.first=="Glen" && name.second=="Waldon")
483    {
484        name.first = "Glenn";
485        name.second = "Waldron";
486    }
487    if (name.first=="Ralf" && name.second=="Karn")
488    {
489        name.first = "Ralf";
490        name.second = "Kern";
491    }
492    if (name.first=="Donny" && name.second=="Cipperly")
493    {
494        name.first = "Donald";
495        name.second = "Cipperly";
496    }
497    if (name.first=="Gino" && name.second=="van")
498    {
499        name.first = "Gino";
500        name.second = "van den Bergen";
501    }
502    if (name.first=="Radu" && name.second=="Mihai")
503    {
504        name.first = "Mihai";
505        name.second = "Radu";
506    }
507    if (name.first=="Art" && name.second=="Trevs")
508    {
509        name.first = "Art";
510        name.second = "Tevs";
511    }
512    if (name.first=="Tim" && name.second=="More")
513    {
514        name.first = "Tim";
515        name.second = "Moore";
516    }
517    if (name.first=="Andre" && name.second=="Garneau")
518    {
519        name.first = "André";
520        name.second = "Garneau";
521    }
522    if (name.first=="Eric" && name.second=="Hammil")
523    {
524        name.first = "Chris";
525        name.second = "Hanson";
526    }
527    if (name.first=="Paul" && name.second=="de")
528    {
529        name.first = "Paul";
530        name.second = "de Repentigny";
531    }
532    if (name.first=="Raymond" && name.second=="de")
533    {
534        name.first = "Raymond";
535        name.second = "de Vries";
536    }
537    if (name.first=="Nick" && name.second=="")
538    {
539        name.first = "Trajce";
540        name.second = "Nikolov";
541    }
542    if (name.first=="Daniel" && name.second=="")
543    {
544        name.first = "Daniel";
545        name.second = "Sjölie";
546    }
547    if (name.first=="Julia" && name.second=="Ortiz")
548    {
549        name.first = "Julian";
550        name.second = "Ortiz";
551    }
552    if (name.first=="Rune" && name.second=="Schmidt")
553    {
554        name.first = "Rune";
555        name.second = "Schmidt Jensen";
556    }
557    if (name.first=="Romano" && name.second=="José")
558    {
559        name.first = "Romano";
560        name.second = "José Magacho da Silva";
561    }
562    if (name.first=="Rommano" && name.second=="Silva")
563    {
564        name.first = "Romano";
565        name.second = "José Magacho da Silva";
566    }
567    if (name.first=="Leandro" && name.second=="Motta")
568    {
569        name.first = "Leandro";
570        name.second = "Motta Barros";
571    }
572    if (name.first=="A" && name.second=="Botorabi")
573    {
574        name.first = "Ali";
575        name.second = "Botorabi";
576    }
577
578    if (name.first=="Waltice" && name.second=="")
579    {
580        name.first = "Walter";
581        name.second = "J. Altice";
582    }
583
584    if (name.first=="Drew" && name.second=="")
585    {
586        name.first = "Drew";
587        name.second = "Whitehouse";
588    }
589    if (name.first=="Douglas" && name.second=="A")
590    {
591        name.first = "Douglas";
592        name.second = "A. Pouk";
593    }
594    if (name.first=="Colin" && name.second=="MacDonald")
595    {
596        name.first = "Colin";
597        name.second = "McDonald";
598    }
599    if (name.first=="Nikolov" && name.second=="Trajce")
600    {
601        name.first = "Trajce";
602        name.second = "Nikolov";
603    }
604    if (name.first=="Frauciel" && name.second=="Luc")
605    {
606        name.first = "Luc";
607        name.second = "Frauciel";
608    }
609}
610
611void lastValidCharacter(const std::string& name, unsigned int& pos,char c)
612{
613    for(unsigned int i=0;i<pos;++i)
614    {
615        if (name[i]==c)
616        {
617            pos = i;
618            return;
619        }
620    }
621}
622
623void lastValidCharacter(const std::string& name, unsigned int& last)
624{
625    lastValidCharacter(name, last, '.');
626    lastValidCharacter(name, last, ',');
627    lastValidCharacter(name, last, '\'');
628    lastValidCharacter(name, last, '/');
629    lastValidCharacter(name, last, '\\');
630    lastValidCharacter(name, last, ':');
631    lastValidCharacter(name, last, ';');
632    lastValidCharacter(name, last, ')');
633}
634
635
636
637NamePair createName(const std::string& first, const std::string& second)
638{
639    if (first.empty()) return EmptyNamePair;
640   
641    // osg::notify(osg::NOTICE)<<"first = "<<first<<" second = "<<second<<std::endl;
642   
643    unsigned int last = first.size();
644    lastValidCharacter(first, last);
645   
646    if (last==0) return EmptyNamePair;
647   
648    std::string name;
649   
650    name.append(first.begin(), first.begin()+last);
651
652    if (!validName(name)) return EmptyNamePair;
653
654    name = typoCorrection(name);
655   
656    if (second.empty() ||
657        !validName(second))
658    {
659        // filter any single or two letter words as unlike to be names.
660        if (name.size()<=2) return EmptyNamePair;
661
662        return NamePair(name,"");
663    }
664
665    last = second.size();
666   
667    lastValidCharacter(second, last);
668   
669    if (last>0)
670    {
671        std::string surname(second.begin(), second.begin()+last);
672       
673        if (validName(surname))
674        {
675            surname = typoCorrection(surname);
676            return NamePair(name, surname);
677        }
678    }
679   
680    // filter any single or two letter words as unlike to be names.
681    if (name.size()<=2) return EmptyNamePair;
682   
683    return NamePair(name,"");
684}
685
686bool submissionsSequence(const Words& words, unsigned int& i)
687{
688    if (i+1>=words.size()) return false;
689   
690    if (words[i]=="From" ||
691        words[i]=="from" ||
692        words[i]=="From:" ||
693        words[i]=="from:" ||
694        words[i]=="Merged" ||
695        words[i]=="Integrated") return true;
696       
697    if (i+2>=words.size()) return false;
698   
699    if (words[i]=="submitted" && words[i+1]=="by")
700    {
701        i+=1;
702        return true;
703    }
704       
705    if (words[i]=="Folded" && words[i+1]=="in")
706    {
707        i+=1;
708        return true;
709    }
710
711    if (words[i]=="Rolled" && words[i+1]=="in")
712    {
713        i+=1;
714        return true;
715    }
716
717    if (words[i]=="Checked" && words[i+1]=="in")
718    {
719        i+=1;
720        return true;
721    }
722
723    if (i+3>=words.size()) return false;
724
725    if (words[i]=="sent" && words[i+1]=="in" && words[i+2]=="by")
726    {
727        i+=2;
728        return true;
729    }
730
731    return false;
732}
733
734void readContributors(NameMap& names, const std::string& file)
735{
736    osgDB::ifstream fin(file.c_str());
737   
738    Words words;
739    while(fin)
740    {
741        std::string keyword;
742        fin >> keyword;
743        words.push_back(keyword);
744    }
745   
746    std::string blank_string;
747   
748    for(unsigned int i=0; i< words.size(); ++i)
749    {
750        if (submissionsSequence(words,i))
751        {
752            if (i+2<words.size() && validName(words[i+1]))
753            {
754                NamePair name = createName(words[i+1], words[i+2]);
755                nameCorrection(name);
756                if (!name.first.empty()) ++names[name];
757                i+=2;
758            }
759            else if (i+1<words.size() && validName(words[i+1]))
760            {
761                NamePair name = createName(words[i+1], blank_string);
762                nameCorrection(name);
763                if (!name.first.empty()) ++names[name];
764                i+=1;
765            }
766        }
767        else
768        {
769            if (words[i]=="robert")
770            {
771                ++names[NameRobertOsfield];
772            }
773            else if (words[i]=="don")
774            {
775                ++names[NameDonBurns];
776            }
777        }
778    }
779
780    // reassign fisrt name entries to their full names entries
781    if (names.size()>1)
782    {
783        for(NameMap::iterator itr = names.begin();
784            itr != names.end();
785            )
786        {
787            if (itr->first.second.empty())
788            {
789                NameMap::iterator next_itr = itr;
790                ++next_itr;
791               
792                if (next_itr!=names.end() && itr->first.first==next_itr->first.first)
793                {
794                    next_itr->second += itr->second;
795                    names.erase(itr);
796                    itr = next_itr;
797                }
798                else
799                {
800                    ++itr;
801                }
802            }
803            else
804            {
805                ++itr;
806            }
807        }
808    }
809   
810    // remove the double entries from Robert's contributions
811    if (names.size()>1)
812    {       
813        for(NameMap::iterator itr = names.begin();
814            itr != names.end();
815            ++itr)
816        {
817            if (itr->first != NameRobertOsfield && itr->first != NameDonBurns )
818            {
819                names[NameRobertOsfield] -= itr->second;
820            }
821        }
822    }
823   
824   
825}
826
827void buildContributors(NameMap& names)
828{
829    // top five contributors
830    ++names[NamePair("Robert","Osfield")];
831    ++names[NamePair("Don","Burns")];
832    ++names[NamePair("Marco","Jez")];
833    ++names[NamePair("Mike","Weiblen")];
834    ++names[NamePair("Geoff","Michel")];
835    ++names[NamePair("Ben","van Basten")];
836   
837    // contributors that don't appear in the ChangeLog due to their contributions
838    // being before CVS started for the OSG, or before the name logging began.
839    ++names[NamePair("Karsten","Weiss")];
840    ++names[NamePair("Graeme","Harkness")];
841    ++names[NamePair("Axel","Volley")];
842    ++names[NamePair("Nikolaus","Hanekamp")];
843    ++names[NamePair("Kristopher","Bixler")];
844    ++names[NamePair("Tanguy","Fautré")];
845    ++names[NamePair("J.E.","Hoffmann")];
846}
847
848int main( int argc, char **argv)
849{
850    osg::ArgumentParser arguments(&argc,argv);
851    arguments.getApplicationUsage()->setCommandLineUsage(arguments.getApplicationName()+" [options]");
852    arguments.getApplicationUsage()->addCommandLineOption("-h or --help","Display this information");
853    arguments.getApplicationUsage()->addCommandLineOption("--entries","Print out number of entries into the ChangeLog file for each contributor.");
854    arguments.getApplicationUsage()->addCommandLineOption("--version-number","Print out version number only");
855    arguments.getApplicationUsage()->addCommandLineOption("--major-number","Print out major version number only");
856    arguments.getApplicationUsage()->addCommandLineOption("--minor-number","Print out minor version number only");
857    arguments.getApplicationUsage()->addCommandLineOption("--patch-number","Print out patch version number only");
858    arguments.getApplicationUsage()->addCommandLineOption("--so-number ","Print out shared object version number only");
859    arguments.getApplicationUsage()->addCommandLineOption("--openthreads-version-number","Print out version number for OpenThreads only");
860    arguments.getApplicationUsage()->addCommandLineOption("--openthreads-soversion-number","Print out shared object version number for OpenThreads only");
861    arguments.getApplicationUsage()->addCommandLineOption("Matrix::value_type","Print the value of Matrix::value_type");
862    arguments.getApplicationUsage()->addCommandLineOption("Plane::value_type","Print the value of Plane::value_type");
863    arguments.getApplicationUsage()->addCommandLineOption("BoundingSphere::value_type","Print the value of BoundingSphere::value_type");
864    arguments.getApplicationUsage()->addCommandLineOption("BoundingBox::value_type","Print the value of BoundingBox::value_type");
865    arguments.getApplicationUsage()->addCommandLineOption("-r <file> or --read <file>","Read the ChangeLog to generate an estimated contributors list.");
866
867    if (arguments.read("--version-number"))
868    {
869        std::cout<<osgGetVersion()<<std::endl;
870        return 0;
871    }
872   
873    if (arguments.read("--major-number"))
874    {
875        std::cout<<OPENSCENEGRAPH_MAJOR_VERSION<<std::endl;
876        return 0;
877    }
878   
879    if (arguments.read("--minor-number"))
880    {
881        std::cout<<OPENSCENEGRAPH_MINOR_VERSION<<std::endl;
882        return 0;
883    }
884   
885    if (arguments.read("--patch-number"))
886    {
887        std::cout<<OPENSCENEGRAPH_PATCH_VERSION<<std::endl;
888        return 0;
889    }
890   
891    if (arguments.read("--soversion-number") || arguments.read("--so-number") )
892    {
893        std::cout<<osgGetSOVersion()<<std::endl;
894        return 0;
895    }
896   
897
898    if (arguments.read("--openthreads-version-number"))
899    {
900        std::cout<<OpenThreadsGetVersion()<<std::endl;
901        return 0;
902    }
903   
904   
905    if (arguments.read("--openthreads-major-number"))
906    {
907        std::cout<<OPENTHREADS_MAJOR_VERSION<<std::endl;
908        return 0;
909    }
910   
911    if (arguments.read("--openthreads-minor-number"))
912    {
913        std::cout<<OPENTHREADS_MINOR_VERSION<<std::endl;
914        return 0;
915    }
916   
917    if (arguments.read("--openthreads-patch-number"))
918    {
919        std::cout<<OPENTHREADS_PATCH_VERSION<<std::endl;
920        return 0;
921    }
922
923    if (arguments.read("--openthreads-soversion-number"))
924    {
925        std::cout<<OpenThreadsGetSOVersion()<<std::endl;
926        return 0;
927    }
928
929
930    if (arguments.read("Matrix::value_type"))
931    {
932        std::cout<<((sizeof(osg::Matrix::value_type)==4)?"float":"double")<<std::endl;
933        return 0;
934    }
935
936    if (arguments.read("Plane::value_type"))
937    {
938        std::cout<<((sizeof(osg::Plane::value_type)==4)?"float":"double")<<std::endl;
939        return 0;
940    }
941
942    if (arguments.read("BoundingSphere::value_type"))
943    {
944        std::cout<<((sizeof(osg::BoundingSphere::value_type)==4)?"float":"double")<<std::endl;
945        return 0;
946    }
947    if (arguments.read("BoundingBox::value_type"))
948    {
949        std::cout<<((sizeof(osg::BoundingBox::value_type)==4)?"float":"double")<<std::endl;
950        return 0;
951    }
952   
953    std::cout<<osgGetLibraryName()<< " "<< osgGetVersion()<<std::endl<<std::endl;
954
955    bool printContributors = false;
956    bool printNumEntries = false;
957    while ( arguments.read("--entries"))
958    {
959        printContributors = true;
960        printNumEntries = true;
961    }
962
963    std::string changeLog;
964    while ( arguments.read("-r",changeLog) || arguments.read("--read",changeLog)) printContributors = true;
965
966    // if user request help write it out to cout.
967    if (arguments.read("-h") || arguments.read("--help"))
968    {
969        std::cout<<arguments.getApplicationUsage()->getCommandLineUsage()<<std::endl;
970        arguments.getApplicationUsage()->write(std::cout,arguments.getApplicationUsage()->getCommandLineOptions());
971        return 1;
972    }
973
974    if (printContributors)
975    {
976        NameMap names;
977        buildContributors(names);
978        if (!changeLog.empty())
979        {
980            readContributors(names, changeLog);
981        }
982       
983        typedef std::multimap<unsigned int, NamePair> SortedNameMap;
984
985        SortedNameMap sortedNames;       
986        for(NameMap::iterator itr = names.begin();
987            itr != names.end();
988            ++itr)
989        {
990            sortedNames.insert(SortedNameMap::value_type(itr->second, itr->first));
991        }
992
993        std::cout<<names.size()<<" Contributors:"<<std::endl<<std::endl;
994       
995        if (printNumEntries)
996        {
997            std::cout<<"Entries Firstname Surname"<<std::endl;
998            std::cout<<"-------------------------"<<std::endl;
999            for(SortedNameMap::reverse_iterator sitr = sortedNames.rbegin();
1000                sitr != sortedNames.rend();
1001                ++sitr)
1002            {
1003                std::cout<<sitr->first<<"\t"<<sitr->second.first<<" "<<sitr->second.second<<std::endl;
1004            }
1005        }
1006        else
1007        {
1008            std::cout<<"Firstname Surname"<<std::endl;
1009            std::cout<<"-----------------"<<std::endl;
1010            for(SortedNameMap::reverse_iterator sitr = sortedNames.rbegin();
1011                sitr != sortedNames.rend();
1012                ++sitr)
1013            {
1014                std::cout<<sitr->second.first<<" "<<sitr->second.second<<std::endl;
1015            }
1016        }
1017    }
1018
1019    return 0;
1020}
Note: See TracBrowser for help on using the browser.