#!/usr/local/bin/fontforge -lang=ff

if ( Strtol($version)<20070924 )
  Error( "Please upgrade to a more recent version of fontforge" )
endif

if ( $argc <= 1 )
  Print( "fontlint: {fontfile}" )
  Print( "  Validates the listed fonts" )
return( 1 );
endif

while ( $argc > 1 )
  Open( $1, 9 )		/* Open even if fstype objects, turn on validation */
  mask = Validate()
  blues = $privateState
  if ( $order==2 )
    blues = blues & ~0x010000;
  else
    mask = mask & ~0x80000;
  endif
  if ( mask==0 && $loadState==0 && blues==0 )
    Print("Validation " + $fontname + " ...Passed")
  else
    Print("Validation " + $fontname + " ...Failed")
    if ( mask & 0x2 )
      Print( "  Open Contour" )
    endif
    if ( mask & 0x4 )
      Print( "  Self Intersecting Glyph" )
    endif
    if ( mask & 0x8 )
      Print( "  Wrong Direction" )
    endif
    if ( mask & 0x10 )
      Print( "  Flipped Reference" )
    endif
    if ( mask & 0x20 )
      Print( "  Missing Points at Extrema" )
    endif
    if ( mask & 0x40 )
      Print( "  Unknown glyph referenced in GSUB/GPOS/MATH" )
    endif
    if ( mask & 0x80 )
      Print( "  More points in a glyph than PostScript allows" )
    endif
    if ( mask & 0x100 )
      Print( "  Too Many Hints" )
    endif
    if ( mask & 0x200 )
      Print( "  Bad Glyph Name" )
    endif
    if ( mask & 0x400 )
      Print( "  More points in a glyph than specified in 'maxp'" )
    endif
    if ( mask & 0x800 )
      Print( "  More paths in a glyph than specified in 'maxp'" )
    endif
    if ( mask & 0x1000 )
      Print( "  More points in a composite glyph than specified in 'maxp'" )
    endif
    if ( mask & 0x2000 )
      Print( "  More paths in a composite glyph than specified in 'maxp'" )
    endif
    if ( mask & 0x4000 )
      Print( "  Instructions longer than allowed in 'maxp'" )
    endif
    if ( mask & 0x8000 )
      Print( "  More references in a glyph than specified in 'maxp'" )
    endif
    if ( mask & 0x10000 )
      Print( "  References nested more deeply than specified in 'maxp'" )
    endif
    if ( mask & 0x20000 )
#      Print( "  'prep' or 'fpgm' tables are longer than specified in 'maxp'" )
#I no longer think this is an error
    endif
    if ( mask & 0x40000 )
      Print( "  Adjacent points too far apart in a glyph" )
    endif
    if ( mask & 0x80000 )
      Print( "  Non integral coordinates in a glyph" )
    endif
    if ( mask & 0x100000 )
      Print( "  A glyph uses at least one, but not all, anchor classes in a subtable" )
      Print( "   (I'm not absolutely sure this is an error)" )
    endif
    if ( mask & 0x200000 )
      Print( "  Two glyphs have the same name." )
    endif
    if ( mask & 0x400000 )
      Print( "  Two glyphs have the unicode." )
    endif
    if ( mask & 0x800000 )
      Print( "  Overlapping hints in a glyph." )
    endif

    mask = $loadState;
    if ( mask & 0x01 )
      Print( "  Bad PostScript fontname entry in the 'name' table" )
    endif
    if ( mask & 0x02 )
      Print( "  Bad 'glyf' or 'loca' table" )
    endif
    if ( mask & 0x04 )
      Print( "  Bad 'CFF ' table" )
    endif
    if ( mask & 0x08 )
      Print( "  Bad 'hhea', 'hmtx', 'vhea' or 'vmtx' table" )
    endif
    if ( mask & 0x10 )
      Print( "  Bad 'cmap' table" )
    endif
    if ( mask & 0x20 )
      Print( "  Bad 'EBDT', 'bdat', 'EBLC' or 'bloc' (embedded bitmap) table" )
    endif
    if ( mask & 0x40 )
      Print( "  Bad Apple GX advanced typography table" )
    endif
    if ( mask & 0x80 )
      Print( "  Bad OpenType advanced typography table" )
    endif
    if ( mask & 0x100 )
      Print( "  Bad version number in OS/2 table (must be >0, and must be >1 for OT-CFF fonts)" )
    endif
    if ( mask & 0x200 )
      Print( "  Bad sfnt file header" )
    endif

    if ( blues & 0x010000 )
      Print( "  Missing BlueValues entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x000001 )
      Print( "  Odd number of elements in either the BlueValues or OtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000002 )
      Print( "  Disordered elements in either the BlueValues or OtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000004 )
      Print( "  Too many elements in either the BlueValues or OtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000008 )
      Print( "  Elements too close in either the BlueValues or OtherBlues entries in the PostScript Private dictionary (must be at least 2*BlueFuzz+1 apart)" )
    endif
    if ( blues & 0x000010 )
      Print( "  Non-integral elements in either the BlueValues or OtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000020 )
      Print( "  Alignment zone height in either the BlueValues or OtherBlues is too big for the BlueScale in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000100 )
      Print( "  Odd number of elements in either the FamilyBlues or FamilyOtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000200 )
      Print( "  Disordered elements in either the FamilyBlues or FamilyOtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000400 )
      Print( "  Too many elements in either the FamilyBlues or FamilyOtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x000800 )
      Print( "  Elements too close in either the FamilyBlues or FamilyOtherBlues entries in the PostScript Private dictionary (must be at least 2*BlueFuzz+1 apart)" )
    endif
    if ( blues & 0x001000 )
      Print( "  Non-integral elements in either the FamilyBlues or FamilyOtherBlues entries in the PostScript Private dictionary" )
    endif
    if ( blues & 0x002000 )
      Print( "  Alignment zone height in either the FamilyBlues or FamilyOtherBlues is too big for the BlueScale in the PostScript Private dictionary" )
    endif
    if ( blues & 0x020000 )
      Print( "  Bad BlueFuzz entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x040000 )
      Print( "  Bad BlueScale entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x080000 )
      Print( "  Bad StdHW entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x100000 )
      Print( "  Bad StdVW entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x200000 )
      Print( "  Bad StemSnapH entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x400000 )
      Print( "  Bad StemSnapV entry in PostScript Private dictionary" )
    endif
    if ( blues & 0x800000 )
      Print( "  StemSnapH does not contain StdHW value in PostScript Private dictionary" )
    endif
    if ( blues & 0x1000000 )
      Print( "  StemSnapV does not contain StdVW value in PostScript Private dictionary" )
    endif
    if ( blues & 0x2000000 )
      Print( "  Bad BlueShift entry in PostScript Private dictionary" )
    endif
Quit( 1 )
  endif
  Close()
  shift
endloop
