123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by Sebastian Guenther
- .rst resource string table file converter.
-
- 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+}
- program rstconv;
- uses sysutils, classes;
- const
- help =
- 'rstconv [-h|--help] Displays this help'#10+
- 'rstconv options Convert rst file'#10#10+
- 'Options are:'#10+
- ' -i file Use specified file instead of stdin as input .rst (OPTIONAL)'#10+
- ' -o file Write output to specified file (REQUIRED)'#10+
- ' -f format Specifies the output format:'#10+
- ' po GNU gettext .po (portable) format (DEFAULT)'#10;
- InvalidOption = 'Invalid option - ';
- OptionAlreadySpecified = 'Option has already been specified - ';
- NoOutFilename = 'No output filename specified';
- InvalidOutputFormat = 'Invalid output format -';
- type
- TConstItem = class(TCollectionItem)
- public
- ModuleName, ConstName, Value: String;
- end;
- var
- InFilename, OutFilename: String;
- ConstItems: TCollection;
- procedure ReadRSTFile;
- var
- f: Text;
- s: String;
- item: TConstItem;
- DotPos, EqPos, i, j: Integer;
- begin
- Assign(f, InFilename);
- Reset(f);
- while not eof(f) do begin
- ReadLn(f, s);
- If (Length(S)=0) or (S[1]='#') then
- continue;
- item := TConstItem(ConstItems.Add);
- DotPos := Pos('.', s);
- EqPos := Pos('=', s);
- if DotPos > EqPos then // paranoia checking.
- DotPos := 0;
- item.ModuleName := Copy(s, 1, DotPos - 1);
- item.ConstName := Copy(s, DotPos + 1, EqPos - DotPos - 1);
- item.Value := '';
- i := EqPos + 1;
- while i <= Length(s) do begin
- if s[i] = '''' then begin
- Inc(i);
- j := i;
- while s[i] <> '''' do Inc(i);
- item.Value := item.Value + Copy(s, j, i - j);
- Inc(i);
- end else if s[i] = '#' then begin
- Inc(i);
- j := i;
- while s[i] in ['0'..'9'] do Inc(i);
- item.Value := item.Value + Chr(StrToInt(Copy(s, j, i - j)));
- end else if s[i] = '+' then begin
- ReadLn(f, s);
- i := 1;
- end else
- Inc(i);
- end;
- end;
- Close(f);
- end;
- procedure ConvertToGettextPO;
- var
- i, j: Integer;
- f: Text;
- item: TConstItem;
- s: String;
- c: Char;
- begin
- Assign(f, OutFilename);
- Rewrite(f);
- for i := 0 to ConstItems.Count - 1 do begin
- item := TConstItem(ConstItems.items[i]);
- // Convert string to C-style syntax
- s := '';
- for j := 1 to Length(item.Value) do begin
- c := item.Value[j];
- case c of
- #9: s := s + '\t';
- #10: s := s + '\n';
- #1..#8, #11..#31, #128..#255:
- s := s + '\' +
- Chr(Ord(c) shr 6 + 48) +
- Chr((Ord(c) shr 3) and 7 + 48) +
- Chr(Ord(c) and 7 + 48);
- '\': s := s + '\\';
- '"': s := s + '\"';
- else s := s + c;
- end;
- end;
- // Write msg entry
- WriteLn(f, '#: ', item.ModuleName, ':', item.ConstName);
- WriteLn(f, 'msgid "', s, '"');
- WriteLn(f, 'msgstr ""');
- WriteLn(f);
- end;
- Close(f);
- end;
- type
- TConversionProc = procedure;
- var
- i: Integer;
- ConversionProc: TConversionProc;
- begin
- if (ParamStr(1) = '-h') or (ParamStr(1) = '--help') then begin
- WriteLn(help);
- exit;
- end;
- ConversionProc := @ConvertToGettextPO;
- i := 1;
- while i <= ParamCount do begin
- if ParamStr(i) = '-i' then begin
- if InFilename <> '' then begin
- WriteLn(StdErr, OptionAlreadySpecified, '-i');
- Halt(1);
- end;
- InFilename := ParamStr(i + 1);
- Inc(i, 2);
- end else if ParamStr(i) = '-o' then begin
- if OutFilename <> '' then begin
- WriteLn(StdErr, OptionAlreadySpecified, '-o');
- Halt(1);
- end;
- OutFilename := ParamStr(i + 1);
- Inc(i, 2);
- end else if ParamStr(i) = '-f' then begin
- if OutFilename <> '' then begin
- WriteLn(StdErr, OptionAlreadySpecified, '-f');
- Halt(1);
- end;
- if ParamStr(i + 1) = 'po' then
- else begin
- WriteLn(StdErr, InvalidOutputFormat, ParamStr(i + 1));
- Halt(1);
- end;
- Inc(i, 2);
- end else begin
- WriteLn(StdErr, InvalidOption, ParamStr(i));
- Halt(1);
- end;
- end;
- if OutFilename = '' then begin
- WriteLn(StdErr, NoOutFilename);
- Halt(1);
- end;
- ConstItems := TCollection.Create(TConstItem);
- ReadRSTFile;
- ConversionProc;
- end.
- {
- $Log$
- Revision 1.5 2000-02-07 13:42:39 peter
- * fixed notes
- Revision 1.4 2000/01/07 16:46:04 daniel
- * copyright 2000
- Revision 1.3 1999/07/24 18:35:10 michael
- + Added check for missing unitname in constant name
- Revision 1.2 1999/07/24 16:22:38 michael
- + Comments and empty lines are now ignored
- Revision 1.1 1999/07/23 18:23:45 michael
- + Added rstconv
- }
|