瀏覽代碼

* Tools to create dotted units or units that support dotted filenames

Michaël Van Canneyt 2 年之前
父節點
當前提交
401268818a

+ 277 - 0
utils/dotutils/README.txt

@@ -0,0 +1,277 @@
+# Dotted units tools
+
+# Intro
+This directory contains tools to convert the sources of units or programs so
+their uses clause contains dotted names.
+
+It can also generate a dotted version of a unit in one of several ways.
+
+The prefixer unit and the namespacetool unit contain the functionality
+to change uses clauses in unit files.
+
+# Config files for the tools
+
+The tools expect one or two files:
+
+## File transformation rules
+
+A file with rules to apply to units.
+
+Each line is constructed as follows:
+  
+```
+FileName=Rule;Compile Options 
+```
+
+Here
+
+*  FileName is the undotted unit name to convert a dotted unit.
+
+*  Rule is the rule to construct the dotted unit. See below for the rule.
+
+*  Compile options are compile options as understood by fcl-pascal needed to  correctly parse the unit source
+
+This file is used to construct dotted unit files from undotted files.
+
+The file must be contain all files in a give directory grouped:
+
+Ff a line contains no rule or compile options, the last used rule/compile options for a file in the same directory is reused.
+
+```
+src/sysutils.pp=System;-S2
+src/classes.pp
+src/math/math.pp
+```
+
+will result in classes being parsed with -S2 and the resulting name will be System.classes
+the name of the math unit will not be changed.
+
+
+### Known units rules
+
+A file with OldName=Rule pairs to apply to unit names in a uses clause. a Rule may never specify a path
+or an extension. The same extension as the original is used. 
+
+## Conversion Rules
+
+A rule can take the following forms:
+  
+"*DottedUnitName" : Use the dotted name as ypes.
+   
+Example:
+
+```
+sysutils=*System.SysUtils
+```
+
+The resulting file is called System.SysUtils
+
+"Prefix" : Prepend the non-dotted name with the given prefix, separated by a dot.
+
+Example:
+
+```
+sysutils=system
+```
+
+will result in a file system.sysutils
+ 
+"Prefix,*UnitSuffix" : This is equivalent to *Prefix.UnitSuffix
+
+Example:
+
+```
+sysutils=System,*SysUtils 
+```
+  
+will result in System.SysUtils
+
+
+"Prefix,-TextToDelete" strips the indicated part from the start of the original filename and prepends the result with Prefix. 
+
+Example:
+
+```
+fpreportdata=FpReport,-fpreport 
+```
+
+Will result in FpReport.Data
+
+"Prefix,TextToDelete-" strips the indicated part from the end of the original filename and prepends the result with Prefix. 
+
+Example:
+
+```
+elfresource=System.Resources,resource-
+```
+
+
+Will result in System.Resources.elf
+  
+
+# Available tools
+
+## addnamespacetofpmake.pp
+
+Utility to add a statement to add a namespace to a fpmake program file for FPC packages.
+This can be used to let fpmake dynamically change non-dotted names to dotted
+names in its targets and dependencies.
+
+## conditionalprefix.pp
+
+Takes a unit name from standard input, pretty print it (first letter
+uppercased) and add a conditional define for a namespace.
+
+```
+echo "sysutils" | conditionalprefix System will result in 
+```
+
+```
+{$IFDEF FPC_DOTTEDUNITS}System{$ENDIF}.Sysutils
+```
+
+To be used in shell scripts or to be invoked from an editor 
+that allows you to filter a selection through a command
+
+## dond.pp
+
+Tool to lowercase values in a Name=Value list
+
+(use to construct lowercase rules)
+
+## fixuses.pp
+
+Read a complete uses clause from standard input, and replace it with a conditional uses clause that 
+allows dotted and non-dotted units. The command needs a file with unit transform rules to apply
+to the units in the uses clause.
+
+To be used in shell scripts or to be invoked from an editor 
+that allows you to filter a selection through a command.
+
+Example:
+
+```
+echo "uses sysutils, classes" | fixuses known.txt 
+```
+
+results in
+
+```
+{$IFDEF FPC_DOTTEDUNITS}
+uses System.SysUtils, System.Classes;
+{$ELSE}
+uses sysutils, classes
+{$ENDIF}
+```
+
+
+## genunitnames.pp
+
+Read a list of unit file transformations and generate a list of unit names for use in a Makefile.
+The output consists of a XYZUNIT variable for each unit in the file list, twice: once dotted, once not dotted.
+The variables can be used in target definitions and dependency lists.
+
+Example
+
+```
+genunitnames list.txt
+```
+
+with list.txt containing
+
+```
+sysutils=*System.SysUtils
+classes=*System.Classes
+```
+
+results in 
+
+```
+ifdef FPC_DOTTEDUNITS
+SYSUTILSUNIT=System.SysUtils
+CLASSESUNIT=System.Classes
+else
+SYSUTILSUNIT=sysutils
+CLASSESUNIT=classes
+endif
+```
+
+## makedottedfiles.pp
+
+Application to Prefix units in uses clause of a list of programs, and
+generate a dotted version of the unit. Optionally adapts an fpmake file.
+
+This tool accepts a lot of options, run with -h to get an explanation of
+what it does.
+
+It needs 2 files to be specified using the command-line options: 
+a rule file of units to treat and the 'known mappings' rule file.    
+
+## prefixunits.pp
+
+Prefix units in a uses clause of a single program or unit.
+
+## proxyunit.pp
+
+Generate a skeleton unit with namespaced name which defines FPC_DOTTEDUNITS and 
+includes the original non-dotted unit. The full path to the skeleton unit
+must be given, the original non-dotted unit must be given only as a name.
+The extension is optional, when not specified, .pp is assumed.
+
+Example:
+
+```
+proxyunit namespaced/System.SysUtils.pp sysutils.pp
+```
+
+results in
+
+```
+unit System.SysUtils;
+{$DEFINE FPC_DOTTEDUNITS}
+{$i sysutils.pp}
+```
+## replaceunitnames.pp
+
+Replace hardcoded unit names xyz in a Makefile rule by a variable XYZUNIT.
+(see genunitnames for how to create the variables). Needs a rule file with
+names of units that may be replaced.
+
+Example:
+
+replaceunitnames list.txt Makefile.fpc
+
+with list.txt
+```
+sysutils=*System.SysUtils
+classes=*System.Classes
+```
+and the Makefile:
+
+```
+sysutils($PPUEXT): sysutils.pp
+	$(COMPILER) sysutils.pp
+
+classes($PPUEXT): classes.pp sysutils.pp 
+	$(COMPILER) classes.pp
+```
+
+is transformed to
+sysutils($PPUEXT): $(SYSUTILSUNIT).pp
+        $(COMPILER) $(SYSUTILSUNIT).pp
+
+classes($PPUEXT): $(CLASSESUNIT).pp $(SYSUTILSUNIT).pp 
+        $(COMPILER) $(CLASSESUNIT).pp
+	
+
+## reworkmakefile.pp  
+
+Duplicate all rules in a Makefile.fpc [Rules] section according to the rules specified
+in the aliases file. Skip rules that are in the skip file. Every rule is
+duplicated so 2 targets are defined: a dotted target and a non-dotted
+target. More than one file can be specified.
+
+# Known aliases
+
+The known.txt file contains the aliases list for the FPC rtl and packages.
+This can be used to convert a project to use dotted names.

+ 63 - 0
utils/dotutils/addnamespacetofpmake.pp

@@ -0,0 +1,63 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Utility to add a statement to add a namespace to a fpmake program file for FPC packages.
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program addnamespacetofpmake;
+
+uses classes, sysutils;
+
+const
+  namespacelist = 'namespaces.lst';
+
+Function HandleFile(const aFileName : string) : boolean;
+
+Var
+  aFile : TStringList;
+  I : Integer;
+  aLine : string;
+
+begin
+  Result:=False;
+  aFile:=TStringList.Create;
+  try
+    aFile.LoadFromFile(aFileName);
+    i:=aFile.Count-1;
+    while (I>=0) and not Result do
+      begin
+      aLine:=aFile[i];
+      if pos('{$ifndef ALLPACKAGES}',aLine)>0 then
+        if Pos('run',Lowercase(aFile[i+1]))>0 then
+          begin
+          aFile.Insert(I,'');
+          aFile.Insert(I,Format('    P.NamespaceMap:=''%s'';',[namespacelist]));
+          aFile.Insert(I,'');
+          Result:=True;
+          end;
+      Dec(I);
+      end;
+    if Result then
+      aFile.SaveToFile(aFileName);
+  finally
+    aFile.Free;
+  end;
+end;
+
+var
+  I : Integer;
+
+begin
+  for I:=1 to ParamCount do
+    if not handleFile(Paramstr(i)) then
+      Writeln('Could not modify file: ',Paramstr(i));
+end.
+

+ 29 - 0
utils/dotutils/conditionalprefix.pp

@@ -0,0 +1,29 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Take a unit name and add a conditional define for a namespace.
+    To be used in shell scripts or to be invoked from an editor 
+    that allows you to filter a selection through a command
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program conditionalprefix;
+
+Var
+  S : AnsiString;
+
+begin
+  Readln(S);
+  if S<>'' then
+  S[1]:=UpCase(S[1]);
+  S:='{$IFDEF FPC_DOTTEDUNITS}'+ParamStr(1)+'.{$ENDIF}'+S;
+  Write(S);
+end.
+

+ 40 - 0
utils/dotutils/dond.pp

@@ -0,0 +1,40 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Tool to lowercase values in a Name=Value lisst.
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+{$mode objfpc}
+{$h+}
+
+uses sysutils, classes;
+
+Var
+  I : Integer;
+  N,V : String;
+
+
+begin
+  With TStringList.Create do
+    try
+      LoadFromFile(ParamStr(1));
+      For I:=0 to Count-1 do
+        begin
+        GetNameValue(i,N,V);
+        V:=LowerCase(V);
+        Strings[i]:=N+'='+V;
+        end;
+      SaveToFile(ParamStr(1));
+    Finally
+      Free;
+    end;
+end.

+ 16 - 0
utils/dotutils/encloseunit.pp

@@ -0,0 +1,16 @@
+
+{$mode objfpc}
+{$H+}
+
+var
+  S : String;
+  
+begin  
+  Writeln('{$IFNDEF FPC_DOTTEDUNITS}');
+  While not EOF do
+    begin
+    Readln(S);
+    Writeln(S);
+    end;
+  Writeln('{$ENDIF FPC_DOTTEDUNITS}');
+end.

+ 54 - 0
utils/dotutils/fixuses.pp

@@ -0,0 +1,54 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Take a uses clause from standard input, 
+    and replace it with a conditional uses clause that allows dotted and non-dotted units.
+    To be used in shell scripts or to be invoked from an editor 
+    that allows you to filter a selection through a command.
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program fixuses;
+
+uses classes, prefixer;
+
+Var
+  aIn,aOut : TStrings;
+  P : TPrefixer;
+  S : String;
+
+begin
+  if ParamStr(1)='' then
+    begin
+    Writeln('Error : need name of known namespaces');
+    Halt(1);
+    end;
+  P:=nil;
+  aOut:=nil;
+  aIn:=TStringList.Create;
+  try
+    aOut:=TStringList.Create;
+    While not EOF do
+      begin
+      ReadLn(S);
+      aIn.Add(S);
+      end;
+    P:=TPrefixer.Create(Nil);
+    P.KnownNameSpaces.LoadFromFile(ParamStr(1));
+    P.ReworkUses(aIn,aOut);
+    For S in aout do
+      Writeln(S);
+  finally
+    aIn.Free;
+    aOut.Free;
+    P.Free;
+  end;
+end.
+

+ 56 - 0
utils/dotutils/genunitnames.pp

@@ -0,0 +1,56 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Read a list of unit file transformations and generate a list of unit names for use in a Makefile.
+    The output consists of a XYZUNIT variable for each unit in the file list, twice: once dotted, once not dotted.
+    The variables can be used in target definitions and dependency lists.
+        
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program genunitnames;
+
+uses sysutils, classes, types, namespacetool, prefixer;
+
+var
+  L,Dotted,NDotted : TStrings;
+  aLine, aNewUnit, aFN,aRule,aLastDir,aLastRule : String;
+  aOpts : TStringDynArray;
+
+begin
+  Dotted:=Nil;
+  NDotted:=nil;
+  L:=TStringList.Create;
+  try
+    Dotted:=TStringList.Create;
+    NDotted:=TStringList.Create;
+    L.LoadFromFile(paramstr(1));
+    for aLine in L do
+      begin
+      TNamespaceTool.SplitRuleLine(aLine,aFN,aRule,aLastDir,aLastRule,aOPts);
+      aNewUnit:=TPrefixer.ApplyRule(aFN,aRule,aRule<>'');
+      NDotted.Add(UpperCase(aFN)+'UNIT='+aFn);
+      Dotted.Add(UpperCase(aFN)+'UNIT='+aNewUnit);
+      end;
+
+    Writeln('ifdef FPC_DOTTEDUNITS');
+    For aLine in Dotted do
+      Writeln(aLine);
+    Writeln('else');
+    For aLine in NDotted do
+      Writeln(aLine);
+    Writeln('endif');
+  finally
+    Dotted.Free;
+    NDotted.Free;
+    L.Free;
+  end;
+
+end.
+

+ 2622 - 0
utils/dotutils/known.txt

@@ -0,0 +1,2622 @@
+macuuid=*System.Macuuid
+libuuid=*System.Libuuid
+cairogobject=*Api.Cairo.GObject
+cairo=*Api.Cairo.Lib
+cairoft=*Api.Cairo.Ft
+cairoxlib=*Api.Cairo.Xlib
+cairowin32=*Api.Cairo.win32
+odbcsqldyn=*Api.OdbcDyn
+odbcsql=*Api.Odbc
+cl=*OpenCLApi.Cl
+cl_gl=*OpenCLApi.Cl_gl
+colorsel=*FreeVision.Colorsel
+fvconsts=*FreeVision.Fvconsts
+gadgets=*FreeVision.Gadgets
+colortxt=*FreeVision.Colortxt
+time=*FreeVision.Time
+editors=*FreeVision.Editors
+asciitab=*FreeVision.Asciitab
+resource=*System.Resources.Resource
+stddlg=*FreeVision.Stddlg
+memory=*FreeVision.Memory
+buildfv=*FreeVision.Buildfv
+statuses=*FreeVision.Statuses
+sysmsg=*FreeVision.Sysmsg
+msgbox=*FreeVision.Msgbox
+timeddlg=*FreeVision.Timeddlg
+colorsel=*FreeVision.Colorsel
+uhistlist=*FreeVision.Uhistlist
+fvconsts=*FreeVision.Fvconsts
+utabs=*FreeVision.Utabs
+uinplong=*FreeVision.Uinplong
+outline=*FreeVision.Outline
+uvalidate=*FreeVision.Uvalidate
+histlist=*FreeVision.Histlist
+tabs=*FreeVision.Tabs
+utimeddlg=*FreeVision.Utimeddlg
+umenus=*FreeVision.Umenus
+ufvcommon=*FreeVision.Ufvcommon
+udialogs=*FreeVision.Udialogs
+drivers=*FreeVision.Drivers
+uviews=*FreeVision.Uviews
+views=*FreeVision.Views
+fvcommon=*FreeVision.Fvcommon
+app=*FreeVision.App
+inplong=*FreeVision.Inplong
+validate=*FreeVision.Validate
+umsgbox=*FreeVision.Umsgbox
+buildfv=*FreeVision.Buildfv
+uoutline=*FreeVision.Uoutline
+dialogs=*FreeVision.Dialogs
+udrivers=*FreeVision.Udrivers
+uapp=*FreeVision.Uapp
+menus=*FreeVision.Menus
+iconvenc=*UnixApi.Iconvenc
+iconvenc_dyn=*UnixApi.Iconvenc_dyn
+pgtk=*FPGtk.Pgtk
+fpgtkext=*Fpgtkext
+fpglib=*Fpglib
+objectdef=*Objectdef
+progwin=*Progwin
+buttonrow=*Buttonrow
+gtkdeftexts=*Gtkdeftexts
+gtkeditor=*Gtkeditor
+finddlgs=*Finddlgs
+settingsrec=*Settingsrec
+xpms=*Xpms
+fpgtk=*Fpgtk
+gcmem=*Api.Libgc.Gcmem
+fpmkunit=*Fpmkunit
+wpstk=*OS2Api.Wpstk
+lvm=*OS2Api.Lvm
+mmio=*OS2Api.Mmio
+clkdll=*OS2Api.Clkdll
+mciapi=*OS2Api.Mciapi
+sw=*OS2Api.Sw
+mcidrv=*OS2Api.Mcidrv
+dive=*OS2Api.Dive
+som=*OS2Api.Som
+hwvideo=*OS2Api.Hwvideo
+buildall=*OS2Api.Buildall
+mmbase=*OS2Api.Mmbase
+ftpapi=*OS2Api.Ftpapi
+mci=*OS2Api.Mci
+gst=*Api.Gstreamer.Gst
+gstformat=*Api.Gstreamer.Gstformat
+gles11=*Api.OpenGL.Gles11
+gles20=*Api.OpenGL.Gles20
+xmlxsdparser=*Api.XML.Xsdparser
+xml2=*Api.XML.Xml2
+xmlxsd=*Api.XML.Xsd
+p_dinput=*PTC.Win32.P_dinput
+p_ddraw=*PTC.Win32.P_ddraw
+ptc=*Ptc
+ptceventqueue=*PTC.EventQueue
+ptcwrapper=*PTC.Wrapper
+vesa=*PTC.Dos.Vesa
+textfx2=*PTC.Dos.Textfx2
+vga=*PTC.Dos.Vga
+mouse33h=*PTC.Dos.Mouse33h
+timeunit=*PTC.Dos.Timeunit
+cga=*PTC.Dos.Cga
+p_gx=*PTC.WinCE.P_gx
+ddraw=*PTC.WinCE.Ddraw
+tinyptc=*PTC.Tinyptc
+bfd=*UnixApi.Bfd
+googlekgsearch=*Api.Google.KgSearch
+googlefitness=*Api.Google.Fitness
+googlestorage=*Api.Google.Storage
+googleurlshortener=*Api.Google.UrlShortener
+googleiam=*Api.Google.Iam
+googlereplicapoolupdater=*Api.Google.ReplicaPoolUpdater
+googleresourceviews=*Api.Google.ResourceViews
+googleidentitytoolkit=*Api.Google.IdentityToolkit
+googlecalendar=*Api.Google.Calendar
+googlereplicapool=*Api.Google.ReplicaPool
+googlesqladmin=*Api.Google.SqlAdmin
+googlesafebrowsing=*Api.Google.SafeBrowsing
+googlepartners=*Api.Google.Partners
+googlefreebase=*Api.Google.FreeBase
+googlecloudresourcemanager=*Api.Google.Cloud.ResourceManager
+googlecloudbilling=*Api.Google.Cloud.Billing
+googleproximitybeacon=*Api.Google.ProximityBeacon
+googlefirebaserules=*Api.Google.FirebaseRules
+googlestoragetransfer=*Api.Google.StorageTransfer
+googleclouddebugger=*Api.Google.Cloud.Debugger
+googleanalytics=*Api.Google.Analytics
+googleappsactivity=*Api.Google.AppsActivity
+googlecloudtrace=*Api.Google.Cloud.Trace
+googlecontainer=*Api.Google.Container
+googlecoordinate=*Api.Google.Coordinate
+googleadexchangebuyer=*Api.Google.AdExchange.Buyer
+googlediscovery=*Api.Google.Discovery
+googlegmail=*Api.Google.Gmail
+googleblogger=*Api.Google.Blogger
+googleprediction=*Api.Google.Prediction
+googlemanager=*Api.Google.Manager
+googledataproc=*Api.Google.DataProc
+googlegames=*Api.Google.Games
+googlecontent=*Api.Google.Content
+googlegamesconfiguration=*Api.Google.GamesConfiguration
+googlegan=*Api.Google.Gan
+googledoubleclickbidmanager=*Api.Google.DoubleclickBidManager
+googledns=*Api.Google.Dns
+googleoauth2=*Api.Google.Oauth2
+googlefusiontables=*Api.Google.FusionTables
+googleaudit=*Api.Google.Audit
+googlewebmasters=*Api.Google.Webmasters
+googletranslate=*Api.Google.Translate
+googletagmanager=*Api.Google.TagManager
+googlemirror=*Api.Google.Mirror
+googlepagespeedonline=*Api.Google.PageSpeedOnline
+googlescript=*Api.Google.Script
+googleqpxexpress=*Api.Google.QpxExpress
+googleanalyticsreporting=*Api.Google.AnalyticsReporting
+googlepeople=*Api.Google.People
+googleplusdomains=*Api.Google.PlusDomains
+googlecloudmonitoring=*Api.Google.Cloud.Monitoring
+googlecomputeaccounts=*Api.Google.ComputeAccounts
+googlebigquery=*Api.Google.BigQuery
+googleautoscaler=*Api.Google.AutoScaler
+googleyoutubereporting=*Api.Google.YouTube.Reporting
+googlelicensing=*Api.Google.Licensing
+googlebooks=*Api.Google.Books
+googleyoutubeanalytics=*Api.Google.Youtube.Analytics
+googletoolresults=*Api.Google.ToolResults
+googledrive=*Api.Google.Drive
+googlecloudsearch=*Api.Google.Cloud.Search
+googleplus=*Api.Google.Plus
+googledfareporting=*Api.Google.DfaReporting
+googleruntimeconfig=*Api.Google.RuntimeConfig
+googlelogging=*Api.Google.Logging
+googlemonitoring=*Api.Google.Monitoring
+googlegroupsmigration=*Api.Google.GroupsMigration
+googleclouderrorreporting=*Api.Google.Cloud.ErrorReporting
+googleadsense=*Api.Google.AdSense
+googledeploymentmanager=*Api.Google.DeploymentManager
+googletaskqueue=*Api.Google.TaskQueue
+googleclassroom=*Api.Google.ClassRoom
+googleandroidenterprise=*Api.Google.AndroidEnterprise
+googlepubsub=*Api.Google.PubSub
+googlecustomsearch=*Api.Google.CustomSearch
+googlecivicinfo=*Api.Google.CivicInfo
+googlegamesmanagement=*Api.Google.GamesManagement
+googledoubleclicksearch=*Api.Google.DoubleClicksearch
+googlemapsengine=*Api.Google.MapsEngine
+googlesiteverification=*Api.Google.SiteVerification
+googlesheets=*Api.Google.Sheets
+googleplaymoviespartner=*Api.Google.PlayMoviesPartner
+googleyoutube=*Api.Google.YouTube
+googlecloudlatencytest=*Api.Google.Cloud.LatencyTest
+googleconsumersurveys=*Api.Google.ConsumerSurveys
+googlereseller=*Api.Google.Reseller
+googlespectrum=*Api.Google.Spectrum
+googledataflow=*Api.Google.DataFlow
+googledatastore=*Api.Google.DataStore
+googlevision=*Api.Google.Vision
+googleandroidpublisher=*Api.Google.AndroidPublisher
+googlegenomics=*Api.Google.Genomics
+googleacceleratedmobilepageurl=*Api.Google.AcceleratedMobilePageUrl
+googlecloudbuild=*Api.Google.CloudBuild
+googleappengine=*Api.Google.AppEngine
+googleadexchangebuyer2=*Api.Google.AdExchange.Buyer2
+googleadexchangeseller=*Api.Google.AdExchange.Seller
+googleappstate=*Api.Google.AppState
+googleclouduseraccounts=*Api.Google.Cloud.UserAccounts
+googletasks=*Api.Google.Tasks
+googleadmin=*Api.Google.Admin
+googleadsensehost=*Api.Google.AdSenseHost
+googlecompute=*Api.Google.Compute
+googlewebfonts=*Api.Google.Webfonts
+googlegroupssettings=*Api.Google.GroupsSettings
+googleserviceregistry=*Api.Google.ServiceRegistry
+googleclient=*GoogleApi.GoogleClient
+googleservice=*GoogleApi.GoogleService
+googlebase=*GoogleApi.GoogleBase
+ffi=*Api.Ffi
+ffi.manager=*Api.Ffi.manager
+fat=*WiiApi.Fat
+filesystem=*NdsApi.Filesystem
+gbfs=*NdsApi.Gbfs
+nds7=*NdsApi.Nds7
+dswifi7=*NdsApi.Dswifi7
+dswifi9=*NdsApi.Dswifi9
+maxmod9=*NdsApi.Maxmod9
+maxmod7=*NdsApi.Maxmod7
+nds9=*NdsApi.Nds9
+gl2d=*NdsApi.Gl2d
+CloudKit=*Api.Cocoa.CloudKit
+PDFKit=*Api.Cocoa.PDFKit
+CoreMediaIO=*Api.Cocoa.CoreMediaIO
+CalendarStore=*Api.Cocoa.CalendarStore
+CoreData=*Api.Cocoa.CoreData
+DefinedClassesIOBluetoothUI=*Api.Cocoa.DefinedClassesIOBluetoothUI
+GameKit=*Api.Cocoa.GameKit
+QTKit=*Api.Cocoa.QTKit
+DefinedClassesMapKit=*Api.Cocoa.DefinedClassesMapKit
+ScreenSaver=*Api.Cocoa.ScreenSaver
+Collaboration=*Api.Cocoa.Collaboration
+DefinedClassesIOBluetooth=*Api.Cocoa.DefinedClassesIOBluetooth
+DefinedClassesAVKit=*Api.Cocoa.DefinedClassesAVKit
+CoreAudioKit=*Api.Cocoa.CoreAudioKit
+MapKit=*Api.Cocoa.MapKit
+DefinedClassesOSAKit=*Api.Cocoa.DefinedClassesOSAKit
+CoreGraphics=*MacOsApi.CoreGraphics
+OSAKit=*Api.Cocoa.OSAKit
+IOBluetoothUI=*Api.Cocoa.IOBluetoothUI
+DefinedClassesCloudKit=*Api.Cocoa.DefinedClassesCloudKit
+Social=*Api.Cocoa.Social
+ImageKit=*Api.Cocoa.ImageKit
+CoreMedia=*Api.Cocoa.CoreMedia
+DefinedClassesQuickLookUI=*Api.Cocoa.DefinedClassesQuickLookUI
+EventKit=*Api.Cocoa.EventKit
+InputMethodKit=*Api.Cocoa.InputMethodKit
+DefinedClassesAudioVideoBridging=*Api.Cocoa.DefinedClassesAudioVideoBridging
+PreferencePanes=*Api.Cocoa.PreferencePanes
+DefinedClassesSecurityInterface=*Api.Cocoa.DefinedClassesSecurityInterface
+StoreKit=*Api.Cocoa.StoreKit
+GLKit=*Api.Cocoa.GLKit
+CoreBluetooth=*Api.Cocoa.CoreBluetooth
+CocoaAll=*Api.Cocoa.CocoaAll
+DefinedClassesSceneKit=*Api.Cocoa.DefinedClassesSceneKit
+DefinedClassesQuartzFilters=*Api.Cocoa.DefinedClassesQuartzFilters
+DefinedClassesInstantMessage=*Api.Cocoa.DefinedClassesInstantMessage
+Automator=*Api.Cocoa.Automator
+DefinedClassesCoreMediaIO=*Api.Cocoa.DefinedClassesCoreMediaIO
+DefinedClassesQTKit=*Api.Cocoa.DefinedClassesQTKit
+Accounts=*Api.Cocoa.Accounts
+DefinedClassesQuartzCore=*Api.Cocoa.DefinedClassesQuartzCore
+DefinedClassesGameController=*Api.Cocoa.DefinedClassesGameController
+DefinedClassesLocalAuthentication=*Api.Cocoa.DefinedClassesLocalAuthentication
+DefinedClassesAppleScriptObjC=*Api.Cocoa.DefinedClassesAppleScriptObjC
+QuartzCore=*Api.Cocoa.QuartzCore
+iTunesLibrary=*Api.Cocoa.ITunesLibrary
+Foundation=*Api.Cocoa.Foundation
+AVFoundation=*Api.Cocoa.AVFoundation
+DefinedClassesPubSub=*Api.Cocoa.DefinedClassesPubSub
+SpriteKit=*Api.Cocoa.SpriteKit
+DefinedClassesCoreAudio=*Api.Cocoa.DefinedClassesCoreAudio
+DefinedClassesAppKit=*Api.Cocoa.DefinedClassesAppKit
+DefinedClassesCoreLocation=*Api.Cocoa.DefinedClassesCoreLocation
+DefinedClassesCryptoTokenKit=*Api.Cocoa.DefinedClassesCryptoTokenKit
+DefinedClassesCoreBluetooth=*Api.Cocoa.DefinedClassesCoreBluetooth
+DefinedClassesStoreKit=*Api.Cocoa.DefinedClassesStoreKit
+DefinedClassesWebKit=*Api.Cocoa.DefinedClassesWebKit
+AddressBook=*Api.Cocoa.AddressBook
+DefinedClassesImageCaptureCore=*Api.Cocoa.DefinedClassesImageCaptureCore
+InstantMessage=*Api.Cocoa.InstantMessage
+CoreVideo=*Api.Cocoa.CoreVideo
+DefinedClassesInputMethodKit=*Api.Cocoa.DefinedClassesInputMethodKit
+DefinedClassesCoreVideo=*Api.Cocoa.DefinedClassesCoreVideo
+NotificationCenter=*Api.Cocoa.NotificationCenter
+ServiceManagement=*Api.Cocoa.ServiceManagement
+DefinedClassesPDFKit=*Api.Cocoa.DefinedClassesPDFKit
+QuickLookUI=*Api.Cocoa.QuickLookUI
+DefinedClassesAccounts=*Api.Cocoa.DefinedClassesAccounts
+DefinedClassesCoreImage=*Api.Cocoa.DefinedClassesCoreImage
+DefinedClassesMediaAccessibility=*Api.Cocoa.DefinedClassesMediaAccessibility
+DefinedClassesSocial=*Api.Cocoa.DefinedClassesSocial
+DefinedClassesGLKit=*Api.Cocoa.DefinedClassesGLKit
+DefinedClassesCoreAudioKit=*Api.Cocoa.DefinedClassesCoreAudioKit
+MultipeerConnectivity=*Api.Cocoa.MultipeerConnectivity
+WebKit=*Api.Cocoa.WebKit
+DefinedClassesGameKit=*Api.Cocoa.DefinedClassesGameKit
+DefinedClassesSyncServices=*Api.Cocoa.DefinedClassesSyncServices
+LocalAuthentication=*Api.Cocoa.LocalAuthentication
+SyncServices=*Api.Cocoa.SyncServices
+DefinedClassesServiceManagement=*Api.Cocoa.DefinedClassesServiceManagement
+DefinedClassesCollaboration=*Api.Cocoa.DefinedClassesCollaboration
+AppKit=*Api.Cocoa.AppKit
+DefinedClassesImageKit=*Api.Cocoa.DefinedClassesImageKit
+CoreLocation=*Api.Cocoa.CoreLocation
+DefinedClassesMediaLibrary=*Api.Cocoa.DefinedClassesMediaLibrary
+DefinedClassesCoreFoundation=*Api.Cocoa.DefinedClassesCoreFoundation
+DefinedClassesCFOpenDirectory=*Api.Cocoa.DefinedClassesCFOpenDirectory
+DefinedClassesSpriteKit=*Api.Cocoa.DefinedClassesSpriteKit
+MediaLibrary=*Api.Cocoa.MediaLibrary
+DefinedClassesAVFoundation=*Api.Cocoa.DefinedClassesAVFoundation
+QuickLook=*Api.Cocoa.QuickLook
+DefinedClassesScriptingBridge=*Api.Cocoa.DefinedClassesScriptingBridge
+DefinedClassesCoreData=*Api.Cocoa.DefinedClassesCoreData
+QuartzComposer=*Api.Cocoa.QuartzComposer
+DefinedClassesiTunesLibrary=*Api.Cocoa.DefinedClassesiTunesLibrary
+AppleScriptObjC=*Api.Cocoa.AppleScriptObjC
+DefinedClassesNotificationCenter=*Api.Cocoa.DefinedClassesNotificationCenter
+DefinedClassesQuickLook=*Api.Cocoa.DefinedClassesQuickLook
+CoreImage=*Api.Cocoa.CoreImage
+InstallerPlugins=*Api.Cocoa.InstallerPlugins
+DefinedClassesAutomator=*Api.Cocoa.DefinedClassesAutomator
+CoreFoundation=*MacOsApi.CoreFoundation
+SecurityInterface=*Api.Cocoa.SecurityInterface
+OpenDirectory=*Api.Cocoa.OpenDirectory
+DefinedClassesCoreGraphics=*Api.Cocoa.DefinedClassesCoreGraphics
+MediaAccessibility=*Api.Cocoa.MediaAccessibility
+ScriptingBridge=*Api.Cocoa.ScriptingBridge
+DefinedClassesFoundation=*Api.Cocoa.DefinedClassesFoundation
+DefinedClassesInstallerPlugins=*Api.Cocoa.DefinedClassesInstallerPlugins
+GameController=*Api.Cocoa.GameController
+DefinedClassesOpenDirectory=*Api.Cocoa.DefinedClassesOpenDirectory
+DefinedClassesFinderSync=*Api.Cocoa.DefinedClassesFinderSync
+AudioVideoBridging=*Api.Cocoa.AudioVideoBridging
+CFOpenDirectory=*Api.Cocoa.CFOpenDirectory
+DefinedClassesScreenSaver=*Api.Cocoa.DefinedClassesScreenSaver
+DefinedClassesMultipeerConnectivity=*Api.Cocoa.DefinedClassesMultipeerConnectivity
+QuartzFilters=*Api.Cocoa.QuartzFilters
+FinderSync=*Api.Cocoa.FinderSync
+DefinedClassesQuartzComposer=*Api.Cocoa.DefinedClassesQuartzComposer
+DefinedClassesCoreMedia=*Api.Cocoa.DefinedClassesCoreMedia
+IOBluetooth=*Api.Cocoa.IOBluetooth
+SecurityFoundation=*Api.Cocoa.SecurityFoundation
+DefinedClassesAddressBook=*Api.Cocoa.DefinedClassesAddressBook
+DefinedClassesPreferencePanes=*Api.Cocoa.DefinedClassesPreferencePanes
+CryptoTokenKit=*Api.Cocoa.CryptoTokenKit
+PubSub=*Api.Cocoa.PubSub
+SceneKit=*Api.Cocoa.SceneKit
+DefinedClassesEventKit=*Api.Cocoa.DefinedClassesEventKit
+DefinedClassesSecurityFoundation=*Api.Cocoa.DefinedClassesSecurityFoundation
+CoreAudio=*Api.Cocoa.CoreAudio
+AVKit=*Api.Cocoa.AVKit
+DefinedClassesCalendarStore=*Api.Cocoa.DefinedClassesCalendarStore
+ImageCaptureCore=*Api.Cocoa.ImageCaptureCore
+pxlib=*Api.Pxlib
+dbindexer=*FPIndexer.Dbindexer
+fpmasks=*FPIndexer.Fpmasks
+ireadertxt=*FPIndexer.Ireadertxt
+ireaderpas=*FPIndexer.Ireaderpas
+sqldbindexdb=*FPIndexer.Sqldbindexdb
+ireaderhtml=*FPIndexer.Ireaderhtml
+fpindexer=*FPIndexer.Fpindexer
+memindexdb=*FPIndexer.Memindexdb
+fbindexdb=*FPIndexer.Fbindexdb
+sqliteindexdb=*FPIndexer.Sqliteindexdb
+pgindexdb=*FPIndexer.Pgindexdb
+mysql56dyn=*Api.Mysql56dyn
+my4_sys=*Api.My4_sys
+mysql51emb=*Api.Mysql51emb
+mysql41dyn=*Api.Mysql41dyn
+mysql3_com=*Api.Mysql3_com
+mysql50dyn=*Api.Mysql50dyn
+mysql3=*Api.Mysql3
+mysql80dyn=*Api.Mysql80dyn
+mysql55=*Api.Mysql55
+mysql57dyn=*Api.Mysql57dyn
+mysql3_version=*Api.Mysql3_version
+mysql51dyn=*Api.Mysql51dyn
+mysql4=*Api.Mysql4
+mysql3dyn=*Api.Mysql3dyn
+mysql4_com=*Api.Mysql4_com
+mysql3_comdyn=*Api.Mysql3_comdyn
+mysql4dyn=*Api.Mysql4dyn
+mysql55dyn=*Api.Mysql55dyn
+mysql40=*Api.Mysql40
+mysql50=*Api.Mysql50
+mysql4_comdyn=*Api.Mysql4_comdyn
+mysql4_version=*Api.Mysql4_version
+mysql51=*Api.Mysql51
+mysql40dyn=*Api.Mysql40dyn
+mysql41=*Api.Mysql41
+libcurl=*Api.Libcurl
+imlib=*Api.Imlib
+gdk_imlib=*Api.Gdk_imlib
+symbolic=*System.Symbolic
+crt=*System.Console.Crt
+vesamode=*System.Console.Vesamode
+mouse=*System.Console.Mouse
+Video=*MacOsApi.Video
+keyboard=*PalmApi.Keyboard
+winevent=*System.Console.Winevent
+unixkvmbase=*System.Console.Unixkvmbase
+terminfo=*System.Console.Terminfo
+vidcrt=*System.Console.Vidcrt
+libfontconfig=*Api.Libfontconfig
+newt=*Api.Newt
+registry=*System.Registry
+xmlreg=*System.Xmlreg
+fpreportdata=*FpReport.Data
+fpreportpdfexport=*FpReport.Exports.Pdf
+fpreportdatajson=*FpReport.Data.Rest
+fpreporthtmlexport=*FpReport.Exports.Html
+fpreportfpimageexport=*FpReport.Exports.FpImage
+fpreportdb=*FpReport.Data.Db
+fpreportcanvashelper=*FpReport.CanvasHelper
+fpreportdatadbf=*FpReport.Data.Dbf
+fpreportqrcode=*FpReport.QrCode
+fpreportbarcode=*FpReport.BarCode
+fpreporthtmlutil=*FpReport.Html.Utils
+fpjsonreport=*FpReport.Json
+fpreportdatacsv.ppFpReport=*FpReport.Data.Csv
+fpextfuncs=*FpReport.ExtFuncs
+fpreport=*FpReport.Report
+fplazreport=*FpReport.Lazarus
+fpreportstreamer=*FpReport.Streamer
+fpreportcontnr=*FpReport.Contnr
+fpreportdom=*FpReport.Dom
+fpreportdatasqldb=*FpReport.Data.SqlDb
+fpreporthtmlparser=*FpReport.Html.Parser
+fprepexprpars=*FpReport.Expressions
+fpreportjson=*FpReport.Json
+bzip2=*System.Bzip2
+bzip2stream=*System.Bzip2stream
+bzip2comn=*System.Bzip2comn
+dblib=*Api.Dblib
+generics.strings=*System.Generics.Strings
+generics.collections=*System.Generics.Collections
+generics.hashes=*System.Generics.Hashes
+generics.memoryexpanders=*System.Generics.MemoryExpanders
+generics.helpers=*System.Generics.Helpers
+generics.defaults=*System.Generics.Defaults
+gdbm=*Api.Gdbm
+crypth=*UnixApi.Crypth
+pwd=*UnixApi.Pwd
+shadow=*UnixApi.Shadow
+users=*UnixApi.Users
+grp=*UnixApi.Grp
+unzipdll=*System.Unzipdll
+ziptypes=*System.Ziptypes
+unzip51g=*System.Unzip51g
+form=*PalmApi.Form
+ocrt=*Api.NCurses.Ocrt
+ncurses=*Api.Ncurses
+ncrt=*Api.NCurses.Ncrt
+menu=*Api.NCurses.Menu
+panel=*Api.NCurses.Panel
+roo=*NumLib.Roo
+ode=*NumLib.Ode
+omv=*NumLib.Omv
+ipf=*NumLib.Ipf
+inv=*NumLib.Inv
+spe=*NumLib.Spe
+dsl=*NumLib.Dsl
+iom=*NumLib.Iom
+int=*NumLib.Int
+mdt=*NumLib.Mdt
+sle=*NumLib.Sle
+timer=*Amiga.Core.Timer
+eigh2=*NumLib.Eigh2
+typ=*NumLib.Typ
+eig=*NumLib.Eig
+eigh1=*NumLib.Eigh1
+det=*NumLib.Det
+numlib=*NumLib.Numlib
+spl=*NumLib.Spl
+oratypes=*Api.Oracle.Types
+oci=*Api.Oracle.Oci
+oraoci=*Api.Oracle.Oraoci
+ocidyn=*Api.Oracle.Ocidyn
+gdk2pixbuf=*Api.Gtk2.Gdk2pixbuf
+gtk2=*Api.Gtk2.Gtk2
+gdk2=*Api.Gdk2
+libglade2=*Api.Glade2
+pangoutils=*Api.Pangoutils
+pango=*Api.Pango
+atk=*Api.Atk
+pangocairo=*Api.Pangocairo
+gdk2x=*Api.Gtk2.Gdk2x
+gtk2ext=*Api.Gtk2.Gtk2ext
+gtkhtml=*Api.Gtk2.Gtkhtml
+buildgtk2=*Api.Gtk2.Buildgtk2
+glib2=*Api.Glib2
+gdkglext=*Api.Gtk2.Gdkglext
+gtkglext=*Api.Gtk2.Gtkglext
+maxmod=*GBAApi.Maxmod
+gba=*GBAApi.Gba
+tcl80=*Api.Tcl80
+zorba=*Api.Zorba
+zorbadyn=*Api.ZorbaDyn
+xqc=*Api.Xqc
+fpjsontopas=*FpJson.ToPas
+jsonini=*FpJson.Ini
+fpjson=*FpJson.Data
+jsonscanner=*FpJson.Scanner
+json2yaml=*FpJson.Json2Yaml
+fpjsonrtti=*FpJson.Rtti
+fpjsonapply=*FpJson.Apply
+fpjsonvalue=*FpJson.Value
+jsonparser=*FpJson.Parser
+jsonreader=*FpJson.Reader
+jsonconf=*FpJson.Conf
+ggi=*Api.Ggi
+gii=*Api.Gii
+ggi2d=*Api.Ggi2d
+xrandr=*Api.X11.Xrandr
+shape=*Api.X11.Shape
+x=*Api.X11.X
+sunkeysym=*Api.X11.Sunkeysym
+xmd=*Api.X11.Xmd
+xge=*Api.X11.Xge
+xevi=*Api.X11.Xevi
+xvlib=*Api.X11.Xvlib
+xkb=*Api.X11.Xkb
+xinput2=*Api.X11.Xinput2
+deckeysym=*Api.X11.Deckeysym
+xtestext1=*Api.X11.Xtestext1
+xinerama=*Api.X11.Xinerama
+xf86dga=*Api.X11.Xf86dga
+dpms=*Api.X11.Dpms
+xcms=*Api.X11.Xcms
+xatom=*Api.X11.Xatom
+xi=*Api.X11.Xi
+xlib=*Api.X11.Xlib
+xag=*Api.X11.Xag
+xcup=*Api.X11.Xcup
+xinput=*Api.X11.Xinput
+mitmisc=*Api.X11.Mitmisc
+xi2=*Api.X11.Xi2
+security=*Api.X11.Security
+xlbx=*Api.X11.Xlbx
+xfixes=*Api.X11.Xfixes
+xf86vmode=*Api.X11.Xf86vmode
+xkblib=*Api.X11.Xkblib
+xext=*Api.X11.Xext
+fontconfig=*Api.X11.Fontconfig
+cursorfont=*Api.X11.Cursorfont
+xshm=*Api.X11.Xshm
+xf86keysym=*Api.X11.Xf86keysym
+xresource=*Api.X11.Xresource
+keysym=*Api.X11.Keysym
+hpkeysym=*Api.X11.Hpkeysym
+sync=*Api.X11.Sync
+multibuf=*Api.X11.Multibuf
+xrender=*Api.X11.Xrender
+xv=*Api.X11.Xv
+xdbe=*Api.X11.Xdbe
+xutil=*Api.X11.Xutil
+xft=*Api.X11.Xft
+graph=*System.MacOSX.Graph
+wincrt=*System.Win32.Wincrt
+winmouse=*System.Win32.Winmouse
+ggigraph=*System.Unix.Ggigraph
+ptcgraph=*System.PTC.Ptcgraph
+ptcmouse=*System.PTC.Ptcmouse
+ptccrt=*System.PTC.Ptccrt
+sdlgraph=*System.Sdlgraph
+gnutls=*Api.Gnutls
+gnutlssockets=*System.Net.Gnutlssockets
+httpd=*Api.Httpd20.Httpd
+httpsvlt=*System.Net.Httpsvlt
+resolve=*System.Net.Resolve
+sslbase=*System.Net.Sslbase
+sslsockets=*System.Net.Sslsockets
+cnetdb=*System.Net.Cnetdb
+netdb=*System.Net.Netdb
+ssockets=*System.Net.Ssockets
+fpsock=*System.Net.Fpsock
+sndfile=*Api.Sndfile
+uenetclass=*Api.Uenetclass
+enet=*Api.Enet
+glx=*Api.OpenGL.Glx
+freeglut=*Api.OpenGL.Freeglut
+glut=*Api.OpenGL.Glut
+glext=*Api.OpenGL.Glext
+glu=*Api.OpenGL.Glu
+gl=*Api.OpenGL.Gl
+sdfdata=*Data.Sdfdata
+fpddsqldb=*Data.Dict.Sqldb
+fpddmysql41=*Data.Dict.Mysql41
+fpddmysql57=*Data.Dict.Mysql57
+fpddsqlite3=*Data.Dict.Sqlite3
+fpddoracle=*Data.Dict.Oracle
+fpddmysql40=*Data.Dict.Mysql40
+fpddmysql56=*Data.Dict.Mysql56
+fpdddiff=*Data.Dict.Diff
+fpdatadict=*Data.Dict.Fpdatadict
+fpdddbf=*Data.Dict.Dbf
+fpddmysql50=*Data.Dict.Mysql50
+fpddmssql=*Data.Dict.Mssql
+fpddfb=*Data.Dict.Fb
+fpddregstd=*Data.Dict.Regstd
+fpddodbc=*Data.Dict.Odbc
+fpddpq=*Data.Dict.Pq
+fpddmysql51=*Data.Dict.Mysql51
+fpddmysql55=*Data.Dict.Mysql55
+fpddmysql80=*Data.Dict.Mysql80
+paradox=*Data.Paradox
+fpjsondataset=*Data.JsonDataset
+extjsdataset=*Data.Extjsdataset
+fieldmap=*Data.Fieldmap
+csvdataset=*Data.Csvdataset
+xmldatapacketreader=*Data.Xmldatapacketreader
+dbwhtml=*Data.Dbwhtml
+sqlscript=*Data.Sqlscript
+dbcoll=*Data.Dbcoll
+sqltypes=*Data.Sqltypes
+dbconst=*Data.Dbconst
+bufdataset_parser=*Data.Bufdataset_parser
+db=*Data.Db
+bufdataset=*Data.Bufdataset
+fpsqlscanner=*Data.SQL.Scanner
+fpsqlparser=*Data.SQL.Parser
+fpsqltree=*Data.SQL.Tree
+fpsimplejsonexport=*Data.Export.SimpleJson
+fprtfexport=*Data.Export.Rtf
+fpdbfexport=*Data.Export.Dbf
+fpfixedexport=*Data.Export.Fixed
+fpsqlexport=*Data.Export.Sql
+fptexexport=*Data.Export.Tex
+fpxmlxsdexport=*Data.Export.XmlXsd
+fpcsvexport=*Data.Export.Csv
+fpsimplexmlexport=*Data.Export.SimpleXml
+fpstdexports=*Data.Export.RegisterStandard
+fpdbexport=*Data.Export.Db
+odbcconn=*Data.SqlDb.Odbcconn
+sqldbpool=*Data.SqlDb.Pool
+mysql50conn=*Data.SqlDb.Mysql50conn
+mysql57conn=*Data.SqlDb.Mysql57conn
+mysql51conn=*Data.SqlDb.Mysql51conn
+mysql41conn=*Data.SqlDb.Mysql41conn
+mysql55conn=*Data.SqlDb.Mysql55conn
+mysql56conn=*Data.SqlDb.Mysql56conn
+mysql40conn=*Data.SqlDb.Mysql40conn
+mysql80conn=*Data.SqlDb.Mysql80conn
+oracleconnection=*Data.SqlDb.Oracleconnection
+sqldb=*Data.Sqldb
+sqldblib=*Data.SqlDb.Sqldblib
+pqconnection=*Data.SqlDb.Pqconnection
+pqeventmonitor=*Data.SqlDb.Pqeventmonitor
+mssqlconn=*Data.SqlDb.Mssqlconn
+fbadmin=*Data.SqlDb.Fbadmin
+fbeventmonitor=*Data.SqlDb.Fbeventmonitor
+ibconnection=*Data.SqlDb.Ibconnection
+sqldbini=*Data.SqlDb.Sqldbini
+sqlite3backup=*Data.SqlDb.Sqlite3backup
+sqlite3conn=*Data.SqlDb.Sqlite3conn
+fpcgtypesafedataset=*Data.CodeGen.TypeSafeDataset
+fpcgcreatedbf=*Data.CodeGen.CreateDbf
+fpcgfieldmap=*Data.CodeGen.FieldMap
+fpcgdbcoll=*Data.CodeGen.Collections
+fpddpopcode=*Data.CodeGen.PopulateFields
+fpcgsqlconst=*Data.CodeGen.SqlConst
+fpcgtiopf=*Data.CodeGen.TiOpf
+fpddcodegen=*Data.CodeGen.Types
+dbf_reg=*Data.Dbf.Reg
+dbf_prscore=*Data.Dbf.Prscore
+dbf_avl=*Data.Dbf.Avl
+dbf_idxcur=*Data.Dbf.Idxcur
+dbf_str_ita=*Data.Dbf.Str_ita
+dbf_fields=*Data.Dbf.Fields
+dbf_str_pl=*Data.Dbf.Str_pl
+dbf_pgfile=*Data.Dbf.Pgfile
+dbf_dbffile=*Data.Dbf.Dbffile
+dbf_common=*Data.Dbf.Common
+dbf_str=*Data.Dbf.Str
+dbf_wtil=*Data.Dbf.Wtil
+dbf_str_pt=*Data.Dbf.Str_pt
+dbf_prssupp=*Data.Dbf.Prssupp
+dbf_pgcfile=*Data.Dbf.Pgcfile
+dbf_cursor=*Data.Dbf.Cursor
+dbf_str_fr=*Data.Dbf.Str_fr
+dbf_str_ru=*Data.Dbf.Str_ru
+dbf_str_es=*Data.Dbf.Str_es
+dbf_lang=*Data.Dbf.Lang
+dbf=*Data.Dbf.Dbf
+dbf_str_nl=*Data.Dbf.Str_nl
+tdbf_l=*Data.Dbf.Tdbf_l
+dbf_parser=*Data.Dbf.Parser
+dbf_prsdef=*Data.Dbf.Prsdef
+dbf_memo=*Data.Dbf.Memo
+dbf_idxfile=*Data.Dbf.Idxfile
+dbf_collate=*Data.Dbf.Collate
+memds=*Data.Memds
+sqliteds=*Data.SQLite.Sqliteds
+customsqliteds=*Data.SQLite.Customsqliteds
+sqlite3ds=*Data.SQLite.Sqlite3ds
+reswriter=*System.Resources.Writer
+fpcrestypes=*System.Resources.Types
+rcparser=*System.Resources.Rc.Parser
+versionresource=*System.Resources.Version
+coffreader=*System.Resources.Coff.Reader
+cofftypes=*System.Resources.Coff.Types
+resdatastream=*System.Resources.DataStream
+externaltypes=*System.Resources.ExternalTypes
+bitmapresource=*System.Resources.Bitmap
+elftypes=*System.Resources.Elf.Types
+rcreader=*System.Resources.Rc.Rreader
+xcoffwriter=*System.Resources.XCoff.Writer
+winpeimagereader=*System.Resources.WinPeImage.Reader
+machotypes=*System.Resources.Macho.Types
+externalreader=*System.Resources.External.Reader
+resreader=*System.Resources.Reader
+groupresource=*System.Resources.Group
+resmerger=*System.Resources.Merger
+coffwriter=*System.Resources.Coff.Writer
+resourcetree=*System.Resources.Tree
+groupiconresource=*System.Resources.GroupIcon
+groupcursorresource=*System.Resources.GroupCursor
+machoconsts=*System.Resources.Macho.Consts
+versionconsts=*System.Resources.Version.Consts
+strtable=*System.Resources.StringTable.Types
+externalwriter=*System.Resources.External.Writer
+elfwriter=*System.Resources.Elf.Writer
+dfmreader=*System.Resources.Dfm.Reader
+acceleratorsresource=*System.Resources.Accelerator
+tlbreader=*System.Resources.Tlb.reader
+icocurtypes=*System.Resources.GroupTypes
+coffconsts=*System.Resources.Coff.Consts
+elfconsts=*System.Resources.Elf.Consts
+elfreader=*System.Resources.Elf.Reader
+machoreader=*System.Resources.Macho.Reader
+versiontypes=*System.Resources.Version.Types
+stringtableresource=*System.Resources.StringTable
+machowriter=*System.Resources.Macho.Writer
+resfactory=*System.Resources.Factory
+png=*Api.Png
+gadtools=*Amiga.Core.Gadtools
+console=*Amiga.Core.Console
+utility=*Amiga.Core.Utility
+mui=*Amiga.Other.Mui
+datatypes=*Amiga.Core.Datatypes
+exec=*Amiga.Core.Exec
+workbench=*Amiga.Core.Workbench
+icon=*Amiga.Core.Icon
+hardware=*Amiga.Core.Hardware
+keymap=*Amiga.Core.Keymap
+commodities=*Amiga.Core.Commodities
+serial=*Amiga.Core.Serial
+agraphics=*Amiga.Core.Agraphics
+conunit=*Amiga.Core.Conunit
+layers=*Amiga.Core.Layers
+diskfont=*Amiga.Core.Diskfont
+tagsarray=*Amiga.Utils.Tagsarray
+iffparse=*Amiga.Core.Iffparse
+intuition=*Amiga.Core.Intuition
+asl=*Amiga.Core.Asl
+cybergraphics=*Amiga.Other.Cybergraphics
+longarray=*AROSApi.Longarray
+locale=*Amiga.Core.Locale
+inputevent=*Amiga.Core.Inputevent
+amigados=*Amiga.Core.Amigados
+clipboard=*Amiga.Core.Clipboard
+tcsrcmap=*Js.TcSrcMap
+jsparser=*Js.Parser
+jsscanner=*Js.Scanner
+jswriter=*Js.Writer
+jssrcmap=*Js.SrcMap
+tstopas=*Js.TsToPas
+jsbase=*Js.Base
+jstree=*Js.Tree
+jstoken=*Js.Token
+jsminifier=*Js.Minifier
+zstream=*System.ZLib.Zstream
+adler=*System.ZLib.Adler
+unzip=*System.ZLib.Unzip
+inffast=*System.ZLib.Inffast
+zbase=*System.ZLib.Zbase
+infutil=*System.ZLib.Infutil
+zdeflate=*System.ZLib.Zdeflate
+zcompres=*System.ZLib.Zcompres
+zip=*System.ZLib.Zip
+zuncompr=*System.ZLib.Zuncompr
+gzio=*System.ZLib.Gzio
+infblock=*System.ZLib.Infblock
+infcodes=*System.ZLib.Infcodes
+inftrees=*System.ZLib.Inftrees
+zinflate=*System.ZLib.Zinflate
+trees=*System.ZLib.Trees
+zipper=*System.ZLib.Zipper
+ziputils=*System.ZLib.Ziputils
+paszlib=*System.ZLib.Paszlib
+ril=*WinceAPI.Ril
+buildwinceunits=*WinceAPI.Buildwinceunits
+winioctl=*WinceAPI.Winioctl
+sip=*WinceAPI.Sip
+pimstore=*WinceAPI.Pimstore
+rapitypes=*WinceAPI.Rapitypes
+aygshell=*WinceAPI.Aygshell
+connmgr=*WinceAPI.Connmgr
+devmgmt=*WinceAPI.Devmgmt
+tapi=*WinceAPI.Tapi
+msacm=*WinceAPI.Msacm
+gpsapi=*WinceAPI.Gpsapi
+bthapi=*WinceAPI.Bthapi
+commdlg=*WinApi.Commdlg
+mmsystem=*WinApi.Mmsystem
+raserror=*WinceAPI.Raserror
+Power=*MacOsApi.Power
+ras=*WinceAPI.Ras
+imm=*WinceAPI.Imm
+wap=*WinceAPI.Wap
+rapi=*WinceAPI.Rapi
+service=*WinceAPI.Service
+tlhelp32=*WinceAPI.Tlhelp32
+sipapi=*WinceAPI.Sipapi
+simmgr=*WinceAPI.Simmgr
+pm=*WinceAPI.Pm
+shellapi=*WinApi.Shellapi
+notify=*WinceAPI.Notify
+devload=*WinceAPI.Devload
+extapi=*WinceAPI.Extapi
+wininet=*WinApi.Wininet
+projects=*WinceAPI.Projects
+cpl=*WinceAPI.Cpl
+mmreg=*WinceAPI.Mmreg
+ws2bth=*WinceAPI.Ws2bth
+storemgr=*WinceAPI.Storemgr
+windbase=*WinceAPI.Windbase
+oleauto=*WinceAPI.Oleauto
+bthutil=*WinceAPI.Bthutil
+iphlpapi=*WinceAPI.Iphlpapi
+todaycmn=*WinceAPI.Todaycmn
+phone=*WinceAPI.Phone
+msgqueue=*WinceAPI.Msgqueue
+bt_sdp=*WinceAPI.Bt_sdp
+pnp=*WinceAPI.Pnp
+sms=*SinclairApi.Sms
+tsp=*WinceAPI.Tsp
+bt_api=*WinceAPI.Bt_api
+gx=*WinceAPI.Gx
+nled=*WinceAPI.Nled
+keybd=*WinceAPI.Keybd
+cesync=*WinceAPI.Cesync
+htmlctrl=*WinceAPI.Htmlctrl
+commctrl=*WinApi.Commctrl
+webidltopas2js=*WebIdl.ToPas2Js
+webidlparser=*WebIdl.Parser
+webidltowasmjob=*WebIdl.ToWasmJob
+webidltopas=*WebIdl.ToPascal
+webidldefs=*WebIdl.Defs
+webidlscanner=*WebIdl.Scanner
+systemlog=*UnixApi.Systemlog
+pasresolver=*Pascal.Resolver
+pparser=*Pascal.Parser
+pasresolveeval=*Pascal.ResolveEval
+passrcutil=*Pascal.Utils
+pastounittest=*Pascal.ToUnitTest
+pscanner=*Pascal.Scanner
+pastree=*Pascal.Tree
+pasuseanalyzer=*Pascal.UseAnalyzer
+paswrite=*Pascal.Writer
+dbuscomp=*Api.Dbuscomp
+dbus=*Api.Dbus
+fpwavformat=*System.Sound.Wav.Format
+fpwavreader=*System.Sound.Wav.Reader
+fpwavwriter=*System.Sound.Wav.Writer
+dts=*Api.Dts
+xsd_generator=*Sdo.Xsd.Generator
+sdo_xsdparser=*Sdo.Xsd.Parser
+sdo_xsdintf=*Sdo.Xsd.Intf
+sdo_xsd_helper=*Sdo.Xsd.Helper
+xsd_consts=*Sdo.Xsd.Consts
+sdo_field_imp=*Sdo.Field.Impl
+sdo_dataobject=*Sdo.DataObject
+sdo_serialization=*Sdo.Serialization
+sdo_binary_streamer=*Sdo.Binary.Streamer
+sdo_parserutils=*Sdo.Parser.Utils
+sdo_linked_list=*Sdo.LinkedList
+sdo=*Sdo.Base
+sdo_date_utils=*Sdo.DateUtils
+sdo_serialization_binary=*Sdo.Serialization.Binary
+sdo_xpath_helper=*Sdo.Xpath.Helper
+sdo_logger_intf=*Sdo.Logger.Intf
+sdo_consts=*Sdo.Consts
+sdo_dom_cursors=*Sdo.Dom.Cursors
+sdo_fpc_xml=*Sdo.Fpc.Xml
+sdo_type=*Sdo.Types
+sdo_serialization_xml=*Sdo.Serialization.xml
+sdo_imp_utils=*Sdo.Imp.utils
+sdo_locators=*Sdo.Locators
+sdo_datafactory=*Sdo.Data.Factory
+sdo_serialization_utils=*Sdo.Serialization.Utils
+pas_generator=*Sdo.Pas.Generator
+sdo_types=*Sdo.BaseTypes
+sdo_rtti_filters=*Sdo.RttiFilters
+sdo_utils=*Sdo.Utils
+sdo_cursor_intf=*Sdo.Cursor.Intf
+sdo_changesummary=*Sdo.Changesummary
+sdo_das_imp=*Sdo.Das.Impl
+sdo_das_utils=*Sdo.Das.Utils
+data_acces_intf=*Sdo.Das.DataAcces.Intf
+sdo_das=*Sdo.Das.Base
+ldap=*Api.Ldap
+lber=*Api.Lber
+fuse=*Fuse
+fpcddb=*System.CdRom.Cddb
+wincd=*System.CdRom.Windows
+cdrom=*System.CdRom
+scsidefs=*System.CdRom.ScsiDefs
+major=*System.CdRom.Major
+lincd=*System.CdRom.Linunix
+cdromioctl=*System.CdRom.Windows.Ioctl
+wnaspi32=*System.CdRom.Windows.Aspi32
+discid=*System.CdRom.DiscId
+onetimepass=*System.Hash.Onetimepass
+fptlsbigint=*System.Hash.Tlsbigint
+fpsha512=*System.Hash.Sha512
+fpecc=*System.Hash.Ecc
+fpsha256=*System.Hash.Sha256
+fprsa=*System.Hash.Rsa
+fppem=*System.Hash.Pem
+fphashutils=*System.Hash.Utils
+fpecdsa=*System.Hash.Ecdsa
+fpasn=*System.Hash.Asn
+rexxsaa=*Api.Rexxsaa
+fastcgi=*Api.Fastcgi
+gctypes=*WiiApi.Gctypes
+gcmodplay=*WiiApi.Gcmodplay
+network=*WiiApi.Network
+gccore=*WiiApi.Gccore
+debug=*WiiApi.Debug
+iso9660=*WiiApi.Iso9660
+asndlib=*WiiApi.Asndlib
+aesndlib=*WiiApi.Aesndlib
+mp3player=*WiiApi.Mp3player
+cupsdyn=*Api.Cupsdyn
+proj=*Kuvx.Proj
+objcrtlutils=*Api.ObjC.RtlUtils
+objcrtlmacosx=*Api.ObjC.RtlMacOsX
+objcrtl10=*Api.ObjC.Rtl10
+objcrtl20=*Api.ObjC.Rtl20
+objcrtl=*Api.ObjC.Rtl
+objcrtliphoneos=*Api.ObjC.RtlIPhoneOs
+qlutil=*SinclairApi.Qlutil
+qdos=*SinclairApi.Qdos
+qlfloat=*SinclairApi.Qlfloat
+hermes=*Api.Hermes
+imagemagick=*Api.Imagemagick
+buildim=*Api.Buildim
+magick_wand=*Api.Magick_wand
+a52=*Api.A52
+fftw_s=*Api.Fftw_s
+aprutil=*Api.Httpd20.Aprutil
+apriconv=*Api.Httpd20.Apriconv
+apr=*Api.Httpd20.Apr
+fppdfpredict=*FpPdf.Predict
+fppdfparser=*FpPdf.Parser
+fppdfobjects=*FpPdf.Objects
+fppdfscanner=*FpPdf.Scanner
+fpfonttextmapping=*FpPdf.FontTextMapping
+fpttfsubsetter=*FpPdf.Ttf.Subsetter
+fppdfconsts=*FpPdf.Consts
+fppdf=*FpPdf.Pdf
+fpttfencodings=*FpPdf.Ttf.Encodings
+fpttf=*FpPdf.Ttf
+fpparsettf=*FpPdf.Ttf.Parser
+fppdfsource=*FpPdf.Source
+pas2jscompilercfg=*Pas2Js.Compiler.Config
+pas2jsutils=*Pas2Js.Utils
+pas2jsresources=*Pas2Js.Resources
+pas2jspcucompiler=*Pas2Js.Compiler.Pcu
+pas2jspparser=*Pas2Js.Parser
+pas2jsfscompiler=*Pas2Js.Compiler.Files
+pas2jsuseanalyzer=*Pas2Js.UseAnalyzer
+pas2jsjsresources=*Pas2Js.Resources.Js
+pas2jsresstrfile=*Pas2Js.Resources.Strings
+pas2jslibcompiler=*Pas2Js.Compiler.Lib
+pas2jsfileutils=*Pas2Js.Files.Utils
+pas2jscompilerpp=*Pas2Js.Compiler.PostProcess
+fppas2js=*Pas2Js.Compiler.Transpiler
+fppjssrcmap=*Pas2Js.SrcMap
+pas2jshtmlresources=*Pas2Js.Resources.Html
+pas2jsfs=*Pas2Js.Files.Fs
+pas2jsfilecache=*Pas2Js.Files.Cache
+pas2jsfiler=*Pas2Js.Filer
+pas2jslogger=*Pas2Js.Logger
+pas2jscompiler=*Pas2Js.Compiler.Base
+pthreads=*UnixApi.Pthreads
+process=*System.Process
+dbugintf=*System.Dbugintf
+simpleipc=*System.Simpleipc
+dbugmsg=*System.Dbugmsg
+processunicode=*System.Processunicode
+pipes=*System.Pipes
+libmagic=*Api.Magic
+penmgr=*PalmApi.Penmgr
+exglib=*PalmApi.Exglib
+dlserver=*PalmApi.Dlserver
+rect=*PalmApi.Rect
+netbitutils=*PalmApi.Netbitutils
+palmcompatibility=*PalmApi.Palmcompatibility
+progress=*PalmApi.Progress
+irlib=*PalmApi.Irlib
+overlaymgr=*PalmApi.Overlaymgr
+table=*PalmApi.Table
+filestream=*PalmApi.Filestream
+vfsmgr=*PalmApi.Vfsmgr
+keymgr=*PalmApi.Keymgr
+slotdrvrlib=*PalmApi.Slotdrvrlib
+modemmgr=*PalmApi.Modemmgr
+connectionmgr=*PalmApi.Connectionmgr
+uicolor=*PalmApi.Uicolor
+list=*PalmApi.List
+telephonymgrtypes=*PalmApi.Telephonymgrtypes
+soundmgr=*PalmApi.Soundmgr
+stringmgr=*PalmApi.Stringmgr
+udamgr=*PalmApi.Udamgr
+intlmgr=*PalmApi.Intlmgr
+consolemgr=*PalmApi.Consolemgr
+seriallinkmgr=*PalmApi.Seriallinkmgr
+datamgr=*PalmApi.Datamgr
+alarmmgr=*PalmApi.Alarmmgr
+netmgr=*PalmApi.Netmgr
+systemresources=*PalmApi.Systemresources
+pdilib=*PalmApi.Pdilib
+day=*PalmApi.Day
+find_=*PalmApi.Find_
+systemmgr=*PalmApi.Systemmgr
+featuremgr=*PalmApi.Featuremgr
+telephonymgr=*PalmApi.Telephonymgr
+hal=*PalmApi.Hal
+m68khwr=*PalmApi.M68khwr
+errorbase=*PalmApi.Errorbase
+field=*PalmApi.Field
+font=*PalmApi.Font
+category=*PalmApi.Category
+floatmgr=*PalmApi.Floatmgr
+attentionmgr=*PalmApi.Attentionmgr
+notifymgr=*PalmApi.Notifymgr
+uicontrols=*PalmApi.Uicontrols
+window=*PalmApi.Window
+palmlocale=*PalmApi.Palmlocale
+event_=*PalmApi.Event_
+password=*PalmApi.Password
+graffiti=*PalmApi.Graffiti
+smslib=*PalmApi.Smslib
+preferences=*Amiga.Other.Preferences
+sysutil=*PalmApi.Sysutil
+serialmgr=*PalmApi.Serialmgr
+telephonymgrui=*PalmApi.Telephonymgrui
+expansionmgr=*PalmApi.Expansionmgr
+inetmgr=*PalmApi.Inetmgr
+inspoint=*PalmApi.Inspoint
+uiresources=*PalmApi.Uiresources
+sysevtmgr=*PalmApi.Sysevtmgr
+fontselect_=*PalmApi.Fontselect_
+lz77mgr=*PalmApi.Lz77mgr
+control=*PalmApi.Control
+encrypt=*PalmApi.Encrypt
+pdiconst=*PalmApi.Pdiconst
+bitmap=*PalmApi.Bitmap
+seltimezone=*PalmApi.Seltimezone
+palmos=*PalmApi.Palmos
+menu_=*PalmApi.Menu_
+textmgr=*PalmApi.Textmgr
+fslib=*PalmApi.Fslib
+crc=*System.Hash.Crc
+helperserviceclass=*PalmApi.Helperserviceclass
+localize=*PalmApi.Localize
+selday=*PalmApi.Selday
+coretraps=*PalmApi.Coretraps
+chars=*PalmApi.Chars
+hwrmiscflags=*PalmApi.Hwrmiscflags
+scrollbar=*PalmApi.Scrollbar
+libtraps=*PalmApi.Libtraps
+privaterecords=*PalmApi.Privaterecords
+serialmgrold=*PalmApi.Serialmgrold
+helper=*PalmApi.Helper
+graffitishift=*PalmApi.Graffitishift
+fatalalert=*PalmApi.Fatalalert
+applaunchcmd=*PalmApi.Applaunchcmd
+graffitireference=*PalmApi.Graffitireference
+aboutbox=*PalmApi.Aboutbox
+exgmgr=*PalmApi.Exgmgr
+seltime=*PalmApi.Seltime
+datetime=*PalmApi.Datetime
+timemgr=*PalmApi.Timemgr
+imcutils=*PalmApi.Imcutils
+sysevent=*PalmApi.Sysevent
+localemgr=*PalmApi.Localemgr
+launcher=*PalmApi.Launcher
+textservicesmgr=*PalmApi.Textservicesmgr
+memorymgr=*PalmApi.Memorymgr
+phonelookup=*PalmApi.Phonelookup
+libusb=*Api.Usb
+unixutils=*UnixApi.Utils
+msgraph=*Web.OData.Msgraph
+sharepoint=*Web.OData.Sharepoint
+odataservice=*Web.OData.Odataservice
+odatabase=*Web.OData.Odatabase
+office365client=*Web.OData.Office365client
+uhpackimp=*FpWeb.UhpackImp
+uhpacktables=*FpWeb.UhpackTables
+uhpack=*FpWeb.Uhpack
+custfcgi=*FpWeb.HostApp.Custom.Fcgi
+fpwebclient=*FpWeb.Client
+fcgigate=*FpWeb.FcgiGate
+custapache=*FpWeb.HostApp.Custom.Apache
+fphttpsys=*FpWeb.HostApp.HttpSys
+fpweb=*FpWeb.Base
+microhttpapp=*FpWeb.HostApp.MicroHttpApp
+webutil=*FpWeb.Utils
+custhttpapp=*FpWeb.HostApp.Custom.HttpApp
+ezcgi=*FpWeb.HostApp.Ezcgi
+fpmimetypes=*FpWeb.MimeTypes
+iniwebsession=*FpWeb.Session.Ini
+httpprotocol=*FpWeb.Http.Protocol
+custapache24=*FpWeb.HostApp.Custom.Apache24
+custmicrohttpapp=*FpWeb.HostApp.Custom.MicroHttpApp
+fpcgi=*FpWeb.HostApp.Cgi
+fpdatasetform=*FpWeb.DatasetForm
+fpwebproxy=*FpWeb.Modules.Proxy
+fphttpclientpool=*FpWeb.Http.Client.Pool
+fphttpstatus=*FpWeb.Http.Status
+fphtml=*FpWeb.Html
+fphttpclient=*FpWeb.Http.Client
+cgiprotocol=*FpWeb.Cgi.Protocol
+custweb=*FpWeb.Handler
+httpjson=*FpWeb.Http.Json
+fphttpapp=*FpWeb.HostApp.HttpApp
+restcodegen=*FpWeb.Rest.Codegen
+fphttpwebclient=*FpWeb.Http.Client
+fpapache=*FpWeb.HostApp.Apache
+restbase=*FpWeb.Rest.Base
+httpdefs=*FpWeb.Http.Defs
+fphttpclientasyncpool=*FpWeb.Http.Client.AsyncPool
+tcwebmodule=*FpWeb.Tests.Module
+fpapache24=*FpWeb.HostApp.Apache24
+httproute=*FpWeb.Route
+cgiapp=*FpWeb.HostApp.SimpleCgi
+fpwebfile=*FpWeb.Modules.Files
+fpfcgi=*FpWeb.HostApp.Fcgi
+custhttpsys=*FpWeb.HostApp.Custom.HttpSys
+fphttpserver=*FpWeb.http.Server
+custcgi=*FpWeb.HostApp.Custom.Cgi
+websession=*FpWeb.Session
+fphttp=*FpWeb.Http.Base
+webpage=*FpWeb.WebPage
+sqldbwebdata=*FpWeb.Data.SqlDb
+extjsjson=*FpWeb.Data.Extjs.Json
+fpextjs=*FpWeb.Data.Extjs.Base
+extjsxml=*FpWeb.Data.Extjs.Xml
+fpwebdata=*FpWeb.Data.Base
+webjsonrpc=*FpWeb.JsonRpc.Web
+fpextdirect=*FpWeb.JsonRpc.ExtDirect
+fprpcrtti=*FpWeb.JsonRpc.Rtti
+fpdispextdirect=*FpWeb.JsonRpc.DispExtDirect
+fprpcstrings=*FpWeb.JsonRpc.Strings
+fpjsonrpc=*FpWeb.JsonRpc.Base
+fprpccodegen=*FpWeb.JsonRpc.Codegen
+fprpcclient=*FpWeb.JsonRpc.Client
+sqldbrestbridge=*FpWeb.RestBridge.Bridge
+sqldbrestjson=*FpWeb.RestBridge.Json
+sqldbrestconst=*FpWeb.RestBridge.Consts
+sqldbrestauth=*FpWeb.RestBridge.Auth
+sqldbrestxml=*FpWeb.RestBridge.Xml
+sqldbrestschema=*FpWeb.RestBridge.Schema
+sqldbrestcds=*FpWeb.RestBridge.Cds
+sqldbrestmodule=*FpWeb.RestBridge.Module
+sqldbrestdata=*FpWeb.RestBridge.Data
+sqldbrestado=*FpWeb.RestBridge.Ado
+sqldbrestio=*FpWeb.RestBridge.IO
+sqldbrestini=*FpWeb.RestBridge.Ini
+sqldbrestauthini=*FpWeb.RestBridge.Authini
+sqldbrestcsv=*FpWeb.RestBridge.Csv
+fpwebsocket=*FpWeb.WebSocket.Protocol
+fpwebsocketserver=*FpWeb.WebSocket.Server
+fpcustwsserver=*FpWeb.WebSocket.Custom.Server
+wsupgrader=*FpWeb.WebSocket.Upgrader
+fpwebsocketclient=*FpWeb.WebSocket.Client
+fpoauth2ini=*Jwt.Oauth2ini
+fpjwarsa=*Jwt.Jwa.Rsa
+fpjwasha512=*Jwt.Jwa.Sha512
+fpjwasha384=*Jwt.Jwa.Sha384
+fpjwaes256=*Jwt.Jwa.Es256
+fpjwasha256=*Jwt.Jwa.Sha256
+fpjwt=*Jwt.Jwa.Fpjwt
+fpoauth2=*Jwt.Jwa.Fpoauth2
+libc=*Api.Libc
+kerneldefs=*Api.Kerneldefs
+kernelioctl=*Api.Kernelioctl
+libtar=*Libx.Libtar
+fpxmlrep=*FPPkg.XmlRep
+pkgfpmake=*FPPkg.Fpmake
+pkgwget=*FPPkg.Wget
+fprepos=*FPPkg.Repos
+pkgrepos=*FPPkg.PackageRepos
+xpkguninstalledsrcsrepo=*FPPkg.Uninstalledsrcsrepo
+pkgglobals=*FPPkg.Globals
+pkgmessages=*FPPkg.Messages
+pkgfphttp=*FPPkg.Fphttp
+pkgpackagesstructure=*FPPkg.Packagesstructure
+pkghandler=*FPPkg.Handler
+pkgdownload=*FPPkg.Download
+pkgfppkg=*FPPkg.Package
+pkgoptions=*FPPkg.Options
+pkgcommands=*FPPkg.Commands
+xforms=*Api.Xforms
+fd2pascal=*Api.Fd2pascal
+mad=*Api.Mad
+jni=*Api.Jni
+libnettle=*Api.Libnettle
+Appearance=*MacOsApi.Appearance
+PMDefinitions=*MacOsApi.PMDefinitions
+Authorization=*MacOsApi.Authorization
+HISeparator=*MacOsApi.HISeparator
+CGPSConverter=*MacOsApi.CGPSConverter
+Script=*MacOsApi.Script
+CoreAudioTypes=*MacOsApi.CoreAudioTypes
+ColorSyncDevice=*MacOsApi.ColorSyncDevice
+SCSI=*MacOsApi.SCSI
+OSAGeneric=*MacOsApi.OSAGeneric
+DictionaryServices=*MacOsApi.DictionaryServices
+QuickTimeMusic=*MacOsApi.QuickTimeMusic
+PMCoreDeprecated=*MacOsApi.PMCoreDeprecated
+AEInteraction=*MacOsApi.AEInteraction
+Movies=*MacOsApi.Movies
+CFString=*MacOsApi.CFString
+AudioHardware=*MacOsApi.AudioHardware
+CGImage=*MacOsApi.CGImage
+CFFileDescriptor=*MacOsApi.CFFileDescriptor
+CGWindowLevels=*MacOsApi.CGWindowLevels
+ImageCompression=*MacOsApi.ImageCompression
+AuthorizationPlugin=*MacOsApi.AuthorizationPlugin
+AudioHardwareDeprecated=*MacOsApi.AudioHardwareDeprecated
+HIShape=*MacOsApi.HIShape
+HTMLRendering=*MacOsApi.HTMLRendering
+DriverSynchronization=*MacOsApi.DriverSynchronization
+CFStringTokenizer=*MacOsApi.CFStringTokenizer
+CGDataProvider=*MacOsApi.CGDataProvider
+CGPDFDocument=*MacOsApi.CGPDFDocument
+SCDynamicStoreKey=*MacOsApi.SCDynamicStoreKey
+gluContext=*MacOsApi.GluContext
+MacOSAll=*MacOsApi.MacOSAll
+CGErrors=*MacOsApi.CGErrors
+HITextLengthFilter=*MacOsApi.HITextLengthFilter
+CGLTypes=*MacOsApi.CGLTypes
+CFURL=*MacOsApi.CFURL
+ColorSyncCMM=*MacOsApi.ColorSyncCMM
+CGLCurrent=*MacOsApi.CGLCurrent
+SCPreferencesSetSpecific=*MacOsApi.SCPreferencesSetSpecific
+AEObjects=*MacOsApi.AEObjects
+QuickTimeStreaming=*MacOsApi.QuickTimeStreaming
+CFBitVector=*MacOsApi.CFBitVector
+HIContainerViews=*MacOsApi.HIContainerViews
+TypeSelect=*MacOsApi.TypeSelect
+CGDirectPalette=*MacOsApi.CGDirectPalette
+MDQuery=*MacOsApi.MDQuery
+TextEdit=*MacOsApi.TextEdit
+MacWindows=*MacOsApi.MacWindows
+x509defs=*MacOsApi.X509defs
+QuickTimeVRFormat=*MacOsApi.QuickTimeVRFormat
+CGPattern=*MacOsApi.CGPattern
+QDCMCommon=*MacOsApi.QDCMCommon
+CFUserNotification=*MacOsApi.CFUserNotification
+MacLocales=*MacOsApi.MacLocales
+cssmconfig=*MacOsApi.Cssmconfig
+Dictionary=*MacOsApi.Dictionary
+HostTime=*MacOsApi.HostTime
+PMErrors=*MacOsApi.PMErrors
+vDSP=*MacOsApi.VDSP
+ColorPicker=*MacOsApi.ColorPicker
+HIComboBox=*MacOsApi.HIComboBox
+AXAttributeConstants=*MacOsApi.AXAttributeConstants
+fp=*MacOsApi.Fp
+CMCalibrator=*MacOsApi.CMCalibrator
+QLGenerator=*MacOsApi.QLGenerator
+HIDataBrowser=*MacOsApi.HIDataBrowser
+MDLineage=*MacOsApi.MDLineage
+CFXMLNode=*MacOsApi.CFXMLNode
+CTFont=*MacOsApi.CTFont
+KeychainHI=*MacOsApi.KeychainHI
+ColorSyncProfile=*MacOsApi.ColorSyncProfile
+QLThumbnail=*MacOsApi.QLThumbnail
+acl=*MacOsApi.Acl
+CarbonEventsCore=*MacOsApi.CarbonEventsCore
+gliDispatch=*MacOsApi.GliDispatch
+CVBuffer=*MacOsApi.CVBuffer
+ABActions=*MacOsApi.ABActions
+CodeFragments=*MacOsApi.CodeFragments
+UniversalAccess=*MacOsApi.UniversalAccess
+CFBundle=*MacOsApi.CFBundle
+CGLayer=*MacOsApi.CGLayer
+CTTypesetter=*MacOsApi.CTTypesetter
+ATSUnicodeTypes=*MacOsApi.ATSUnicodeTypes
+CoreText=*MacOsApi.CoreText
+FinderRegistry=*MacOsApi.FinderRegistry
+CFDictionary=*MacOsApi.CFDictionary
+CGDisplayConfiguration=*MacOsApi.CGDisplayConfiguration
+ATSUnicodeFlattening=*MacOsApi.ATSUnicodeFlattening
+AuthorizationDB=*MacOsApi.AuthorizationDB
+HIImageViews=*MacOsApi.HIImageViews
+CFURLAccess=*MacOsApi.CFURLAccess
+HIObject=*MacOsApi.HIObject
+gliContexts=*MacOsApi.GliContexts
+CGPDFContentStream=*MacOsApi.CGPDFContentStream
+CFNetworkErrorss=*MacOsApi.CFNetworkErrorss
+CVPixelBuffer=*MacOsApi.CVPixelBuffer
+CFFTPStream=*MacOsApi.CFFTPStream
+CGDisplayFades=*MacOsApi.CGDisplayFades
+MDExternalDatastore=*MacOsApi.MDExternalDatastore
+SFNTTypes=*MacOsApi.SFNTTypes
+CTRun=*MacOsApi.CTRun
+ControlDefinitions=*MacOsApi.ControlDefinitions
+CFCharacterSet=*MacOsApi.CFCharacterSet
+Translation=*MacOsApi.Translation
+CFByteOrders=*MacOsApi.CFByteOrders
+ATSTypes=*MacOsApi.ATSTypes
+cssmerr=*MacOsApi.Cssmerr
+CVHostTime=*MacOsApi.CVHostTime
+Endian=*MacOsApi.Endian
+CGPDFString=*MacOsApi.CGPDFString
+AudioFormat=*MacOsApi.AudioFormat
+CFMachPort=*MacOsApi.CFMachPort
+AudioHardwareBase=*MacOsApi.AudioHardwareBase
+AudioUnitCarbonViews=*MacOsApi.AudioUnitCarbonViews
+CFBinaryHeap=*MacOsApi.CFBinaryHeap
+Processes=*MacOsApi.Processes
+AudioUnitProperties=*MacOsApi.AudioUnitProperties
+URLAccess=*MacOsApi.URLAccess
+CFPreferences=*MacOsApi.CFPreferences
+MDImporter=*MacOsApi.MDImporter
+Lists=*MacOsApi.Lists
+CVOpenGLTextureCache=*MacOsApi.CVOpenGLTextureCache
+ICACamera=*MacOsApi.ICACamera
+CGPDFScanner=*MacOsApi.CGPDFScanner
+CGPDFContext=*MacOsApi.CGPDFContext
+CFPropertyList=*MacOsApi.CFPropertyList
+AVLTree=*MacOsApi.AVLTree
+Quickdraw=*MacOsApi.Quickdraw
+CGBase=*MacOsApi.CGBase
+CTFontManager=*MacOsApi.CTFontManager
+xattr=*MacOsApi.Xattr
+MultiProcessingInfo=*MacOsApi.MultiProcessingInfo
+AXErrors=*MacOsApi.AXErrors
+QLThumbnailImage=*MacOsApi.QLThumbnailImage
+CVOpenGLBuffer=*MacOsApi.CVOpenGLBuffer
+SKDocument=*MacOsApi.SKDocument
+QTSMovie=*MacOsApi.QTSMovie
+CFError=*MacOsApi.CFError
+CGPDFObject=*MacOsApi.CGPDFObject
+QLBase=*MacOsApi.QLBase
+CGDirectDisplay=*MacOsApi.CGDirectDisplay
+CGPDFPage=*MacOsApi.CGPDFPage
+GPCStrings=*MacOsApi.GPCStrings
+CFNumberFormatter=*MacOsApi.CFNumberFormatter
+CGSession=*MacOsApi.CGSession
+CGAffineTransforms=*MacOsApi.CGAffineTransforms
+CFSet=*MacOsApi.CFSet
+CSIdentity=*MacOsApi.CSIdentity
+HIWindowViews=*MacOsApi.HIWindowViews
+HIMovieView=*MacOsApi.HIMovieView
+PMCore=*MacOsApi.PMCore
+MDSchema=*MacOsApi.MDSchema
+CGImageSource=*MacOsApi.CGImageSource
+LowMem=*MacOsApi.LowMem
+AIFF=*MacOsApi.AIFF
+CGLDevice=*MacOsApi.CGLDevice
+FontSync=*MacOsApi.FontSync
+AEMach=*MacOsApi.AEMach
+Threads=*MacOsApi.Threads
+AXValueConstants=*MacOsApi.AXValueConstants
+ICAApplication=*MacOsApi.ICAApplication
+kern_return=*MacOsApi.Kern_return
+MachineExceptions=*MacOsApi.MachineExceptions
+CVImageBuffer=*MacOsApi.CVImageBuffer
+AuthSession=*MacOsApi.AuthSession
+macglext=*MacOsApi.Macglext
+AppleHelp=*MacOsApi.AppleHelp
+HIToolbar=*MacOsApi.HIToolbar
+DateTimeUtils=*MacOsApi.DateTimeUtils
+QDPictToCGContext=*MacOsApi.QDPictToCGContext
+DASession=*MacOsApi.DASession
+CGPDFStream=*MacOsApi.CGPDFStream
+Displays=*MacOsApi.Displays
+CVOpenGLTexture=*MacOsApi.CVOpenGLTexture
+ColorSyncTransform=*MacOsApi.ColorSyncTransform
+CGColor=*MacOsApi.CGColor
+WSMethodInvocation=*MacOsApi.WSMethodInvocation
+Components=*MacOsApi.Components
+Events=*MacOsApi.Events
+CGContext=*MacOsApi.CGContext
+DriverServices=*MacOsApi.DriverServices
+CFXMLParser=*MacOsApi.CFXMLParser
+OpenTransportProtocol=*MacOsApi.OpenTransportProtocol
+Menus=*MacOsApi.Menus
+CGPDFDictionary=*MacOsApi.CGPDFDictionary
+Navigation=*MacOsApi.Navigation
+SCNetwork=*MacOsApi.SCNetwork
+HIView=*MacOsApi.HIView
+MusicDevice=*MacOsApi.MusicDevice
+IOKitReturn=*MacOsApi.IOKitReturn
+HIArchive=*MacOsApi.HIArchive
+Drag=*MacOsApi.Drag
+ABGlobals=*MacOsApi.ABGlobals
+CFNetDiagnostics=*MacOsApi.CFNetDiagnostics
+AppleEvents=*MacOsApi.AppleEvents
+SKIndex=*MacOsApi.SKIndex
+CFHTTPAuthentication=*MacOsApi.CFHTTPAuthentication
+HIScrollView=*MacOsApi.HIScrollView
+Aliases=*MacOsApi.Aliases
+cssmkrapi=*MacOsApi.Cssmkrapi
+TextEncodingPlugin=*MacOsApi.TextEncodingPlugin
+CarbonEvents=*MacOsApi.CarbonEvents
+CGLProfiler=*MacOsApi.CGLProfiler
+Sound=*MacOsApi.Sound
+LSSharedFileList=*MacOsApi.LSSharedFileList
+MoviesFormat=*MacOsApi.MoviesFormat
+PMDefinitionsDeprecated=*MacOsApi.PMDefinitionsDeprecated
+QuickdrawTypes=*MacOsApi.QuickdrawTypes
+NSL=*MacOsApi.NSL
+CFStream=*MacOsApi.CFStream
+UTType=*MacOsApi.UTType
+CGDataConsumer=*MacOsApi.CGDataConsumer
+OpenTransportProviders=*MacOsApi.OpenTransportProviders
+AXUIElement=*MacOsApi.AXUIElement
+TextCommon=*MacOsApi.TextCommon
+SpeechRecognition=*MacOsApi.SpeechRecognition
+AudioUnitUtilities=*MacOsApi.AudioUnitUtilities
+FileTypesAndCreators=*MacOsApi.FileTypesAndCreators
+Debugging=*MacOsApi.Debugging
+CVPixelBufferIOSurface=*MacOsApi.CVPixelBufferIOSurface
+CFSocket=*MacOsApi.CFSocket
+HILittleArrows=*MacOsApi.HILittleArrows
+IOSurfaceAPI=*MacOsApi.IOSurfaceAPI
+vBLAS=*MacOsApi.VBLAS
+CGEventSource=*MacOsApi.CGEventSource
+CFUUID=*MacOsApi.CFUUID
+CGPath=*MacOsApi.CGPath
+MIDISetup=*MacOsApi.MIDISetup
+InternetConfig=*MacOsApi.InternetConfig
+MacOSXPosix=*MacOsApi.MacOSXPosix
+Keyboards=*MacOsApi.Keyboards
+ATSUnicodeGlyphs=*MacOsApi.ATSUnicodeGlyphs
+PMPrintAETypes=*MacOsApi.PMPrintAETypes
+ImageCodec=*MacOsApi.ImageCodec
+CTFontTraits=*MacOsApi.CTFontTraits
+HITheme=*MacOsApi.HITheme
+BackupCore=*MacOsApi.BackupCore
+HISegmentedView=*MacOsApi.HISegmentedView
+CFPlugInCOM=*MacOsApi.CFPlugInCOM
+CFTree=*MacOsApi.CFTree
+SpeechSynthesis=*MacOsApi.SpeechSynthesis
+NSLCore=*MacOsApi.NSLCore
+SCDynamicStore=*MacOsApi.SCDynamicStore
+OSA=*MacOsApi.OSA
+cssmtype=*MacOsApi.Cssmtype
+AudioConverter=*MacOsApi.AudioConverter
+certextensions=*MacOsApi.Certextensions
+ATSUnicodeObjects=*MacOsApi.ATSUnicodeObjects
+ATSLayoutTypes=*MacOsApi.ATSLayoutTypes
+TranslationServices=*MacOsApi.TranslationServices
+AEDataModel=*MacOsApi.AEDataModel
+UnicodeConverter=*MacOsApi.UnicodeConverter
+mach_error=*MacOsApi.Mach_error
+SCDynamicStoreCopySpecific=*MacOsApi.SCDynamicStoreCopySpecific
+cssmapple=*MacOsApi.Cssmapple
+HIRelevanceBar=*MacOsApi.HIRelevanceBar
+SCNetworkReachability=*MacOsApi.SCNetworkReachability
+PMPrintingDialogExtensions=*MacOsApi.PMPrintingDialogExtensions
+AudioOutputUnit=*MacOsApi.AudioOutputUnit
+Palettes=*MacOsApi.Palettes
+CFArray=*MacOsApi.CFArray
+CSIdentityBase=*MacOsApi.CSIdentityBase
+HIButtonViews=*MacOsApi.HIButtonViews
+CFProxySupport=*MacOsApi.CFProxySupport
+Pasteboard=*MacOsApi.Pasteboard
+HIPopupButton=*MacOsApi.HIPopupButton
+AEHelpers=*MacOsApi.AEHelpers
+AXNotificationConstants=*MacOsApi.AXNotificationConstants
+Math64=*MacOsApi.Math64
+CTFontCollection=*MacOsApi.CTFontCollection
+WSTypes=*MacOsApi.WSTypes
+UTCUtils=*MacOsApi.UTCUtils
+CGPDFArray=*MacOsApi.CGPDFArray
+HIDisclosureViews=*MacOsApi.HIDisclosureViews
+AudioQueue=*MacOsApi.AudioQueue
+PictUtils=*MacOsApi.PictUtils
+IconStorage=*MacOsApi.IconStorage
+QuickTimeVR=*MacOsApi.QuickTimeVR
+UTCoreTypes=*MacOsApi.UTCoreTypes
+DADisk=*MacOsApi.DADisk
+SCSchemaDefinitions=*MacOsApi.SCSchemaDefinitions
+QTStreamingComponents=*MacOsApi.QTStreamingComponents
+CVDisplayLink=*MacOsApi.CVDisplayLink
+CFDate=*MacOsApi.CFDate
+DrawSprocket=*MacOsApi.DrawSprocket
+ASDebugging=*MacOsApi.ASDebugging
+IconsCore=*MacOsApi.IconsCore
+CFCalendar=*MacOsApi.CFCalendar
+HITextViews=*MacOsApi.HITextViews
+TextUtils=*MacOsApi.TextUtils
+SecBase=*MacOsApi.SecBase
+CGGLContext=*MacOsApi.CGGLContext
+LSOpen=*MacOsApi.LSOpen
+CGEventTypes=*MacOsApi.CGEventTypes
+HIProgressViews=*MacOsApi.HIProgressViews
+MDItem=*MacOsApi.MDItem
+CSIdentityAuthority=*MacOsApi.CSIdentityAuthority
+Controls=*MacOsApi.Controls
+CFRunLoop=*MacOsApi.CFRunLoop
+QuickdrawText=*MacOsApi.QuickdrawText
+CFSocketStream=*MacOsApi.CFSocketStream
+CGEvent=*MacOsApi.CGEvent
+IBCarbonRuntime=*MacOsApi.IBCarbonRuntime
+SCDynamicStoreCopyDHCPInfos=*MacOsApi.SCDynamicStoreCopyDHCPInfos
+CGShading=*MacOsApi.CGShading
+GestaltEqu=*MacOsApi.GestaltEqu
+CFURLEnumerator=*MacOsApi.CFURLEnumerator
+MacTypes=*MacOsApi.MacTypes
+Notification=*MacOsApi.Notification
+Scrap=*MacOsApi.Scrap
+MacApplication=*MacOsApi.MacApplication
+MIDIDriver=*MacOsApi.MIDIDriver
+ObjCRuntime=*MacOsApi.ObjCRuntime
+SKSearch=*MacOsApi.SKSearch
+HFSVolumes=*MacOsApi.HFSVolumes
+FSEvents=*MacOsApi.FSEvents
+MacTextEditor=*MacOsApi.MacTextEditor
+CGWindow=*MacOsApi.CGWindow
+AEPackObject=*MacOsApi.AEPackObject
+AXActionConstants=*MacOsApi.AXActionConstants
+cblas=*MacOsApi.Cblas
+KeyEvents=*MacOsApi.KeyEvents
+HIToolboxDebugging=*MacOsApi.HIToolboxDebugging
+MediaHandlers=*MacOsApi.MediaHandlers
+SKAnalysis=*MacOsApi.SKAnalysis
+AXConstants=*MacOsApi.AXConstants
+CGGradient=*MacOsApi.CGGradient
+CGFont=*MacOsApi.CGFont
+MacHelp=*MacOsApi.MacHelp
+ToolUtils=*MacOsApi.ToolUtils
+KeychainCore=*MacOsApi.KeychainCore
+ASRegistry=*MacOsApi.ASRegistry
+AudioComponents=*MacOsApi.AudioComponents
+PLStringFuncs=*MacOsApi.PLStringFuncs
+CTFontManagerErrors=*MacOsApi.CTFontManagerErrors
+macglu=*MacOsApi.Macglu
+CFTimeZone=*MacOsApi.CFTimeZone
+HIClockView=*MacOsApi.HIClockView
+fenv=*MacOsApi.Fenv
+AudioServices=*MacOsApi.AudioServices
+AuthorizationTags=*MacOsApi.AuthorizationTags
+CGLRenderers=*MacOsApi.CGLRenderers
+PMPrintSettingsKeys=*MacOsApi.PMPrintSettingsKeys
+WSProtocolHandler=*MacOsApi.WSProtocolHandler
+Finder=*MacOsApi.Finder
+LSQuarantine=*MacOsApi.LSQuarantine
+CFData=*MacOsApi.CFData
+FixMath=*MacOsApi.FixMath
+CGImageDestination=*MacOsApi.CGImageDestination
+macgl=*MacOsApi.Macgl
+CFHost=*MacOsApi.CFHost
+HIMenuView=*MacOsApi.HIMenuView
+CFBag=*MacOsApi.CFBag
+QuickTimeComponents=*MacOsApi.QuickTimeComponents
+ICADevice=*MacOsApi.ICADevice
+MacOS=*MacOsApi.MacOS
+CFHTTPMessage=*MacOsApi.CFHTTPMessage
+CFNetServices=*MacOsApi.CFNetServices
+ABPeoplePicker=*MacOsApi.ABPeoplePicker
+AudioUnitParameters=*MacOsApi.AudioUnitParameters
+CGImageMetadata=*MacOsApi.CGImageMetadata
+LanguageAnalysis=*MacOsApi.LanguageAnalysis
+CaptiveNetwork=*MacOsApi.CaptiveNetwork
+CGBitmapContext=*MacOsApi.CGBitmapContext
+CFHTTPStream=*MacOsApi.CFHTTPStream
+NumberFormatting=*MacOsApi.NumberFormatting
+HITabbedView=*MacOsApi.HITabbedView
+CGLProfilerFunctionEnums=*MacOsApi.CGLProfilerFunctionEnums
+CGColorSpace=*MacOsApi.CGColorSpace
+AudioFile=*MacOsApi.AudioFile
+CTLine=*MacOsApi.CTLine
+AEUserTermTypes=*MacOsApi.AEUserTermTypes
+SCPreferences=*MacOsApi.SCPreferences
+AudioHardwareService=*MacOsApi.AudioHardwareService
+DigitalHubRegistry=*MacOsApi.DigitalHubRegistry
+OSAComp=*MacOsApi.OSAComp
+CVPixelBufferPool=*MacOsApi.CVPixelBufferPool
+Files=*MacOsApi.Files
+ATSFont=*MacOsApi.ATSFont
+CGRemoteOperation=*MacOsApi.CGRemoteOperation
+ATSUnicodeDrawing=*MacOsApi.ATSUnicodeDrawing
+TextInputSources=*MacOsApi.TextInputSources
+QTML=*MacOsApi.QTML
+ABTypedefs=*MacOsApi.ABTypedefs
+CGGeometry=*MacOsApi.CGGeometry
+LSInfo=*MacOsApi.LSInfo
+CFPlugIn=*MacOsApi.CFPlugIn
+QuickTimeErrors=*MacOsApi.QuickTimeErrors
+CTTextTab=*MacOsApi.CTTextTab
+CFFileSecurity=*MacOsApi.CFFileSecurity
+AXTextAttributedString=*MacOsApi.AXTextAttributedString
+ConditionalMacros=*MacOsApi.ConditionalMacros
+HIToolbox=*MacOsApi.HIToolbox
+SCPreferencesPath=*MacOsApi.SCPreferencesPath
+TextServices=*MacOsApi.TextServices
+CSIdentityQuery=*MacOsApi.CSIdentityQuery
+HISearchField=*MacOsApi.HISearchField
+CTFrame=*MacOsApi.CTFrame
+AppleDiskPartitions=*MacOsApi.AppleDiskPartitions
+CFBase=*MacOsApi.CFBase
+Multiprocessing=*MacOsApi.Multiprocessing
+SFNTLayoutTypes=*MacOsApi.SFNTLayoutTypes
+Accessibility=*MacOsApi.Accessibility
+HISlider=*MacOsApi.HISlider
+CGFunction=*MacOsApi.CGFunction
+Collections=*MacOsApi.Collections
+ATSUnicodeDirectAccess=*MacOsApi.ATSUnicodeDirectAccess
+PMApplication=*MacOsApi.PMApplication
+TSMTE=*MacOsApi.TSMTE
+CTParagraphStyle=*MacOsApi.CTParagraphStyle
+Icons=*MacOsApi.Icons
+CFStringEncodingExt=*MacOsApi.CFStringEncodingExt
+CVPixelFormatDescription=*MacOsApi.CVPixelFormatDescription
+SecTrust=*MacOsApi.SecTrust
+SKSummary=*MacOsApi.SKSummary
+ColorSyncDeprecated=*MacOsApi.ColorSyncDeprecated
+AudioFileComponents=*MacOsApi.AudioFileComponents
+OpenTransport=*MacOsApi.OpenTransport
+ScalerStreamTypes=*MacOsApi.ScalerStreamTypes
+CTGlyphInfo=*MacOsApi.CTGlyphInfo
+PEFBinaryFormat=*MacOsApi.PEFBinaryFormat
+CTFontDescriptor=*MacOsApi.CTFontDescriptor
+IntlResources=*MacOsApi.IntlResources
+AudioFileStream=*MacOsApi.AudioFileStream
+CFMessagePort=*MacOsApi.CFMessagePort
+TextEncodingConverter=*MacOsApi.TextEncodingConverter
+SystemSound=*MacOsApi.SystemSound
+CFNotificationCenter=*MacOsApi.CFNotificationCenter
+CTStringAttributes=*MacOsApi.CTStringAttributes
+DHCPClientPreferences=*MacOsApi.DHCPClientPreferences
+HIGeometry=*MacOsApi.HIGeometry
+FontPanel=*MacOsApi.FontPanel
+HITextUtils=*MacOsApi.HITextUtils
+AudioCodecs=*MacOsApi.AudioCodecs
+MacOpenGL=*MacOsApi.MacOpenGL
+CVBase=*MacOsApi.CVBase
+MixedMode=*MacOsApi.MixedMode
+CVOpenGLBufferPool=*MacOsApi.CVOpenGLBufferPool
+AERegistry=*MacOsApi.AERegistry
+PMApplicationDeprecated=*MacOsApi.PMApplicationDeprecated
+CVReturns=*MacOsApi.CVReturns
+TranslationExtensions=*MacOsApi.TranslationExtensions
+SCNetworkConfiguration=*MacOsApi.SCNetworkConfiguration
+CFAttributedString=*MacOsApi.CFAttributedString
+SystemConfiguration=*MacOsApi.SystemConfiguration
+ATSUnicodeFonts=*MacOsApi.ATSUnicodeFonts
+Folders=*MacOsApi.Folders
+OSUtils=*MacOsApi.OSUtils
+CTFramesetter=*MacOsApi.CTFramesetter
+Resources=*MacOsApi.Resources
+CFDateFormatter=*MacOsApi.CFDateFormatter
+Dialogs=*MacOsApi.Dialogs
+SCNetworkConnection=*MacOsApi.SCNetworkConnection
+QDOffscreen=*MacOsApi.QDOffscreen
+MacMemory=*MacOsApi.MacMemory
+Fonts=*MacOsApi.Fonts
+StringCompare=*MacOsApi.StringCompare
+AppleScript=*MacOsApi.AppleScript
+HIAccessibility=*MacOsApi.HIAccessibility
+CFNumber=*MacOsApi.CFNumber
+CGPDFOperatorTable=*MacOsApi.CGPDFOperatorTable
+MIDIServices=*MacOsApi.MIDIServices
+MIDIThruConnection=*MacOsApi.MIDIThruConnection
+ABAddressBook=*MacOsApi.ABAddressBook
+AXRoleConstants=*MacOsApi.AXRoleConstants
+MacErrors=*MacOsApi.MacErrors
+AUComponent=*MacOsApi.AUComponent
+CGImageProperties=*MacOsApi.CGImageProperties
+CFLocale=*MacOsApi.CFLocale
+AXValue=*MacOsApi.AXValue
+UnicodeUtilities=*MacOsApi.UnicodeUtilities
+wasmtime=*Api.Wasmtime
+pcap=*Api.Pcap
+gitlabclient=*Api.Gitlab.Client
+regexpr=*Regexpr
+oldregexpr=*System.Oldregexpr
+regex=*System.Regex
+libgnome=*Api.Gnome1.Gnome
+libart=*Api.Gnome1.Art
+libzvt=*Api.Gnome1.Zvr
+libgnomeui=*Api.Gnome1.Ui
+gconf=*Api.Gnome1.Conf
+gconfclient=*Api.Gnome1.ConfClient
+sha1=*System.Hash.Sha1
+unixcrypt=*System.Hash.Unixcrypt
+uuid=*System.Hash.Uuid
+ntlm=*System.Hash.Ntlm
+hmac=*System.Hash.Hmac
+md5=*System.Hash.Md5
+postgres=*Api.Postgres
+postgres3dyn=*Api.Postgres3dyn
+dllist=*Api.Dllist
+dllistdyn=*Api.Dllistdyn
+postgres3=*Api.Postgres3
+fpmustache=*Mustache.Base
+fpexmustache=*Mustache.Extended
+fpdbmustache=*Mustache.Data
+system.ioutils=*System.ioutils
+system.netencoding=*System.netencoding
+gtkglarea=*Api.Gtk1.Gtkglarea
+gtk=*Api.Gtk1.Gtk
+gmodule=*Api.Gtk1.Gmodule
+glib=*Api.Gtk1.Glib
+gdkpixbuf=*Api.Gtk1.Gdkpixbuf
+gdk=*Api.Gtk1.Gdk
+tinygl=*MorphApi.Tinygl
+cgxvideo=*MorphApi.Cgxvideo
+akeyboard=*Amiga.Core.Akeyboard
+get9=*MorphApi.Get9
+input=*Amiga.Core.Input
+ahi=*Amiga.Other.Ahi
+amigalib=*Amiga.Core.Amigalib
+opensslsockets=*System.Net.Opensslsockets
+openssl=*Api.Openssl
+fpopenssl=*System.Net.Fpopenssl
+jwawinwlx=*WinApi.Jedi.Winwlx
+jwawshisotp=*WinApi.Jedi.Wshisotp
+jwaimapi=*WinApi.Jedi.Imapi
+jwawppstmsg=*WinApi.Jedi.Wppstmsg
+jwabitscfg=*WinApi.Jedi.Bitscfg
+jwaaf_irda=*WinApi.Jedi.Af_irda
+jwawinsock=*WinApi.Jedi.Winsock
+jwamstask=*WinApi.Jedi.Mstask
+jwaws2bth=*WinApi.Jedi.Ws2bth
+jwaiiscnfg=*WinApi.Jedi.Iiscnfg
+jwaatalkwsh=*WinApi.Jedi.Atalkwsh
+jwacryptuiapi=*WinApi.Jedi.Cryptuiapi
+jwalmcons=*WinApi.Jedi.Lmcons
+jwawinnls=*WinApi.Jedi.Winnls
+jwacpl=*WinApi.Jedi.Cpl
+jwawpapimsg=*WinApi.Jedi.Wpapimsg
+jwaauthz=*WinApi.Jedi.Authz
+jwapsapi=*WinApi.Jedi.Psapi
+jwawinable=*WinApi.Jedi.Winable
+jwaiadmext=*WinApi.Jedi.Iadmext
+jwawpwizmsg=*WinApi.Jedi.Wpwizmsg
+jwawincrypt=*WinApi.Jedi.Wincrypt
+jwadsadmin=*WinApi.Jedi.Dsadmin
+jwasporder=*WinApi.Jedi.Sporder
+jwaipifcons=*WinApi.Jedi.Ipifcons
+jwawpspihlp=*WinApi.Jedi.Wpspihlp
+jwawindllnames=*WinApi.Jedi.Windllnames
+jwarpcnterr=*WinApi.Jedi.Rpcnterr
+jwaiprtrmib=*WinApi.Jedi.Iprtrmib
+jwaaclapi=*WinApi.Jedi.Aclapi
+jwaadsdb=*WinApi.Jedi.Adsdb
+jwawinuser=*WinApi.Jedi.Winuser
+jwawincred=*WinApi.Jedi.Wincred
+jwaicmpapi=*WinApi.Jedi.Icmpapi
+jwapdh=*WinApi.Jedi.Pdh
+jwahtmlhelp=*WinApi.Jedi.Htmlhelp
+jwalmaudit=*WinApi.Jedi.Lmaudit
+jwaerrorrep=*WinApi.Jedi.Errorrep
+jwaadssts=*WinApi.Jedi.Adssts
+jwawindns=*WinApi.Jedi.Windns
+jwawingdi=*WinApi.Jedi.Wingdi
+jwareason=*WinApi.Jedi.Reason
+jwaioevent=*WinApi.Jedi.Ioevent
+jwapbt=*WinApi.Jedi.Pbt
+jwawpcrsmsg=*WinApi.Jedi.Wpcrsmsg
+jwawintype=*WinApi.Jedi.Wintype
+jwawinternl=*WinApi.Jedi.Winternl
+jwawptypes=*WinApi.Jedi.Wptypes
+jwaws2dnet=*WinApi.Jedi.Ws2dnet
+jwalmerrlog=*WinApi.Jedi.Lmerrlog
+jwawinbase=*WinApi.Jedi.Winbase
+jwasubauth=*WinApi.Jedi.Subauth
+jwascesvc=*WinApi.Jedi.Scesvc
+jwalmalert=*WinApi.Jedi.Lmalert
+jwaipinfoid=*WinApi.Jedi.Ipinfoid
+jwauxtheme=*WinApi.Jedi.Uxtheme
+jwaactivex=*WinApi.Jedi.Activex
+jwawinsafer=*WinApi.Jedi.Winsafer
+jwapatchwiz=*WinApi.Jedi.Patchwiz
+jwalmat=*WinApi.Jedi.Lmat
+jwaaclui=*WinApi.Jedi.Aclui
+jwawtsapi32=*WinApi.Jedi.Wtsapi32
+jwaisguids=*WinApi.Jedi.Isguids
+jwaprsht=*WinApi.Jedi.Prsht
+jwawinsock2=*WinApi.Jedi.Winsock2
+jwawinldap=*WinApi.Jedi.Winldap
+jwawinver=*WinApi.Jedi.Winver
+jwaimapierror=*WinApi.Jedi.Imapierror
+jwaadserr=*WinApi.Jedi.Adserr
+jwabatclass=*WinApi.Jedi.Batclass
+jwapdhmsg=*WinApi.Jedi.Pdhmsg
+jwacderr=*WinApi.Jedi.Cderr
+jwabthsdpdef=*WinApi.Jedi.Bthsdpdef
+jwafaxext=*WinApi.Jedi.Faxext
+ModuleLoader=*WinApi.Jedi.ModuleLoader
+jwawpapi=*WinApi.Jedi.Wpapi
+jwabthdef=*WinApi.Jedi.Bthdef
+jwasvcguid=*WinApi.Jedi.Svcguid
+jwawsrm=*WinApi.Jedi.Wsrm
+jwaobjsel=*WinApi.Jedi.Objsel
+jwaprofinfo=*WinApi.Jedi.Profinfo
+jwawincpl=*WinApi.Jedi.Wincpl
+jwawinnetwk=*WinApi.Jedi.Winnetwk
+jwaadsprop=*WinApi.Jedi.Adsprop
+jwarpc=*WinApi.Jedi.Rpc
+jwaregstr=*WinApi.Jedi.Regstr
+jwawsipx=*WinApi.Jedi.Wsipx
+jwafaxroute=*WinApi.Jedi.Faxroute
+jwasddl=*WinApi.Jedi.Sddl
+jwawinreg=*WinApi.Jedi.Winreg
+jwauserenv=*WinApi.Jedi.Userenv
+jwawinperf=*WinApi.Jedi.Winperf
+jwaiptypes=*WinApi.Jedi.Iptypes
+buildjwa=*WinApi.Jedi.Buildjwa
+jwawinber=*WinApi.Jedi.Winber
+jwaactiveds=*WinApi.Jedi.Activeds
+jwasnmp=*WinApi.Jedi.Snmp
+jwaqossp=*WinApi.Jedi.Qossp
+jwasecext=*WinApi.Jedi.Secext
+jwawinfax=*WinApi.Jedi.Winfax
+jwadde=*WinApi.Jedi.Dde
+jwavista=*WinApi.Jedi.Vista
+jwalmuse=*WinApi.Jedi.Lmuse
+jwawownt16=*WinApi.Jedi.Wownt16
+jwawsnwlink=*WinApi.Jedi.Wsnwlink
+jwafaxmmc=*WinApi.Jedi.Faxmmc
+jwaiphlpapi=*WinApi.Jedi.Iphlpapi
+jwantstatus=*WinApi.Jedi.Ntstatus
+jwafaxdev=*WinApi.Jedi.Faxdev
+jwamsiquery=*WinApi.Jedi.Msiquery
+jwawpftpmsg=*WinApi.Jedi.Wpftpmsg
+jwawindows=*WinApi.Jedi.Windows
+jwanb30=*WinApi.Jedi.Nb30
+jwaqospol=*WinApi.Jedi.Qospol
+jwamprerror=*WinApi.Jedi.Mprerror
+jwawsnetbs=*WinApi.Jedi.Wsnetbs
+jwaime=*WinApi.Jedi.Ime
+jwapatchapi=*WinApi.Jedi.Patchapi
+jwazmouse=*WinApi.Jedi.Zmouse
+jwahherror=*WinApi.Jedi.Hherror
+jwawinioctl=*WinApi.Jedi.Winioctl
+jwaadsnms=*WinApi.Jedi.Adsnms
+jwantldap=*WinApi.Jedi.Ntldap
+jwatraffic=*WinApi.Jedi.Traffic
+jwamstcpip=*WinApi.Jedi.Mstcpip
+jwaqos=*WinApi.Jedi.Qos
+jwaws2spi=*WinApi.Jedi.Ws2spi
+jwasspi=*WinApi.Jedi.Sspi
+jwawinsvc=*WinApi.Jedi.Winsvc
+jwacplext=*WinApi.Jedi.Cplext
+jwahtmlguid=*WinApi.Jedi.Htmlguid
+jwawinresrc=*WinApi.Jedi.Winresrc
+jwalmdfs=*WinApi.Jedi.Lmdfs
+jwaauthif=*WinApi.Jedi.Authif
+jwawinerror=*WinApi.Jedi.Winerror
+jwadbt=*WinApi.Jedi.Dbt
+jwabits=*WinApi.Jedi.Bits
+jwanative=*WinApi.Jedi.Native
+jwabugcodes=*WinApi.Jedi.Bugcodes
+jwamsi=*WinApi.Jedi.Msi
+jwaschedule=*WinApi.Jedi.Schedule
+jwalmshare=*WinApi.Jedi.Lmshare
+jwabluetoothapis=*WinApi.Jedi.Bluetoothapis
+jwadsrole=*WinApi.Jedi.Dsrole
+jwantsecapi=*WinApi.Jedi.Ntsecapi
+jwabits1_5=*WinApi.Jedi.Bits1_5
+jwacmnquery=*WinApi.Jedi.Cmnquery
+jwanspapi=*WinApi.Jedi.Nspapi
+jwadsgetdc=*WinApi.Jedi.Dsgetdc
+jwalmjoin=*WinApi.Jedi.Lmjoin
+jwarpcdce=*WinApi.Jedi.Rpcdce
+jwadhcpcsdk=*WinApi.Jedi.Dhcpcsdk
+jwantdsbmsg=*WinApi.Jedi.Ntdsbmsg
+jwagpedit=*WinApi.Jedi.Gpedit
+jwarpcasync=*WinApi.Jedi.Rpcasync
+jwaipexport=*WinApi.Jedi.Ipexport
+jwaiaccess=*WinApi.Jedi.Iaccess
+jwantdsbcli=*WinApi.Jedi.Ntdsbcli
+jwalm=*WinApi.Jedi.Lm
+jwantquery=*WinApi.Jedi.Ntquery
+jwadhcpsapi=*WinApi.Jedi.Dhcpsapi
+jwalmsname=*WinApi.Jedi.Lmsname
+jwacolordlg=*WinApi.Jedi.Colordlg
+jwapowrprof=*WinApi.Jedi.Powrprof
+jwalmremutl=*WinApi.Jedi.Lmremutl
+jwasrrestoreptapi=*WinApi.Jedi.Srrestoreptapi
+jwalmwksta=*WinApi.Jedi.Lmwksta
+jwaws2tcpip=*WinApi.Jedi.Ws2tcpip
+jwaqosname=*WinApi.Jedi.Qosname
+jwantdsapi=*WinApi.Jedi.Ntdsapi
+jwarpcssl=*WinApi.Jedi.Rpcssl
+jwalmapibuf=*WinApi.Jedi.Lmapibuf
+jwalmaccess=*WinApi.Jedi.Lmaccess
+jwawinefs=*WinApi.Jedi.Winefs
+jwaschemadef=*WinApi.Jedi.Schemadef
+jwalmserver=*WinApi.Jedi.Lmserver
+jwawownt32=*WinApi.Jedi.Wownt32
+jwasisbkup=*WinApi.Jedi.Sisbkup
+jwadsquery=*WinApi.Jedi.Dsquery
+jwalmmsg=*WinApi.Jedi.Lmmsg
+jwaimagehlp=*WinApi.Jedi.Imagehlp
+jwarpcnsi=*WinApi.Jedi.Rpcnsi
+jwawinnt=*WinApi.Jedi.Winnt
+jwalmuseflg=*WinApi.Jedi.Lmuseflg
+jwawincon=*WinApi.Jedi.Wincon
+jwatlhelp32=*WinApi.Jedi.Tlhelp32
+jwasensapi=*WinApi.Jedi.Sensapi
+jwalmerr=*WinApi.Jedi.Lmerr
+jwasens=*WinApi.Jedi.Sens
+jwantddpar=*WinApi.Jedi.Ntddpar
+jwabitsmsg=*WinApi.Jedi.Bitsmsg
+jwalmstats=*WinApi.Jedi.Lmstats
+jwadlgs=*WinApi.Jedi.Dlgs
+jwaadtgen=*WinApi.Jedi.Adtgen
+jwadssec=*WinApi.Jedi.Dssec
+jwaaccctrl=*WinApi.Jedi.Accctrl
+jwadskquota=*WinApi.Jedi.Dskquota
+jwamsidefs=*WinApi.Jedi.Msidefs
+jwaadstlb=*WinApi.Jedi.Adstlb
+jwacarderr=*WinApi.Jedi.Carderr
+jwawbemcli=*WinApi.Jedi.Wbemcli
+jwashlguid=*WinApi.Jedi.Shlguid
+jwamswsock=*WinApi.Jedi.Mswsock
+jwawsvns=*WinApi.Jedi.Wsvns
+jwalpmapi=*WinApi.Jedi.Lpmapi
+jwalmsvc=*WinApi.Jedi.Lmsvc
+jwasensevts=*WinApi.Jedi.Sensevts
+jwawmistr=*WinApi.Jedi.Wmistr
+jwaissper16=*WinApi.Jedi.Issper16
+jwanetsh=*WinApi.Jedi.Netsh
+jwasecurity=*WinApi.Jedi.Security
+jwadhcpssdk=*WinApi.Jedi.Dhcpssdk
+jwaexcpt=*WinApi.Jedi.Excpt
+jwamciavi=*WinApi.Jedi.Mciavi
+jwaprotocol=*WinApi.Jedi.Protocol
+jwaws2atm=*WinApi.Jedi.Ws2atm
+jwawinsta=*WinApi.Jedi.Winsta
+jwasfc=*WinApi.Jedi.Sfc
+jwadsclient=*WinApi.Jedi.Dsclient
+jwalmrepl=*WinApi.Jedi.Lmrepl
+jwaadshlp=*WinApi.Jedi.Adshlp
+jwablberr=*WinApi.Jedi.Blberr
+jwalmconfig=*WinApi.Jedi.Lmconfig
+jwatmschema=*WinApi.Jedi.Tmschema
+jwaloadperf=*WinApi.Jedi.Loadperf
+matroska=*Api.Matroska
+vorbis=*Api.Vorbis
+ogg=*Api.Ogg
+fmtbcd=*Data.FMTBcd
+stdconvs=*System.StdConvs
+variants=*System.Variants
+strutils=*System.StrUtils
+convutils=*System.ConvUtils
+dateutils=*System.DateUtils
+nullable=*System.Nullable
+rtti=*System.Rtti
+widestrutils=*System.WideStrUtils
+syshelpers=*System.Syshelpers
+system.uitypes=*System.System.uitypes
+varutils=*System.VarUtils
+fpasync=*System.Async.Fpasync
+libasync=*Libasync
+garrayutils=*System.Stl.Arrayutils
+gdeque=*System.Stl.Deque
+gstack=*System.Stl.Stack
+ghashmap=*System.Stl.Hashmap
+gset=*System.Stl.Sets
+gtree=*System.Stl.Tree
+ghashset=*System.Stl.Hashset
+gmap=*System.Stl.Map
+gpriorityqueue=*System.Stl.Priorityqueue
+gqueue=*System.Stl.Queue
+gutil=*System.Stl.Util
+gvector=*System.Stl.Vector
+glinkedlist=*System.Stl.Linkedlist
+libsee=*Api.Libsee
+httpd24=*Api.Httpd24
+apr24=*Api.Httpd24.Apr
+utmp=*UnixApi.Utmp
+picasso96api=*Amiga.Other.Picasso96api
+libmicrohttpd=*Api.Microhttpd
+yacclib=*Pascal.Yacclib
+lexlib=*Pascal.Lexlib
+gd=*Api.Gd
+fileinfo=*Fcl.Fileinfo
+ServiceManager=*System.Win.ServiceManager
+daemonapp=*System.DaemonAfe pp
+freadlin=*Api.Freadlin
+gdbint=*Api.Gdbint
+gdbcon=*Api.Gdbcon
+xmltestreport=*FpcUnit.Reports.XMLTest
+money=*FpcUnit.Money
+fpcunittests=*FpcUnit.Tests.Unittests
+moneytest=*FpcUnit.Tests.Money
+testmockobject=*FpcUnit.Tests.Money
+testdecorator=*FpcUnit.Decorator
+latextestreport=*FpcUnit.Reports.LaTeX
+fpcunit=*FpcUnit.Test
+testutils=*FpcUnit.Utils
+fpcunitreport=*FpcUnit.Report
+junittestreport=*FpcUnit.Reports.JUnit
+consoletestrunner=*FpcUnit.Runners.Console
+testregistry=*FpcUnit.Registry
+testreport=*FpcUnit.Report
+simpletestrunner=*FpcUnit.Runners.Simple
+plaintestreport=*FpcUnit.Reports.Plain
+xmlreporter=*FpcUnit.Reports.XML
+ubmockobject=*FpcUnit.Ubmockobject
+digesttestreport=*FpcUnit.Reports.Digest
+libvlc=*Api.Vlc
+vlc=*Api.Vlc.Component
+jcprepct=*SystemJpeg.Jcprepct
+jcparam=*SystemJpeg.Jcparam
+jchuff=*SystemJpeg.Jchuff
+jdphuff=*SystemJpeg.Jdphuff
+jerror=*SystemJpeg.Jerror
+jdcoefct=*SystemJpeg.Jdcoefct
+jdinput=*SystemJpeg.Jdinput
+jcmainct=*SystemJpeg.Jcmainct
+jidctred=*SystemJpeg.Jidctred
+jidctint=*SystemJpeg.Jidctint
+jcmaster=*SystemJpeg.Jcmaster
+pasjpeg=*SystemJpeg.Pasjpeg
+jmemdosa=*SystemJpeg.Jmemdosa
+jddctmgr=*SystemJpeg.Jddctmgr
+jdatasrc=*SystemJpeg.Jdatasrc
+jdcolor=*SystemJpeg.Jdcolor
+jcmarker=*SystemJpeg.Jcmarker
+jdapimin=*SystemJpeg.Jdapimin
+jmemmgr=*SystemJpeg.Jmemmgr
+jfdctflt=*SystemJpeg.Jfdctflt
+jcapimin=*SystemJpeg.Jcapimin
+jconsts=*SystemJpeg.Jconsts
+jdmarker=*SystemJpeg.Jdmarker
+jdmainct=*SystemJpeg.Jdmainct
+jidctasm=*SystemJpeg.Jidctasm
+jmemnobs=*SystemJpeg.Jmemnobs
+jcomapi=*SystemJpeg.Jcomapi
+jdhuff=*SystemJpeg.Jdhuff
+jpeglib=*SystemJpeg.Jpeglib
+jfdctfst=*SystemJpeg.Jfdctfst
+jdmerge=*SystemJpeg.Jdmerge
+jinclude=*SystemJpeg.Jinclude
+jmorecfg=*SystemJpeg.Jmorecfg
+jfdctint=*SystemJpeg.Jfdctint
+jidctflt=*SystemJpeg.Jidctflt
+jccoefct=*SystemJpeg.Jccoefct
+jdeferr=*SystemJpeg.Jdeferr
+jcdctmgr=*SystemJpeg.Jcdctmgr
+jcsample=*SystemJpeg.Jcsample
+jctrans=*SystemJpeg.Jctrans
+jcapistd=*SystemJpeg.Jcapistd
+jdtrans=*SystemJpeg.Jdtrans
+jccolor=*SystemJpeg.Jccolor
+jquant1=*SystemJpeg.Jquant1
+jmemsys=*SystemJpeg.Jmemsys
+jdatadst=*SystemJpeg.Jdatadst
+jcphuff=*SystemJpeg.Jcphuff
+jmemdos=*SystemJpeg.Jmemdos
+jutils=*SystemJpeg.Jutils
+jidct2d=*SystemJpeg.Jidct2d
+buildpasjpeg=*SystemJpeg.Buildpasjpeg
+jdsample=*SystemJpeg.Jdsample
+jdapistd=*SystemJpeg.Jdapistd
+jdmaster=*SystemJpeg.Jdmaster
+jquant2=*SystemJpeg.Jquant2
+jidctfst=*SystemJpeg.Jidctfst
+jdct=*SystemJpeg.Jdct
+jdpostct=*SystemJpeg.Jdpostct
+jcinit=*SystemJpeg.Jcinit
+openal=*Api.Openal
+ibase40=*Api.Ibase40
+ibase60=*Api.Ibase60
+ibase60dyn=*Api.Ibase60dyn
+basenenc=*Fcl.BaseNEnc
+wtex=*Fcl.Wtex
+iostream=*Fcl.Streams.IO
+contnrs=*System.Contnrs
+streamio=*System.Streamio
+bufstream=*Fcl.Streams.Buffer
+advancedipc=*Fcl.AdvancedIpc
+fpobserver=*Fcl.Fpobserver
+singleinstance=*Fcl.SingleInstance
+pascodegen=*Pascal.CodeGenerator
+eventlog=*Fcl.EventLog
+inicol=*Fcl.IniCollection
+streamex=*System.Stream.Extra
+base64=*System.Hash.Base64
+maskutils=*System.Maskutils
+wformat=*Fcl.Wformat
+advancedsingleinstance=*Fcl.AdvancedSingleInstance
+lzwstream=*Fcl.Streams.LZW
+pooledmm=*System.Pooledmm
+csvreadwrite=*Fcl.Csv.ReadWrite
+idea=*System.Hash.Idea
+whtml=*Fcl.Whtml
+csvdocument=*Fcl.Csv.Document
+gettext=*System.GetText
+chainstream=*Fcl.Streams.Chained
+rttiutils=*Fcl.RttiUtils
+rtfpars=*Fcl.Rtf.Parser
+fptemplate=*Fcl.Template
+fpthreadpool=*Fcl.ThreadPool
+fpexprpars=*Fcl.Expressions
+uriparser=*Fcl.UriParser
+ascii85=*System.Hash.Ascii85
+streamcoll=*Fcl.Streams.Collection
+inifiles=*System.IniFiles
+custapp=*Fcl.CustApp
+blowfish=*System.Hash.Blowfish
+nullstream=*Fcl.Streams.Null
+syncobjs=*System.SyncObjs
+avl_tree=*Fcl.AVLTree
+cachecls=*Fcl.CacheCls
+fptimer=*Fcl.Timer
+lauxlib=*Api.Lua.Aux
+lualib=*Api.Lua.Std
+rsvg=*Api.Rsvg
+htmlelements=*Xml.HtmlElements
+xmliconv_windows=*Xml.Win.Iconv
+xmlreader=*Xml.Reader
+sax_xml=*Xml.SimpleSax
+xmlutils=*Xml.Utils
+xhtml=*Xml.XHTML
+xmlstreaming=*Xml.Streaming
+xmltextreader=*Xml.TextReader
+xmliconv=*Xml.IConv
+xmlconf=*Xml.Conf
+htmwrite=*XmL.HtmWrite
+sax=*Xml.SAX
+htmldefs=*HTML.Defs
+dtdmodel=*Xml.Dtdmodel
+sax_html=*HTML.Sax
+dom_html=*HTML.Dom
+htmlwriter=*HTML.Writer
+dom=*Xml.Dom
+xpath=*Xml.XPath
+xmlread=*Xml.Read
+xmlcfg=*Xml.Config
+xmlwrite=*Xml.Writer
+vgamouse=*Api.Vgamouse
+svgalib=*Api.Svgalib
+nvapi=*Api.Nvapi
+printer=*System.Printer
+sockets=*System.Net.Sockets
+winsock=*WinApi.Winsock
+ucomplex=*System.Ucomplex
+objects=*System.Objects
+sortalgs=*System.Sortalgs
+matrix=*System.Matrix
+real48utils=*System.Real48utils
+winsock2=*WinApi.Winsock2
+gpm=*UnixApi.Gpm
+clocale=*UnixApi.Clocale
+ipc=*UnixApi.Ipc
+unixsockets=*UnixApi.Sockets
+gmp=*Api.Gmp
+libgmp=*Api.Libgmp
+modplug=*Api.Modplug
+bullet=*Amiga.Core.Bullet
+colorwheel=*Amiga.Core.Colorwheel
+hardblocks=*Amiga.Core.Hardblocks
+bootblock=*Amiga.Core.Bootblock
+trackdisk=*Amiga.Core.Trackdisk
+prtgfx=*Amiga.Core.Prtgfx
+audio=*Amiga.Core.Audio
+realtime=*Amiga.Core.Realtime
+expansionbase=*Amiga.Core.Expansionbase
+scsidisk=*Amiga.Core.Scsidisk
+tapedeck=*Amiga.Core.Tapedeck
+romboot_base=*Amiga.Core.Romboot_base
+parallel=*Amiga.Core.Parallel
+gradientslider=*Amiga.Core.Gradientslider
+configvars=*Amiga.Core.Configvars
+lowlevel=*Amiga.Core.Lowlevel
+amigaguide=*Amiga.Core.Amigaguide
+nonvolatile=*Amiga.Core.Nonvolatile
+translator=*Amiga.Core.Translator
+cd=*Amiga.Core.Cd
+prefs=*Amiga.Core.Prefs
+amigaprinter=*Amiga.Core.Amigaprinter
+gameport=*Amiga.Core.Gameport
+rexx=*Amiga.Core.Rexx
+configregs=*Amiga.Core.Configregs
+prtbase=*Amiga.Core.Prtbase
+expansion=*Amiga.Core.Expansion
+wbargs=*Amiga.Utils.Wbargs
+vartags=*Amiga.Utils.Vartags
+linklist=*Amiga.Utils.Linklist
+easyasl=*Amiga.Utils.Easyasl
+pastoc=*Amiga.Utils.Pastoc
+doublebuffer=*Amiga.Utils.Doublebuffer
+amigautils=*Amiga.Utils.Amigautils
+consoleio=*Amiga.Utils.Consoleio
+deadkeys=*Amiga.Utils.Deadkeys
+timerutils=*Amiga.Utils.Timerutils
+hisoft=*Amiga.Utils.Hisoft
+tritonmacros=*Amiga.Other.Tritonmacros
+mysticview=*Amiga.Other.Mysticview
+ptreplay=*Amiga.Other.Ptreplay
+xadmaster=*Amiga.Other.Xadmaster
+identify=*Amiga.Other.Identify
+lucyplay=*Amiga.Other.Lucyplay
+ttengine=*Amiga.Other.Ttengine
+gtlayout=*Amiga.Other.Gtlayout
+render=*Amiga.Other.Render
+amarquee=*Amiga.Other.Amarquee
+ahi_sub=*Amiga.Other.Ahi_sub
+reqtools=*Amiga.Other.Reqtools
+triton=*Amiga.Other.Triton
+zlib=*Api.Z
+guigfx=*Amiga.Other.Guigfx
+collation_zh=*System.Collations.Zh
+collation_de=*System.Collations.De
+collation_ru=*System.Collations.Ru
+buildcollations=*System.Collations.Buildcollations
+collation_es=*System.Collations.Es
+collation_fr_ca=*System.Collations.Fr_ca
+collation_sv=*System.Collations.Sv
+collation_ja=*System.Collations.Ja
+collation_ko=*System.Collations.Ko
+cpbuildu=*System.Unicode.Cpbuildu
+freebidi=*System.Unicode.Freebidi
+utf8bidi=*System.Unicode.Utf8bidi
+cp932=*System.Unicode.Cp932
+cp949=*System.Unicode.Cp949
+unicodeducet=*System.Unicode.Unicodeducet
+cp936=*System.Unicode.Cp936
+cp895=*System.Unicode.Cp895
+graphemebreakproperty=*System.Unicode.Graphemebreakproperty
+eastasianwidth=*System.Unicode.Eastasianwidth
+cp950=*System.Unicode.Cp950
+aspell=*Api.Aspell
+aspelldyn=*Api.Aspelldyn
+spellcheck=*Api.Spellcheck
+gemdos=*AtariApi.Gemdos
+vdi=*AtariApi.Vdi
+tos=*AtariApi.Tos
+nf_ops=*AtariApi.Nf_ops
+gem=*AtariApi.Gem
+aes=*AtariApi.Aes
+metados=*AtariApi.Metados
+gemcmmn=*AtariApi.Gemcmmn
+bios=*AtariApi.Bios
+xbios=*AtariApi.Xbios
+pcq=*AmigaApi.Pcq
+amsgbox=*AmigaApi.Amsgbox
+muihelper=*AmigaApi.Muihelper
+cliputils=*AmigaApi.Cliputils
+fpcssscanner=*FPCSS.Scanner
+fpcssresolver=*FPCSS.Resolver
+fpcssutils=*FPCSS.Utils
+fpcssparser=*FPCSS.Parser
+fpcsstree=*FPCSS.Tree
+sdl=*Api.Sdl
+sdl_image=*Api.Sdl.Image
+sdl_ttf=*Api.Sdl.Ttf
+smpeg=*Api.Sdl.SMpeg
+sdl_net=*Api.Sdl.Net
+sdl_mixer=*Api.Sdl.Mixer
+sdlutils=*Api.Sdl.Utils
+sdl_gfx=*Api.Sdl.Gfx
+libxmlparser=*Api.Sdl.XmlParser
+sdl_mixer_nosmpeg=*Api.Sdl.Mixer.NoSMpeg
+logger=*Api.Sdl.Logger
+fpwritepnm=*FpImage.Writer.PNM
+fppixlcanv=*FpImage.PixelCanvas
+fpqrcodegen=*FpImage.QRCodeGen
+fpimgqrcode=*FpImage.QRCode
+fpreadpnm=*FpImage.Reader.PNM
+fpreadtga=*FpImage.Reader.Targa
+fpreadpcx=*FpImage.Reader.PCX
+fpreadjpeg=*FpImage.ReaderJpeg
+fpwritebmp=*FpImage.Writer.Bitmap
+freetypeh=*Api.Freetypeh
+fpwritetga=*FpImage.Writer.Targa
+fpcolhash=*FpImage.ColorHash
+bmpcomn=*FpImage.Common.Bitmap
+xwdfile=*Api.Xwdfile
+fpwritepcx=*FpImage.Writer.PCX
+fpbarcode=*FpImage.BarCode
+pngcomn=*FpImage.Common.PNG
+fpreadqoi=*FpImage.Reader.QOI
+fpquantizer=*FpImage.Quantizer
+qoicomn=*FpImage.Common.QOI
+fpditherer=*FpImage.Ditherer
+pixtools=*FPimage.PixelTools.Pixtools
+freetypehdyn=*Api.Freetypehdyn
+freetype=*Api.Freetype
+fpwritexpm=*FpImage.Writer.XPM
+fpcanvas=*FpImage.Canvas
+pscanvas=*FpImage.Pscanvas
+fpwritejpeg=*FpImage.WriterJpeg
+fptiffcmn=*FpImage.Common.TIFF
+fpimage=*FpImage
+targacmn=*FpImage.Common.Targa
+fpreadpng=*FpImage.Reader.PNG
+fpwritetiff=*FpImage.Writer.TIFF
+pcxcomn=*FpImage.Common.PCX
+fpimggauss=*FpImage.Gauss
+fpwritepng=*FpImage.Writer.Png
+fpreadtiff=*FpImage.Reader.Tiff
+fpwriteqoi=*FpImage.Writer.Qoi
+fpreadpsd=*FpImage.Reader.Psd
+extinterpolation=*FpImage.Extinterpolation
+fpreadgif=*FpImage.Reader.Gif
+fpreadxwd=*FpImage.Reader.Xwd
+fpimgcmn=*FpImage.Common
+fpreadxpm=*FpImage.Reader.Xpm
+fpimgbarcode=*FPIMage.BarCode
+fpreadbmp=*FpImage.Reader.Bitmap
+ellipses=*FpImage.Ellipses
+ftfont=*FpImage.Ftfont
+clipping=*FpImage.Clipping
+fpimgcanv=*FpImage.ImageCanvas
+iosxlocale=*IOSApi.Iosxlocale
+iosxwstr=*IOSApi.Iosxwstr
+sqlite3=*Api.Sqlite3
+sqlite=*Api.Sqlite
+sqlite3ext=*Api.Sqlite3Ext
+sqlite3db=*Api.Sqlite3Db
+sqlitedb=*Api.SqliteDb
+sqlite3dyn=*Api.Sqlite3Dyn
+chmfiftimain=*Chm.FiftiMain
+chmwriter=*Chm.Writer
+paslzx=*Chm.PasLzx
+chmbase=*Chm.Base
+fasthtmlparser=*Fcl.FastHtmlParser
+chmreader=*Chm.Reader
+chmspecialfiles=*Chm.SpecialFiles
+chmfilewriter=*Chm.FileWriter
+itsftransform=*Fcl.ItsFTransform
+chmsitemap=*Chm.Sitemap
+itolitlstypes=*Fcl.ItolitlsTypes
+chmtypes=*Chm.Types
+lzxcompressthread=*Chm.Lzx.CompressThread
+paslzxcomp=*Chm.Lzx.Compress
+itolitlsreader=*Chm.ItolitlsReader
+paslznonslide=*Chm.PasLzNonSlide
+htmlindexer=*Chm.HtmlIndexer
+htmlutil=*Chm.HtmlUtil
+shlobj=*WinApi.Shlobj
+richedit=*WinApi.Richedit
+eventsink=*WinApi.Eventsink
+multimon=*WinApi.Multimon
+winutils=*WinApi.Winutils
+shlwapi=*WinApi.Shlwapi
+imm_dyn=*WinApi.Imm_dyn
+winspool=*WinApi.Winspool
+ole2=*WinApi.Ole2
+buildwinutilsbase=*WinApi.Buildwinutilsbase
+libkinect10=*WinApi.Libkinect10
+oleserver=*WinApi.Oleserver
+activex=*WinApi.Activex
+nb30=*WinApi.Nb30
+urlmon=*WinApi.Urlmon
+comserv=*WinApi.Comserv
+flatsb=*WinApi.Flatsb
+httpapi=*WinApi.Httpapi
+shfolder=*WinApi.Shfolder
+winhttp=*WinApi.Winhttp
+htmlhelp=*WinApi.Htmlhelp
+imagehlp=*WinApi.Imagehlp
+typelib=*WinApi.Typelib
+dwmapi=*WinApi.Dwmapi
+winver=*WinApi.Winver
+stdole2=*WinApi.Stdole2
+comconst=*WinApi.Comconst
+uxtheme=*WinApi.Uxtheme
+comobj=*WinApi.Comobj
+aio=NetWareApi
+allwinner_a20=Embedded
+AndroidR14=AndroidAPI
+AThreads=AmigaApi
+BaseUnix=*UnixApi.Base
+bethreads=BeosApi.Threads
+BlockRtl=CApi
+BSD=BsdApi
+Character=System
+CharSet=System
+Classes=System
+CMem=System
+common=PalmApi
+Console=System
+ConsoleIO=EmbeddedApi
+cortexm0=ARMApi
+cortexm3=ARMApi
+cortexm4=ARMApi
+cortexm7=ARMApi
+CP1250=System.CodePages
+CP1251=System.CodePages
+CP1252=System.CodePages
+CP1253=System.CodePages
+CP1254=System.CodePages
+CP1255=System.CodePages
+CP1256=System.CodePages
+CP1257=System.CodePages
+CP1258=System.CodePages
+CP3021=System.CodePages
+CP437=System.CodePages
+CP646=System.CodePages
+CP737=System.CodePages
+CP775=System.CodePages
+CP850=System.CodePages
+CP852=System.CodePages
+CP855=System.CodePages
+CP856=System.CodePages
+CP857=System.CodePages
+CP860=System.CodePages
+CP861=System.CodePages
+CP862=System.CodePages
+CP863=System.CodePages
+CP864=System.CodePages
+CP865=System.CodePages
+CP866=System.CodePages
+CP869=System.CodePages
+CP874=System.CodePages
+CP8859_1=System.CodePages
+CP8859_10=System.CodePages
+CP8859_11=System.CodePages
+CP8859_13=System.CodePages
+CP8859_14=System.CodePages
+CP8859_15=System.CodePages
+CP8859_16=System.CodePages
+CP8859_2=System.CodePages
+CP8859_3=System.CodePages
+CP8859_4=System.CodePages
+CP8859_5=System.CodePages
+CP8859_6=System.CodePages
+CP8859_7=System.CodePages
+CP8859_8=System.CodePages
+CP8859_9=System.CodePages
+CPall=*System.CodePages.All
+CPkoi8_r=System.CodePages
+CPkoi8_u=System.CodePages
+CPU=*System.CPU
+CThreads=UnixApi
+CTypes=*System.CTypes
+CWString=UnixApi
+ddk=NTApi
+Dl=UnixApi
+DOS=TP
+doscall2=OS2Api
+doscalls=OS2Api
+dpmiexcp=DOSApi
+dxeload=DOSApi
+dxetype=DOSApi
+DynLibs=System
+EMU387=DOSApi
+EMX=DOSApi
+Errors=UnixApi
+esp32=System
+esp8266=System
+esp8266rtos_30300=System
+esp8266rtos_30400=System
+espidf_40100=System
+espidf_40200=System
+espidf_40400=System
+exe=OS2Api
+exeinfo=*System.ExeInfo
+fe310g000=EmbeddedApi
+fe310g002=EmbeddedApi
+FGL=System
+FPCMemDLL=System
+FPCylix=System
+FPWideString=System
+FreeBSD=FreeBSDApi
+gd32vf103xx=EmbeddedApi
+GetOpts=System
+GO32=DOSApi
+gpio=EmbeddedApi
+HeapMGR=EmbeddedApi
+InitC=System
+Intrinsics=System
+ISO7185=System
+JDK15=JavaApi
+kbdcalls=OS2Api
+libc=NetwareLibCApi
+LineInfo=System
+Linux=*LinuxApi
+LinuxVCS=*LinuxApi.Vcs
+lm3fury=EmbeddedApi
+lm3tempest=EmbeddedApi
+lm4f120=EmbeddedApi
+lnfodwrf=*System.LineInfo.Dwarf
+lnfogdb=*System.LineInfo.Gdb
+lpc11xx=EmbeddedApi
+lpc122x=EmbeddedApi
+lpc13xx=EmbeddedApi
+lpc1768=EmbeddedApi
+lpc21x4=EmbeddedApi
+lpc8xx=EmbeddedApi
+LStrings=System
+MacOS=MacOSApi
+MacOSTP=MacOSApi
+MacUtils=MacOSApi
+mailbox=EmbeddedApi
+Math=System
+Messages=WinApi
+mk20d5=EmbeddedApi
+mk20d7=EmbeddedApi
+mk22f51212=EmbeddedApi
+mk64f12=EmbeddedApi
+mmio=EmbeddedApi
+MMX=System.CPU
+moncalls=OS2Api
+moucalls=OS2Api
+MSMouse=DOSApi
+multiboot=EmbeddedApi
+NDK=NTApi
+NDKUtils=NTApi
+NetWare=NetwareApi
+newexe=OS2Api
+nrf51=EmbeddedApi
+nrf52=EmbeddedApi
+nwcalls=NetWareApi
+nwnit=NetWareApi
+nwpre=NetWareApi
+nwprot=NetWareApi
+nwserv=NetWareApi
+nwsnut=NetWareApi
+ObjC=System
+ObjCBase=System
+os2def=OS2Api
+PageMem=System
+pilot=PalmApi
+pmbidi=OS2Api
+pmbitmap=OS2Api
+pmdev=OS2Api
+pmgpi=OS2Api
+pmhelp=OS2Api
+pmshl=OS2Api
+pmspl=OS2Api
+pmstddlg=OS2Api
+pmwin=OS2Api
+pmwp=OS2Api
+pmwsock=OS2Api
+Ports=System
+Posix=QNXApi
+profile=DOSApi
+raspi2=EmbeddedApi
+raspi3=EmbeddedApi
+raspiuart=EmbeddedApi
+RtlConsts=System
+sam3x8e=EmbeddedApi
+samd51p19a=EmbeddedApi
+sc32442b=EmbeddedApi 
+sfpu128=*System.SoftFpu128
+sfpux80=*System.SoftFpuX80
+ShareMem=WinApi
+Signals=WinApi
+so32dll=OS2Api
+SoftFPU=System
+SortBase=System
+stm32f0xx=EmbeddedApi
+stm32f103xe=EmbeddedApi
+stm32f10x_cl=EmbeddedApi
+stm32f10x_conn=EmbeddedApi
+stm32f10x_hd=EmbeddedApi
+stm32f10x_ld=EmbeddedApi
+stm32f10x_md=EmbeddedApi
+stm32f10x_xl=EmbeddedApi
+stm32f401xe=EmbeddedApi
+stm32f401xx=EmbeddedApi
+stm32f407xx=EmbeddedApi
+stm32f411xe=EmbeddedApi
+stm32f429=EmbeddedApi
+stm32f429xx=EmbeddedApi
+stm32f446xx=EmbeddedApi
+stm32f745=EmbeddedApi
+stm32f746=EmbeddedApi
+stm32f756=EmbeddedApi
+stm32g071xx=EmbeddedApi
+Strings=System
+Symbian=SymbianApi
+sysall=PalmApi
+SysCall=UnixApi
+SysConst=System
+SysCtl=BsdApi
+sysemx=DOSApi
+sysos2=OS2Api
+systraps=PalmApi
+SysUtils=System
+TermIO=UnixApi
+Types=System
+TypInfo=System
+UFloat128=*System.UFloat128
+UFloatX80=*System.UFloatX80
+ui=PalmApi
+uiq=SymbianApi
+uiqclasses=SymbianApi
+unicodedata=System.CodePages
+Unix=UnixApi
+UnixCP=*UnixApi.CP
+UnixType=*UnixApi.Types
+UnixUtil=*UnixApi.Utils
+viocalls=OS2Api
+WASIApi=WASIApi
+WASIUtil=WASIApi
+WatCom=WatcomApi
+WebAssembly=WebAssemblyAPI
+Win31=WinApi
+WinDirs=WinApi
+Windows=WinApi
+WinProcs=WinApi
+WinSysUt=WinApi
+WinTypes=WinApi
+X86=System
+xmc4500=EmbeddedApi

+ 194 - 0
utils/dotutils/makedottedfiles.pp

@@ -0,0 +1,194 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Application to Prefix units in uses clause of a list of programs. 
+    Optionally adapts an fpmake file.
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+program makedottedfiles;
+
+{$mode objfpc}{$H+}
+
+uses
+  {$IFDEF UNIX}
+  cthreads,
+  {$ENDIF}
+  types, Classes, SysUtils, CustApp, Prefixer, namespacetool;
+
+
+type
+
+  { TNamespaceCreation }
+
+  TNamespaceCreation = class(TCustomApplication)
+  Private
+    FTool : TNamespaceTool;
+    FListFileName: string;
+    FQuiet : Boolean;
+    FVerbose : Boolean;
+    procedure DoLogTool(Sender: TObject; EventType: TEventType; const Msg: String);
+    function ProcessOptions: Boolean;
+  protected
+    procedure DoLog(EventType: TEventType; const Msg: String); override;
+    procedure DoRun; override;
+  public
+    constructor Create(TheOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure Usage(const aMsg : String);
+  end;
+
+{ TNamespaceCreation }
+
+procedure TNamespaceCreation.DoLog(EventType: TEventType; const Msg: String);
+begin
+  Writeln('[',EventType,'] ',Msg);
+end;
+
+
+function TNamespaceCreation.ProcessOptions : Boolean;
+
+const
+  Short = 'qDhbncarl:k:d:p:s:e:m:vu';
+  Long : Array of string = ('help','list:','known-prefixes:','dirmap:','backup','prefix:','subdir:','dry-run','cased','apply-rule','restart','replace-subdir','ext','fpmake-file:','quiet','verbose','update');
+
+var
+  aExt,ErrorMsg: String;
+  NonOpts : Array of string;
+
+begin
+  Result:=False;
+  ErrorMsg:=CheckOptions(Short,Long);
+  if (ErrorMsg<>'') or HasOption('h','help') then
+    begin
+    Usage(ErrorMsg);
+    Exit;
+    end;
+  // Options for tool class
+  aExt:=GetOptionValue('e','ext');
+  FTool.ForcedExt:=aExt;
+  FTool.DirMapFileName:=GetOptionValue('d','dirmap');
+  FTool.PrefixesFileName:=GetOptionValue('k','known-prefixes');
+  FTool.DefaultPrefix:=GetOptionValue('p','prefix');
+  FTool.Subdir:=GetOptionValue('s','subdir');
+  if FTool.SubDir='' then
+    FTool.SubDir:=DefaultSubdir;
+  FTool.SubdirMode:=sdmAppend;
+  if HasOption('D','replace-subdir') then
+    FTool.SubDirMode:=sdmReplace;
+  FTool.Backup:=HasOption('b','backup');
+  FTool.Update:=HasOption('u','update');
+  FTool.DryRun:=HasOption('n','dry-run');
+  FTool.Restart:=HasOption('r','restart');
+  FTool.CasedFiles:=HasOption('c','cased');
+  FTool.FPMakeNameSpaceFile:=GetoptionValue('m','fpmake-file');
+  FQuiet:=HasOption('q','quiet');
+  FVerbose:=HasOption('v','verbose');
+  if FVerbose then
+    FQuiet:=False;
+  FListFileName:=GetOptionValue('l','list');
+  NonOpts:=GetNonOptions(Short,Long);
+  if (FListFileName='') and (Length(NonOpts)=1) then
+    FListFileName:=NonOpts[0];
+  If (FListFileName='') then
+    begin
+    Usage('Need file list filename');
+    exit;
+    end;
+  If (FTool.PrefixesFileName='') and (FTool.DefaultPrefix='') and not HasOption('a','apply-rule') then
+    begin
+    Usage('Need prefixes filename or default prefix');
+    exit;
+    end;
+  Result:=True;
+end;
+
+procedure TNamespaceCreation.DoLogTool(Sender: TObject; EventType : TEventType; const Msg: String);
+
+var
+  CanLog : Boolean;
+begin
+  Case EventType of
+    etDebug : CanLog:=FVerbose;
+    etError : CanLog:=True;
+  else
+    CanLog:=Not FQuiet;
+  end;
+  if CanLog then
+    Log(EventType,Msg);
+end;
+
+procedure TNamespaceCreation.DoRun;
+
+
+begin
+  Terminate;
+  if not ProcessOptions then
+    exit;
+  FTool.Init;
+  if HasOption('a','apply-rule') then
+    FTool.CreateKnown(FListFileName)
+  else
+    FTool.HandleFileList(FListFileName);
+end;
+
+constructor TNamespaceCreation.Create(TheOwner: TComponent);
+begin
+  inherited Create(TheOwner);
+  StopOnException:=True;
+  FTool:=TNamespaceTool.Create(Self);
+  FTool.OnLog:=@DoLogTool;
+end;
+
+destructor TNamespaceCreation.Destroy;
+
+begin
+  FreeAndNil(FTool);
+  Inherited;
+end;
+
+procedure TNamespaceCreation.Usage(const aMsg: String);
+
+begin
+  if aMsg<>'' then
+    Writeln('Error : ',aMsg);
+  { add your help code here }
+  Writeln('Usage: ', ExeName, ' [options] list');
+  Writeln('Where options is one or more of');
+  Writeln('-h --help                  This help');
+  Writeln('-a --apply-rule            Apply rule in filelist to construct known file list.');
+  Writeln('                           if -k is not specified, then map file is list file with extension changed to FILE.map)');
+  Writeln('-b --backup                Create backup of files that are written');
+  Writeln('-c --cased                 First letter of name is uppercased when creating alias');
+  Writeln('-d --dirmap=FILE           Directory mapping. Old=New, new is relative to subdir');
+  Writeln('-e --ext=EXT               Force extension of created dotted units to EXT. If not set, original extension is taken');
+  Writeln('-D --replace-subdir        Directory mapping. Completely replace dir with mapping from dirmap.');
+  Writeln('-k --known-prefixes=FILE   Namespace mapping. Unit=Namespace');
+  Writeln('-l --list=FILE             Files to handle. One file per line');
+  Writeln('-m --fpmake-file=FILE      Write namespace unit mappping to FILE and add as NameSpaceMap to package definition in fpmake.pp');
+  Writeln('-n --dry-run               Do not execute commands, only write what would be done.');
+  Writeln('-r --restart               Do not load done.lst. Default is to load done.lst and skip files listed in it.');
+  Writeln('                           The file is always updated when done.');
+  Writeln('-q --quiet                 Do not produce any output.');
+  Writeln('-s --subdir=DIRECTORY      Directory in which to write files. Default: '+FTool.DefaultPrefix);
+  Writeln('-u --update                Write updated known prefixes file.');
+  Writeln('-v --verbose               Produce debug output (reports on uses clause manipulations).');
+end;
+
+var
+  Application: TNamespaceCreation;
+begin
+  Application:=TNamespaceCreation.Create(nil);
+  Application.Title:='Namespaced files creation tool';
+  Application.Run;
+  Application.Free;
+end.
+

+ 548 - 0
utils/dotutils/namespacetool.pas

@@ -0,0 +1,548 @@
+unit namespacetool;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, types, prefixer;
+
+Const
+  DefaultSubdir = 'namespaced';
+  DefaultDoneList = 'done.lst';
+
+type
+
+  { TNamespaceCreation }
+  TSubDirMode = (
+                 sdmAppend, // append dirmap result to subdir
+                 sdmReplace // replace directory part with result of dirmap
+                );
+  TNamespaceToolLogEvent = procedure(Sender : TObject; EventType : TEventType; Const Msg : String) of object;
+  TChangeFPMakeResult = (cmrFailed,cmrAlreadyDone,cmrOK);
+
+  { TNamespaceTool }
+
+  TNamespaceTool = class(TComponent)
+  Private
+    FDoneFileName : string;
+    FDirMapFileName: string;
+    FOnLog: TNamespaceToolLogEvent;
+    FPrefixesFileName: string;
+    FDefaultPrefix: string;
+    FFPMakeNameSpaceFile : String;
+    FSubDir : String;
+    FCasedFiles,
+    FUpdate,
+    FDryRun,
+    FWritePrefixes,
+    FBackup: Boolean;
+    FSubdirMode: TSubDirMode;
+    FFPMakeMap : TStrings;
+    FDirmap : TStrings;
+    FKnownPrefixes : TStrings;
+    FRestart : Boolean;
+    FLastOpts: TStringDynArray;
+    FLastRule,
+    FLastDir : String;
+    FForcedExt : String;
+    procedure DoPrefixLog(Sender: TObject; aType: TEventType; const aMsg: String
+      );
+    procedure SetForcedExt(AValue: String);
+    procedure SetSubdir(AValue: String);
+  Protected
+
+    procedure DoMsg(const aFmt: String; const aArgs: array of const;
+      EventType: TEventType=etInfo); overload;
+    procedure DoMsg(const aMessage: String; EventType: TEventType=etInfo); overload;
+    // Add code to initialize namespace to fpmake in filename.
+    function AddNamespaceNameToFpMake(const aFileName: string): TChangeFPMakeResult;
+    // add file to FPMake namespaces file
+    procedure AddToFPMakeMap(const aSrcFileName, aDestFileName: string);
+    // Create directory if not dryrun
+    procedure CreateDestDir(const aDestDir: string);
+    // Actual HandleFileList
+    procedure DoHandleFileList(const aFileName: String);
+    // Return name of package dir from filename (first level of dir tree).
+    function GetPackageDir(const aFileName: string): string;
+    // Return unit name from file name.
+    function GetUnitNameFromFile(aFile: String): string;
+    // Split line into
+    procedure SplitLine(aLine: String; out aFileName, aRule: String;
+      var aOpts: TStringDynArray);
+    // Write FPMake Namespaces file.
+    procedure WritePackageNameSpaceFile(aDir: String; aList: TStrings; DoClear: Boolean=True);
+  Public
+    class procedure SplitRuleLine(aLine: String; out aFileName, aRule: String;
+      var AlastDir, aLastRule: String; var aOpts, aLastOpts: TStringDynArray);
+  Public
+    Constructor Create(aOwner : TComponent); override;
+    Destructor Destroy; override;
+    // Initialize (load config files)
+    Procedure Init;
+    // Actual actions
+    // Apply rule to a single unit file
+    procedure HandleFile(const aFileName: String; aRule: string; aOptions: array of String);
+    // Load file list and call handlefile for each
+    procedure HandleFileList(const aFileName: String);
+    // Create a 'known prefixes' file with the names of the files
+    procedure CreateKnown(const aFileName: String);
+
+
+    Property OnLog : TNamespaceToolLogEvent Read FOnLog Write FOnLog;
+    Property ForcedExt : String Read FForcedExt Write SetForcedExt;
+    Property DirMapFileName : String Read FDirMapFileName Write FDirMapFileName;
+    Property PrefixesFileName : String Read FPrefixesFileName Write FPrefixesFileName;
+    Property DefaultPrefix : String Read FDefaultPrefix Write FDefaultPrefix;
+    Property Subdir : String Read FSubdir Write SetSubdir;
+    Property SubdirMode : TSubDirMode Read FSubdirMode Write FSubdirMode;
+    Property Backup : Boolean Read FBackup Write FBackup;
+    Property Update : Boolean Read FUpdate Write FUpdate;
+    Property DryRun : Boolean Read FDryRun Write FDryRun;
+    Property Restart : Boolean Read FRestart Write FRestart;
+    Property CasedFiles : Boolean Read FCasedFiles Write FCasedFiles;
+    Property FPMakeNameSpaceFile : String Read FFPMakeNameSpaceFile Write FFPMakeNameSpaceFile;
+    Property KnownPrefixes : TStrings Read FKnownPrefixes;
+    Property DirMap : Tstrings Read FDirmap;
+  end;
+
+implementation
+
+procedure TNamespaceTool.CreateDestDir(const aDestDir : string);
+
+begin
+  if not DirectoryExists(aDestDir) then
+    begin
+    DoMsg('Creating destination directory: %s',[aDestDir]);
+    if not FDryRun then
+      if not ForceDirectories(aDestDir) then
+        Raise Exception.Create('Could not create destination directory '+aDestDir);
+    end;
+end;
+
+procedure TNamespaceTool.DoMsg(const aFmt: String; const aArgs: array of const; EventType : TEventType = etInfo);
+begin
+  DoMsg(Format(aFmt,aArgs),EventType);
+end;
+
+procedure TNamespaceTool.DoMsg(const aMessage: String; EventType : TEventType = etInfo);
+begin
+  if assigned(OnLog) then
+    OnLog(Self,EventType, aMessage);
+end;
+
+procedure TNamespaceTool.AddToFPMakeMap(const aSrcFileName,aDestFileName : string);
+
+Var
+  Src,Dest,aDir,aRule : String;
+
+begin
+  Src:=aSrcFileName;
+  Dest:=aDestFileName;
+  // Strip package dir
+  aDir:=GetPackageDir(aSrcFileName);
+  if Pos(aDir,Src)=1 then
+    Delete(Src,1,Length(aDir));
+  if Pos(aDir,Dest)=1 then
+    Delete(Dest,1,Length(aDir));
+  // Map file itself.
+  FFPMakeMap.Values[Src]:=Dest;
+  aDir:=ExtractFilePath(Src);
+  // Map source directory to namespaced
+  aRule:='{s*:'+aDir+'}';
+  FFPMakeMap.Values[aRule]:=ExtractFilePath(Dest);
+  // Add original to include directory
+  aRule:='{i+:'+aDir+'}';
+  if FFPMakeMap.IndexOf(aRule)=-1 then
+    FFPMakeMap.Add(aRule);
+end;
+
+function TNamespaceTool.GetUnitNameFromFile(aFile : String) : string;
+
+begin
+  Result:=ExtractFileName(ChangeFileExt(aFile,''))
+end;
+
+procedure TNamespaceTool.SetForcedExt(AValue: String);
+begin
+  if FForcedExt=AValue then Exit;
+  if (aValue<>'') and (aValue[1]<>'.') then
+    aValue:='.'+aValue;
+  FForcedExt:=AValue;
+end;
+
+procedure TNamespaceTool.DoPrefixLog(Sender: TObject; aType: TEventType;
+  const aMsg: String);
+begin
+  DoMsg(aMsg,aType);
+end;
+
+procedure TNamespaceTool.SetSubdir(AValue: String);
+begin
+  if FSubdir=AValue then Exit;
+  FSubdir:=AValue;
+  if FSubDir<>'' then
+    FSubDir:=IncludeTrailingPathDelimiter(FSubDir);
+end;
+
+procedure TNamespaceTool.HandleFile(const aFileName: String; aRule : string; aOptions: array of String);
+
+Var
+  aNewUnitName,aNewUnitFile,Ext,SrcDir,aUnitName,DestDir,aDummy,DestFN : String;
+  P : TPrefixer;
+  NeedUpdate : Boolean;
+  Idx : Integer;
+
+begin
+  NeedUpdate:=False;
+  Ext:=FForcedExt;
+  if Ext='' then
+    Ext:=ExtractFileExt(aFileName);
+  // Construct File name
+  aUnitName:=GetUnitNameFromFile(aFilename);
+  // Construct destination dir.
+  SrcDir:=ExtractFilePath(aFileName);
+  DestDir:=FDirMap.Values[aUnitName];
+  if DestDir='' then
+    DestDir:=FDirMap.Values[ExcludeTrailingBackslash(SrcDir)];
+  if DestDir='' then
+    DestDir:=SrcDir;
+  case SubDirMode of
+    sdmAppend : DestDir:=FSubDir+DestDir;
+    sdmReplace : ; // do nothing
+  end;
+  DestDir:=IncludeTrailingPathDelimiter(DestDir);
+  // No rule, see if there is a filename rule in known prefixes
+  if aRule='' then
+    begin
+    Idx:=FKnownPrefixes.IndexOfName(aUnitName);
+    if Idx<>-1 then
+      FKnownPrefixes.GetNameValue(Idx,aDummy,aRule);
+    end;
+  aNewUnitFile:=TPrefixer.ApplyRule(aFileName,aDummy,aRule,FCasedFiles and (aRule<>''));
+  aNewUnitName:=GetUnitNameFromFile(aNewUnitFile);
+  if SameText(aNewUnitName,aUnitName) then
+    begin
+    DoMsg('Rule for %s does not result in different unit name, skipping.',[aFileName],etWarning);
+    exit;
+    end;
+  DestFN:=DestDir+aNewUnitName+Ext;
+  // Add new file to FPMake map.
+  AddToFPMakeMap(aFileName,DestFN);
+  if FileExists(DestFN) then
+    DoMsg('File %s already exists, skipping generation',[DestFN]);
+  // Create directory.
+  CreateDestDir(DestDir);
+  DoMsg('Converting %s to %s',[aFileName,DestFN]);
+  if not FDryRun then
+    begin
+    P:=TPrefixer.Create(Self);
+    try
+      P.OnLog:=@DoPrefixLog;
+      P.UnitFileMode:=fmInclude;
+      P.IncludeUnitNameMode:=inmIfndef;
+      P.FileName:=aFileName;
+      P.NameSpace:=TPrefixer.ExtractPrefix(aRule);
+      P.KnownNameSpaces.AddStrings(FKnownPrefixes);
+      P.SkipDestFileName:=FileExists(DestFN);
+      P.DestFileName:=DestFN;
+      P.CreateBackups:=FBackup;
+      P.CasedFileNames:=FCasedFiles;
+      P.Params.AddStrings(aOptions);
+      P.Params.Add('-Fi'+ExtractFilePath(aFileName));
+      P.Execute;
+    finally
+      P.Free;
+    end;
+    end;
+  If NeedUpdate then
+    begin
+    FKnownPrefixes.Values[aUnitName]:='*'+aNewUnitName;
+    FWritePrefixes:=True;
+    end;
+
+end;
+
+Function TNamespaceTool.AddNamespaceNameToFpMake(const aFileName : string) : TChangeFPMakeResult;
+
+const
+  namespacelist = 'namespaces.lst';
+
+Var
+  aFile : TStringList;
+  I : Integer;
+  aLine : string;
+
+begin
+  Result:=cmrFailed;
+  aFile:=TStringList.Create;
+  try
+    aFile.LoadFromFile(aFileName);
+    i:=aFile.Count-1;
+    while (I>=0) and (Result=cmrFailed) do
+      begin
+      if Pos('p.namespacemap',LowerCase(aFile[i]))>0 then
+        result:=cmrAlreadyDone;
+      Dec(I);
+      end;
+    i:=aFile.Count-1;
+    while (I>=0) and (Result=cmrFailed) do
+      begin
+      aLine:=aFile[i];
+      if pos('{$ifndef ALLPACKAGES}',aLine)>0 then
+        if Pos('run',Lowercase(aFile[i+1]))>0 then
+          begin
+          aFile.Insert(I,'');
+          aFile.Insert(I,Format('    P.NamespaceMap:=''%s'';',[namespacelist]));
+          aFile.Insert(I,'');
+          Result:=cmrOK;
+          end;
+      Dec(I);
+      end;
+    if Result=cmrOK then
+      aFile.SaveToFile(aFileName);
+  finally
+    aFile.Free;
+  end;
+end;
+
+procedure TNamespaceTool.WritePackageNameSpaceFile(aDir : String; aList : TStrings; DoClear : Boolean = True);
+
+Var
+  FN : String;
+
+begin
+  if aDir<>'' then
+    aDir:=IncludeTrailingPathDelimiter(aDir);
+  if (FFPMakeNameSpaceFile='') or (FFPMakeMap.Count=0) then
+    exit;
+  FN:=aDir+FFPMakeNameSpaceFile;
+  DoMsg('Writing fpmake map file to %s, writing %d rules',[FN,FFPMakeMap.Count]);
+  FFPMakeMap.SaveToFile(FN);
+  if DoClear then
+    FFPMakeMap.Clear;
+  if FileExists(aDir+'fpmake.pp') then
+    Case AddNamespaceNameToFpMake(aDir+'fpmake.pp') of
+      cmrFailed : DoMsg('Failed to set NamespaceMap to file "%s"',[FN],etError);
+      cmrAlreadyDone : DoMsg('NamespaceMap already set in "%s"',[FN],etWarning);
+      cmrOK : DoMsg('Added NamespaceMap to file "%s"',[FN],etInfo);
+    end
+
+end;
+
+constructor TNamespaceTool.Create(aOwner: TComponent);
+begin
+  inherited Create(aOwner);
+  FDirmap:=TStringList.Create;
+  FKnownPrefixes:=TStringList.Create;
+  FFPMakeMap:=TStringList.Create;
+  FDoneFileName:=DefaultDoneList;
+end;
+
+destructor TNamespaceTool.Destroy;
+begin
+  FreeAndNil(FDirmap);
+  FreeAndNil(FKnownPrefixes);
+  FreeAndNil(FFPMakeMap);
+  inherited Destroy;
+end;
+
+procedure TNamespaceTool.Init;
+begin
+  if (PrefixesFileName<>'') then
+    begin
+    KnownPrefixes.LoadFromFile(PrefixesFileName);
+    DoMsg('Load of %s results in %d known prefixes',[PrefixesFileName,KnownPrefixes.Count]);
+    end;
+  if (DirMapFileName<>'') then
+    begin
+    Dirmap.LoadFromFile(DirMapFileName);
+    DoMsg('Load of %s results in %d directory mappings',[DirMapFileName,DirMap.Count]);
+    end;
+end;
+
+
+procedure TNamespaceTool.SplitLine(aLine: String; out aFileName, aRule: String;
+  var aOpts: TStringDynArray);
+
+
+begin
+  SplitRuleLine(aLine,aFileName,aRule,FLastDir,FLastRule,aOpts,FLastOpts);
+end;
+
+Class procedure TNamespaceTool.SplitRuleLine(aLine: String; out aFileName, aRule: String; var AlastDir, aLastRule : String; var aOpts, aLastOpts: TStringDynArray);
+
+var
+  I,P : Integer;
+  aDir,FN,Opt : String;
+
+begin
+  aRule:='';
+  aFileName:='';
+  aOpts:=[];
+  P:=Pos(';',aLine);
+  if P=0 then
+    begin
+    FN:=aLine;
+    SetLength(aOpts,0);
+    end
+  else
+    begin
+    FN:=Copy(aLine,1,P-1);
+    Opt:=Trim(Copy(aLine,P+1));
+    SetLength(aOpts,Length(Opt));
+    I:=0;
+    Repeat
+      P:=Pos(' ',Opt);
+      if P=0 then
+        P:=Length(Opt)+1;
+      aOpts[I]:=Copy(Opt,1,P-1);
+      Opt:=Trim(Copy(Opt,P+1));
+      inc(I);
+    until (Opt='');
+    SetLength(aOpts,I);
+    end;
+  P:=Pos('=',FN);
+  if P<>0 then
+    begin
+    aRule:=Copy(FN,P+1);
+    FN:=Copy(FN,1,P-1);
+    end;
+  aFileName:=FN;
+  // Use previous rule ?
+  aDir:=ExtractFilePath(FN);
+  if aDir=aLastDir then
+    begin
+    if (aRule='') then
+      aRule:=aLastRule;
+    if Length(aOpts)=0 then
+      aOpts:=aLastOpts;
+    end;
+  aLastDir:=aDir;
+  aLastRule:=aRule;
+  aLastOpts:=aOpts;
+end;
+
+function TNamespaceTool.GetPackageDir(const aFileName : string) : string;
+
+Var
+  P : Integer;
+
+begin
+  Result:='';
+  if aFileName='' then
+    exit;
+  P:=Pos('/',aFileName,2);
+  if P=0 then
+    exit;
+  Result:=Copy(aFileName,1,P);
+  If Result[1]='/' then
+    Delete(Result,1,1);
+end;
+
+procedure TNamespaceTool.HandleFileList(const aFileName : String);
+
+begin
+  DoHandleFileList(aFileName);
+  if FWritePrefixes and Update then
+    begin
+    DoMsg('Updating known prefixes file: %s ',[PrefixesFileName]);
+    if not FDryRun then
+      FKnownPrefixes.SaveToFile(FPrefixesFileName);
+    end;
+end;
+
+procedure TNamespaceTool.DoHandleFileList(const aFileName : String);
+
+Var
+  List,Done : TStringList;
+  aLine,FN,FNDir, LastPackageDir,aRule : String;
+  aOpts : TStringDynArray;
+
+begin
+  aOpts:=[];
+  Done:=Nil;
+  LastPackageDir:='';
+  List:=TStringList.Create;
+  try
+    Done:=TStringList.Create;
+    if (not FRestart) and fileExists(FDoneFileName) then
+      Done.LoadFromFile(FDoneFileName);
+    List.LoadFromFile(aFileName);
+    For aLine in List do
+      begin
+      // Lines have 3 parts
+      // FileName=Rule;Compile Options
+      SplitLine(aLine,FN,aRule,aOpts);
+      FNDir:=GetPackageDir(FN);
+      if (LastPackageDir<>FNDir) then
+        begin
+        if (LastPackageDir<>'')  and (FFPMakeNameSpaceFile<>'') then
+          WritePackageNameSpaceFile(LastPackageDir,List);
+        LastPackageDir:=FNDir;
+        end;
+      if Done.indexOf(FN)=-1 then
+        begin
+        try
+          HandleFile(FN,aRule,aOpts);
+          Done.Add(FN);
+        except
+          On E : Exception do
+            DoMsg('Error %s while handling file %s : %s',[E.ClassName,FN,E.Message],etError);
+        end;
+        end;
+      end;
+    if (LastPackageDir<>'')  and (FFPMakeNameSpaceFile<>'') then
+      WritePackageNameSpaceFile(LastPackageDir,List);
+  finally
+    Done.SaveToFile(FDoneFileName);
+    List.Free;
+  end;
+end;
+
+procedure TNamespaceTool.CreateKnown(const aFileName: String);
+
+Var
+  List,Done : TStringList;
+  aRule,aLine,FN,aUnit,aNewUnit : String;
+  aOpts : TStringDynArray;
+
+begin
+  Done:=Nil;
+  FLastDir:='';
+  FLastRule:='';
+  aOpts:=[];
+  if FPrefixesFileName='' then
+    FPrefixesFileName:=ChangeFileExt(aFileName,'.map');
+  List:=TStringList.Create;
+  try
+    Done:=TStringList.Create;
+    if FileExists(FPrefixesFileName) then
+      Done.LoadFromFile(FPrefixesFileName);
+    List.LoadFromFile(aFileName);
+    // Lines have 3 parts
+    // FileName=Rule;Compile Options
+    For aLine in List do
+      begin
+      SplitLine(aLine,FN,aRule,aOpts);
+      aUnit:=ChangeFileExt(ExtractFileName(FN),'');
+      aNewUnit:=ChangeFileExt(ExtractFileName(TPrefixer.ApplyRule(FN,aUnit,aRule,FCasedFiles)),'');
+      Done.Values[aUnit]:='*'+aNewUnit;
+      end;
+    if FDryRun then
+      begin
+      for aLine in Done do
+        DoMsg(aLine)
+      end
+    else
+      Done.SaveToFile(FPrefixesFileName);
+  finally
+    Done.SaveToFile('done.tmp');
+    Done.Free;
+    List.Free;
+  end;
+
+end;
+
+end.
+

+ 840 - 0
utils/dotutils/prefixer.pas

@@ -0,0 +1,840 @@
+unit prefixer;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, PScanner, PParser, PasTree, strutils, regexpr;
+
+Type
+  { We have to override abstract TPasTreeContainer methods.
+    See utils/fpdoc/dglobals.pp for an implementation of TFPDocEngine,
+    a "real" engine. }
+  TSimpleEngine = class(TPasTreeContainer)
+  public
+    function CreateElement(AClass: TPTreeElement; const AName: String;
+      AParent: TPasElement; AVisibility: TPasMemberVisibility;
+      const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
+      override;
+    function FindElement(const AName: String): TPasElement; override;
+  end;
+
+  { TPrefixer }
+
+  TFileMode = (
+    fmReplace,           // new file replaces old completely.
+    fmReplaceNamespace,  // new file replaces old completely. Namespaces are used for uses clause.
+    fmInclude,           // new file includes old, units in uses clause replaced with new names
+    fmIncludeNamespace   // new file includes old. Namespaces are used for uses clause.
+    );
+  TIncludeNameMode = (
+    inmIfdefElse, // Unit name in include file is set using {$IFDEF DEFINE} NEWNAME {$ELSE} OLDNAME {$ENDIF}
+    inmIfndef     // Unit clause is included in main file, it is skipped in include file using {$IFNDEF DEFINE} unit OLDNAME; {$ENDIF}
+  );
+
+  TPrefixLog = Procedure (Sender : TObject; aType : TEventType; const aMsg : String) of object;
+
+  TPrefixer = class(TComponent)
+  private
+    FCasedFileNames: Boolean;
+    FCreateBackups: Boolean;
+    FDefine: String;
+    FDestFileName: String;
+    FDestUnitName: String;
+    FFileName: String;
+    FKnownNameSpaces: TStrings;
+    FNameMode: TIncludeNameMode;
+    FNameSpace: String;
+    FOnLog: TPrefixLog;
+    FParams: TStrings;
+    FSkipDestFileName: Boolean;
+    FSources : TStrings;
+    FDottedSources : TStrings;
+    FNewUses : TStrings;
+    FUnitFileMode: TFileMode;
+    FFullFileName : String;
+  Protected
+    Procedure DoLog(aType : TEventType; Const aMsg : String);
+    Procedure DoLog(aType : TEventType; Const aFmt : String; aArgs : array of const);
+    procedure AddNameSpaces(Src: TStrings; aUses: TPasUsesClause);
+    procedure CorrectUnitName(aName: String; aLineNr: Integer);
+    procedure DoParseLog(Sender: TObject; const Msg: String);
+    procedure GetAdditionalUnits(aUnitNames: TStrings; aSource: String);
+    function GetDefine: String;
+    function GetDestFileName: String;
+    function GetDestUnitName: String;
+    function MaybeBackup(const aFileName: string): Boolean;
+    function ParseSource(AEngine: TPasTreeContainer;
+      const FPCCommandLine: array of String; OSTarget, CPUTarget: String;
+      Options: TParseSourceOptions): TPasModule;
+    function ReplaceUnits(const aLine: string; aUnitNames : TStrings): String;
+    function ReplaceWord(aLine, aName, aFull: String): String;
+    function FindWord(aName,aLine : String): Boolean;
+    procedure ReworkUses(aSection: TPasSection);
+  Public
+    Constructor Create(aOwner : TComponent); override;
+    Destructor Destroy; override;
+    Procedure PrintUses(aSection : TPasSection; aShowFileName : Boolean = false);
+    procedure Execute;
+    procedure ReworkUses(aUses,aNewUses : TStrings);
+    class function ExtractPrefix(const aRule: String): String;
+    class function ApplyRule(const aFile,aCasedName,aRule : String; PrettyPrint : Boolean) : String;
+    class function ApplyAliasRule(const aName, aRule: String): String;
+    // Create backups of created/changed files  ?
+    Property CreateBackups : Boolean Read FCreateBackups Write FCreateBackups;
+    // How to create the new file.
+    Property UnitFileMode : TFileMode Read FUnitFileMode Write FUnitFileMode;
+    // How to set the unit name in the case of an include file.
+    Property IncludeUnitNameMode : TIncludeNameMode Read FNameMode Write FNameMode;
+    // Define to use to protect dotted names. Default FPC_DOTTEDUNITS
+    Property Define : String Read GetDefine Write FDefine;
+    // Filename to process. For include modes, this file will be overwritten !
+    Property FileName : String Read FFileName Write FFileName;
+    // Do not write dotted Filename
+    Property SkipDestFileName : Boolean Read FSkipDestFileName Write FSkipDestFileName;
+    // Dotted Filename to produce (including path & extension). If not set, NameSpace.FileName is used.
+    Property DestFileName : String Read GetDestFileName Write FDestFileName;
+    // Filename to produce. If not set, DestFileName without extension is used.
+    Property DestUnitName : String Read GetDestUnitName Write FDestUnitName;
+    // Namespace to be used for this unit.
+    Property NameSpace : String Read FNameSpace Write FNameSpace;
+    // Namespaces for used units, in format UnitName=NameSpace
+    Property KnownNameSpaces : TStrings Read FKnownNameSpaces;
+    // Params needed to parse FileName
+    Property Params : TStrings Read FParams;
+    // if True, then the output files have the same case as the unit names.
+    // If False, all filenames are lowercased.
+    Property CasedFileNames : Boolean Read FCasedFileNames Write FCasedFileNames;
+    // For messages
+    Property OnLog : TPrefixLog Read FOnLog Write FOnLog;
+  end;
+
+implementation
+
+function TSimpleEngine.CreateElement(AClass: TPTreeElement;
+                                     const AName: String;
+                                     AParent: TPasElement;
+                                     AVisibility: TPasMemberVisibility;
+                                     const ASourceFilename: String;
+                                     ASourceLinenumber: Integer): TPasElement;
+begin
+  // Writeln(AName,' : ',AClass.ClassName,' at ',ASourceFilename,':',ASourceLinenumber);
+  Result := AClass.Create(AName, AParent);
+  Result.Visibility := AVisibility;
+  Result.SourceFilename := ASourceFilename;
+  Result.SourceLinenumber := ASourceLinenumber;
+end;
+
+function TSimpleEngine.FindElement(const AName: String): TPasElement;
+begin
+  { dummy implementation, see TFPDocEngine.FindElement for a real example }
+  Result := nil;
+end;
+
+constructor TPrefixer.Create(aOwner: TComponent);
+begin
+  inherited Create(aOwner);
+  FKnownNameSpaces:=TStringList.Create;
+  FParams:=TStringList.Create;
+  FSources:=TStringList.Create;
+  FDottedSources:=TStringList.Create;
+  FNewuses:=TStringList.Create;
+  FUnitFileMode:=fmInclude;
+  FNameMode:=inmIfndef;
+end;
+
+destructor TPrefixer.Destroy;
+begin
+  FreeAndNil(FKnownNameSpaces);
+  FreeAndNil(FParams);
+  FreeAndNil(FSources);
+  FreeAndNil(FDottedSources);
+  FreeAndNil(FNewuses);
+  inherited Destroy;
+end;
+
+procedure TPrefixer.PrintUses(aSection: TPasSection; aShowFileName: Boolean);
+
+Var
+  aUses : TPasUsesUnit;
+  aName : string;
+
+begin
+  if aSection=Nil then
+    exit;
+  for aUses in aSection.UsesClause do
+    begin
+    aName:='';
+    if aShowFileName and assigned(aUses.InFileName) then
+      aName:=AnsiDequotedStr(aUses.InFileName.Value,'''');
+    if (aName='') and assigned(aUses.Expr) then
+      aName:=aUses.Expr.GetDeclaration(False);
+    if aName='' then
+      aName:=aUses.Name;
+    DoLog(etInfo,'%s, { location: %s:%d }',[aName,aUses.SourceFilename,aUses.SourceLinenumber]);
+    end;
+end;
+
+function TPrefixer.ReplaceWord(aLine, aName, aFull: String): String;
+
+var
+  RE : TRegExpr;
+
+begin
+  RE:=TRegExpr.Create('\b'+aName+'\b');
+  try
+    Result:=RE.Replace(aLine,aFull);
+    DoLog(etDebug, '%s: %s -> %s = %s',[aLine,aName,aFull,Result]);
+  finally
+    RE.Free;
+  end;
+end;
+
+function TPrefixer.FindWord(aName, aLine: String): Boolean;
+var
+  RE : TRegExpr;
+
+begin
+  RE:=TRegExpr.Create('\b'+aName+'\b');
+  try
+    RE.ModifierI:=True;
+    Result:=RE.Exec(aLine);
+    DoLog(etDebug, '%s: %s = %s',[aLine,aName,BoolToStr(Result,'true','false')]);
+  finally
+    RE.Free;
+  end;
+end;
+
+function TPrefixer.ReplaceUnits(const aLine: string; aUnitNames: TStrings): String;
+
+Var
+  res,aName,aFull,aNameSpace,aUnit : String;
+  idx : Integer;
+
+begin
+  Res:=aLine;
+  for aName in aUnitNames do
+    begin
+    Idx:=FKnownNameSpaces.IndexOfName(aName);
+    if Idx<>-1 then
+      begin
+      FKnownNameSpaces.GetNameValue(Idx,aUnit,aNameSpace);
+      if Copy(aNameSpace,1,1)='*' then
+        aFull:=Copy(aNameSpace,2)
+      else
+        aFull:=aNameSpace+'.'+aUnit;
+      Res:=ReplaceWord(Res,aName,aFull);
+      end;
+    end;
+  Result:=Res;
+end;
+
+
+procedure TPrefixer.GetAdditionalUnits(aUnitNames : TStrings; aSource : String);
+
+Var
+  aRE : TRegExpr;
+  aWords : TStringList;
+  aWord : string;
+
+begin
+  awords:=nil;
+  aRE:=TRegExpr.Create('(\w+)');
+  Try
+    aWords:=TstringList.Create;
+    if aRe.Exec(aSource) then
+      repeat
+        aWord:=System.Copy(aSource, ARE.MatchPos[0], ARE.MatchLen[0]);
+        if IndexText(aWord,['uses','define','undef','if','ifdef', 'endif','else'])=-1 then
+          if (FKnownNameSpaces.IndexOfName(aWord)<>-1) then
+            aUnitNames.Add(aWord); // Duplicates set to ignore
+      until not Are.ExecNext;
+
+  Finally
+    aWords.Free;
+    aRE.Free;
+  end;
+end;
+
+procedure TPrefixer.ReworkUses(aSection: TPasSection);
+
+Var
+  aUses : TPasUsesUnit;
+  S,aName,aLine,FNUses,FNMain : String;
+  aUnitNames : TStringList;
+  // all 0-based
+  I,Idx, FUses,FUsesEnd, FFirst,FLast : Integer;
+
+
+begin
+  if (aSection=Nil)
+      or (Length(aSection.UsesClause)=0)
+      or ((Length(aSection.UsesClause)=1)
+           and (SameText(aSection.UsesClause[0].Name,'System')))  then
+    exit;
+  FNMain:=ExtractFileName(FFileName);
+  FFirst:=FSources.Count+1;
+  FLast:=0;
+  aUnitNames:=TStringList.Create;
+  try
+    aUnitNames.Sorted:=True;
+    aUnitNames.Duplicates:=dupIgnore;
+    for aUses in aSection.UsesClause do
+      begin
+      if aUses.SourceLinenumber-1>FLast then
+        FLast:=aUses.SourceLinenumber-1;
+      if aUses.SourceLinenumber-1<FFirst then
+        FFirst:=aUses.SourceLinenumber-1;
+      FNUses:=ExtractFileName(aUses.SourceFilename);
+      aName:='';
+      if (aName='') and assigned(aUses.Expr) then
+        aName:=aUses.Expr.GetDeclaration(False);
+      if aName='' then
+        aName:=aUses.Name;
+      if (FNUses<>FNMain) or (expandfilename(aUses.SourceFileName)<>FFullFileName) then
+         Raise Exception.CreateFmt('Uses clause unit %s not in main unit: (uses: %s) <> %s',[aName,FNUses,FNMain]);
+      aUnitNames.Add(aName);
+      end;
+    Fuses:=FFirst;
+    if Fuses>=FSources.Count then
+      FUses:=FSources.Count-1;
+    While (FUses>=0) and (Pos('uses',lowerCase(FSources[FUses]))=0) do
+      Dec(Fuses);
+    FUsesEnd:=FLast; // Fuses is 0 bases
+    While (FUsesEnd<FSources.Count) and (Pos(';',FSources[FUsesEnd])=0) do
+      Inc(FusesEnd);
+    DoLog(etDebug, 'Uses clause extends from %d: %s',[FUses,FSources[FUses]]);
+    DoLog(etDebug, 'Uses clause extends to %d: %s',[FUsesEnd,FSources[FUsesEnd]]);
+    S:='';
+    For I:=Fuses to FUsesEnd do
+      S:=S+#10+FSources[I];
+    GetAdditionalUnits(aUnitNames,S);
+    FNewuses.Clear;
+
+    if UnitFileMode<>fmReplace then
+      FNewuses.Add('{$IFDEF '+Define+'}');
+    For Idx:=FUses to FUsesEnd do
+      begin
+      aLine:=FSources[Idx];
+      If (Idx>=FFirst) and (Idx<=FLast) then
+        begin
+        aLine:=ReplaceUnits(aLine,aUnitNames);
+        end;
+      FNewUses.Add(aLine);
+      end;
+    // Check what we need to do with original sources
+    if UnitFileMode<>fmReplace then
+      begin
+      FNewuses.Add('{$ELSE '+Define+'}');
+      // Insert before uses
+      FSources.Insert(FUsesEnd+1,'{$ENDIF '+Define+'}');
+      end
+    else
+      begin
+      // If we need to replace, we just remove all old lines before adding the new ones
+      if UnitFileMode=fmReplace then
+        For I:=FUsesEnd downto FUses do
+          FSources.Delete(I);
+      end;
+    For I:=FNewUses.Count-1 downto 0 do
+      FSources.Insert(FUses,FNewUses[i]);
+  finally
+    aUnitNames.Free;
+  end;
+end;
+
+function TPrefixer.GetDefine: String;
+begin
+  Result:=FDefine;
+  if Result='' then
+    Result:='FPC_DOTTEDUNITS';
+end;
+
+function TPrefixer.MaybeBackup(const aFileName: string): Boolean;
+
+Var
+  BFN : String;
+  FIn,Fout : TFileStream;
+
+begin
+  Result:=FileExists(aFileName);
+  if Result then
+     begin
+     BFN:=aFileName+'.bak';
+     Fout:=Nil;
+     Fin:=TFileStream.Create(aFilename,fmOpenRead or fmShareDenyWrite);
+     try
+       Fout:=TFileStream.Create(BFN,fmCreate);
+       Fout.CopyFrom(FIn,0);
+     finally
+       Fin.Free;
+       Fout.Free;
+     end;
+     end;
+end;
+
+function TPrefixer.GetDestFileName: String;
+
+Var
+  DN, FN : String;
+
+begin
+  Result:=FDestFileName;
+  if Result='' then
+    begin
+    DN:=ExtractFilePath(FileName);
+    FN:=ExtractFileName(FileName);
+    if CasedFileNames then
+      Result:=DN+NameSpace+'.'+FN
+    else
+      Result:=DN+LowerCase(NameSpace+'.'+FN);
+    end;
+end;
+
+function TPrefixer.GetDestUnitName: String;
+
+begin
+  Result:=FDestUnitName;
+  if Result='' then
+    Result:=ChangeFileExt(ExtractFileName(DestFileName),'');
+end;
+
+procedure TPrefixer.CorrectUnitName(aName : String; aLineNr : Integer);
+
+Var
+  aLine,aReplace,aNewName : string;
+  Idx : Integer;
+
+begin
+  aNewName:=DestUnitName;
+  if (aNewName=aName) then
+    exit; // nothing to do.
+  case IncludeUnitNameMode of
+  inmIfdefElse:
+    begin
+    aLine:=FSources[aLineNr];
+    aReplace:='{$IFDEF '+Define+'} '+aNewName+' {$ELSE} '+aName+' {$ENDIF}';
+    aLine:=ReplaceWord(aLine,aName,aReplace);
+    end;
+  inmIfndef:
+    begin
+    // Look for ;
+    idx:=aLineNr-1;
+    While (Idx<FSources.Count) and (Pos(';',FSources[Idx])=0) do
+      Inc(Idx);
+    if (Idx<FSources.Count-1) then
+      FSources.Insert(Idx+1,'{$ENDIF '+DEFINE+'}');
+    // Look for unit
+    idx:=aLineNr;
+    if Idx>=FSources.Count then
+      Idx:=FSources.Count-1;
+    While (Idx>=0) and Not FindWord('unit',FSources[Idx]) do
+      Dec(Idx);
+    if Idx>=0 then
+      FSources.Insert(Idx,'{$IFNDEF '+DEFINE+'}');
+    end;
+  end;
+end;
+
+procedure TPrefixer.DoParseLog(Sender: TObject; const Msg: String);
+begin
+  DoLog(etDebug,Msg);
+end;
+
+procedure TPrefixer.DoLog(aType: TEventType; const aMsg: String);
+begin
+  if assigned(FOnLog) then
+    FOnLog(Self,aType,aMsg);
+end;
+
+procedure TPrefixer.DoLog(aType: TEventType; const aFmt: String;
+  aArgs: array of const);
+begin
+  DoLog(aType,Format(aFmt,aArgs));
+end;
+
+procedure TPrefixer.AddNameSpaces(Src : TStrings; aUses : TPasUsesClause);
+
+Var
+  aUsed : TPasUsesUnit;
+  aDirective,aName,aNameSpace,aUnit : String;
+  idx : Integer;
+
+begin
+  for aUsed in aUses do
+    begin
+    aName:='';
+    if assigned(aUsed.Expr) then
+      aName:=aUsed.Expr.GetDeclaration(False);
+    if aName='' then
+      aName:=aUsed.Name;
+    Idx:=FKnownNameSpaces.IndexOfName(aName);
+    if Idx<>-1 then
+      begin
+      FKnownNameSpaces.GetNameValue(Idx,aUnit,aNameSpace);
+      aDirective:='{$NAMESPACE '+aNameSpace+'}';
+      if Src.IndexOf(aDirective)=-1 then
+        Src.Insert(0,aDirective);
+      end;
+    end;
+end;
+
+function TPrefixer.ParseSource(AEngine: TPasTreeContainer;
+  const FPCCommandLine: array of String; OSTarget, CPUTarget: String;
+  Options: TParseSourceOptions): TPasModule;
+
+var
+  FileResolver: TBaseFileResolver;
+  Parser: TPasParser;
+  lFilename: String;
+  Scanner: TPascalScanner;
+  allowmem : Boolean;
+
+  procedure ProcessCmdLinePart(S : String);
+  var
+    l,Len: Integer;
+
+  begin
+    if (S='') then
+      exit;
+    Len:=Length(S);
+    if (s[1] = '-') and (len>1) then
+    begin
+      case s[2] of
+        'd': // -d define
+          begin
+          s:=Copy(s, 3, Len);
+          Scanner.AddDefine(UpperCase(S));
+          if s='allowmem' then
+            AllowMem:=True;
+          end;
+        'u': // -u undefine
+          Scanner.RemoveDefine(UpperCase(Copy(s, 3, Len)));
+        'F': // -F
+          if (len>2) and (s[3] = 'i') then // -Fi include path
+            FileResolver.AddIncludePath(Copy(s, 4, Len));
+        'I': // -I include path
+          FileResolver.AddIncludePath(Copy(s, 3, Len));
+        'S': // -S mode
+          if  (len>2) then
+            begin
+            l:=3;
+            While L<=Len do
+              begin
+              case S[l] of
+                'c' : Scanner.Options:=Scanner.Options+[po_cassignments];
+                'd' : Scanner.SetCompilerMode('DELPHI');
+                '2' : Scanner.SetCompilerMode('OBJFPC');
+                'h' : ; // do nothing
+              end;
+              inc(l);
+              end;
+            end;
+        'M' :
+           begin
+           delete(S,1,2);
+           l:=pos(':',S);
+           if (L<>0) and (UpperCase(Copy(S,1,l-1))='MODESWITCH') then
+             begin
+             Delete(S,1,l);
+             if SameText(S,'externalclass') then
+               Scanner.ReadOnlyModeSwitches:=Scanner.ReadOnlyModeSwitches+[msExternalClass];
+             Scanner.SetModeSwitch(S);
+             end
+           else
+             Scanner.SetCompilerMode(S);
+           end;
+      end;
+    end else
+      if lFilename <> '' then
+        raise ENotSupportedException.Create(SErrMultipleSourceFiles)
+      else
+        lFilename := s;
+  end;
+
+var
+  S: String;
+  opts : TPOptions;
+
+begin
+  AllowMem:=False;
+  if DefaultFileResolverClass=Nil then
+    raise ENotImplemented.Create(SErrFileSystemNotSupported);
+  Result := nil;
+  FileResolver := nil;
+  Scanner := nil;
+  Parser := nil;
+  try
+    FileResolver := DefaultFileResolverClass.Create;
+    if FileResolver is TFileResolver then
+      TFileResolver(FileResolver).UseStreams:=poUseStreams in Options;
+    Scanner := TPascalScanner.Create(FileResolver);
+    Scanner.LogEvents:=AEngine.ScannerLogEvents;
+    Scanner.OnLog:=AEngine.Onlog;
+    if not (poSkipDefaultDefs in Options) then
+      begin
+      Scanner.AddDefine('FPK');
+      Scanner.AddDefine('FPC');
+      Scanner.AddDefine('FPC_LITTLE_ENDIAN');
+      // TargetOS
+      s := UpperCase(OSTarget);
+      Scanner.AddDefine(s);
+      Case s of
+        'LINUX' : Scanner.AddDefine('UNIX');
+        'FREEBSD' :
+          begin
+          Scanner.AddDefine('BSD');
+          Scanner.AddDefine('UNIX');
+          end;
+        'NETBSD' :
+          begin
+          Scanner.AddDefine('BSD');
+          Scanner.AddDefine('UNIX');
+          end;
+        'SUNOS' :
+          begin
+          Scanner.AddDefine('SOLARIS');
+          Scanner.AddDefine('UNIX');
+          end;
+        'GO32V2' : Scanner.AddDefine('DPMI');
+        'BEOS' : Scanner.AddDefine('UNIX');
+        'QNX' : Scanner.AddDefine('UNIX');
+        'AROS' : Scanner.AddDefine('HASAMIGA');
+        'MORPHOS' : Scanner.AddDefine('HASAMIGA');
+        'AMIGA' : Scanner.AddDefine('HASAMIGA');
+      end;
+      // TargetCPU
+      s := UpperCase(CPUTarget);
+      Scanner.AddDefine('CPU'+s);
+      if (s='X86_64') then
+        Scanner.AddDefine('CPU64')
+      else
+        Scanner.AddDefine('CPU32');
+      end;
+    Parser := TPasParser.Create(Scanner, FileResolver, AEngine);
+    if (poSkipDefaultDefs in Options) then
+      Parser.ImplicitUses.Clear;
+    lFilename := '';
+    Parser.LogEvents:=AEngine.ParserLogEvents;
+    Parser.OnLog:=AEngine.Onlog;
+
+    For S in FPCCommandLine do
+      ProcessCmdLinePart(S);
+    if lFilename = '' then
+      raise Exception.Create(SErrNoSourceGiven);
+    FileResolver.AddIncludePath(ExtractFilePath(lFileName));
+    opts:=[po_AsmWhole,po_AsmPascalComments];
+    if AllowMem then
+      Include(opts,po_allowmem);
+    opts:=opts+Scanner.options;
+    Parser.Options:=Parser.Options+opts;
+    Parser.OnLog:=@DoParseLog;
+
+    Scanner.OpenFile(lFilename);
+
+    Parser.ParseMain(Result);
+  finally
+    Parser.Free;
+    Scanner.Free;
+    FileResolver.Free;
+  end;
+end;
+
+
+procedure TPrefixer.Execute;
+
+var
+  M: TPasModule;
+  P : TPasProgram absolute M;
+  L : TPasLibrary absolute M;
+  E: TPasTreeContainer;
+  cmdline : Array of String;
+
+begin
+  FFullFileName:=ExpandFileName(FFileName);
+  cmdline:=Params.ToStringArray;
+  CmdLine:=Concat(CmdLine,[FileName]);
+  E := TSimpleEngine.Create;
+  M := nil;
+  try
+    E.OnLog:=@DoParseLog;
+    E.ParserLogEvents:=[pleImplementation,pleInterface];
+    FSources.LoadFromFile(FFileName);
+    FDottedSources.Clear;
+    M := Self.ParseSource(E, cmdline, 'linux', 'i386',[]);
+    if UnitFileMode in [fmInclude,fmIncludeNamespace] then
+      begin
+      if IncludeUnitNameMode=inmIfndef then
+        FDottedSources.Add('unit '+DestUnitName+';');
+      FDottedSources.Add('{$DEFINE '+Define+'}');
+      end;
+    if M is TPasProgram then
+      begin
+      if UnitFileMode in [fmReplace,fmInclude] then
+        ReworkUses(P.ProgramSection)
+      else
+        AddNameSpaces(FSources,P.ProgramSection.UsesClause);
+      end
+    else if M is TPasLibrary then
+      begin
+      if UnitFileMode in [fmReplace,fmInclude] then
+        ReworkUses(L.LibrarySection)
+      else
+        AddNameSpaces(FSources,L.LibrarySection.UsesClause);
+      end
+    else
+      begin
+      if UnitFileMode in [fmReplace,fmInclude] then
+        begin
+        ReworkUses(M.ImplementationSection);
+        ReworkUses(M.InterfaceSection);
+        CorrectUnitName(M.Name,M.SourceLinenumber);
+        end
+      else
+        begin
+        AddNamespaces(FDottedSources,M.ImplementationSection.UsesClause);
+        AddNameSpaces(FDottedSources,M.InterfaceSection.UsesClause);
+        end;
+      end;
+    if UnitFileMode in [fmReplace,fmReplaceNamespace] then
+      begin
+      MaybeBackup(DestFileName);
+      FSources.SaveToFile(DestFileName);
+      end
+    else
+      begin
+      MaybeBackup(FileName);
+      FSources.SaveToFile(FileName);
+      if not SkipDestFileName then
+        begin
+        FDottedSources.Add('{$i '+ExtractFileName(FileName)+'}');
+        MaybeBackup(DestFileName);
+        FDottedSources.SaveToFile(DestFileName);
+        end;
+      end;
+  finally
+    FreeAndNil(M);
+    FreeAndNil(E)
+  end;
+end;
+
+procedure TPrefixer.ReworkUses(aUses, aNewUses: TStrings);
+
+Var
+  S,aLine : String;
+  aUnitNames : TStringList;
+  I,Idx : Integer;
+
+
+begin
+  aUnitNames:=TStringList.Create;
+  try
+    aUnitNames.Sorted:=True;
+    aUnitNames.Duplicates:=dupIgnore;
+    S:='';
+    For I:=0 to aUses.Count-1 do
+      S:=S+#10+aUses[I];
+    GetAdditionalUnits(aUnitNames,S);
+    aNewuses.Clear;
+    aNewuses.Add('{$IFDEF '+Define+'}');
+    For Idx:=0 to aUses.Count-1 do
+      begin
+      aLine:=aUses[Idx];
+      aLine:=ReplaceUnits(aLine,aUnitNames);
+      aNewUses.Add(aLine);
+      end;
+    // Add original
+    aNewuses.Add('{$ELSE '+Define+'}');
+    aNewuses.AddStrings(aUses);
+    aNewuses.Add('{$ENDIF '+Define+'}');
+  finally
+    aUnitNames.Free;
+  end;
+end;
+
+class function TPrefixer.ExtractPrefix(const aRule: String) : String;
+
+Var
+  P : Integer;
+
+begin
+  // *Prefix.UnitName
+  if Copy(aRule,1,1)='*' then
+    begin
+    P:=Pos('.',aRule);
+    Result:=Copy(aRule,2,P-2);
+    end
+  else
+    begin
+    // Prefix,UnitNamerule
+    P:=Pos(',',aRule);
+    if P=0 then
+      P:=Length(aRule)+1;
+    Result:=Copy(aRule,1,P-1);
+    end;
+end;
+
+class function TPrefixer.ApplyAliasRule(const aName, aRule: String) : String;
+
+begin
+  If Copy(aRule,1,1)='*' then
+    Result:=Copy(aRule,2)
+  else if aRule<>'' then
+    Result:=aRule+'.'+aName
+  else
+    Result:=aName;
+end;
+
+class function TPrefixer.ApplyRule(const aFile, aCasedName,aRule: String;
+  PrettyPrint: Boolean): String;
+
+Var
+  p,len : Integer;
+  aExt,aDir,aName,aPrefix : String;
+
+begin
+  aPrefix:='';
+  aDir:=ExtractFilePath(aFile);
+  aExt:=ExtractFileExt(aFile);
+  Result:=ExtractFileName(aFile);
+  // *DottedUnitName
+  // Prefix
+  // Prefix,*UnitSuffix
+  // Prefix,-DeleteFromOriginalAtStart
+  // Prefix,DeleteFromOriginalAtEnd-
+  P:=Pos(',',aRule);
+  if P=0 then
+    begin
+    if aRule<>'' then
+      if aRule[1]='*' then
+        Result:=Copy(aRule,2)+aExt
+      else if PrettyPrint and (aCasedName<>'') then
+        Result:=aRule+'.'+aCasedName+aExt
+      else
+        aPrefix:=aRule+'.'
+    end
+  else
+    begin
+    aPrefix:=Copy(aRule,1,P-1)+'.';
+    aName:=Copy(aRule,P+1);
+    Len:=Length(AName);
+    if Len>0 then
+      begin
+      Case aName[1] of
+        '*' : Result:=Copy(aName,2)+ExtractFileExt(Result);
+        '-' : if Pos(Copy(aName,2),Result)=1 then
+               Delete(Result,1,Len-1);
+      else
+        if (aName[Len]='-') and (RPos(aName,Result)=Length(Result)-Len+1) then
+          Result:=Copy(Result,1,Length(Result)-Len);
+      end;
+      end;
+    end;
+  if PrettyPrint then
+    Result[1]:=Upcase(Result[1]);
+  Result:=aDir+aPrefix+Result;
+end;
+
+end.
+

+ 114 - 0
utils/dotutils/prefixunits.pp

@@ -0,0 +1,114 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Prefix units in uses clause of a single program or unit.
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program prefixunits;
+
+{$mode objfpc}
+{$H+}
+ 
+uses cwstring, SysUtils, Classes, custapp, prefixer;
+
+type
+
+   { TApplication }
+
+   TApplication = class(TCustomApplication)
+   Private
+     FPrefixer : TPrefixer;
+   Public
+     Constructor create(aOwner : TComponent); override;
+     Destructor Destroy; override;
+     Procedure Usage(Err : string);
+     Procedure DoRun; override;
+   end;
+
+constructor TApplication.create(aOwner: TComponent);
+begin
+  inherited create(aOwner);
+  FPrefixer:=TPrefixer.Create(Self);
+end;
+
+destructor TApplication.Destroy;
+begin
+  FreeAndNil(FPrefixer);
+  inherited Destroy;
+end;
+
+procedure TApplication.Usage(Err: string);
+
+begin
+  if Err<>'' then
+    Writeln('Error: ',Err);
+  Writeln('Usage: ',ExtractFileName(Paramstr(0)),' [OPTIONS] filename');
+  Writeln('Where options is exactly one of');
+  Writeln('-h or --help                      shows this help');
+  Writeln('-f or --filename=FILE             Filename to process, can be specifid simply');
+  Writeln('-d or --dest-filename=FILE        Destination filename to produce. Default is namespace.filename');
+  Writeln('-k or --known-namespaces=FILE     Name of file with known namespaces.');
+  Writeln('-n or --namespace=NS              Namespace to apply to file.');
+  Writeln('-o or --option=option             Option to pass to compiler.');
+  Writeln('-b or --backup                    Create backups of existing files when overwriting.');
+  Writeln('All other options are passed as-is to the parser');
+  Halt(Ord(Err<>''));
+end;
+
+procedure TApplication.DoRun;
+
+Const
+  ShortOpts = 'bhf:k:n:o:d:';
+  LongOpts : Array of string = ('backup','filename:','known-namespaces:','namespace:','option:','dest-filename:');
+
+Var
+  S : String;
+  Opts : Array of string;
+
+begin
+  Terminate;
+  S:=CheckOptions(Shortopts,LongOpts);
+  if (S<>'') or HasOption('h','help') then
+    Usage(S);
+  FPrefixer.NameSpace:=GetOptionValue('n','namespace');
+  FPrefixer.FileName:=GetOptionValue('f','filename');
+  FPrefixer.DestFileName:=GetOptionValue('d','dest-filename');
+  FPrefixer.CreateBackups:=HasOption('b','backup');
+  if FPrefixer.FileName='' then
+    begin
+    Opts:=GetNonOptions(ShortOpts,LongOpts);
+    if (Length(Opts)>0) then
+      FPrefixer.FileName:=Opts[0];
+    end;
+  Opts:=GetOptionValues('o','option');
+  For S in Opts do
+    FPrefixer.Params.Add(S);
+  if (FPrefixer.NameSpace='') then
+    Usage('Namespace is required');
+  if (FPrefixer.FileName='') then
+    Usage('Filename is required');
+  S:=GetOptionValue('k','known-namespaces');
+  if S='' then
+    S:=ExtractFilePath(ParamStr(0))+'knownprefixes.txt';
+  if FileExists(S) then
+    FPrefixer.KnownNameSpaces.LoadFromFile(S);
+  FPrefixer.Execute;
+end;
+
+begin
+  With TApplication.Create(Nil) do
+    try
+      Initialize;
+      Run;
+    finally
+      Free;
+    end;
+end.

+ 55 - 0
utils/dotutils/proxyunit.pp

@@ -0,0 +1,55 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Generate a skeleton unit with namespaced name which defines FPC_DOTTEDUNITS and 
+    includes the original non-dotted unit.
+        
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program proxyunit;
+
+uses StrUtils, SysUtils, Classes;
+
+  Function MaybeExt(S : String) : String;
+  begin
+    Result:=S;
+    if IndexText(ExtractFileExt(S),['.pas','.pp'])=-1 then
+      Result:=Result+'.pp'
+  end;
+
+Function MaybeStripExt(S : String) : String;
+  begin
+    Result:=S;
+    if IndexText(ExtractFileExt(S),['.pas','.pp'])<>-1 then
+      Result:=ChangeFileExt(Result,'')
+  end;
+
+var
+  aFile : TStrings;
+
+begin
+  if (ParamCount<>2) then
+    begin
+    Writeln('Usage: dottedunit nondottedunit');
+    Writeln('Default extension is .pp and is appended if needed');
+    Halt(1);
+    end;
+  aFile:=TStringList.Create;
+  try
+    aFile.Add('unit '+MaybeStripExt(ExtractFileName(ParamStr(1)))+';');
+    aFile.Add('{$DEFINE FPC_DOTTEDUNITS}');
+    aFile.Add('{$i '+MaybeExt(ParamStr(2))+'}');
+    aFile.SaveToFile(MaybeExt(ParamStr(1)));
+  finally
+    aFile.Free;
+  end;
+
+end.
+

+ 83 - 0
utils/dotutils/replaceunitnames.pp

@@ -0,0 +1,83 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Replace hardcoded unit names xyz in a makefile by a variable XYZUNIT.
+    (see genunitnames for how to create the variables)
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+program replaceunitnames;
+
+uses regexpr,sysutils, classes, types, namespacetool, prefixer;
+
+function ReplaceWord(aLine, aName, aFull: String): String;
+
+var
+  RE : TRegExpr;
+
+begin
+  RE:=TRegExpr.Create('\b'+aName+'\b');
+  try
+    RE.ModifierI:=True;
+    Result:=RE.Replace(aLine,aFull);
+//    Writeln(aLine,': ',aName,' -> ',aFull,' = ',Result);
+  finally
+    RE.Free;
+  end;
+end;
+
+
+function ReplaceUnits(const aLine: string; aUnitNames: TStrings): String;
+
+Var
+  res,aName,aFull : String;
+
+begin
+  Res:=aLine;
+  for aName in aUnitNames do
+    begin
+    aFull:='$('+UpperCase(aName)+'UNIT)';
+    Res:=ReplaceWord(Res,aName,aFull);
+    end;
+  Result:=Res;
+end;
+
+
+var
+  i : Integer;
+  L,aNames,aMakeFile: TStrings;
+  aFN,aRule : String;
+
+begin
+  aNames:=Nil;
+  aMakeFile:=nil;
+  L:=TStringList.Create;
+  try
+    aMakeFile:=TStringList.Create;
+    aNames:=TStringList.Create;
+    L.LoadFromFile(paramstr(1));
+    for I:=0 to L.Count-1 do
+      begin
+      L.GetNameValue(I,aFN,aRule);
+      aNames.Add(aFN);
+      end;
+    aMakeFile.LoadFromFile(Paramstr(2));
+    aMakeFile.SaveToFile(Paramstr(2)+'.bak');
+    For I:=0 to aMakefile.Count-1 do
+      aMakefile[I]:=ReplaceUnits(aMakefile[I],aNames);
+    aMakeFile.SaveToFile(ParamStr(2)+'.new');
+  finally
+    aMakeFile.Free;
+    aNames.Free;
+    L.Free;
+  end;
+end.
+

+ 47 - 0
utils/dotutils/replaceword.pp

@@ -0,0 +1,47 @@
+program replaceword;
+
+{$mode objfpc}
+{$h+}
+uses regexpr,sysutils, classes;
+
+function ReplaceWord(aLine, aName, aFull: String): String;
+
+var
+  RE : TRegExpr;
+
+begin
+  RE:=TRegExpr.Create('\b'+aName+'\b');
+  try
+//    RE.ModifierI:=True;
+    Result:=RE.Replace(aLine,aFull);
+//    Writeln(aLine,': ',aName,' -> ',aFull,' = ',Result);
+  finally
+    RE.Free;
+  end;
+end;
+
+
+var
+  I,J : Integer;
+  aMakeFile: TStrings;
+  W1,W2,aFN : String;
+
+begin
+  W1:=ParamStr(1);
+  W2:=ParamStr(2);
+  aMakeFile:=TStringList.Create;
+  try
+    for I:=3 to ParamCount do
+      begin
+      aFN:=Paramstr(I);
+      aMakeFile.LoadFromFile(aFN);
+      aMakeFile.SaveToFile(aFn+'.bak');
+      For J:=0 to aMakefile.Count-1 do
+        aMakefile[J]:=ReplaceWord(aMakefile[J],W1,W2);
+      aMakeFile.SaveToFile(AFN);
+      end;
+  finally
+    aMakeFile.Free;
+  end;
+end.
+

+ 139 - 0
utils/dotutils/reworkmakefile.pp

@@ -0,0 +1,139 @@
+{
+    This file is part of the Free Component Library
+    Copyright (c) 2022 by Michael Van Canneyt, [email protected]
+
+    Rework makefile rules: 
+    Replace hardcoded unit names xyz in a rule with variable XYZUNIT.
+    (see genunitnames for how to create the variables)
+    
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program reworkmakefile;
+
+uses strutils, regexpr, sysutils, classes, types, namespacetool, prefixer,
+  custapp, rewritemakefile;
+
+
+Type
+
+  { TRewriteMakeFileApp }
+
+  TRewriteMakeFileApp = Class(TCustomApplication)
+  Private
+    FTool : TRewriteMakeFile;
+    FFilenames : TStringArray;
+    procedure ToolLog(Sender: TObject; EventType: TEventType; const Msg: String
+      );
+  Protected
+    procedure DoLog(EventType: TEventType; const Msg: String); override;
+    procedure Usage (aMsg : string);
+    function ProcessOptions : Boolean;
+    Procedure DoRun; override;
+  Public
+    Constructor Create(aOwner : TComponent); override;
+    Destructor Destroy; override;
+  end;
+
+{ TRewriteMakeFileApp }
+
+procedure TRewriteMakeFileApp.ToolLog(Sender: TObject; EventType: TEventType;
+  const Msg: String);
+begin
+  DoLog(EventType,Msg);
+end;
+
+procedure TRewriteMakeFileApp.DoLog(EventType: TEventType; const Msg: String);
+begin
+  Writeln('[',EventType,'] ',Msg);
+end;
+
+procedure TRewriteMakeFileApp.Usage(aMsg: string);
+begin
+  if aMsg<>'' then
+    Writeln('Error: ',aMsg);
+  Writeln('Usage : ',ExtractFileName(ParamStr(0)),' [options] File1 [File2..FileN]');
+  Writeln('-a --aliases=FILE       Load aliases from FILE');
+  Writeln('-c --common=FILE        Load names of units that must be in $(NSINC) from FILE');
+  Writeln('-s --skip=FILE          Load names of units for which no rule must be made. ');
+  ExitCode:=Ord(AMsg<>'');
+end;
+
+
+function TRewriteMakeFileApp.ProcessOptions: Boolean;
+
+Const
+  ShortOpts = 'hc:a:s:';
+  LongOpts : Array of string = ('help','common:','aliases:','skip:');
+
+Var
+  S : String;
+
+begin
+  Result:=False;
+  S:=CheckOptions(ShortOpts,LongOpts);
+  if (S<>'') or HasOPtion('h','help') then
+    begin
+    Usage(S);
+    exit;
+    end;
+  FTool.AliasesFileName:=GetOptionValue('a','aliases');
+  FTool.CommonUnitsFileName:=GetOptionValue('c','common');
+  FTool.SkipUnitsFileName:=GetOptionValue('s','skip');
+  FFilenames:=GetNonOptions(ShortOpts,LongOpts);
+  Result:=(FTool.AliasesFileName<>'');
+  if Not Result then
+    begin
+    Usage('Need aliases file');
+    exit;
+    end;
+  Result:=Length(FFilenames)>0;
+  if Not Result then
+    begin
+    Usage('Need file list');
+    exit;
+    end;
+end;
+
+procedure TRewriteMakeFileApp.DoRun;
+
+var
+  aFile : String;
+
+begin
+  StopOnException:=True;
+  Terminate;
+  if not ProcessOptions then
+    exit;
+  For aFile in FFilenames do
+    FTool.HandleMakeFile(aFile);
+end;
+
+constructor TRewriteMakeFileApp.Create(aOwner: TComponent);
+begin
+  inherited Create(aOwner);
+  FTool:=TRewriteMakeFile.Create(Self);
+  FTool.OnLog:=@ToolLog;
+end;
+
+destructor TRewriteMakeFileApp.Destroy;
+begin
+  FreeAndNil(FTool);
+  inherited Destroy;
+end;
+
+begin
+  With TRewriteMakeFileApp.Create(nil) do
+    try
+      Initialize;
+      Run;
+    finally
+      Free;
+    end;
+end.
+

+ 498 - 0
utils/dotutils/rewritemakefile.pas

@@ -0,0 +1,498 @@
+unit rewritemakefile;
+
+{$mode ObjFPC}{$H+}
+
+interface
+
+uses strutils, regexpr, sysutils, classes, types, prefixer;
+
+Type
+
+  { TRewriteMakeFile }
+  TMakeFileToolLogEvent = procedure(Sender : TObject; EventType : TEventType; Const Msg : String) of object;
+
+  TRewriteMakeFile = Class(TComponent)
+  private
+    FAliasesFileName: String;
+    FNew,
+    FCommon,
+    FNames,
+    FSkip,
+    FAliases : TStrings;
+    FOnLog: TMakeFileToolLogEvent;
+    FCommonUnitsFileName: String;
+    FSkipUnitsFileName: String;
+
+    procedure SetAliasesFileName(AValue: String);
+    procedure SetCommonUnitsFileName(AValue: String);
+    procedure SetSkipUnitsFileName(AValue: String);
+  Protected
+    procedure DoMsg(const aFmt: String; const aArgs: array of const;
+      EventType: TEventType=etInfo); overload;
+    procedure DoMsg(const aMessage: String; EventType: TEventType=etInfo); overload;
+
+    procedure LoadNames(const aFileName: String; aAliases, aNames: TStrings); virtual;
+    procedure addRecipe(aRecipe: TStrings); virtual;
+    function GetNextLine(aLines: TStrings; var I: integer; var aLine: String): Boolean;
+    function GetDottedUnitSrc(const aUnit,DottedUnit, aExt : String) : String; virtual;
+  Public
+    class function ExtractSourceExt(aLine, aUnit: string): String;
+    class function ReplaceSourceFile(aLine, aUnit: string): String;
+    class function CheckContinue(aLine: String): Boolean;
+    class function CorrectSpaces(S: String; aIndent: String): string;
+    class procedure FixTabs(sl: TStrings);
+    class function IsRule(aLine: String): Boolean;
+    class function ReplaceUnits(const aLine: string; aUnitNames: TStrings): String;
+    class function ReplaceWord(aLine, aName, aFull: String): String;
+    class function StripMacroChars(S: String): String;
+  Public
+    Constructor Create(aOwner : TComponent); override;
+    Destructor Destroy; override;
+    procedure HandleMakeFile(aFileName: string);
+    Property AliasesFileName : String Read FAliasesFileName Write SetAliasesFileName;
+    Property CommonUnitsFileName : String Read FCommonUnitsFileName Write SetCommonUnitsFileName;
+    Property SkipUnitsFileName : String Read FSkipUnitsFileName Write SetSkipUnitsFileName;
+    Property OnLog : TMakeFileToolLogEvent Read FOnLog Write FOnLog;
+  end;
+
+Implementation
+
+class function TRewriteMakeFile.ReplaceWord(aLine, aName, aFull: String): String;
+
+var
+  RE : TRegExpr;
+
+begin
+  RE:=TRegExpr.Create('\b'+aName+'\b');
+  try
+    RE.ModifierI:=True;
+    Result:=RE.Replace(aLine,aFull);
+//    Writeln(aLine,': ',aName,' -> ',aFull,' = ',Result);
+  finally
+    RE.Free;
+  end;
+end;
+
+
+class function TRewriteMakeFile.ReplaceUnits(const aLine: string; aUnitNames: TStrings): String;
+
+Var
+  res,aName,aFull : String;
+
+begin
+  Res:=aLine;
+  for aName in aUnitNames do
+    begin
+    aFull:='$('+UpperCase(aName)+'UNIT)';
+    Res:=ReplaceWord(Res,aName,aFull);
+    end;
+  Result:=Res;
+end;
+
+procedure TRewriteMakeFile.SetAliasesFileName(AValue: String);
+begin
+  if FAliasesFileName=AValue then Exit;
+  FAliasesFileName:=AValue;
+  if aValue='' then
+    FAliases.Clear;
+  FNames.Clear;
+  LoadNames(aValue,FAliases,FNames);
+end;
+
+procedure TRewriteMakeFile.SetCommonUnitsFileName(AValue: String);
+begin
+  if FCommonUnitsFileName=AValue then Exit;
+  FCommonUnitsFileName:=AValue;
+  if aValue='' then
+    FCommon.Clear
+  else
+    FCommon.LoadFromFile(aValue);
+end;
+
+procedure TRewriteMakeFile.SetSkipUnitsFileName(AValue: String);
+begin
+  if FSkipUnitsFileName=AValue then Exit;
+  FSkipUnitsFileName:=AValue;
+  if aValue='' then
+    FSkip.Clear
+  else
+    FSkip.LoadFromFile(aValue);
+end;
+
+procedure TRewriteMakeFile.DoMsg(const aFmt: String;
+  const aArgs: array of const; EventType: TEventType);
+
+begin
+  DoMsg(Format(aFmt,aArgs),EventType);
+end;
+
+procedure TRewriteMakeFile.DoMsg(const aMessage: String; EventType: TEventType);
+begin
+  if assigned(OnLog) then
+    OnLog(Self,EventType, aMessage);
+end;
+
+procedure TRewriteMakeFile.LoadNames(const aFileName: String; aAliases,
+  aNames: TStrings);
+
+var
+  I : integer;
+  N,V : String;
+
+begin
+  aAliases.LoadFromFile(aFileName);
+  for I:=0 to aAliases.Count-1 do
+    begin
+    aAliases.GetNameValue(I,N,V);
+    if SameText(N,'unixcp') then
+      Writeln('Aloha');
+    aAliases[I]:=N+'='+TPrefixer.ApplyAliasRule(N,V);
+    aNames.Add(N);
+    end;
+end;
+
+class function TRewriteMakeFile.CheckContinue(aLine: String): Boolean;
+
+Var
+  L : Integer;
+
+begin
+  L:=Length(aLine);
+  Result:=(L>0) and (aLine[L]='\');
+end;
+
+class function TRewriteMakeFile.IsRule(aLine: String): Boolean;
+
+begin
+  Result:=(aLine='') or (aLine[1]=#9)
+end;
+
+function TRewriteMakeFile.GetNextLine(aLines: TStrings; var I: integer;
+  var aLine: String): Boolean;
+
+begin
+  Result:=I<aLines.Count-1;
+  if Result then
+    begin
+    Inc(I);
+    aLine:=aLines[i];
+    end;
+end;
+
+function TRewriteMakeFile.GetDottedUnitSrc(const aUnit, DottedUnit, aExt: String
+  ): String;
+begin
+  if FCommon.IndexOf(aUnit)=-1 then
+    Result:='$(NSOSDIR)/'
+  else
+    Result:='$(NSINC)/';
+  Result:=Result+DottedUnit+aExt
+end;
+
+class function TRewriteMakeFile.ReplaceSourceFile(aLine, aUnit: string): String;
+
+  Procedure AddToResult(S: String);
+
+  begin
+    if Result<>'' then
+      Result:=Result+' ';
+    Result:=Result+S;
+  end;
+
+  Function ReplacePath(S : String) : String;
+
+  begin
+    if pos(aUnit+'.pp',S)>0 then
+      Result:='$<'
+    else if pos(aUnit+'.pas',S)>0 then
+      Result:='$<'
+    else
+      Result:=S;
+  end;
+
+Var
+  a : Array of string;
+  S : String;
+
+begin
+  Result:='';
+  A:=SplitString(aLine,' ');
+  For S in a do
+    begin
+    if Pos(aUnit,S)=0 then
+      AddToResult(S)
+    else
+      AddToResult(ReplacePath(S));
+    end;
+end;
+
+class function TRewriteMakeFile.StripMacroChars(S: String): String;
+
+begin
+  if Pos('$(',S)=0 then
+    Result:=S
+  else
+    begin
+    Result:=StringReplace(S,'$(','',[]);
+    Result:=StringReplace(Result,')','',[]);
+    end;
+end;
+
+constructor TRewriteMakeFile.Create(aOwner: TComponent);
+begin
+  inherited Create(aOwner);
+  FAliases:=TStringList.Create;
+  FNames:=TStringList.Create;
+  FCommon:=TStringList.Create;
+  FNew:=TStringList.Create;
+  FSkip:=TStringList.Create;
+end;
+
+destructor TRewriteMakeFile.Destroy;
+begin
+  FreeAndNil(FSkip);
+  FreeAndNil(FNew);
+  FreeAndNil(FAliases);
+  FreeAndNil(FNames);
+  FreeAndNil(FCommon);
+  inherited Destroy;
+end;
+
+class function TRewriteMakeFile.CorrectSpaces(S: String; aIndent: String
+  ): string;
+
+var
+  len,aCount : Integer;
+
+begin
+  aCount:=0;
+  len:=Length(aIndent);
+  While (aCount<Length(S)) and (S[aCount+1]=' ') do
+    inc(aCount);
+  Result:=S;
+  if aCount<Len then
+    Result:=Copy(aIndent,1,Len-aCount)+Result
+  else if aCount>Len then
+    Delete(Result,1,aCount-Len);
+end;
+
+class function TRewriteMakeFile.ExtractSourceExt(aLine, aUnit: string): String;
+
+Var
+  a : Array of string;
+  S : String;
+
+begin
+  Result:='';
+  A:=SplitString(aLine,' ');
+  For S in a do
+    begin
+    if Pos(aUnit,S)<>0 then
+      begin
+      Result:=ExtractFileExt(S);
+      exit;
+      end;
+    end;
+
+end;
+
+procedure TRewriteMakeFile.addRecipe(aRecipe: TStrings);
+
+var
+  aTarget, aCompileLine, aExt, aUnit, aDottedUnit, aCasedUnit,  aLine,aDeps,aUpper,aIndent,UnitDeps : String;
+  P,NameIdx,Idx,I,iRules : Integer;
+
+begin
+  aLine:=aRecipe[0];
+  P:=Pos('$(PPUEXT)',aLine);
+  aUnit:=Trim(Copy(aLine,1,P-1));
+  if FSkip.IndexOf(aUnit)<>-1 then
+    begin
+    DoMsg('Skipping unit "%s"',[aUnit],etWarning);
+    Exit;
+    end;
+  NameIdx:=FNames.IndexOf(aUnit);
+  if NameIdx<>-1 then
+    FNames.Delete(NameIdx);
+
+  P:=Pos(':',aLine);
+  aTarget:=Copy(aLine,1,P);
+  aDeps:=Copy(aLine,P+1);
+  aUpper:=UpperCase(aUnit);
+  UnitDeps:=StripMacroChars(aUpper)+'_DEPS';
+  FNew.Add('');
+  aExt:=ExtractSourceExt(aDeps,aUnit);
+  aDeps:=UNITDEPS+'='+Trim(ReplaceUnits(aDeps,FNames));
+  if aDeps[Length(aDeps)]<>'\' then
+    aDeps:=aDeps+'\';
+  FNew.Add(aDeps);
+  aIndent:=StringOfChar(' ',Length(UnitDeps)+1);
+  i:=0;
+  While CheckContinue(aLine) and GetNextLine(aRecipe,I,aLine) do
+    begin
+    if aExt='' then
+      aExt:=ExtractSourceExt(aDeps,aUnit);
+    aDeps:=CorrectSpaces(ReplaceUnits(aLine,FNames),aIndent);
+    if aDeps[Length(aDeps)]<>'\' then
+      aDeps:=aDeps+'\';
+    FNew.Add(aDeps);
+    end;
+  FNew.Add(aIndent+'$('+UnitDeps+'_OS) '+'$('+UnitDeps+'_CPU)');
+  FNew.Add('');
+  FNew.Add(aTarget+' $('+UnitDeps+')');
+  iRules:=I;
+  While GetNextLine(aRecipe,I,aLine) and IsRule(aLine) do
+    begin
+    aCompileLine:=ReplaceSourceFile(aLine,aUnit);
+    FNew.Add(ReplaceUnits(aCompileLine,FNames));
+    end;
+  Idx:=FAliases.IndexOfName(aUnit);
+  if Idx<>-1 then
+    begin
+    FAliases.GetNameValue(Idx,aCasedUnit,aDottedunit);
+    aTarget:=StringReplace(aTarget,aUnit,aDottedUnit,[]);
+    FNew.Add('');
+    FNew.Add(aTarget+' '+GetDottedUnitSrc(aUnit,aDottedUnit,aExt)+' $('+UnitDeps+')');
+    I:=iRules;
+    While GetNextLine(aRecipe,I,aLine) and IsRule(aLine) do
+      begin
+      aCompileLine:=ReplaceSourceFile(aLine,aUnit);
+      FNew.Add(ReplaceUnits(aCompileLine,FNames));
+      end;
+    end;
+  if NameIdx<>-1 then
+    FNames.Insert(NameIdx,aUnit);
+end;
+
+class procedure TRewriteMakeFile.FixTabs(sl:TStrings);
+var
+  i,j,k : integer;
+  s,s2  : string;
+  isContinue : Boolean;
+begin
+  isContinue:=False;
+  i:=0;
+  while (i<sl.Count) do
+    begin
+    s:=sl[i];
+    if Not IsContinue then
+      begin
+      if (s<>'') and (s[1] in [' ',#9]) then
+        begin
+        k:=0;
+        j:=0;
+        repeat
+          inc(j);
+          case s[j] of
+            ' ' :
+              inc(k);
+            #9 :
+              k:=(k+7) and not(7);
+          else
+              break;
+          end;
+        until (j=length(s));
+        if k>7 then
+          begin
+          s2:='';
+          Delete(s,1,j-1);
+          while (k>7) do
+           begin
+           s2:=s2+#9;
+           dec(k,8);
+           end;
+          while (k>0) do
+           begin
+           s2:=s2+' ';
+           dec(k);
+           end;
+          sl[i]:=s2+s;
+          end;
+        end;
+      end;
+    IsContinue:=(S<>'') and (S[Length(S)]='\');
+    inc(i);
+    end;
+end;
+
+
+
+procedure TRewriteMakeFile.HandleMakeFile(aFileName: string);
+
+Var
+  aMakeFile : TStrings;
+
+  Function DoGetNextLine(var I : integer; var aLine : String) : Boolean;
+
+  begin
+    Result:=GetNextLine(aMakeFile,I,aLine);
+  end;
+
+var
+  i,P : Integer;
+  aRecipe : TStrings;
+  aSection,aLine : String;
+
+begin
+  aLine:='';
+  aRecipe:=Nil;
+  aMakeFile:=TStringList.Create;
+  try
+    aRecipe:=TstringList.Create;
+    aMakeFile.LoadFromFile(aFileName);
+    FixTabs(aMakeFile);
+    I:=-1;
+    While DoGetNextLine(I,aLine) do
+      begin
+      aLine:=aMakefile[I];
+      if Copy(aLine,1,1)='[' then
+        aSection:=LowerCase(Copy(aLine,2,Length(aLine)-2));
+      Case asection of
+      'rules',
+      'prerules' :
+        begin
+        P:=Pos('$(PPUEXT)',aLine);
+        if (P>0) and (Pos(':',aLine)>P) then
+          begin
+          aRecipe.Clear;
+          aRecipe.Add(aLine);
+          // Add continuation lines
+          While CheckContinue(aLine) and DoGetNextLine(I,aLine) do
+            aRecipe.Add(aLine);
+          // Add compiler rules
+          While DoGetNextLine(I,aLine) and (IsRule(aLine)) do
+            aRecipe.add(aLine);
+          addRecipe(aRecipe);
+          Dec(I); // Go back to previous line.
+          end
+        else
+          FNew.Add(aLine);
+        end;
+      'shared',
+      'target':
+        begin
+        P:=Pos('=',aLine);
+        if (P>0) and (IndexText(Trim(Copy(aLine,1,P-1)),['units','implicitunits','libunits'])<>-1)  then
+          begin
+          FNew.Add(ReplaceUnits(aLine,FNames));
+          While CheckContinue(aLine) and DoGetNextLine(I,aLine) do
+            FNew.Add(ReplaceUnits(aLine,FNames));
+          end
+        else
+          FNew.Add(aLine);
+        end;
+      else
+        FNew.Add(aLine);
+      end;
+      end;
+//      ReplaceUnits(aMakefile[I],aNames);
+    FNew.SaveToFile(aFileName+'.new');
+  finally
+    aMakeFile.Free;
+    aRecipe.Free;
+  end;
+end;
+
+
+end.
+