parameters: ()
docstring: main program body
docstring_summary: main program body
docstring_tokens: main program body
function: def main():
    """main program body"""
  
    if len( sys.argv ) != 2:
      print __doc__ % sys.argv[0]
      sys.exit( 1 )
  
    file  = open( sys.argv[1], "wb" )
    write = file.write
  
    count_sid = len( sid_standard_names )
  
    # `mac_extras' contains the list of glyph names in the Macintosh standard
    # encoding which are not in the SID Standard Names.
    #
    mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names )
  
    # `base_list' contains the names of our final glyph names table.
    # It consists of the `mac_extras' glyph names, followed by the SID
    # standard names.
    #
    mac_extras_count = len( mac_extras )
    base_list        = mac_extras + sid_standard_names
  
    write( "/****************************************************************************\n" )
    write( " *\n" )
  
    write( " * %-71s\n" % os.path.basename( sys.argv[1] ) )
  
    write( " *\n" )
    write( " *   PostScript glyph names.\n" )
    write( " *\n" )
    write( " * Copyright 2005-2019 by\n" )
    write( " * David Turner, Robert Wilhelm, and Werner Lemberg.\n" )
    write( " *\n" )
    write( " * This file is part of the FreeType project, and may only be used,\n" )
    write( " * modified, and distributed under the terms of the FreeType project\n" )
    write( " * license, LICENSE.TXT.  By continuing to use, modify, or distribute\n" )
    write( " * this file you indicate that you have read the license and\n" )
    write( " * understand and accept it fully.\n" )
    write( " *\n" )
    write( " */\n" )
    write( "\n" )
    write( "\n" )
    write( "  /* This file has been generated automatically -- do not edit! */\n" )
    write( "\n" )
    write( "\n" )
  
    # dump final glyph list (mac extras + sid standard names)
    #
    st = StringTable( base_list, "ft_standard_glyph_names" )
  
    st.dump( file )
    st.dump_sublist( file, "ft_mac_names",
                     "FT_NUM_MAC_NAMES", mac_standard_names )
    st.dump_sublist( file, "ft_sid_names",
                     "FT_NUM_SID_NAMES", sid_standard_names )
  
    dump_encoding( file, "t1_standard_encoding", t1_standard_encoding )
    dump_encoding( file, "t1_expert_encoding", t1_expert_encoding )
  
    # dump the AGL in its compressed form
    #
    agl_glyphs, agl_values = adobe_glyph_values()
    dict = StringNode( "", 0 )
  
    for g in range( len( agl_glyphs ) ):
      dict.add( agl_glyphs[g], eval( "0x" + agl_values[g] ) )
  
    dict       = dict.optimize()
    dict_len   = dict.locate( 0 )
    dict_array = dict.store( "" )
  
    write( """\
    /*
     * This table is a compressed version of the Adobe Glyph List (AGL),
     * optimized for efficient searching.  It has been generated by the
     * `glnames.py' python script located in the `src/tools' directory.
     *
     * The lookup function to get the Unicode value for a given string
     * is defined below the table.
     */
  
  #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
  
  """ )
  
    dump_array( dict_array, write, "ft_adobe_glyph_list" )
  
    # write the lookup routine now
    #
    write( """\
  #ifdef  DEFINE_PS_TABLES
    /*
     * This function searches the compressed table efficiently.
     */
    static unsigned long
    ft_get_adobe_glyph_index( const char*  name,
                              const char*  limit )
    {
      int                   c = 0;
      int                   count, min, max;
      const unsigned char*  p = ft_adobe_glyph_list;
  
  
      if ( name == 0 || name >= limit )
        goto NotFound;
  
      c     = *name++;
      count = p[1];
      p    += 2;
  
      min = 0;
      max = count;
  
      while ( min < max )
      {
        int                   mid = ( min + max ) >> 1;
        const unsigned char*  q   = p + mid * 2;
        int                   c2;
  
  
        q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
  
        c2 = q[0] & 127;
        if ( c2 == c )
        {
          p = q;
          goto Found;
        }
        if ( c2 < c )
          min = mid + 1;
        else
          max = mid;
      }
      goto NotFound;
  
    Found:
      for (;;)
      {
        /* assert (*p & 127) == c */
  
        if ( name >= limit )
        {
          if ( (p[0] & 128) == 0 &&
               (p[1] & 128) != 0 )
            return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
  
          goto NotFound;
        }
        c = *name++;
        if ( p[0] & 128 )
        {
          p++;
          if ( c != (p[0] & 127) )
            goto NotFound;
  
          continue;
        }
  
        p++;
        count = p[0] & 127;
        if ( p[0] & 128 )
          p += 2;
  
        p++;
  
        for ( ; count > 0; count--, p += 2 )
        {
          int                   offset = ( (int)p[0] << 8 ) | p[1];
          const unsigned char*  q      = ft_adobe_glyph_list + offset;
  
          if ( c == ( q[0] & 127 ) )
          {
            p = q;
            goto NextIter;
          }
        }
        goto NotFound;
  
      NextIter:
        ;
      }
  
    NotFound:
      return 0;
    }
  #endif /* DEFINE_PS_TABLES */
  
  #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
  
  """ )
  
    if 0:  # generate unit test, or don't
      #
      # now write the unit test to check that everything works OK
      #
      write( "#ifdef TEST\n\n" )
  
      write( "static const char* const  the_names[] = {\n" )
      for name in agl_glyphs:
        write( '  "' + name + '",\n' )
      write( "  0\n};\n" )
  
      write( "static const unsigned long  the_values[] = {\n" )
      for val in agl_values:
        write( '  0x' + val + ',\n' )
      write( "  0\n};\n" )
  
      write( """
  #include <stdlib.h>
  #include <stdio.h>
  
    int
    main( void )
    {
      int                   result = 0;
      const char* const*    names  = the_names;
      const unsigned long*  values = the_values;
  
  
      for ( ; *names; names++, values++ )
      {
        const char*    name      = *names;
        unsigned long  reference = *values;
        unsigned long  value;
  
  
        value = ft_get_adobe_glyph_index( name, name + strlen( name ) );
        if ( value != reference )
        {
          result = 1;
          fprintf( stderr, "name '%s' => %04x instead of %04x\\n",
                           name, value, reference );
        }
      }
  
      return result;
    }
  """ )
  
      write( "#endif /* TEST */\n" )
  
    write("\n/* END */\n")
function_tokens: def main ( ) : if len ( sys . argv ) != 2 : print __doc__ % sys . argv [ 0 ] sys . exit ( 1 ) file = open ( sys . argv [ 1 ] , "wb" ) write = file . write count_sid = len ( sid_standard_names ) # `mac_extras' contains the list of glyph names in the Macintosh standard # encoding which are not in the SID Standard Names. # mac_extras = filter_glyph_names ( mac_standard_names , sid_standard_names ) # `base_list' contains the names of our final glyph names table. # It consists of the `mac_extras' glyph names, followed by the SID # standard names. # mac_extras_count = len ( mac_extras ) base_list = mac_extras + sid_standard_names write ( "/****************************************************************************\n" ) write ( " *\n" ) write ( " * %-71s\n" % os . path . basename ( sys . argv [ 1 ] ) ) write ( " *\n" ) write ( " *   PostScript glyph names.\n" ) write ( " *\n" ) write ( " * Copyright 2005-2019 by\n" ) write ( " * David Turner, Robert Wilhelm, and Werner Lemberg.\n" ) write ( " *\n" ) write ( " * This file is part of the FreeType project, and may only be used,\n" ) write ( " * modified, and distributed under the terms of the FreeType project\n" ) write ( " * license, LICENSE.TXT.  By continuing to use, modify, or distribute\n" ) write ( " * this file you indicate that you have read the license and\n" ) write ( " * understand and accept it fully.\n" ) write ( " *\n" ) write ( " */\n" ) write ( "\n" ) write ( "\n" ) write ( "  /* This file has been generated automatically -- do not edit! */\n" ) write ( "\n" ) write ( "\n" ) # dump final glyph list (mac extras + sid standard names) # st = StringTable ( base_list , "ft_standard_glyph_names" ) st . dump ( file ) st . dump_sublist ( file , "ft_mac_names" , "FT_NUM_MAC_NAMES" , mac_standard_names ) st . dump_sublist ( file , "ft_sid_names" , "FT_NUM_SID_NAMES" , sid_standard_names ) dump_encoding ( file , "t1_standard_encoding" , t1_standard_encoding ) dump_encoding ( file , "t1_expert_encoding" , t1_expert_encoding ) # dump the AGL in its compressed form # agl_glyphs , agl_values = adobe_glyph_values ( ) dict = StringNode ( "" , 0 ) for g in range ( len ( agl_glyphs ) ) : dict . add ( agl_glyphs [ g ] , eval ( "0x" + agl_values [ g ] ) ) dict = dict . optimize ( ) dict_len = dict . locate ( 0 ) dict_array = dict . store ( "" ) write ( """\
    /*
     * This table is a compressed version of the Adobe Glyph List (AGL),
     * optimized for efficient searching.  It has been generated by the
     * `glnames.py' python script located in the `src/tools' directory.
     *
     * The lookup function to get the Unicode value for a given string
     * is defined below the table.
     */
  
  #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
  
  """ ) dump_array ( dict_array , write , "ft_adobe_glyph_list" ) # write the lookup routine now # write ( """\
  #ifdef  DEFINE_PS_TABLES
    /*
     * This function searches the compressed table efficiently.
     */
    static unsigned long
    ft_get_adobe_glyph_index( const char*  name,
                              const char*  limit )
    {
      int                   c = 0;
      int                   count, min, max;
      const unsigned char*  p = ft_adobe_glyph_list;
  
  
      if ( name == 0 || name >= limit )
        goto NotFound;
  
      c     = *name++;
      count = p[1];
      p    += 2;
  
      min = 0;
      max = count;
  
      while ( min < max )
      {
        int                   mid = ( min + max ) >> 1;
        const unsigned char*  q   = p + mid * 2;
        int                   c2;
  
  
        q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
  
        c2 = q[0] & 127;
        if ( c2 == c )
        {
          p = q;
          goto Found;
        }
        if ( c2 < c )
          min = mid + 1;
        else
          max = mid;
      }
      goto NotFound;
  
    Found:
      for (;;)
      {
        /* assert (*p & 127) == c */
  
        if ( name >= limit )
        {
          if ( (p[0] & 128) == 0 &&
               (p[1] & 128) != 0 )
            return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
  
          goto NotFound;
        }
        c = *name++;
        if ( p[0] & 128 )
        {
          p++;
          if ( c != (p[0] & 127) )
            goto NotFound;
  
          continue;
        }
  
        p++;
        count = p[0] & 127;
        if ( p[0] & 128 )
          p += 2;
  
        p++;
  
        for ( ; count > 0; count--, p += 2 )
        {
          int                   offset = ( (int)p[0] << 8 ) | p[1];
          const unsigned char*  q      = ft_adobe_glyph_list + offset;
  
          if ( c == ( q[0] & 127 ) )
          {
            p = q;
            goto NextIter;
          }
        }
        goto NotFound;
  
      NextIter:
        ;
      }
  
    NotFound:
      return 0;
    }
  #endif /* DEFINE_PS_TABLES */
  
  #endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
  
  """ ) if 0 : # generate unit test, or don't # # now write the unit test to check that everything works OK # write ( "#ifdef TEST\n\n" ) write ( "static const char* const  the_names[] = {\n" ) for name in agl_glyphs : write ( '  "' + name + '",\n' ) write ( "  0\n};\n" ) write ( "static const unsigned long  the_values[] = {\n" ) for val in agl_values : write ( '  0x' + val + ',\n' ) write ( "  0\n};\n" ) write ( """
  #include <stdlib.h>
  #include <stdio.h>
  
    int
    main( void )
    {
      int                   result = 0;
      const char* const*    names  = the_names;
      const unsigned long*  values = the_values;
  
  
      for ( ; *names; names++, values++ )
      {
        const char*    name      = *names;
        unsigned long  reference = *values;
        unsigned long  value;
  
  
        value = ft_get_adobe_glyph_index( name, name + strlen( name ) );
        if ( value != reference )
        {
          result = 1;
          fprintf( stderr, "name '%s' => %04x instead of %04x\\n",
                           name, value, reference );
        }
      }
  
      return result;
    }
  """ ) write ( "#endif /* TEST */\n" ) write ( "\n/* END */\n" )