carbon: removed objcparser from pascocoa

git-svn-id: trunk@24107 -
This commit is contained in:
dmitry 2010-03-20 09:57:06 +00:00
parent 6a78f28957
commit f1812c07c0
10 changed files with 0 additions and 6796 deletions

9
.gitattributes vendored
View File

@ -4557,15 +4557,6 @@ lcl/interfaces/carbon/pascocoa/foundation/NSString.inc svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/foundation/NSValue.inc svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/foundation/NSZone.inc svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/foundation/foundation.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/ObjCParserTypes.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/ObjCParserUtils.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/ObjCTemplate.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/ObjCToPas.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/default.ini svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/gnuccFeatures.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/objcparser.lpi svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/objcparser.pas svneol=native#text/plain
lcl/interfaces/carbon/pascocoa/parser/testparser.sh svneol=native#text/plain
lcl/interfaces/cocoa/Makefile svneol=native#text/plain
lcl/interfaces/cocoa/Makefile.fpc svneol=native#text/plain
lcl/interfaces/cocoa/cocoaint.pas svneol=native#text/plain

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,242 +0,0 @@
unit ObjCTemplate;
interface
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
uses
Classes, SysUtils, ObjCParserTypes, ObjCParserUtils;
type
TTemplateList = class(TObject)
public
Params : TStringList;
SubLists : TList;
Owner : TTemplateList;
Name : AnsiString;
constructor Create(AOwner: TTemplateList);
destructor Destroy; override;
end;
TTemplateValues = class(TObject)
public
procedure ProcSpecial(const Special: AnsiString; var ReplaceText: AnsiString); virtual;
end;
TTemplateProc = class(TObject)
private
fTemplate : AnsiString;
fRoot : TTemplateList;
fStack : TList;
fValues : TTemplateValues;
fText : AnsiString;
protected
function CurrentList: TTEmplateList;
function GetReplace(const tmp: AnsiString; var AtIndex: Integer): AnsiString;
function ParseNextProc(var Proc: AnsiString; var idx: Integer): AnsiString;
procedure DoParse(var idx: Integer; const EndTmp: AnsiString);
public
function Parse(const Template: AnsiString; RootList: TTemplateList; AValues: TTemplateValues): AnsiString;
end;
TPascalValues = class(TTemplateValues)
private
fEndsCount : Integer;
ClassEnd : Boolean;
ClassSection : AnsiString;
public
procedure ProcSpecial(const Special: AnsiString; var ReplaceText: AnsiString); override;
end;
implementation
const
PreProcChar : AnsiChar = '%';
PreProcMark : TCharSet = ['%'];
function GetTmpParam(const temp: AnsiString; var i: Integer): AnsiString;
begin
ScanWhile(temp, i, [#13, #10, #32, #9]);
Result := ScanTo(temp, i, [#32, #9, #13, #10]);
end;
{ TTemplate }
function TTemplateProc.CurrentList: TTemplateList;
begin
Result := TTemplateList(fStack[fStack.Count-1])
end;
procedure TTemplateProc.DoParse(var idx: Integer; const EndTmp: AnsiString);
var
prc : AnsiString;
isValue : Boolean;
t : AnsiString;
begin
while idx <= length(fTemplate) do begin
fText := fText + ParseNextProc(prc, idx);
isValue := false;
if (EndTmp <> '') and (prc = EndTmp) then Exit;
if prc = '' then Continue;
if prc[1] = '_' then begin
prc := Copy(prc, 2, length(prc)-1);
isValue := true;
end;
if prc = '' then Continue;
if isValue then begin
if Assigned(fValues) then begin
fValues.ProcSpecial(AnsiLowerCase(prc), t);
fText := fText + t
end;
end else begin
//inc(idx);
fText := fText + GetReplace(AnsiLowerCase(prc), idx);
end;
end;
end;
function TTemplateProc.GetReplace(const tmp: AnsiString; var AtIndex: Integer): AnsiString;
var
i : Integer;
nm : AnsiString;
j : Integer;
l : TTemplateList;
ExitIndex:Integer;
idx : Integer;
begin
Result := '';
i := 1;
if AnsiLowerCase(GetTmpParam(tmp, i)) = 'foreach' then begin
nm := GetTmpParam(tmp, i);
ExitIndex := AtIndex;
for j := 0 to CurrentList.SubLists.Count - 1 do begin
l := TTemplateList(CurrentList.SubLists[j]);
idx := AtIndex;
if l.Name = nm then begin
fStack.Add(l);
DoParse(idx, 'end');
fStack.Delete(fStack.Count-1);
ExitIndex := idx;
end;
end;
AtIndex := ExitIndex;
end else begin
Result := CurrentList.Params.Values[tmp];
end;
end;
function TTemplateProc.Parse(const Template: String;
RootList: TTemplateList; AValues: TTemplateValues): AnsiString;
var
i : integer;
begin
fTemplate := Template;
fRoot := RootList;
fValues := AValues;
fStack := TList.Create;
try
i := 1;
fStack.Add(RootList);
DoParse(i, '');
finally
fStack.Free;
end;
Result := fText;
end;
function TTemplateProc.ParseNextProc(var Proc: string; var idx: Integer): AnsiString;
var
canQuit : Boolean;
begin
canQuit := false; // just don't like: repeat until false;
Result := '';
repeat
Result := Result + ScanTo(fTemplate, idx, PreProcMark);
if idx > length(fTemplate) then begin
Proc := '';
canQuit := true;
end else begin
if (idx < length(fTemplate)) and (fTemplate[idx+1] = PreProcChar) then begin
Result := Result + PreProcChar;
inc(idx,2);
end else begin
inc(idx);
Proc := ScanTo(fTemplate, idx, PreProcMark);
CanQuit := true;
inc(idx);
end;
end;
until canQuit;
end;
{ TTemplateList }
constructor TTemplateList.Create(AOwner: TTemplateList);
begin
Owner := AOwner;
SubLists := TList.Create;
Params := TStringList.Create;
end;
destructor TTemplateList.Destroy;
begin
SubLists.Free;
Params.Free;
inherited;
end;
{ TPascalValues }
procedure TPascalValues.ProcSpecial(const Special: AnsiString;
var ReplaceText: AnsiString);
begin
ReplaceText := '';
if (Special = 'pasprivate') or (Special = 'pasprotected') or (Special = 'paspublic') then begin
if ClassSection = '' then begin
ClassEnd := true;
inc(fEndsCount);
end;
if ClassSection <> Special then
ReplaceText := Copy(Special, 4, length(Special) - 3); //removed 'pas' prefix
ClassSection := Special;
end else if (Special = 'pasend') or (Special = 'pasend.') or (Special = 'pasend;')then begin
if fEndsCount > 0 then begin
ReplaceText := Copy(Special, 4, length(Special) - 3); //removed 'pas' prefix
dec(fEndsCount);
if classEnd then begin
classEnd := false;
ClassSection := '';
end;
end;
end;
end;
{ TTemplateValues }
procedure TTemplateValues.ProcSpecial(const Special: AnsiString;
var ReplaceText: AnsiString);
begin
ReplaceText := '';
end;
end.

View File

@ -1,95 +0,0 @@
unit ObjCToPas;
{ * This file is part of ObjCParser tool
* Copyright (C) 2008-2009 by Dmitry Boyarintsev under the GNU LGPL
* license version 2.0 or 2.1. You should have received a copy of the
* LGPL license along with at http://www.gnu.org/
}
// the unit contains (should contain) lobjc to Pascal convertion utility routines
// todo: move all ObjCParserUtils functions here.
interface
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
uses
SysUtils, ObjCParserTypes;
const
ObjCDefaultParamDelim = '_';
type
TCProcessor = class(TObject)
public
procedure ProcessTree(Root: TEntity); virtual; abstract;
end;
function ObjCToPasMethodName(mtd: TClassMethodDef; CutLastDelims: Boolean = false; ParamDelim: AnsiChar = ObjCDefaultParamDelim): AnsiString;
function IsPascalReserved(const s: AnsiString): Boolean;
implementation
function ObjCToPasMethodName(mtd: TClassMethodDef; CutLastDelims: Boolean; ParamDelim: AnsiChar): AnsiString;
var
i : Integer;
obj : TObject;
begin
Result := mtd._Name;
for i := 0 to mtd.Items.Count - 1 do begin
obj := mtd.Items[i];
if not Assigned(obj) then Continue;
if obj is TParamDescr then begin
Result := Result + TParamDescr(obj)._Descr;
end else if obj is TObjCParameterDef then
Result := Result + ParamDelim;
end;
if CutLastDelims then begin
i := length(Result);
while (i > 0) and (Result[i] = ParamDelim) do dec(i);
Result := Copy(Result, 1, i);
end;
end;
// 'result' is considered reserved word!
function IsPascalReserved(const s: AnsiString): Boolean;
var
ls : AnsiString;
begin
//todo: a hash table should be used!
Result := false;
if s = '' then Exit;
ls := AnsiLowerCase(s);
case ls[1] of
'a': Result := (ls = 'absolute') or (ls = 'abstract') or (ls = 'and') or (ls = 'array') or (ls = 'as') or (ls= 'asm') or (ls = 'assembler');
'b': Result := (ls = 'begin') or (ls = 'break');
'c': Result := (ls = 'cdecl') or (ls = 'class') or (ls = 'const') or (ls = 'constructor') or (ls = 'continue') or (ls = 'cppclass');
'd': Result := (ls = 'deprecated') or (ls = 'destructor') or (ls = 'div') or (ls = 'do') or (ls = 'downto');
'e': Result := (ls = 'else') or (ls = 'end') or (ls = 'except') or (ls = 'exit') or (ls = 'export') or (ls = 'exports') or (ls = 'external');
'f': Result := (ls = 'fail') or (ls = 'false') or (ls = 'far') or (ls = 'file') or (ls = 'finally') or (ls = 'for') or (ls = 'forward') or (ls = 'function');
'g': Result := (ls = 'goto');
'i':
Result := (ls = 'if') or (ls = 'implementation') or (ls = 'in') or (ls = 'index') or (ls = 'inherited') or (ls = 'initialization') or (ls = 'inline')
or (ls = 'interface') or (ls = 'interrupt') or (ls = 'is');
'l': Result := (ls = 'label') or (ls = 'library');
'm': Result := (ls = 'mod');
'n': Result := {(ls = 'name') or} (ls = 'near') or (ls = 'nil') or (ls = 'not');
'o': Result := (ls = 'object') or (ls = 'of') or (ls = 'on') or (ls = 'operator') or (ls = 'or') or (ls = 'otherwise');
'p':
Result := (ls = 'packed') or (ls = 'popstack') or (ls = 'private') or (ls = 'procedure') or (ls = 'program') or (ls = 'property')
or (ls = 'protected') or (ls = 'public');
'r': Result := (ls = 'raise') or (ls = 'record') or (ls = 'reintroduce') or (ls = 'repeat') or (ls = 'result');
's': Result := (ls = 'self') or (ls = 'set') or (ls = 'shl') or (ls = 'shr') or (ls = 'stdcall') or (ls = 'string');
't': Result := (ls = 'then') or (ls = 'to') or (ls = 'true') or (ls = 'try') or (ls = 'type');
'u': Result := (ls = 'unimplemented') or (ls = 'unit') or (ls = 'until') or (ls = 'uses');
'v': Result := (ls = 'var') or (ls = 'virtual');
'w': Result := (ls = 'while') or (ls = 'with');
'x': Result := (ls = 'xor');
end;
end;
end.

View File

@ -1,270 +0,0 @@
[common]
ignoreincludes0=CoreFoundation/
ignoreincludes1=stdint.h setjmp.h stdarg.h stdbool.h limits.h stdarg.h
ignoreincludes2=AvailabilityMacros.h
ignoreincludes3=ApplicationServices/
ignoreincludes4=ApplicationServices/../FrameWorks/CoreGraphics.framework/Headers/
ignoreincludes5=AvailabilityMacros.h
[TypeReplace]
NSStringRef=CFStringRef
NSStringRef*=CFStringRef
NSArray=CFArrayRef
NSArray*=CFArrayRef
NSCharacterSet=CFCharacterSetRef
NSCharacterSet*=CFCharacterSetRef
NSData=CFDataRef
NSData*=CFDataRef
NSDate=CFDateRef
NSDate*=CFDateRef
NSDictionary=CFDictionaryRef
NSDictionary*=CFDictionaryRef
NSMutableArray=CFMutableArrayRef
NSMutableArray*=CFMutableArrayRef
NSMutableCharacterSetRef=CFMutableCharacterSetRef
NSMutableCharacterSetRef*=CFMutableCharacterSetRef
NSMutableData = CFMutableDataRef
NSMutableDictionary = CFMutableDictionaryRef
NSMutableSet = CFMutableSetRef
NSMutableString = CFMutableStringRef
NSNumber = CFNumberRef
NSInputStream = CFReadStreamRef
NSTimer= CFRunLoopTimerRef
NSSet= CFSetRef
NSString=CFStringRef
NSTimeZone= CFTimeZoneRef
NSURL= CFURLRef
NSOutputStream = CFWriteStreamRef
AEDesc*=AEDescPtr
NSMutableData*= CFMutableDataRef
NSMutableDictionary*= CFMutableDictionaryRef
NSMutableSet*= CFMutableSetRef
NSMutableString* = CFMutableStringRef
NSNumber* = CFNumberRef
NSInputStream*= CFReadStreamRef
NSTimer*= CFRunLoopTimerRef
NSSet*= CFSetRef
NSString*= CFStringRef
NSTimeZone*= CFTimeZoneRef
NSURL*= CFURLRef
NSOutputStream*= CFWriteStreamRef
[TypeDefs]
CGRect=struct
CGSize=struct
CGPoint=struct
CFTimeInterval=float
CGAffineTransform=struct
NSRect=struct
NSPoint=struct
NSSize=struct
NSRange=struct
NSTimeInterval=float
NSAffineTransformStruct=struct
NSAffineTransform=objcclass
NSAppleEventDescriptor=objcclass
NSAppleEventManager=objcclass
NSAppleScript=objcclass
NSArchiver=objcclass
NSUnarchiver=objcclass
NSObject=objcclass
NSArray=objcclass
NSMutableArray=objcclass
NSAttributedString=objcclass
NSMutableAttributedString=objcclass
NSAutoreleasePool=objcclass
NSBundle=objcclass
NSCalendar=objcclass
NSDateComponents=objcclass
NSCalendarDate=objcclass
NSDate=objcclass
NSCharacterSet=objcclass
NSMutableCharacterSet=objcclass
NSClassDescription=objcclass
NSCoder=objcclass
NSComparisonPredicate=objcclass
NSCompoundPredicate=objcclass
NSConnection=objcclass
NSDistantObjectRequest=objcclass
NSData=objcclass
NSMutableData=objcclass
NSDateFormatter=objcclass
NSDecimalNumber=objcclass
NSDecimalNumberHandler=objcclass
NSNumber=objcclass
NSScanner=objcclass
NSDictionary=objcclass
NSMutableDictionary=objcclass
NSDistantObject=objcclass
NSDistributedLock=objcclass
NSDistributedNotificationCenter=objcclass
NSEnumerator=objcclass
NSError=objcclass
NSException=objcclass
NSAssertionHandler=objcclass
NSExpression=objcclass
NSFileHandle=objcclass
NSPipe=objcclass
NSFileManager=objcclass
NSDirectoryEnumerator=objcclass
NSFormatter=objcclass
NSGarbageCollector=objcclass
NSValue=objcclass
NSHashTable=objcclass
NSHost=objcclass
NSHTTPCookie=objcclass
NSHTTPCookieStorage=objcclass
NSIndexPath=objcclass
NSIndexSet=objcclass
NSMutableIndexSet=objcclass
NSInvocation=objcclass
NSKeyedArchiver=objcclass
NSKeyedUnarchiver=objcclass
NSSet=objcclass
NSLocale=objcclass
NSLock=objcclass
NSConditionLock=objcclass
NSRecursiveLock=objcclass
NSCondition=objcclass
NSMapTable=objcclass
NSMetadataQuery=objcclass
NSMetadataItem=objcclass
NSMetadataQueryAttributeValueTuple=objcclass
NSMetadataQueryResultGroup=objcclass
NSMethodSignature=objcclass
NSNetService=objcclass
NSNetServiceBrowser=objcclass
NSNotification=objcclass
NSNotificationCenter=objcclass
NSNotificationQueue=objcclass
NSNull=objcclass
NSNumberFormatter=objcclass
NSOperation=objcclass
NSInvocationOperation=objcclass
NSOperationQueue=objcclass
NSString=objcclass
NSPointerArray=objcclass
NSPointerFunctions=objcclass
NSPort=objcclass
NSMachPort=objcclass
NSMessagePort=objcclass
NSSocketPort=objcclass
NSPortCoder=objcclass
NSPortMessage=objcclass
NSPortNameServer=objcclass
NSMachBootstrapServer=objcclass
NSMessagePortNameServer=objcclass
NSSocketPortNameServer=objcclass
NSPredicate=objcclass
NSMutableSet=objcclass
NSProcessInfo=objcclass
NSPropertyListSerialization=objcclass
NSProtocolChecker=objcclass
NSProxy=objcclass
NSRunLoop=objcclass
NSScriptClassDescription=objcclass
NSScriptCoercionHandler=objcclass
NSScriptCommand=objcclass
NSScriptCommandDescription=objcclass
NSScriptExecutionContext=objcclass
NSScriptObjectSpecifier=objcclass
NSIndexSpecifier=objcclass
NSMiddleSpecifier=objcclass
NSNameSpecifier=objcclass
NSPositionalSpecifier=objcclass
NSPropertySpecifier=objcclass
NSRandomSpecifier=objcclass
NSRangeSpecifier=objcclass
NSRelativeSpecifier=objcclass
NSUniqueIDSpecifier=objcclass
NSWhoseSpecifier=objcclass
NSCloneCommand=objcclass
NSCloseCommand=objcclass
NSCountCommand=objcclass
NSCreateCommand=objcclass
NSDeleteCommand=objcclass
NSExistsCommand=objcclass
NSGetCommand=objcclass
NSMoveCommand=objcclass
NSQuitCommand=objcclass
NSSetCommand=objcclass
NSScriptSuiteRegistry=objcclass
NSScriptWhoseTest=objcclass
NSLogicalTest=objcclass
NSSpecifierTest=objcclass
NSCountedSet=objcclass
NSSortDescriptor=objcclass
NSSpellServer=objcclass
NSStream=objcclass
NSInputStream=objcclass
NSOutputStream=objcclass
NSMutableString=objcclass
NSSimpleCString=objcclass
NSConstantString=objcclass
NSTask=objcclass
NSThread=objcclass
NSTimer=objcclass
NSTimeZone=objcclass
NSUndoManager=objcclass
NSURL=objcclass
NSURLAuthenticationChallenge=objcclass
NSCachedURLResponse=objcclass
NSURLCache=objcclass
NSURLConnection=objcclass
NSURLCredential=objcclass
NSURLCredentialStorage=objcclass
NSURLDownload=objcclass
NSURLHandle=objcclass
NSURLProtectionSpace=objcclass
NSURLProtocol=objcclass
NSURLRequest=objcclass
NSMutableURLRequest=objcclass
NSURLResponse=objcclass
NSHTTPURLResponse=objcclass
NSUserDefaults=objcclass
NSValueTransformer=objcclass
NSXMLDocument=objcclass
NSXMLDTD=objcclass
NSXMLDTDNode=objcclass
NSXMLElement=objcclass
NSXMLNode=objcclass
NSXMLParser=objcclass
[TokenReplace]
APPKIT_EXTERN=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED=
DEPRECATED_IN_MAC_OS_X_VERSION_10_0_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_1=
DEPRECATED_IN_MAC_OS_X_VERSION_10_1_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_2=
DEPRECATED_IN_MAC_OS_X_VERSION_10_2_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3=
AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_3=
DEPRECATED_IN_MAC_OS_X_VERSION_10_3_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4=
AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4=
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4=
DEPRECATED_IN_MAC_OS_X_VERSION_10_4_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER=
AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER_BUT_DEPRECATED=
AVAILABLE_MAC_OS_X_VERSION_10_0_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
AVAILABLE_MAC_OS_X_VERSION_10_2_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_5=
DEPRECATED_IN_MAC_OS_X_VERSION_10_5_AND_LATER=

View File

@ -1,70 +0,0 @@
{ * This file is part of ObjCParser tool
* Copyright (C) 2008-2009 by Dmitry Boyarintsev under the GNU LGPL
* license version 2.0 or 2.1. You should have received a copy of the
* LGPL license along with at http://www.gnu.org/
}
unit gnuccFeatures;
{list of GNU CC features, that might be found at header files
it's extermly possible that these language and precomipler features
are not to be compatible with MS C/C++ header files }
interface
{$ifdef fpc}{$mode delphi}{$h+}{$endif}
uses
ObjCParserTypes;
type
TAttribute = class(TEntity)
protected
function DoParse(AParser: TTextParser): Boolean; override;
public
Expression : AnsiString;
end;
function ParseAttribute(Parent: TEntity; Parser: TTextParser): TEntity;
implementation
function ParseAttribute(Parent: TEntity; Parser: TTextParser): TEntity;
var
attr : TAttribute;
begin
attr := TAttribute.Create(nil);
try
if attr.Parse(Parser) then begin
Parent.Items.Add(attr);
attr.owner := Parent;
Result:=attr;
end else begin
attr.Free;
Result := nil;
end;
finally
end;
end;
{ TAttribute }
function TAttribute.DoParse(AParser: TTextParser): Boolean;
var
s : string;
tt : TTokenType;
begin
Result := AParser.FindNextToken(s, tt);
if not Result or (s <> '__attribute__') then begin
Result := false;
Exit;
end;
Expression := ParseSeq(AParser, '(', ')');
Result := true;
end;
initialization
RegisterEntity( @ParseAttribute);
end.

View File

@ -1,212 +0,0 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<PathDelim Value="\"/>
<Version Value="7"/>
<General>
<Flags>
<MainUnitHasUsesSectionForAllUnits Value="False"/>
<MainUnitHasCreateFormStatements Value="False"/>
<MainUnitHasTitleStatement Value="False"/>
<LRSInOutputDirectory Value="False"/>
</Flags>
<MainUnit Value="0"/>
<TargetFileExt Value=""/>
<ActiveEditorIndexAtStart Value="2"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
<Language Value=""/>
<CharSet Value=""/>
</VersionInfo>
<PublishOptions>
<Version Value="2"/>
<IgnoreBinaries Value="False"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
</local>
</RunParams>
<Units Count="4">
<Unit0>
<Filename Value="objcparser.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="objcparser"/>
<CursorPos X="29" Y="24"/>
<TopLine Value="10"/>
<EditorIndex Value="0"/>
<UsageCount Value="26"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="ObjCParserUtils.pas"/>
<UnitName Value="ObjCParserUtils"/>
<CursorPos X="37" Y="888"/>
<TopLine Value="880"/>
<EditorIndex Value="2"/>
<UsageCount Value="13"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="ObjCParserTypes.pas"/>
<UnitName Value="ObjCParserTypes"/>
<CursorPos X="18" Y="503"/>
<TopLine Value="503"/>
<EditorIndex Value="3"/>
<UsageCount Value="13"/>
<Loaded Value="True"/>
</Unit2>
<Unit3>
<Filename Value="gnuccFeatures.pas"/>
<UnitName Value="gnuccFeatures"/>
<CursorPos X="1" Y="1"/>
<TopLine Value="1"/>
<EditorIndex Value="1"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1834" Column="30" TopLine="1824"/>
</Position1>
<Position2>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="7" Column="1" TopLine="1"/>
</Position2>
<Position3>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1171" Column="8" TopLine="1139"/>
</Position3>
<Position4>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position4>
<Position5>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="144" Column="138" TopLine="128"/>
</Position5>
<Position6>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="293" Column="14" TopLine="283"/>
</Position6>
<Position7>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position7>
<Position8>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="284" Column="9" TopLine="274"/>
</Position8>
<Position9>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position9>
<Position10>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="284" Column="9" TopLine="274"/>
</Position10>
<Position11>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="285" Column="9" TopLine="274"/>
</Position11>
<Position12>
<Filename Value="objcparser.pas"/>
<Caret Line="17" Column="18" TopLine="1"/>
</Position12>
<Position13>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1754" Column="3" TopLine="1751"/>
</Position13>
<Position14>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="422" Column="12" TopLine="412"/>
</Position14>
<Position15>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="5" Column="18" TopLine="1"/>
</Position15>
<Position16>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="16" Column="1" TopLine="11"/>
</Position16>
<Position17>
<Filename Value="ObjCParserTypes.pas"/>
<Caret Line="117" Column="29" TopLine="107"/>
</Position17>
<Position18>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="54" Column="34" TopLine="46"/>
</Position18>
<Position19>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="124" Column="5" TopLine="93"/>
</Position19>
<Position20>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position20>
<Position21>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="159" Column="143" TopLine="143"/>
</Position21>
<Position22>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="838" Column="36" TopLine="822"/>
</Position22>
<Position23>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="880" Column="51" TopLine="872"/>
</Position23>
<Position24>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position24>
<Position25>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="151" Column="1" TopLine="143"/>
</Position25>
<Position26>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="159" Column="143" TopLine="143"/>
</Position26>
<Position27>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="838" Column="36" TopLine="822"/>
</Position27>
<Position28>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="888" Column="26" TopLine="872"/>
</Position28>
<Position29>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position29>
<Position30>
<Filename Value="ObjCParserUtils.pas"/>
<Caret Line="159" Column="143" TopLine="143"/>
</Position30>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>
<Other>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="2">
<Item1>
<Name Value="ECodetoolError"/>
</Item1>
<Item2>
<Name Value="EFOpenError"/>
</Item2>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -1,611 +0,0 @@
{ * This file is part of ObjCParser tool
* Copyright (C) 2008-2009 by Dmitry Boyarintsev under the GNU LGPL
* license version 2.0 or 2.1. You should have received a copy of the
* LGPL license along with at http://www.gnu.org/
}
program objcparser;
{$ifdef fpc}
{$mode delphi}{$H+}
{$else}
{$APPTYPE CONSOLE}
{$warn unsafe_code off}
{$warn unsafe_type off}
{$warn unsafe_cast off}
{$endif}
uses
Classes,
IniFiles,
SysUtils,
ObjCParserUtils,
ObjCParserTypes,
ObjCTemplate,
gnuccFeatures;
type
// this object is used only for precomile directives handling
{ TPrecompileHandler }
TPrecompileHandler = class(TObject)
public
hdr : TObjCHeader;
procedure OnPrecompile(Sender: TObject; Precomp: TObject);
procedure OnComment(Sender: TObject; const Comment: AnsiString);
constructor Create(AHeader: TObjCHeader);
end;
var
updIni : AnsiString = '';
doOutput : Boolean = false;
doparseAll : Boolean = false;
const
TokenReplaceSec = 'TokenReplace';
TypeDefsSec = 'TypeDefs';
TypeReplaceSec = 'TypeReplace';
IgnoreIncludesSec = 'IgnoreIncludes';
CommonSec = 'Common';
function FindMax(const c: array of Integer; len: Integer): Integer;
var
i : integer;
mn : Integer;
begin
Result := -1;
if len = 0 then Exit;
mn := 0;
for i := 1 to len - 1 do begin
if c[i] < c[mn] then mn := i;
end;
Result := mn;
end;
procedure TPrecompileHandler.OnPrecompile(Sender: TObject; Precomp: TObject);
var
parser : TTextParser;
preEntity : TPrecompiler;
lst : TEntity;
prc : TPrecompilerEvent;
begin
parser := Sender as TTextParser;
//todo: change for something nicier =)
prc := parser.OnPrecompile;
parser.OnPrecompile := nil;
try
if parser.Stack.Count > 0 then
lst := TEntity(parser.Stack[parser.Stack.Count-1])
else
lst := nil;
preEntity := TPrecompiler.Create(lst);
preEntity.Parse(parser);
lst.Items.Add(preEntity);
finally
parser.OnPrecompile := prc;
end;
end;
procedure TPrecompileHandler.OnComment(Sender: TObject; const Comment: AnsiString);
var
parser : TTextParser;
cmt : TComment;
ent : TEntity;
begin
if length(Comment) < 2 then Exit;
parser := TTextParser(Sender);
if parser.Stack.Count > 0
then ent := TEntity(parser.Stack[parser.Stack.Count-1])
else ent := nil;
if not Assigned(ent) then Exit;
cmt := TComment.Create(ent);
cmt._Comment := Comment;
if IsSubStr('/*', cmt._Comment, 1) then begin
cmt._Comment[1] := '(';
if isSubStr('*/', cmt._Comment, length(cmt._Comment) - 1) then
cmt._Comment[ length(cmt._Comment)] := ')';
end;
ent.Items.Add(cmt);
end;
constructor TPrecompileHandler.Create(AHeader: TObjCHeader);
begin
hdr := AHeader;
end;
procedure UpdateIniWithEntity(Sets: TConvertSettings; Ini: TIniFile; Entity: TEntity);
var
cnv : AnsiString;
i : Integer;
begin
if Entity is TClassDef then begin
Ini.WriteString(TypeDefsSec, TClassDef(Entity)._ClassName, 'objcclass');
end else if Entity is TEntityStruct then begin
Ini.WriteString(TypeDefsSec, TEntityStruct(Entity)._Name, 'struct');
end else if Entity is TTypeNameDef then begin
if Assigned(Sets) then begin
cnv := AnsiLowerCase(ObjCToDelphiType(TTypeNameDef(Entity)._Inherited, false ));
if (cnv = 'float') or (cnv = 'double') then
Ini.WriteString(TypeDefsSec, TTypeNameDef(Entity)._TypeName, 'float')
else if (cnv = 'Int64') then
Ini.WriteString(TypeDefsSec, TTypeNameDef(Entity)._TypeName, 'struct')
end;
end;
for i := 0 to Entity.Items.Count - 1 do
UpdateIniWithEntity(Sets, Ini, Entity.Items[i]);
end;
function ReadAndParseFile(const FileName: AnsiString; outdata: TStrings; var Err: AnsiString): Boolean;
var
hdr : TObjCHeader;
parser : TTextParser;
prec : TPrecompileHandler ;
s : AnsiString;
i, cnt : integer;
upini : TIniFile;
repl : TStringList;
begin
Result :=false;
if not FileExists(FileName) then begin
Err := 'File not found: ' + FileName;
Exit;
end;
s := StrFromFile(FileName);
hdr := TObjCHeader.Create;
prec := TPrecompileHandler.Create(hdr);
parser := CreateCParser(s, true);
try
repl := TStringList.Create;
ConvertSettings.TokenReplace.GetReplaces(repl);
for i := 0 to repl.Count - 1 do begin
TCMacroHandler(parser.MacroHandler).AddSimpleMacro(repl.Names[i], repl.ValueFromIndex[i]);
end;
parser.Buf := s;
try
parser.UsePrecompileEntities := false;
parser.UseCommentEntities := false;
parser.OnPrecompile := prec.OnPrecompile;
parser.OnComment := prec.OnComment;
{for i := 0 to repl.Count - 1 do begin
TCMacroHandler(parser.MacroHandler).AddSimpleMacro(
ConvertSettings.IgnoreTokens[i], '');
//parser.IgnoreTokens.AddStrings(ConvertSettings.IgnoreTokens);
end;}
hdr._FileName := ExtractFileName(FileName);
Result := hdr.Parse(parser);
if not Result then begin
if parser.Errors.Count > 0 then Err := parser.Errors[0]
else Err := 'undesribed error';
Err := Err + #13#10;
cnt := 120;
i := parser.Index - cnt;
if i <= 0 then begin
i := 1;
cnt := parser.Index;
end;
Err := Err + Copy(parser.Buf, i, cnt);
end;
except
end;
if updIni <> '' then begin
upIni := TIniFile.Create(updIni);
try
UpdateIniWithEntity(ConvertSettings, upIni, hdr);
finally
upIni.Free;
end;
end;
WriteOutIncludeFile(hdr, outdata);
finally
parser.TokenTable.Free;
parser.Free;
prec.Free;
//FreeEntity(hdr);
end;
end;
procedure ParseAll;
var
// ch : char;
srch : TSearchRec;
res : Integer;
i : Integer;
pth : AnsiString;
incs : AnsiString;
st : TStringList;
f : Text;
err : AnsiString;
begin
{ err := '';
writeln('would you like to parse all current directory files .h to inc?');
readln(ch);
if (ch <> 'Y') and (ch <> 'y') then begin
writeln('as you wish, bye!');
Exit;
end;}
pth := IncludeTrailingPathDelimiter( GetCurrentDir);
res := FindFirst(pth + '*.h', -1, srch);
if res = 0 then begin
st := TStringList.Create;
try
repeat
write('found: ', srch.Name);
write(' parsing...');
//writeln('parsing: ', pth+srch.Name);
if ReadAndParseFile(pth+srch.Name, st, err) then begin
write(' parsed ');
incs := pth + Copy(srch.Name,1, length(srch.Name) - length(ExtractFileExt(srch.Name)));
incs := incs + '.inc';
//writeln(incs);
if doOutput then begin
assignfile(f, incs); rewrite(f);
try
for i := 0 to st.Count - 1 do
writeln(f, st[i]);
finally
closefile(f);
end;
end;
st.Clear;
end else begin
end;
until FindNext(srch) <> 0;
finally
FindClose(srch);
st.Free;
end;
end;
end;
const
ParamKey = '-';
function isParamValue(const s: AnsiString; var ParName, ParValue: AnsiString): Boolean;
var
i : Integer;
begin
Result := false;
if s = '' then Exit;
Result := (s[1] = ParamKey);
if not Result then Exit;
i := 1;
ScanWhile(s, i, [ParamKey]);
ParName := ScanTo(s, i, [#32, #9, '=']);
ScanWhile(s, i, [#32, #9, '=']);
ParValue := Copy(s, i, length(s) - i + 1);
end;
procedure AddSpaceSeparated(const s: AnsiString; Strings: TStringList);
var
i : Integer;
ns : AnsiString;
begin
i := 1;
while i <= length(s) do begin
ScanTo(s, i, ['A'..'Z', 'a'..'z']);
ns := ScanTo(s, i, [#32, #9, '"']);
if ns <> '' then Strings.Add(ns);
end;
end;
function isNameofPointer(const name: AnsiString): Boolean;
begin
Result := false;
if name = '' then Exit;
Result := name[length(name)] = '*';
end;
procedure ReadIniFile(Settings: TConvertSettings; const FileName: AnsiString);
var
ini : TIniFile;
values : TStringList;
a, b : AnsiString;
i : Integer;
IniName : AnsiString;
begin
// uikit.ini
if not FileExists(FileName) then begin
Exit;
end;
{$ifndef fpc}
if ExtractFileName(FileName) = FileName then
IniName := IncludeTrailingPathDelimiter( GetCurrentDir) + FileName
else
IniName := FileName;
{$else}
IniName := FileName;
{$endif}
ini := TIniFile.Create(IniName);
values := TStringList.Create;
try
values.Clear;
{ ini.ReadSection('TypeReplace', values);
for i := 0 to values.Count - 1 do begin
a := values.ValueFromIndex[i];
b := values.Values[a];
if b <> '' then begin
ense
Settings.TypeDefReplace[a] := b;
end;}
//[Common]
values.Clear;
a := ini.ReadString(CommonSec, 'mainunit', '');
if a <> '' then begin
b := '{%mainunit '+ a + '}';
for i := 0 to ConvertSettings.ConvertPrefix.Count - 1 do
if Pos(ConvertSettings.ConvertPrefix[i], '{%mainunit') = 1 then begin
ConvertSettings.ConvertPrefix[i] := b;
a := '';
Break;
end;
if a <> '' then
ConvertSettings.ConvertPrefix.Add(b);
end;
a := ini.ReadString(CommonSec, 'ignoreincludes', '');
ini.ReadSection('Common', values);
for i := 0 to values.Count - 1 do begin
if Pos('ignoreincludes', values[i]) = 1 then begin
b := ini.ReadString(CommonSec,values[i], '');
AddSpaceSeparated(b, ConvertSettings.IgnoreIncludes);
end;
end;
{ini.ReadSectionValues(IgnoreIncludesSec, values);
for i := 0 to values.Count - 1 do begin
ConvertSettings.IgnoreIncludes.AddStrings(values);
end;}
// [TokenReplace]
Values.Clear;
ini.ReadSection(TokenReplaceSec, values);
for i := 0 to values.Count - 1 do begin
a := Values[i];
b := ini.ReadString(TokenReplaceSec, a, '');
{if b ='' then
Settings.IgnoreTokens.Add(a)
else}
Settings.TokenReplace[a] := b;
end;
// [TypeReplace]
values.Clear;
ini.ReadSection(TypeDefsSec, values);
for i := 0 to values.Count - 1 do begin
a := Values[i];
b := AnsiLowerCase(ini.ReadString(TypeDefsSec, a, ''));
if b = 'objcclass' then
Settings.ObjCClassTypes.Add(a)
else if b = 'struct' then
Settings.StructTypes.Add(a)
else if b = 'float' then
Settings.FloatTypes.Add(a);
end;
values.Clear;
ini.ReadSection(TypeReplaceSec, values);
for i := 0 to values.Count - 1 do begin
a := Values[i];
b := ini.ReadString(TypeReplaceSec, a, '');
if isNameofPointer(a) then
Settings.PtrTypeReplace[ Copy(a, 1, length(a) - 1)] := b
else
Settings.TypeDefReplace[a] := b;
end;
finally
values.Free;
ini.Free;
end;
end;
function GetConvertSettings(Settings : TConvertSettings; var FileName: AnsiString): Boolean;
var
i : integer;
prm : AnsiString;
vlm : AnsiString;
Params : TStringList;
begin
prm := '';
vlm := '';
Params := TStringList.Create;
Params.CaseSensitive := false;
try
for i := 1 to ParamCount do begin
if isParamValue(ParamStr(i), prm, vlm) then begin
prm := AnsiLowerCase(prm);
if prm = 'noout' then doOutput:=false
else if prm = 'all' then doparseAll:=true
else if (prm = 'id') and (vlm <> '') then ConvertSettings.ObjcIDReplace:=vlm
else if (prm = 'call') then ConvertSettings.CallConv:=vlm
else if (prm = 'userefs') then ConvertSettings.UseRefClassType := true
else if (prm = 'refpostfix') then ConvertSettings.RefClassPostfix := vlm
else if prm = 'ini' then begin
ReadIniFile(Settings, vlm);
end else
Params.Values[prm] := vlm;
end else
FileName := ParamStr(i);
end;
vlm := Params.Values['uini'];
if vlm <> '' then
updIni := vlm;
finally
Params.Free;
end;
Result := true;
end;
procedure TypeHelp;
begin
writeln('Obj-C parser usage:');
writeln('objcparser [switches] objcheaderfilename');
writeln('');
writeln('keys:');
writeln(' -ini=filename.ini config file to use for pascal file generation');
writeln(' multiple "-ini" switches are allowed');
writeln(' -uini=filename.ini config file to update the data');
writeln(' -noout prevents from .inc files generated');
writeln(' -all parses headers (*.h) in the current directory');
writeln('');
writeln(' hidden keys (they''re temporary, and will be removed in future versions)');
writeln(' -id=IDENTIFIER the identifier to replace objective-c id type name');
writeln(' default = lobjc.id');
writeln(' -call=IDENTIFIER specifies the function''s calling convention.');
writeln(' default is cdecl. Please note, that calling convention');
writeln(' also effect external functions name. Thus, using ');
writeln(' if calling convention is not cdecl, the external name');
writeln(' -useRefs enables additional types to be created, for lobjc.id ');
writeln(' replacements at the parameter and result types');
writeln(' -refPostFix post-fix for each ref type. The default postfix is ''Ref''');
end;
var
inpf : AnsiString = '';
st : TStrings = nil;
err : AnsiString = '';
i : integer;
function FileToString(const FileName: WideString): AnsiString;
var
fs : TFileStream;
begin
Result := '';
try
fs := TfileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
try
SetLength(Result, fs.Size);
fs.Read(Result[1], fs.Size)
finally
fs.Free;
end;
except
end;
end;
{procedure DoTest(const InputFile: AnsiString);
var
hdr : TObjCHeader;
wrt : TStringsWriter;
cnv : TDefaultConverter;
i : Integer;
names : TPascalNames;
begin
hdr := TObjCHeader.Create;
wrt := TStringsWriter.Create;
wrt.Strings := TStringList.Create;
try
if not ParserCHeader( FileToString(InputFile), hdr) then Exit;
cnv := TDefaultConverter.Create;
names := CreateDefaultPascalNames;
try
cnv.WriteCHeader(hdr, wrt, names);
finally
cnv.Free;
end;
for i := 0 to wrt.Strings.Count - 1 do
writeln(wrt.Strings[i]);
finally
wrt.Strings.Free;
wrt.Free;
hdr.Free;
end;
end;}
procedure TestTemplate;
var
fn : TFileStream;
tmp : AnsiString;
tp : TTemplateProc;
s : string;
pv : TPascalValues;
root: TTemplateList;
cl : TTemplateList;
begin
root:=TTemplateList.Create(nil);
cl:=TTemplateList.Create(root);
cl.Name :='class';
cl.Params.Values['class_objcname'] := 'NSNotebook';
cl.Params.Values['class_objcsupername'] := 'NSObject';
root.SubLists.Add(cl);
fn := TFileStream.Create('templatesample.txt', fmOpenRead or fmShareDenyNone);
tp := TTemplateProc.Create;
pv := TPascalValues.Create;
try
SetLength(tmp, fn.Size);
fn.Read(tmp[1], fn.Size);
s := tp.Parse(tmp, root, pv);
writeln(s);
readln;
finally
pv.Free;
tp.Free;
fn.Free;
end;
end;
begin
// TestTemplate;
// Exit;
doOutput := true;
try
GetConvertSettings(ConvertSettings, inpf);
if doParseAll then begin
ParseAll;
Exit;
end else if not FileExists(inpf) then begin
TypeHelp;
Exit;
end;
st := TStringList.Create;
try
if not ReadAndParseFile(inpf, st, err) then
writeln('Error: ', err)
else begin
if doOutput then
for i := 0 to st.Count - 1 do
writeln(st[i]);
end;
except
end;
st.Free;
except
on e: exception do
writeln(e.Message);
end;
end.

View File

@ -1 +0,0 @@
./objcparser /System/Library/Frameworks/AppKit.framework/Headers/NSButton.h > NSButton.inc