GIF89a=( �' 7IAXKgNgYvYx\%wh&h}t�h%�s%x�}9�R��&�0%� (�.��5�SD��&�a)�x5��;ͣ*ȡ&ղ)ׯ7׵<ѻ4�3�H֧KͯT��Y�aq��q��F� !� ' !� NETSCAPE2.0 , =( ��pH,�Ȥr�l:xШtJ�Z�جv��z��xL.:��z�n���|N�����~�������& !�0`9R�}��"�"a:S�~x��������g���E�������R���E����B�� ��ȸ��D���"�Ů� �H��L��D٫D�B�����D���T���H �G��A R�ڐ |�� ٭&��E8�S�kG�A�px�a��� R2XB��E8I���6X�:vT)�~��q�賥��"F~%x� � 4#Z�0O|-4Bs�X:= Q� Sal��yXJ`GȦ|s h��K3l7�B|�$'7Jީܪ0!��D�n=�P� ����0`�R�lj����v>���5 �.69�ϸd�����nlv�9��f{���Pbx �l5}�p� ��� �3a���I�O����!ܾ���i��9��#��)p�a ޽ �{�)vm��%D~ 6f��s}Œ�D�W E�`!� �&L8x� �ܝ{)x`X/>�}m��R�*|`D�=�_ ^�5 !_&'a�O�7�c��`DCx`�¥�9�Y�F���`?��"� �n@`�} lď��@4>�d S �v�xN��"@~d��=�g�s~G��� ���ud &p8Q�)ƫlXD����A~H�ySun�j���k*D�LH�] ��C"J��Xb~ʪwSt}6K,��q�S:9ت:���l�@�`�� �.۬�t9�S�[:��=`9N����{¿�A !R�:���6��x�0�_ �;������^���#����!����U���;0L1�����p% A��U̬ݵ��%�S��!���~`�G���� ���=4�np�3���������u�u�ٮ|%2�I��r�#0��J``8�@S@5� ���^`8E�]�.�S���7 � �0�j S�D� z���i�S�����!���l��w9*�D�I�nEX��� &A�Go�Qf��F��;���}�J����F5��Q|���X��T��y���]� o ��C=��:���PB@ D׽S�(>�C�x}`��xJЬ�۠��p+eE0`�}`A �/NE�� �9@��� H�7�!%B0`�l*��!8 2�%� �:�1�0E��ux%nP1�!�C)�P81l�ɸF#Ƭ{����B0>�� �b�`��O3��()yRpb��E.ZD8�H@% �Rx+%���c� ���f��b�d�`F�"8�XH"��-�|1�6iI, 2�$+](A*j� QT�o0.�U�`�R�}`�SN����yae�����b��o~ S)�y�@��3 �tT�0�&�+~L�f"�-|�~��>!�v��~�\Q1)}@�}h#aP72�"�$ !� " , =( &7IAXG]KgNgYvYxR"k\%w]'}h}t�h%�g+�s%r.m3ax3�x�}9��&��+�!7�0%� (�.�SD��&��;�"&ײ)׻4��6�K� �@pH,�Ȥr�l:xШtJ�Z�جv��z��xL.:��z�n���|N�����~�������& !�0`9R�}��"�"a:S�~x��������g �� E �� �������E �´��C���ǶR��D��"Ʒ�ʱH��M��GڬD�B����D��T����G���C�C� l&�~:'�tU�6ɹ#��)�'�.6�&��Ȼ K(8p0N�?!�2"��NIJX>R��OM '��2�*x�>#n� �@<[:�I�f ��T���Cdb��[�}E�5MBo��@�`@��tW-3 �x�B���jI�&E�9[T&$��ﯧ&"s��ȳ����dc�UUρ#���ldj?����`\}���u|3'�R]�6 �S#�!�FKL�*N E���`$�:e�YD�q�.�촁�s \-�jA 9�����-��M[�x(�s��x�|���p��}k�T�DpE@W� ��]k`1� ���Yb ��0l��*n0��"~zBd�~u�7�0Bl��0-�x~|U�U0 �h�*HS�|��e"#"?vp�i`e6^�+q��`m8 #V�� ��VS|`��"m"сSn|@:U���~`pb�G�ED����2F�I�? >�x� R� ��%~jx��<�a�9ij�2�D��&: Z`�]w���:�6��B�7eFJ|�ҧ�,���FǮcS�ʶ+B�,�ܺN���>PAD�HD��~���n��}�#�� Q��S���2�X�{�k�lQ�2�����w�|2� h9��G�,m���3��6-��E�L��I�³*K���q�`DwV�QXS��peS��� qܧTS����R�u �<�a�*At�lmE� � ��N[P1�ۦ��$��@`��Dpy�yXvCAy�B`}D� 0QwG#� �a[^�� $���Ǧ{L�"[��K�g�;�S~��GX.�goT.��ư��x���?1z��x~:�g�|�L� ��S`��0S]P�^p F<""�?!,�!N4&P� ����:T�@h�9%t��:�-~�I<`�9p I&.)^ 40D#p@�j4�ج:�01��rܼF2oW�#Z ;$Q q  �K��Nl#29 !F@�Bh�ᏬL!XF�LHKh�.�hE&J�G��<"WN!�����Y@� >R~19J"�2,/ &.GXB%�R�9B6�W]���W�I�$��9�RE8Y� ��"�A5�Q.axB�&ة�J�! �t)K%tS-�JF b�NMxL��)�R��"���6O!TH�H� 0 !� ) , =( &AXKgNgYvYxR"k\%wh&h}h%�g+�s%r.x3�x�}9��&��+�R,�!7�0%� (�.��5��&�a)��;�"&ף*Ȳ)ׯ7׻4�3��6�H֧KͻH�T��Y��q��h� ��pH,�Ȥr�l:xШtJ�Z�جv��z��xL.:��z�n���|N�����~�������& !�0`9R�}��"�"a:S�~x��������g �� E$����� � ����$E$��"��D� � ������R��C��� E ��H�M��G�D� �B��ϾD��a��`1r��Ӑ�� �o~�zU!L�C'�yW�UGt����ll�0���uG�)A�s[��x� �xO%��X2�  P�n:R/��aHae+�Dm?# ǣ6�8�J�x�Di�M���j���5oQ7�- <! *�l��R2r/a!l)d� A"�E���� &� ;��c �%����b��pe~C"B���H�eF2��`8qb�t_`ur`e� w�u3��Pv�h""�`�Íx�LĹ��3� �~ֺ�:���MDfJ� �۵�W�%�S�X �؁)�@��:E��w�u�Sxb8y\m�zS��Zb�E�L��w!y(>�"w�=�|��s�d �C�W)H�cC$�L �7r.�\{)@�`@ �X�$PD `aaG:���O�72E�amn]�"Rc�x�R� &dR8`g��i�xLR!�P &d����T���i�|�_ � Qi�#�`g:��:noM� :V �)p����W&a=�e�k� j���1߲s�x�W�jal|0��B0�, \j۴:6���C ��W��|��9���zĸV {�;��n��V�m�I��.��PN� ����C��+��By�ѾHŸ:��� 7�Y�FTk�SaoaY$D�S���29R�kt� ��f� ��:��Sp�3�I��DZ� �9���g��u�*3)O��[_hv ,���Et x�BH� �[��64M@�S�M7d�l�ܶ5-��U܍��z�R3Ԭ3~ ��P��5�g: ���kN�&0�j4���#{��3S�2�K�'ợl���2K{� {۶?~m𸧠�I�nE�='����^���_�=��~�#O���'���o..�Y�n��CSO��a��K��o,���b�����{�C�� "�{�K ��w��Ozdը�:$ ���v�] A#� ���a�z)Rx׿ƥ�d``�w-�y�f�K!����|��P��=�`�(f��'Pa ��BJa%��f�%`�}F����6>��`G"�}�=�!o`�^FP�ةQ�C���`(�}\�ݮ ��$<��n@dĠE#��U�I�!� #l��9`k���'Rr��Z�NB�MF �[�+9���-�wj���8�r� ,V�h"�|�S=�G_��"E� 0i*%̲��da0mVk�):;&6p>�jK ��# �D�:�c?:R Ӭf��I-�"�<�="��7�3S��c2RW ,�8(T"P0F¡Jh�" ; 403WebShell
403Webshell
Server IP : 173.249.157.85  /  Your IP : 3.23.100.174
Web Server : Apache
System : Linux server.frogzhost.com 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 x86_64
User : econtech ( 1005)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : OFF  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/share/ghostscript/lib/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/share/ghostscript/lib/pf2afm.ps
%!
% This is a PostScript program for making an AFM file from
% PFB / PFA and (optionally) PFM files.
%
% Written in BOP s.c., Gda\'nsk, Poland
% e-mail contact: B.Jackowski@GUST.ORG.PL
% version 0.5 (18 XII 1997)
% version 0.55 (11 III 1998) -- unlimited number of chars in a font
% version 1.00 (27 III 1998) -- scanning PFM subdirectory added,
%                               code improved; version sent to LPD
% version 1.01 (1 II 2000)   -- message changed

% Usage:
%   gs [-dNODISPLAY] -- pf2afm.ps disk_font_name
%
% The result is written to the file disk_font_name.afm, provided such
% a file does not exist; otherwise program quits.
%
% The font can be either *.pfa or *.pfb; if no extension is supplied,
% first disk_font_name.pfb is examined, then disk_font_name.pfa.
% Moreover, if there is a *.pfm file in the same directory or in the
% subdirectory PFM, i.e., disk_font_name.pfm or PFM/disk_font_name.pfm,
% kern pairs from it are extracted, as well as additional font
% parameters, usually absent from Type 1 fonts.

% Tribute:
% The program is based on James Clark's <jjc@jclark.uucp> printafm.ps
% (with alterations by d.love@dl.ac.uk and L. Peter Deutsch) from
% Ghostscript 5.10 distribution.

/onechar 1 string def
/edef {exch def} def
/WinAnsiEncoding dup /Encoding findresource def

% charnumber print-charname -
% prints the name of the encoded character
/print-charname {
  PFMCharSet 0 eq {
    WinAnsiEncoding
  } {
    PFBencoding
  } ifelse
  exch get =string cvs dup
  (.notdef) eq {
    /was.notdef true def
  } if
  print.to.ofi ( ) print.to.ofi
} def

/printquit {print flush quit} def

% redirecting GS output to ``ofi'' file
/eolch (\r\n) def
/=only.to.ofi {ofi exch write=only} def          % replaces GS's `=only'
/print.to.ofi  {ofi exch writestring} def        % replaces `print'
/=to.ofi { =only.to.ofi eolch print.to.ofi } def % replaces `='

% read and skip: byte, short, word, double and long
/readb-p {currPFMfile read not {(Unexpected EOF\n) printquit} if} def
/readw-p {readb-p readb-p 256 mul add} def
/reads-p {readw-p dup 32768 ge {65536 sub} if} def
/readd-p {readb-p readb-p readb-p readb-p 256 mul add 256 mul add 256 mul add} def
/readl-p /readd-p load def % double word is, in fact, long integer in GS
/skipb-p {readb-p pop} def
/skipw-p {skipb-p skipb-p} def
/skips-p /skipw-p load def
/skipd-p {skipb-p skipb-p skipb-p skipb-p} def
/skipl-p /skipd-p load def
/skipa-p { {skipb-p} repeat} def

% PFMfile readPFMheader -
% defines currPFMfile, PFMExtMetricOffset, PFMPairKernTableOffset

/readPFMheader {
  currPFMfile bytesavailable
  % ---------------
  % PFM MAIN HEADER
  % ---------------
  skipw-p % PFM: version
  readd-p % PFM: size (size is dword, not word as the documentation says)
  ne {(Wrong file size\n) printquit} if
  60 skipa-p  % PFM: copyright
  skipw-p % PFM: Type
  skipw-p % PFM: Points
  skipw-p % PFM: VertRes
  skipw-p % PFM: HorizRes
  skipw-p % PFM: Ascent
  skipw-p % PFM: InternalLeading
  skipw-p % PFM: ExternalLeading
  skipb-p % PFM: Italic
  skipb-p % PFM: Underline
  skipb-p % PFM: Stikeout
  skipw-p % PFM: Weight
  readb-p % PFM: CharSet
    /PFMCharSet edef
  skipw-p % PFM: PixWidth
  skipw-p % PFM: PixHeight
  skipb-p % PFM: PitchAndFamily
  skipw-p % PFM: AvgWidth
  skipw-p % PFM: MaxWidth
  skipb-p % PFM: FirstChar
  skipb-p % PFM: LastChar
  skipb-p % PFM: DefaultChar
  skipb-p % PFM: BreakChar
  skipw-p % PFM: WidthBytes
  skipd-p % PFM: Device
  skipd-p % PFM: Face
  skipd-p % PFM: BitsPointer
  skipd-p % PFM: BitsOffset
  % here we assume that it is a PostScript font, i.e., it always uses
  % the extended width table, therefore the normal width table is empty
  % -------------
  % PFM EXTENSION
  % -------------
  skipw-p % PFMEX: SizeFields
  readd-p % PFMEX: ExtMetricOffset
    /PFMExtMetricOffset edef
  skipd-p % PFMEX: ExtentTable
  skipd-p % PFMEX: OriginTable
  readd-p % PFMEX: PairKernTable
    /PFMPairKernTableOffset edef
  skipd-p % PFMEX: TrackKernTable
  skipd-p % PFMEX: DriverInfo
  skipd-p % PFMEX: Reserved
} def

% requires that currPFMfile, PFMExtMetricOffset are defined
% readPFMExtMetric -
% defines PFMNumberofKernPairs

/readPFMExtMetric {
  currPFMfile PFMExtMetricOffset setfileposition
  skips-p % EXTT: Size
  skips-p % EXTT: PointSize
  skips-p % EXTT: Orientation
  skips-p % EXTT: MasterHeight
  skips-p % EXTT: MinScale
  skips-p % EXTT: MaxScale
  skips-p % EXTT: MasterUnit
  reads-p % EXTT: CapHeight
   /PFMCapHeight edef
  reads-p % EXTT: XHeight
   /PFMXHeight edef
  reads-p % EXTT: LowerCaseAscent
   /PFMLowerCaseAscent edef
  reads-p % EXTT: LowerCaseDescent
   neg /PFMLowerCaseDescent edef
  skips-p % EXTT: Slant
  skips-p % EXTT: SuperScript
  skips-p % EXTT: SubScript
  skips-p % EXTT: SuperScriptSize
  skips-p % EXTT: SubScriptSize
  skips-p % EXTT: UnderlineOffset
  skips-p % EXTT: UnderlineWidth
  skips-p % EXTT: DoubleUpperUnderlineOffset
  skips-p % EXTT: DoubleLowerUnderlineOffset
  skips-p % EXTT: DoubleUpperUnderlineWidth
  skips-p % EXTT: DoubleLowerUnderlineWidth
  skips-p % EXTT: StrikeOutOffset
  skips-p % EXTT: StrikeOutWidth
  readw-p % EXTT: KernPairs
    /PFMNumberofKernPairs edef
  skipw-p % EXTT: KernTracks
} def

% requires that currPFMfile, PFMPairKernTableOffset, PFMNumberofKernPairs are defined
% readPFMExtMetric -
% prints kern pairs table in the AFM format

/readPFMKernPairs {
  currPFMfile () ne {
    PFMdict begin
    PFMPairKernTableOffset 0 ne {
      currPFMfile PFMPairKernTableOffset setfileposition
      readw-p % undocumented kern count (although all remaining structures are
              % explicitly preceded by their sizes); if it were a stable
             % feature, EXTTEXTMETRICS could be skipped
      PFMNumberofKernPairs
%     2 copy = =
      ne {
        (Inconsistent number of kern pairs\n) printquit
      } if
      (StartKernData) =to.ofi
      (StartKernPairs ) print.to.ofi
      PFMNumberofKernPairs =to.ofi
      % ---------
      % MAIN LOOP
      % ---------
      /was.notdef false def
      PFMNumberofKernPairs {
        (KPX ) print.to.ofi
        readb-p  % first  char
        print-charname
        readb-p  % second char
        print-charname
        reads-p  % kern amount
        =to.ofi
      } repeat
      was.notdef {
        (.notdef character ocurred among kern pairs) =
        (you'd better check the resulting AFM file.) =
      } if
      (EndKernPairs) =to.ofi
      (EndKernData)  =to.ofi
    } if
    end
  } if
} def

% alias (for ``compatibility'' with J. Clark):
/printkernpairs /readPFMKernPairs load def

% printcharmetrics -

/printcharmetrics {
  (StartCharMetrics ) print.to.ofi
  /PFBencoding currfont /Encoding get dup length array copy def
  /PFBcharstrings currfont /CharStrings get def
  PFBcharstrings length
  PFBcharstrings /.notdef known { 1 sub } if =to.ofi
  currfont 1000 scalefont setfont
  % checking Encoding array and CharStrings dictionary for
  % the consistency of names
  /was.inconsitent false def
  0 1 255 {
    dup PFBencoding exch get
    PFBcharstrings exch known {
      pop
    }{
%     dup PFBencoding exch get =
      PFBencoding exch /.notdef put % fix Encoding array
      /was.inconsitent true def
    } ifelse
  } for
  was.inconsitent {
    (Encoding array contains name(s) absent from CharStrings dictionary) =
  } if
  % print metric data for each character in PFB encoding vector
  0 1 255 {
    dup PFBencoding exch get
    dup /.notdef ne {
      exch dup printmetric
    }{
      pop pop
    } ifelse
  } for
  % xPFBencoding contains an entry for each name in the original
  % encoding vector
  /xPFBencoding PFBcharstrings length dict def
  PFBencoding {
    xPFBencoding exch true put
  } forall

  /fontiter 0 def
  /TMPFontTemplate (TMP_FONT#000) def
  {
    % NewPFBencoding is the new encoding vector
    /NewPFBencoding 256 array def
    0 1 255 {
      NewPFBencoding exch /.notdef put
    } for
    % fill up NewPFBencoding with names from CharStrings dictionary that
    % are not encoded so far
    /i 0 def
    PFBcharstrings {
      pop
      i 255 le {
        dup xPFBencoding exch known not {
          dup xPFBencoding exch true put
          NewPFBencoding i 3 -1 roll put
          /i i 1 add def
        }{
          pop
        } ifelse
      }{
        pop exit
      } ifelse
    } forall
    i 0 eq {exit} if
    % define a new font with NewPFBencoding as its encoding vector
    currfont maxlength dict /NewTMPfont edef
    currfont {
      exch dup dup /FID ne exch /Encoding ne and {
        exch NewTMPfont 3 1 roll put
      }{
        pop pop
      } ifelse
    } forall
    % compute a unique name for a font to be registered
    /fontiter fontiter 1 add def
    TMPFontTemplate fontiter (000) cvs
    dup length TMPFontTemplate length exch sub exch putinterval
    /TMPFontName TMPFontTemplate cvn def
    NewTMPfont /FontName TMPFontName put
    NewTMPfont /Encoding NewPFBencoding put
    % make this new font the current font
    TMPFontName NewTMPfont definefont 1000 scalefont setfont
    % print metric data for each character in the newly created encoding vector
    0 1 255 {
      dup NewPFBencoding exch get
      dup /.notdef ne {
        exch -1 printmetric
      }{
        pop pop exit
      } ifelse
    } for
  i 255 lt {exit} if
  } loop
  (EndCharMetrics) =to.ofi
} def

% name actual_code normal_code printmetric -

/printmetric {
  (C ) print.to.ofi =only.to.ofi
  ( ; WX ) print.to.ofi
  onechar 0 3 -1 roll put
  onechar stringwidth pop round cvi =only.to.ofi
  ( ; N ) print.to.ofi =only.to.ofi
  ( ; B ) print.to.ofi
  newpath 0 0 moveto
  onechar false charpath flattenpath pathbbox
  newpath
  round cvi /ury edef round cvi /urx edef
  round cvi /lly edef round cvi /llx edef
  ury lly eq {/ury 0 def /lly 0 def} if % normalize degenrated BB
  urx llx eq {/urx 0 def /llx 0 def} if %
  llx =only.to.ofi ( ) print.to.ofi lly =only.to.ofi ( ) print.to.ofi
  urx =only.to.ofi ( ) print.to.ofi ury =only.to.ofi ( ) print.to.ofi
  (;) =to.ofi
} def

/printinfoitem {
  3 1 roll 2 copy known {
    get dup type /stringtype ne { =string cvs } if exch
    print.to.ofi ( ) print.to.ofi =to.ofi
  }{
    pop pop pop
  } ifelse
} def

/printfontinfo {
  (Comment AFM Generated by Ghostscript/pf2afm) =to.ofi
  currfont /FontName  (FontName) printinfoitem
  %
  currfont /FontInfo get
  dup /FullName           (FullName)           printinfoitem
  dup /FamilyName         (FamilyName)         printinfoitem
  dup /Weight             (Weight)             printinfoitem
  dup /Notice             (Notice)             printinfoitem
  dup /ItalicAngle        (ItalicAngle)        printinfoitem
  dup /isFixedPitch       (IsFixedPitch)       printinfoitem
  dup /UnderlinePosition  (UnderlinePosition)  printinfoitem
  dup /UnderlineThickness (UnderlineThickness) printinfoitem
      /version            (Version)            printinfoitem
  %
  (EncodingScheme FontSpecific) =to.ofi
  %
  (FontBBox) print.to.ofi
  currfont /FontBBox get {
    ( ) print.to.ofi round cvi =only.to.ofi
  } forall
  eolch print.to.ofi
  %
  currPFMfile () ne {
    PFMdict
    dup /PFMCapHeight        (CapHeight) printinfoitem
    dup /PFMXHeight          (XHeight)   printinfoitem
    dup /PFMLowerCaseDescent (Descender) printinfoitem
        /PFMLowerCaseAscent  (Ascender)  printinfoitem
  } if
} def

/readPFBfile {
  % make a shot of the actual font directory:
  /oldFontDirectory FontDirectory dup length dict copy def
  isPFB {% defined in `makeafm'
    (r) file true /PFBDecode filter cvx % true is better (see gs_type1.ps)
    mark exch exec
  }{
    (r) file mark exch run
  } ifelse
  cleartomark
  % make a shot of the updated font directory:
  /newFontDirectory FontDirectory dup length dict copy def
  % spot the added font:
  oldFontDirectory  {pop newFontDirectory exch undef} forall
  newFontDirectory length 1 ne {
    newFontDirectory length =
    (Weird PFB file?\n) printquit
  } if
  newFontDirectory {pop} forall
  findfont /currfont edef
} def

/readPFMfile {
  dup () ne {
    (r) file /currPFMfile edef
    10 dict dup /PFMdict edef begin
    readPFMheader
    readPFMExtMetric
    end
  }{
    pop /currPFMfile () def
  } ifelse
} def

% pfmfilename pf[ba]filename filetype printafm -
% where filetype=(a) or (b)

/printafm {
  readPFBfile
  readPFMfile
  (StartFontMetrics 2.0) =to.ofi
  printfontinfo
  printcharmetrics
  printkernpairs
  (EndFontMetrics) =to.ofi
} def

/pfa_pfb_dict <<
  /.pfb /pfbn
  /.pfB /pfbn
  /.pFb /pfbn
  /.pFB /pfbn
  /.Pfb /pfbn
  /.PfB /pfbn
  /.PFb /pfbn
  /.PFB /pfbn

  /.pfa /pfan
  /.pfA /pfan
  /.pFa /pfan
  /.pFA /pfan
  /.Pfa /pfan
  /.PfA /pfan
  /.PFa /pfan
  /.PFA /pfan
>> readonly def

% Check whether the file name has pfa or pfb extension.
/pfa_or_pfb? {      % s -> false   |    /name true
  dup length 4 lt {
    pop //false
  } {
    dup length 4 sub 4 getinterval //pfa_pfb_dict exch .knownget
  } ifelse
} bind def

% pf[ba]filename makeafm -
/makeafm {
  count 0 eq {(Missing font file name\n) printquit} if
  /ifn edef
  ifn length 0 eq {(Empty font file name\n) printquit} if
% the following piece of the code does, in fact, the job of a system shell,
% i.e., it analyses the supplied names, appends extensions if needed,
% and check files:
  /pfbn () def /pfan () def /pfmn () def % initialisation
  [ t1_glyph_equivalence { pop } forall ] { % disable glyph substitution
    t1_glyph_equivalence exch undef
  } forall
  ifn pfa_or_pfb? {
      ifn dup length string copy def
      ifn dup length 4 sub 0 exch getinterval /ifn edef
  } if
  pfbn () eq pfan () eq and dup {% no extension was supplied, try ".pfb"
    /pfbn ifn (.pfb) concatstrings def
  } if
  pfbn () ne {% check whether "filename.pfb" exists
    pfbn status {pop pop pop pop /isPFB true def}{/pfbn () def} ifelse
  } if
  pfbn () eq and {% checking "filename.pfb" unsuccessful, try ".pfa"
    /pfan ifn (.pfa) concatstrings def
  } if
  pfan () ne {% check whether "filename.pfa" exists
    pfan status {pop pop pop pop /isPFB false def}{/pfan () def} ifelse
  } if

  pfbn () eq pfan () eq and {
    (Neither pfa nor pfb found\n) printquit
  } if

  /ofn ifn (.afm) concatstrings def
  ofn status {
    pop pop pop pop (Resulting file exists\n) printquit
  } if
  /ofi ofn (w) file def

  /pfmn ifn (.pfm) concatstrings def
  pfmn status {
    pop pop pop pop
  }{
    () pfmn {
      (/) search dup not { pop (\\) search } if {
        4 -1 roll exch concatstrings exch concatstrings exch
      }{
        exit
      } ifelse
    } loop
    (pfm/) exch concatstrings concatstrings
    dup status {
      pop pop pop pop /pfmn edef
    }{
      pop /pfmn () def (pfm file not found -- ignored\n) print
    } ifelse
  } ifelse
  //systemdict /.setsafe known {
    <<
      /PermitFileReading
        [ pfmn dup length 0 eq { pop } if
          isPFB {pfbn}{pfan} ifelse
        ]
      /PermitFileWriting [ ]
      /PermitFileControl [ ]
    >> setuserparams
    .locksafe
  } if

  pfmn
  isPFB {pfbn}{pfan} ifelse
  printafm

} def

% Check for command line arguments.
[ shellarguments
  { ] dup length 1 eq {
       0 get makeafm
     }{
       (This is PF2AFM -- AFM generator \(ver. 1.00\)\n) print
       (Usage: gs [-dNODISPLAY] -- pf2afm.ps disk_font_name\n) printquit
     } ifelse
  }
  {pop}
ifelse

Youez - 2016 - github.com/yon3zu
LinuXploit