home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 26 / CD_ASCQ_26_1295.iso / vrac / giftool2.zip / SOURCE.ZIP / MAIN.C < prev    next >
C/C++ Source or Header  |  1995-09-28  |  39KB  |  1,416 lines

  1. /*
  2. **  Copyright 1994, Home Pages, Inc.
  3. **
  4. **    Please read the file COPYRIGHT for specific information.
  5. ** 
  6. **    Home Pages, Inc.
  7. **    257 Castro St. Suite 219
  8. **    Mountain View, CA 94041
  9. ** 
  10. **    Phone: 1 415 903 5353
  11. **      Fax: 1 415 903 5345
  12. ** 
  13. **    EMail: support@homepages.com
  14. ** 
  15. */
  16.  
  17. #include <stdio.h>
  18. #include <ctype.h>
  19. extern char *strchr();
  20. #define TRUE 1
  21. #define FALSE 0
  22. #include "gif.h"
  23.  
  24. struct colorTable_s {
  25.     int    r,g,b;
  26.     char    *name;
  27. } colorTable [] = {
  28.     {255,250,250,"snow"},
  29.     {248,248,255,"ghost white"},
  30.     {248,248,255,"GhostWhite"},
  31.     {245,245,245,"white smoke"},
  32.     {245,245,245,"WhiteSmoke"},
  33.     {220,220,220,"gainsboro"},
  34.     {255,250,240,"floral white"},
  35.     {255,250,240,"FloralWhite"},
  36.     {253,245,230,"old lace"},
  37.     {253,245,230,"OldLace"},
  38.     {250,240,230,"linen"},
  39.     {250,235,215,"antique white"},
  40.     {250,235,215,"AntiqueWhite"},
  41.     {255,239,213,"papaya whip"},
  42.     {255,239,213,"PapayaWhip"},
  43.     {255,235,205,"blanched almond"},
  44.     {255,235,205,"BlanchedAlmond"},
  45.     {255,228,196,"bisque"},
  46.     {255,218,185,"peach puff"},
  47.     {255,218,185,"PeachPuff"},
  48.     {255,222,173,"navajo white"},
  49.     {255,222,173,"NavajoWhite"},
  50.     {255,228,181,"moccasin"},
  51.     {255,248,220,"cornsilk"},
  52.     {255,255,240,"ivory"},
  53.     {255,250,205,"lemon chiffon"},
  54.     {255,250,205,"LemonChiffon"},
  55.     {255,245,238,"seashell"},
  56.     {240,255,240,"honeydew"},
  57.     {245,255,250,"mint cream"},
  58.     {245,255,250,"MintCream"},
  59.     {240,255,255,"azure"},
  60.     {240,248,255,"alice blue"},
  61.     {240,248,255,"AliceBlue"},
  62.     {230,230,250,"lavender"},
  63.     {255,240,245,"lavender blush"},
  64.     {255,240,245,"LavenderBlush"},
  65.     {255,228,225,"misty rose"},
  66.     {255,228,225,"MistyRose"},
  67.     {255,255,255,"white"},
  68.     {0,0,0,"black"},
  69.     {47,79,79,"dark slate gray"},
  70.     {47,79,79,"DarkSlateGray"},
  71.     {47,79,79,"dark slate grey"},
  72.     {47,79,79,"DarkSlateGrey"},
  73.     {105,105,105,"dim gray"},
  74.     {105,105,105,"DimGray"},
  75.     {105,105,105,"dim grey"},
  76.     {105,105,105,"DimGrey"},
  77.     {112,128,144,"slate gray"},
  78.     {112,128,144,"SlateGray"},
  79.     {112,128,144,"slate grey"},
  80.     {112,128,144,"SlateGrey"},
  81.     {119,136,153,"light slate gray"},
  82.     {119,136,153,"LightSlateGray"},
  83.     {119,136,153,"light slate grey"},
  84.     {119,136,153,"LightSlateGrey"},
  85.     {192,192,192,"gray"},
  86.     {192,192,192,"grey"},
  87.     {211,211,211,"light grey"},
  88.     {211,211,211,"LightGrey"},
  89.     {211,211,211,"light gray"},
  90.     {211,211,211,"LightGray"},
  91.     {25,25,112,"midnight blue"},
  92.     {25,25,112,"MidnightBlue"},
  93.     {0,0,128,"navy"},
  94.     {0,0,128,"navy blue"},
  95.     {0,0,128,"NavyBlue"},
  96.     {100,149,237,"cornflower blue"},
  97.     {100,149,237,"CornflowerBlue"},
  98.     {72,61,139,"dark slate blue"},
  99.     {72,61,139,"DarkSlateBlue"},
  100.     {106,90,205,"slate blue"},
  101.     {106,90,205,"SlateBlue"},
  102.     {123,104,238,"medium slate blue"},
  103.     {123,104,238,"MediumSlateBlue"},
  104.     {132,112,255,"light slate blue"},
  105.     {132,112,255,"LightSlateBlue"},
  106.     {0,0,205,"medium blue"},
  107.     {0,0,205,"MediumBlue"},
  108.     {65,105,225,"royal blue"},
  109.     {65,105,225,"RoyalBlue"},
  110.     {0,0,255,"blue"},
  111.     {30,144,255,"dodger blue"},
  112.     {30,144,255,"DodgerBlue"},
  113.     {0,191,255,"deep sky blue"},
  114.     {0,191,255,"DeepSkyBlue"},
  115.     {135,206,235,"sky blue"},
  116.     {135,206,235,"SkyBlue"},
  117.     {135,206,250,"light sky blue"},
  118.     {135,206,250,"LightSkyBlue"},
  119.     {70,130,180,"steel blue"},
  120.     {70,130,180,"SteelBlue"},
  121.     {176,196,222,"light steel blue"},
  122.     {176,196,222,"LightSteelBlue"},
  123.     {173,216,230,"light blue"},
  124.     {173,216,230,"LightBlue"},
  125.     {176,224,230,"powder blue"},
  126.     {176,224,230,"PowderBlue"},
  127.     {175,238,238,"pale turquoise"},
  128.     {175,238,238,"PaleTurquoise"},
  129.     {0,206,209,"dark turquoise"},
  130.     {0,206,209,"DarkTurquoise"},
  131.     {72,209,204,"medium turquoise"},
  132.     {72,209,204,"MediumTurquoise"},
  133.     {64,224,208,"turquoise"},
  134.     {0,255,255,"cyan"},
  135.     {224,255,255,"light cyan"},
  136.     {224,255,255,"LightCyan"},
  137.     {95,158,160,"cadet blue"},
  138.     {95,158,160,"CadetBlue"},
  139.     {102,205,170,"medium aquamarine"},
  140.     {102,205,170,"MediumAquamarine"},
  141.     {127,255,212,"aquamarine"},
  142.     {0,100,0,"dark green"},
  143.     {0,100,0,"DarkGreen"},
  144.     {85,107,47,"dark olive green"},
  145.     {85,107,47,"DarkOliveGreen"},
  146.     {143,188,143,"dark sea green"},
  147.     {143,188,143,"DarkSeaGreen"},
  148.     {46,139,87,"sea green"},
  149.     {46,139,87,"SeaGreen"},
  150.     {60,179,113,"medium sea green"},
  151.     {60,179,113,"MediumSeaGreen"},
  152.     {32,178,170,"light sea green"},
  153.     {32,178,170,"LightSeaGreen"},
  154.     {152,251,152,"pale green"},
  155.     {152,251,152,"PaleGreen"},
  156.     {0,255,127,"spring green"},
  157.     {0,255,127,"SpringGreen"},
  158.     {124,252,0,"lawn green"},
  159.     {124,252,0,"LawnGreen"},
  160.     {0,255,0,"green"},
  161.     {127,255,0,"chartreuse"},
  162.     {0,250,154,"medium spring green"},
  163.     {0,250,154,"MediumSpringGreen"},
  164.     {173,255,47,"green yellow"},
  165.     {173,255,47,"GreenYellow"},
  166.     {50,205,50,"lime green"},
  167.     {50,205,50,"LimeGreen"},
  168.     {154,205,50,"yellow green"},
  169.     {154,205,50,"YellowGreen"},
  170.     {34,139,34,"forest green"},
  171.     {34,139,34,"ForestGreen"},
  172.     {107,142,35,"olive drab"},
  173.     {107,142,35,"OliveDrab"},
  174.     {189,183,107,"dark khaki"},
  175.     {189,183,107,"DarkKhaki"},
  176.     {240,230,140,"khaki"},
  177.     {238,232,170,"pale goldenrod"},
  178.     {238,232,170,"PaleGoldenrod"},
  179.     {250,250,210,"light goldenrod yellow"},
  180.     {250,250,210,"LightGoldenrodYellow"},
  181.     {255,255,224,"light yellow"},
  182.     {255,255,224,"LightYellow"},
  183.     {255,255,0,"yellow"},
  184.     {255,215,0,"gold"},
  185.     {238,221,130,"light goldenrod"},
  186.     {238,221,130,"LightGoldenrod"},
  187.     {218,165,32,"goldenrod"},
  188.     {184,134,11,"dark goldenrod"},
  189.     {184,134,11,"DarkGoldenrod"},
  190.     {188,143,143,"rosy brown"},
  191.     {188,143,143,"RosyBrown"},
  192.     {205,92,92,"indian red"},
  193.     {205,92,92,"IndianRed"},
  194.     {139,69,19,"saddle brown"},
  195.     {139,69,19,"SaddleBrown"},
  196.     {160,82,45,"sienna"},
  197.     {205,133,63,"peru"},
  198.     {222,184,135,"burlywood"},
  199.     {245,245,220,"beige"},
  200.     {245,222,179,"wheat"},
  201.     {244,164,96,"sandy brown"},
  202.     {244,164,96,"SandyBrown"},
  203.     {210,180,140,"tan"},
  204.     {210,105,30,"chocolate"},
  205.     {178,34,34,"firebrick"},
  206.     {165,42,42,"brown"},
  207.     {233,150,122,"dark salmon"},
  208.     {233,150,122,"DarkSalmon"},
  209.     {250,128,114,"salmon"},
  210.     {255,160,122,"light salmon"},
  211.     {255,160,122,"LightSalmon"},
  212.     {255,165,0,"orange"},
  213.     {255,140,0,"dark orange"},
  214.     {255,140,0,"DarkOrange"},
  215.     {255,127,80,"coral"},
  216.     {240,128,128,"light coral"},
  217.     {240,128,128,"LightCoral"},
  218.     {255,99,71,"tomato"},
  219.     {255,69,0,"orange red"},
  220.     {255,69,0,"OrangeRed"},
  221.     {255,0,0,"red"},
  222.     {255,105,180,"hot pink"},
  223.     {255,105,180,"HotPink"},
  224.     {255,20,147,"deep pink"},
  225.     {255,20,147,"DeepPink"},
  226.     {255,192,203,"pink"},
  227.     {255,182,193,"light pink"},
  228.     {255,182,193,"LightPink"},
  229.     {219,112,147,"pale violet red"},
  230.     {219,112,147,"PaleVioletRed"},
  231.     {176,48,96,"maroon"},
  232.     {199,21,133,"medium violet red"},
  233.     {199,21,133,"MediumVioletRed"},
  234.     {208,32,144,"violet red"},
  235.     {208,32,144,"VioletRed"},
  236.     {255,0,255,"magenta"},
  237.     {238,130,238,"violet"},
  238.     {221,160,221,"plum"},
  239.     {218,112,214,"orchid"},
  240.     {186,85,211,"medium orchid"},
  241.     {186,85,211,"MediumOrchid"},
  242.     {153,50,204,"dark orchid"},
  243.     {153,50,204,"DarkOrchid"},
  244.     {148,0,211,"dark violet"},
  245.     {148,0,211,"DarkViolet"},
  246.     {138,43,226,"blue violet"},
  247.     {138,43,226,"BlueViolet"},
  248.     {160,32,240,"purple"},
  249.     {147,112,219,"medium purple"},
  250.     {147,112,219,"MediumPurple"},
  251.     {216,191,216,"thistle"},
  252.     {255,250,250,"snow1"},
  253.     {238,233,233,"snow2"},
  254.     {205,201,201,"snow3"},
  255.     {139,137,137,"snow4"},
  256.     {255,245,238,"seashell1"},
  257.     {238,229,222,"seashell2"},
  258.     {205,197,191,"seashell3"},
  259.     {139,134,130,"seashell4"},
  260.     {255,239,219,"AntiqueWhite1"},
  261.     {238,223,204,"AntiqueWhite2"},
  262.     {205,192,176,"AntiqueWhite3"},
  263.     {139,131,120,"AntiqueWhite4"},
  264.     {255,228,196,"bisque1"},
  265.     {238,213,183,"bisque2"},
  266.     {205,183,158,"bisque3"},
  267.     {139,125,107,"bisque4"},
  268.     {255,218,185,"PeachPuff1"},
  269.     {238,203,173,"PeachPuff2"},
  270.     {205,175,149,"PeachPuff3"},
  271.     {139,119,101,"PeachPuff4"},
  272.     {255,222,173,"NavajoWhite1"},
  273.     {238,207,161,"NavajoWhite2"},
  274.     {205,179,139,"NavajoWhite3"},
  275.     {139,121,94,"NavajoWhite4"},
  276.     {255,250,205,"LemonChiffon1"},
  277.     {238,233,191,"LemonChiffon2"},
  278.     {205,201,165,"LemonChiffon3"},
  279.     {139,137,112,"LemonChiffon4"},
  280.     {255,248,220,"cornsilk1"},
  281.     {238,232,205,"cornsilk2"},
  282.     {205,200,177,"cornsilk3"},
  283.     {139,136,120,"cornsilk4"},
  284.     {255,255,240,"ivory1"},
  285.     {238,238,224,"ivory2"},
  286.     {205,205,193,"ivory3"},
  287.     {139,139,131,"ivory4"},
  288.     {240,255,240,"honeydew1"},
  289.     {224,238,224,"honeydew2"},
  290.     {193,205,193,"honeydew3"},
  291.     {131,139,131,"honeydew4"},
  292.     {255,240,245,"LavenderBlush1"},
  293.     {238,224,229,"LavenderBlush2"},
  294.     {205,193,197,"LavenderBlush3"},
  295.     {139,131,134,"LavenderBlush4"},
  296.     {255,228,225,"MistyRose1"},
  297.     {238,213,210,"MistyRose2"},
  298.     {205,183,181,"MistyRose3"},
  299.     {139,125,123,"MistyRose4"},
  300.     {240,255,255,"azure1"},
  301.     {224,238,238,"azure2"},
  302.     {193,205,205,"azure3"},
  303.     {131,139,139,"azure4"},
  304.     {131,111,255,"SlateBlue1"},
  305.     {122,103,238,"SlateBlue2"},
  306.     {105,89,205,"SlateBlue3"},
  307.     {71,60,139,"SlateBlue4"},
  308.     {72,118,255,"RoyalBlue1"},
  309.     {67,110,238,"RoyalBlue2"},
  310.     {58,95,205,"RoyalBlue3"},
  311.     {39,64,139,"RoyalBlue4"},
  312.     {0,0,255,"blue1"},
  313.     {0,0,238,"blue2"},
  314.     {0,0,205,"blue3"},
  315.     {0,0,139,"blue4"},
  316.     {30,144,255,"DodgerBlue1"},
  317.     {28,134,238,"DodgerBlue2"},
  318.     {24,116,205,"DodgerBlue3"},
  319.     {16,78,139,"DodgerBlue4"},
  320.     {99,184,255,"SteelBlue1"},
  321.     {92,172,238,"SteelBlue2"},
  322.     {79,148,205,"SteelBlue3"},
  323.     {54,100,139,"SteelBlue4"},
  324.     {0,191,255,"DeepSkyBlue1"},
  325.     {0,178,238,"DeepSkyBlue2"},
  326.     {0,154,205,"DeepSkyBlue3"},
  327.     {0,104,139,"DeepSkyBlue4"},
  328.     {135,206,255,"SkyBlue1"},
  329.     {126,192,238,"SkyBlue2"},
  330.     {108,166,205,"SkyBlue3"},
  331.     {74,112,139,"SkyBlue4"},
  332.     {176,226,255,"LightSkyBlue1"},
  333.     {164,211,238,"LightSkyBlue2"},
  334.     {141,182,205,"LightSkyBlue3"},
  335.     {96,123,139,"LightSkyBlue4"},
  336.     {198,226,255,"SlateGray1"},
  337.     {185,211,238,"SlateGray2"},
  338.     {159,182,205,"SlateGray3"},
  339.     {108,123,139,"SlateGray4"},
  340.     {202,225,255,"LightSteelBlue1"},
  341.     {188,210,238,"LightSteelBlue2"},
  342.     {162,181,205,"LightSteelBlue3"},
  343.     {110,123,139,"LightSteelBlue4"},
  344.     {191,239,255,"LightBlue1"},
  345.     {178,223,238,"LightBlue2"},
  346.     {154,192,205,"LightBlue3"},
  347.     {104,131,139,"LightBlue4"},
  348.     {224,255,255,"LightCyan1"},
  349.     {209,238,238,"LightCyan2"},
  350.     {180,205,205,"LightCyan3"},
  351.     {122,139,139,"LightCyan4"},
  352.     {187,255,255,"PaleTurquoise1"},
  353.     {174,238,238,"PaleTurquoise2"},
  354.     {150,205,205,"PaleTurquoise3"},
  355.     {102,139,139,"PaleTurquoise4"},
  356.     {152,245,255,"CadetBlue1"},
  357.     {142,229,238,"CadetBlue2"},
  358.     {122,197,205,"CadetBlue3"},
  359.     {83,134,139,"CadetBlue4"},
  360.     {0,245,255,"turquoise1"},
  361.     {0,229,238,"turquoise2"},
  362.     {0,197,205,"turquoise3"},
  363.     {0,134,139,"turquoise4"},
  364.     {0,255,255,"cyan1"},
  365.     {0,238,238,"cyan2"},
  366.     {0,205,205,"cyan3"},
  367.     {0,139,139,"cyan4"},
  368.     {151,255,255,"DarkSlateGray1"},
  369.     {141,238,238,"DarkSlateGray2"},
  370.     {121,205,205,"DarkSlateGray3"},
  371.     {82,139,139,"DarkSlateGray4"},
  372.     {127,255,212,"aquamarine1"},
  373.     {118,238,198,"aquamarine2"},
  374.     {102,205,170,"aquamarine3"},
  375.     {69,139,116,"aquamarine4"},
  376.     {193,255,193,"DarkSeaGreen1"},
  377.     {180,238,180,"DarkSeaGreen2"},
  378.     {155,205,155,"DarkSeaGreen3"},
  379.     {105,139,105,"DarkSeaGreen4"},
  380.     {84,255,159,"SeaGreen1"},
  381.     {78,238,148,"SeaGreen2"},
  382.     {67,205,128,"SeaGreen3"},
  383.     {46,139,87,"SeaGreen4"},
  384.     {154,255,154,"PaleGreen1"},
  385.     {144,238,144,"PaleGreen2"},
  386.     {124,205,124,"PaleGreen3"},
  387.     {84,139,84,"PaleGreen4"},
  388.     {0,255,127,"SpringGreen1"},
  389.     {0,238,118,"SpringGreen2"},
  390.     {0,205,102,"SpringGreen3"},
  391.     {0,139,69,"SpringGreen4"},
  392.     {0,255,0,"green1"},
  393.     {0,238,0,"green2"},
  394.     {0,205,0,"green3"},
  395.     {0,139,0,"green4"},
  396.     {127,255,0,"chartreuse1"},
  397.     {118,238,0,"chartreuse2"},
  398.     {102,205,0,"chartreuse3"},
  399.     {69,139,0,"chartreuse4"},
  400.     {192,255,62,"OliveDrab1"},
  401.     {179,238,58,"OliveDrab2"},
  402.     {154,205,50,"OliveDrab3"},
  403.     {105,139,34,"OliveDrab4"},
  404.     {202,255,112,"DarkOliveGreen1"},
  405.     {188,238,104,"DarkOliveGreen2"},
  406.     {162,205,90,"DarkOliveGreen3"},
  407.     {110,139,61,"DarkOliveGreen4"},
  408.     {255,246,143,"khaki1"},
  409.     {238,230,133,"khaki2"},
  410.     {205,198,115,"khaki3"},
  411.     {139,134,78,"khaki4"},
  412.     {255,236,139,"LightGoldenrod1"},
  413.     {238,220,130,"LightGoldenrod2"},
  414.     {205,190,112,"LightGoldenrod3"},
  415.     {139,129,76,"LightGoldenrod4"},
  416.     {255,255,224,"LightYellow1"},
  417.     {238,238,209,"LightYellow2"},
  418.     {205,205,180,"LightYellow3"},
  419.     {139,139,122,"LightYellow4"},
  420.     {255,255,0,"yellow1"},
  421.     {238,238,0,"yellow2"},
  422.     {205,205,0,"yellow3"},
  423.     {139,139,0,"yellow4"},
  424.     {255,215,0,"gold1"},
  425.     {238,201,0,"gold2"},
  426.     {205,173,0,"gold3"},
  427.     {139,117,0,"gold4"},
  428.     {255,193,37,"goldenrod1"},
  429.     {238,180,34,"goldenrod2"},
  430.     {205,155,29,"goldenrod3"},
  431.     {139,105,20,"goldenrod4"},
  432.     {255,185,15,"DarkGoldenrod1"},
  433.     {238,173,14,"DarkGoldenrod2"},
  434.     {205,149,12,"DarkGoldenrod3"},
  435.     {139,101,8,"DarkGoldenrod4"},
  436.     {255,193,193,"RosyBrown1"},
  437.     {238,180,180,"RosyBrown2"},
  438.     {205,155,155,"RosyBrown3"},
  439.     {139,105,105,"RosyBrown4"},
  440.     {255,106,106,"IndianRed1"},
  441.     {238,99,99,"IndianRed2"},
  442.     {205,85,85,"IndianRed3"},
  443.     {139,58,58,"IndianRed4"},
  444.     {255,130,71,"sienna1"},
  445.     {238,121,66,"sienna2"},
  446.     {205,104,57,"sienna3"},
  447.     {139,71,38,"sienna4"},
  448.     {255,211,155,"burlywood1"},
  449.     {238,197,145,"burlywood2"},
  450.     {205,170,125,"burlywood3"},
  451.     {139,115,85,"burlywood4"},
  452.     {255,231,186,"wheat1"},
  453.     {238,216,174,"wheat2"},
  454.     {205,186,150,"wheat3"},
  455.     {139,126,102,"wheat4"},
  456.     {255,165,79,"tan1"},
  457.     {238,154,73,"tan2"},
  458.     {205,133,63,"tan3"},
  459.     {139,90,43,"tan4"},
  460.     {255,127,36,"chocolate1"},
  461.     {238,118,33,"chocolate2"},
  462.     {205,102,29,"chocolate3"},
  463.     {139,69,19,"chocolate4"},
  464.     {255,48,48,"firebrick1"},
  465.     {238,44,44,"firebrick2"},
  466.     {205,38,38,"firebrick3"},
  467.     {139,26,26,"firebrick4"},
  468.     {255,64,64,"brown1"},
  469.     {238,59,59,"brown2"},
  470.     {205,51,51,"brown3"},
  471.     {139,35,35,"brown4"},
  472.     {255,140,105,"salmon1"},
  473.     {238,130,98,"salmon2"},
  474.     {205,112,84,"salmon3"},
  475.     {139,76,57,"salmon4"},
  476.     {255,160,122,"LightSalmon1"},
  477.     {238,149,114,"LightSalmon2"},
  478.     {205,129,98,"LightSalmon3"},
  479.     {139,87,66,"LightSalmon4"},
  480.     {255,165,0,"orange1"},
  481.     {238,154,0,"orange2"},
  482.     {205,133,0,"orange3"},
  483.     {139,90,0,"orange4"},
  484.     {255,127,0,"DarkOrange1"},
  485.     {238,118,0,"DarkOrange2"},
  486.     {205,102,0,"DarkOrange3"},
  487.     {139,69,0,"DarkOrange4"},
  488.     {255,114,86,"coral1"},
  489.     {238,106,80,"coral2"},
  490.     {205,91,69,"coral3"},
  491.     {139,62,47,"coral4"},
  492.     {255,99,71,"tomato1"},
  493.     {238,92,66,"tomato2"},
  494.     {205,79,57,"tomato3"},
  495.     {139,54,38,"tomato4"},
  496.     {255,69,0,"OrangeRed1"},
  497.     {238,64,0,"OrangeRed2"},
  498.     {205,55,0,"OrangeRed3"},
  499.     {139,37,0,"OrangeRed4"},
  500.     {255,0,0,"red1"},
  501.     {238,0,0,"red2"},
  502.     {205,0,0,"red3"},
  503.     {139,0,0,"red4"},
  504.     {255,20,147,"DeepPink1"},
  505.     {238,18,137,"DeepPink2"},
  506.     {205,16,118,"DeepPink3"},
  507.     {139,10,80,"DeepPink4"},
  508.     {255,110,180,"HotPink1"},
  509.     {238,106,167,"HotPink2"},
  510.     {205,96,144,"HotPink3"},
  511.     {139,58,98,"HotPink4"},
  512.     {255,181,197,"pink1"},
  513.     {238,169,184,"pink2"},
  514.     {205,145,158,"pink3"},
  515.     {139,99,108,"pink4"},
  516.     {255,174,185,"LightPink1"},
  517.     {238,162,173,"LightPink2"},
  518.     {205,140,149,"LightPink3"},
  519.     {139,95,101,"LightPink4"},
  520.     {255,130,171,"PaleVioletRed1"},
  521.     {238,121,159,"PaleVioletRed2"},
  522.     {205,104,137,"PaleVioletRed3"},
  523.     {139,71,93,"PaleVioletRed4"},
  524.     {255,52,179,"maroon1"},
  525.     {238,48,167,"maroon2"},
  526.     {205,41,144,"maroon3"},
  527.     {139,28,98,"maroon4"},
  528.     {255,62,150,"VioletRed1"},
  529.     {238,58,140,"VioletRed2"},
  530.     {205,50,120,"VioletRed3"},
  531.     {139,34,82,"VioletRed4"},
  532.     {255,0,255,"magenta1"},
  533.     {238,0,238,"magenta2"},
  534.     {205,0,205,"magenta3"},
  535.     {139,0,139,"magenta4"},
  536.     {255,131,250,"orchid1"},
  537.     {238,122,233,"orchid2"},
  538.     {205,105,201,"orchid3"},
  539.     {139,71,137,"orchid4"},
  540.     {255,187,255,"plum1"},
  541.     {238,174,238,"plum2"},
  542.     {205,150,205,"plum3"},
  543.     {139,102,139,"plum4"},
  544.     {224,102,255,"MediumOrchid1"},
  545.     {209,95,238,"MediumOrchid2"},
  546.     {180,82,205,"MediumOrchid3"},
  547.     {122,55,139,"MediumOrchid4"},
  548.     {191,62,255,"DarkOrchid1"},
  549.     {178,58,238,"DarkOrchid2"},
  550.     {154,50,205,"DarkOrchid3"},
  551.     {104,34,139,"DarkOrchid4"},
  552.     {155,48,255,"purple1"},
  553.     {145,44,238,"purple2"},
  554.     {125,38,205,"purple3"},
  555.     {85,26,139,"purple4"},
  556.     {171,130,255,"MediumPurple1"},
  557.     {159,121,238,"MediumPurple2"},
  558.     {137,104,205,"MediumPurple3"},
  559.     {93,71,139,"MediumPurple4"},
  560.     {255,225,255,"thistle1"},
  561.     {238,210,238,"thistle2"},
  562.     {205,181,205,"thistle3"},
  563.     {139,123,139,"thistle4"},
  564.     {0,0,0,"gray0"},
  565.     {0,0,0,"grey0"},
  566.     {3,3,3,"gray1"},
  567.     {3,3,3,"grey1"},
  568.     {5,5,5,"gray2"},
  569.     {5,5,5,"grey2"},
  570.     {8,8,8,"gray3"},
  571.     {8,8,8,"grey3"},
  572.     {10,10,10,"gray4"},
  573.     {10,10,10,"grey4"},
  574.     {13,13,13,"gray5"},
  575.     {13,13,13,"grey5"},
  576.     {15,15,15,"gray6"},
  577.     {15,15,15,"grey6"},
  578.     {18,18,18,"gray7"},
  579.     {18,18,18,"grey7"},
  580.     {20,20,20,"gray8"},
  581.     {20,20,20,"grey8"},
  582.     {23,23,23,"gray9"},
  583.     {23,23,23,"grey9"},
  584.     {26,26,26,"gray10"},
  585.     {26,26,26,"grey10"},
  586.     {28,28,28,"gray11"},
  587.     {28,28,28,"grey11"},
  588.     {31,31,31,"gray12"},
  589.     {31,31,31,"grey12"},
  590.     {33,33,33,"gray13"},
  591.     {33,33,33,"grey13"},
  592.     {36,36,36,"gray14"},
  593.     {36,36,36,"grey14"},
  594.     {38,38,38,"gray15"},
  595.     {38,38,38,"grey15"},
  596.     {41,41,41,"gray16"},
  597.     {41,41,41,"grey16"},
  598.     {43,43,43,"gray17"},
  599.     {43,43,43,"grey17"},
  600.     {46,46,46,"gray18"},
  601.     {46,46,46,"grey18"},
  602.     {48,48,48,"gray19"},
  603.     {48,48,48,"grey19"},
  604.     {51,51,51,"gray20"},
  605.     {51,51,51,"grey20"},
  606.     {54,54,54,"gray21"},
  607.     {54,54,54,"grey21"},
  608.     {56,56,56,"gray22"},
  609.     {56,56,56,"grey22"},
  610.     {59,59,59,"gray23"},
  611.     {59,59,59,"grey23"},
  612.     {61,61,61,"gray24"},
  613.     {61,61,61,"grey24"},
  614.     {64,64,64,"gray25"},
  615.     {64,64,64,"grey25"},
  616.     {66,66,66,"gray26"},
  617.     {66,66,66,"grey26"},
  618.     {69,69,69,"gray27"},
  619.     {69,69,69,"grey27"},
  620.     {71,71,71,"gray28"},
  621.     {71,71,71,"grey28"},
  622.     {74,74,74,"gray29"},
  623.     {74,74,74,"grey29"},
  624.     {77,77,77,"gray30"},
  625.     {77,77,77,"grey30"},
  626.     {79,79,79,"gray31"},
  627.     {79,79,79,"grey31"},
  628.     {82,82,82,"gray32"},
  629.     {82,82,82,"grey32"},
  630.     {84,84,84,"gray33"},
  631.     {84,84,84,"grey33"},
  632.     {87,87,87,"gray34"},
  633.     {87,87,87,"grey34"},
  634.     {89,89,89,"gray35"},
  635.     {89,89,89,"grey35"},
  636.     {92,92,92,"gray36"},
  637.     {92,92,92,"grey36"},
  638.     {94,94,94,"gray37"},
  639.     {94,94,94,"grey37"},
  640.     {97,97,97,"gray38"},
  641.     {97,97,97,"grey38"},
  642.     {99,99,99,"gray39"},
  643.     {99,99,99,"grey39"},
  644.     {102,102,102,"gray40"},
  645.     {102,102,102,"grey40"},
  646.     {105,105,105,"gray41"},
  647.     {105,105,105,"grey41"},
  648.     {107,107,107,"gray42"},
  649.     {107,107,107,"grey42"},
  650.     {110,110,110,"gray43"},
  651.     {110,110,110,"grey43"},
  652.     {112,112,112,"gray44"},
  653.     {112,112,112,"grey44"},
  654.     {115,115,115,"gray45"},
  655.     {115,115,115,"grey45"},
  656.     {117,117,117,"gray46"},
  657.     {117,117,117,"grey46"},
  658.     {120,120,120,"gray47"},
  659.     {120,120,120,"grey47"},
  660.     {122,122,122,"gray48"},
  661.     {122,122,122,"grey48"},
  662.     {125,125,125,"gray49"},
  663.     {125,125,125,"grey49"},
  664.     {127,127,127,"gray50"},
  665.     {127,127,127,"grey50"},
  666.     {130,130,130,"gray51"},
  667.     {130,130,130,"grey51"},
  668.     {133,133,133,"gray52"},
  669.     {133,133,133,"grey52"},
  670.     {135,135,135,"gray53"},
  671.     {135,135,135,"grey53"},
  672.     {138,138,138,"gray54"},
  673.     {138,138,138,"grey54"},
  674.     {140,140,140,"gray55"},
  675.     {140,140,140,"grey55"},
  676.     {143,143,143,"gray56"},
  677.     {143,143,143,"grey56"},
  678.     {145,145,145,"gray57"},
  679.     {145,145,145,"grey57"},
  680.     {148,148,148,"gray58"},
  681.     {148,148,148,"grey58"},
  682.     {150,150,150,"gray59"},
  683.     {150,150,150,"grey59"},
  684.     {153,153,153,"gray60"},
  685.     {153,153,153,"grey60"},
  686.     {156,156,156,"gray61"},
  687.     {156,156,156,"grey61"},
  688.     {158,158,158,"gray62"},
  689.     {158,158,158,"grey62"},
  690.     {161,161,161,"gray63"},
  691.     {161,161,161,"grey63"},
  692.     {163,163,163,"gray64"},
  693.     {163,163,163,"grey64"},
  694.     {166,166,166,"gray65"},
  695.     {166,166,166,"grey65"},
  696.     {168,168,168,"gray66"},
  697.     {168,168,168,"grey66"},
  698.     {171,171,171,"gray67"},
  699.     {171,171,171,"grey67"},
  700.     {173,173,173,"gray68"},
  701.     {173,173,173,"grey68"},
  702.     {176,176,176,"gray69"},
  703.     {176,176,176,"grey69"},
  704.     {179,179,179,"gray70"},
  705.     {179,179,179,"grey70"},
  706.     {181,181,181,"gray71"},
  707.     {181,181,181,"grey71"},
  708.     {184,184,184,"gray72"},
  709.     {184,184,184,"grey72"},
  710.     {186,186,186,"gray73"},
  711.     {186,186,186,"grey73"},
  712.     {189,189,189,"gray74"},
  713.     {189,189,189,"grey74"},
  714.     {191,191,191,"gray75"},
  715.     {191,191,191,"grey75"},
  716.     {194,194,194,"gray76"},
  717.     {194,194,194,"grey76"},
  718.     {196,196,196,"gray77"},
  719.     {196,196,196,"grey77"},
  720.     {199,199,199,"gray78"},
  721.     {199,199,199,"grey78"},
  722.     {201,201,201,"gray79"},
  723.     {201,201,201,"grey79"},
  724.     {204,204,204,"gray80"},
  725.     {204,204,204,"grey80"},
  726.     {207,207,207,"gray81"},
  727.     {207,207,207,"grey81"},
  728.     {209,209,209,"gray82"},
  729.     {209,209,209,"grey82"},
  730.     {212,212,212,"gray83"},
  731.     {212,212,212,"grey83"},
  732.     {214,214,214,"gray84"},
  733.     {214,214,214,"grey84"},
  734.     {217,217,217,"gray85"},
  735.     {217,217,217,"grey85"},
  736.     {219,219,219,"gray86"},
  737.     {219,219,219,"grey86"},
  738.     {222,222,222,"gray87"},
  739.     {222,222,222,"grey87"},
  740.     {224,224,224,"gray88"},
  741.     {224,224,224,"grey88"},
  742.     {227,227,227,"gray89"},
  743.     {227,227,227,"grey89"},
  744.     {229,229,229,"gray90"},
  745.     {229,229,229,"grey90"},
  746.     {232,232,232,"gray91"},
  747.     {232,232,232,"grey91"},
  748.     {235,235,235,"gray92"},
  749.     {235,235,235,"grey92"},
  750.     {237,237,237,"gray93"},
  751.     {237,237,237,"grey93"},
  752.     {240,240,240,"gray94"},
  753.     {240,240,240,"grey94"},
  754.     {242,242,242,"gray95"},
  755.     {242,242,242,"grey95"},
  756.     {245,245,245,"gray96"},
  757.     {245,245,245,"grey96"},
  758.     {247,247,247,"gray97"},
  759.     {247,247,247,"grey97"},
  760.     {250,250,250,"gray98"},
  761.     {250,250,250,"grey98"},
  762.     {252,252,252,"gray99"},
  763.     {252,252,252,"grey99"},
  764.     {255,255,255,"gray100"},
  765.     {255,255,255,"grey100"},
  766.     {0,0,0,"sgi gray 0"},
  767.     {0,0,0,"SGIGray0"},
  768.     {0,0,0,"sgi grey 0"},
  769.     {0,0,0,"SGIGrey0"},
  770.     {10,10,10,"sgi gray 4"},
  771.     {10,10,10,"SGIGray4"},
  772.     {10,10,10,"sgi grey 4"},
  773.     {10,10,10,"SGIGrey4"},
  774.     {20,20,20,"sgi gray 8"},
  775.     {20,20,20,"SGIGray8"},
  776.     {20,20,20,"sgi grey 8"},
  777.     {20,20,20,"SGIGrey8"},
  778.     {30,30,30,"sgi gray 12"},
  779.     {30,30,30,"SGIGray12"},
  780.     {30,30,30,"sgi grey 12"},
  781.     {30,30,30,"SGIGrey12"},
  782.     {40,40,40,"sgi gray 16"},
  783.     {40,40,40,"SGIGray16"},
  784.     {40,40,40,"sgi grey 16"},
  785.     {40,40,40,"SGIGrey16"},
  786.     {51,51,51,"sgi gray 20"},
  787.     {51,51,51,"SGIGray20"},
  788.     {51,51,51,"sgi grey 20"},
  789.     {51,51,51,"SGIGrey20"},
  790.     {61,61,61,"sgi gray 24"},
  791.     {61,61,61,"SGIGray24"},
  792.     {61,61,61,"sgi grey 24"},
  793.     {61,61,61,"SGIGrey24"},
  794.     {71,71,71,"sgi gray 28"},
  795.     {71,71,71,"SGIGray28"},
  796.     {71,71,71,"sgi grey 28"},
  797.     {71,71,71,"SGIGrey28"},
  798.     {81,81,81,"sgi gray 32"},
  799.     {81,81,81,"SGIGray32"},
  800.     {81,81,81,"sgi grey 32"},
  801.     {81,81,81,"SGIGrey32"},
  802.     {91,91,91,"sgi gray 36"},
  803.     {91,91,91,"SGIGray36"},
  804.     {91,91,91,"sgi grey 36"},
  805.     {91,91,91,"SGIGrey36"},
  806.     {102,102,102,"sgi gray 40"},
  807.     {102,102,102,"SGIGray40"},
  808.     {102,102,102,"sgi grey 40"},
  809.     {102,102,102,"SGIGrey40"},
  810.     {112,112,112,"sgi gray 44"},
  811.     {112,112,112,"SGIGray44"},
  812.     {112,112,112,"sgi grey 44"},
  813.     {112,112,112,"SGIGrey44"},
  814.     {122,122,122,"sgi gray 48"},
  815.     {122,122,122,"SGIGray48"},
  816.     {122,122,122,"sgi grey 48"},
  817.     {122,122,122,"SGIGrey48"},
  818.     {132,132,132,"sgi gray 52"},
  819.     {132,132,132,"SGIGray52"},
  820.     {132,132,132,"sgi grey 52"},
  821.     {132,132,132,"SGIGrey52"},
  822.     {142,142,142,"sgi gray 56"},
  823.     {142,142,142,"SGIGray56"},
  824.     {142,142,142,"sgi grey 56"},
  825.     {142,142,142,"SGIGrey56"},
  826.     {153,153,153,"sgi gray 60"},
  827.     {153,153,153,"SGIGray60"},
  828.     {153,153,153,"sgi grey 60"},
  829.     {153,153,153,"SGIGrey60"},
  830.     {163,163,163,"sgi gray 64"},
  831.     {163,163,163,"SGIGray64"},
  832.     {163,163,163,"sgi grey 64"},
  833.     {163,163,163,"SGIGrey64"},
  834.     {173,173,173,"sgi gray 68"},
  835.     {173,173,173,"SGIGray68"},
  836.     {173,173,173,"sgi grey 68"},
  837.     {173,173,173,"SGIGrey68"},
  838.     {183,183,183,"sgi gray 72"},
  839.     {183,183,183,"SGIGray72"},
  840.     {183,183,183,"sgi grey 72"},
  841.     {183,183,183,"SGIGrey72"},
  842.     {193,193,193,"sgi gray 76"},
  843.     {193,193,193,"SGIGray76"},
  844.     {193,193,193,"sgi grey 76"},
  845.     {193,193,193,"SGIGrey76"},
  846.     {204,204,204,"sgi gray 80"},
  847.     {204,204,204,"SGIGray80"},
  848.     {204,204,204,"sgi grey 80"},
  849.     {204,204,204,"SGIGrey80"},
  850.     {214,214,214,"sgi gray 84"},
  851.     {214,214,214,"SGIGray84"},
  852.     {214,214,214,"sgi grey 84"},
  853.     {214,214,214,"SGIGrey84"},
  854.     {224,224,224,"sgi gray 88"},
  855.     {224,224,224,"SGIGray88"},
  856.     {224,224,224,"sgi grey 88"},
  857.     {224,224,224,"SGIGrey88"},
  858.     {234,234,234,"sgi gray 92"},
  859.     {234,234,234,"SGIGray92"},
  860.     {234,234,234,"sgi grey 92"},
  861.     {234,234,234,"SGIGrey92"},
  862.     {244,244,244,"sgi gray 96"},
  863.     {244,244,244,"SGIGray96"},
  864.     {244,244,244,"sgi grey 96"},
  865.     {244,244,244,"SGIGrey96"},
  866.     {255,255,255,"sgi gray 100"},
  867.     {255,255,255,"SGIGray100"},
  868.     {255,255,255,"sgi grey 100"},
  869.     {255,255,255,"SGIGrey100"},
  870.     {125,158,192,"sgi light blue"},
  871.     {125,158,192,"SGILightBlue"},
  872.     {85,85,85,"sgi dark gray"},
  873.     {85,85,85,"SGIDarkGray"},
  874.     {85,85,85,"sgi dark grey"},
  875.     {85,85,85,"SGIDarkGrey"},
  876.     {198,113,113,"sgi salmon"},
  877.     {198,113,113,"SGISalmon"},
  878.     {113,198,113,"sgi chartreuse"},
  879.     {113,198,113,"SGIChartreuse"},
  880.     {142,142,56,"sgi olive drab"},
  881.     {142,142,56,"SGIOliveDrab"},
  882.     {113,113,198,"sgi slate blue"},
  883.     {113,113,198,"SGISlateBlue"},
  884.     {142,56,142,"sgi beet"},
  885.     {142,56,142,"SGIBeet"},
  886.     {56,142,142,"sgi teal"},
  887.     {56,142,142,"SGITeal"},
  888.     {170,170,170,"sgi light gray"},
  889.     {170,170,170,"SGILightGray"},
  890.     {170,170,170,"sgi light grey"},
  891.     {170,170,170,"SGILightGrey"},
  892.     {214,214,214,"sgi very light gray"},
  893.     {214,214,214,"SGIVeryLightGray"},
  894.     {214,214,214,"sgi very light grey"},
  895.     {214,214,214,"SGIVeryLightGrey"},
  896.     {132,132,132,"sgi medium gray"},
  897.     {132,132,132,"SGIMediumGray"},
  898.     {132,132,132,"sgi medium grey"},
  899.     {132,132,132,"SGIMediumGrey"},
  900.     {40,40,40,"sgi very dark gray"},
  901.     {40,40,40,"SGIVeryDarkGray"},
  902.     {40,40,40,"sgi very dark grey"},
  903.     {40,40,40,"SGIVeryDarkGrey"},
  904.     {197,193,170,"sgi bright gray"},
  905.     {197,193,170,"SGIBrightGray"},
  906.     {197,193,170,"sgi bright grey"},
  907.     {197,193,170,"SGIBrightGrey"},
  908.     {75,0,130,"Indigo"},
  909.     {220,20,60,"Crimson"},
  910. };
  911.  
  912. #define NUMBER(x)    (sizeof(x) / sizeof(x[0]))
  913.  
  914. static void dumpCMAP(char *title, char *start, 
  915.             int size, unsigned char data[GIF_MAXCOLORS][3])
  916. {
  917.     int    i;
  918.     int    j;
  919.  
  920.     if (size == 0)
  921.         return;
  922.     printf("%s\n", title);
  923.  
  924.     for (i = 0; i < size; i++) {
  925.         int    r = data[i][0];
  926.         int    g = data[i][1];
  927.         int    b = data[i][2];
  928.         char    *name = NULL;
  929.  
  930.         for (j = 0; j < NUMBER(colorTable); j++) {
  931.             if (colorTable[j].r == r &&
  932.                 colorTable[j].g == g &&
  933.                 colorTable[j].b == b) {
  934.                 name = colorTable[j].name;
  935.                 break;
  936.             }
  937.         }
  938.  
  939.         printf("%s%3d: %3d %3d %3d (0x%02x 0x%02x 0x%02x) %s\n",
  940.             start, i+1, 
  941.             data[i][0], data[i][1], data[i][2],
  942.             data[i][0], data[i][1], data[i][2],
  943.             name == NULL ? "" : name);
  944.     }
  945. }
  946.  
  947. static void GIFDump(char *name, GIFStream *stream, int commentsOnly)
  948. {
  949.     GIFData    *cur;
  950.  
  951.     if (stream == NULL) {
  952.         printf("GIF Image %s -- BAD Image\n", name);
  953.         return;
  954.     }
  955.  
  956.     printf("GIF Image %s (%dx%d)\n", 
  957.         name == NULL ? "STDIN" : name,
  958.         stream->width, stream->height);
  959.     if (!commentsOnly) {
  960.         if (stream->cmapSize != 0) 
  961.             dumpCMAP("Image Colormap", "", 
  962.                 stream->cmapSize, stream->cmapData);
  963.     }
  964.  
  965.     for (cur = stream->data; cur != NULL; cur = cur->next) {
  966.         if (commentsOnly && cur->type != gif_comment)
  967.             continue;
  968.         switch (cur->type) {
  969.         case gif_image:
  970.             printf("  %sImage at %d,%d size %dx%d\n",
  971.                 cur->data.image.interlaced ?
  972.                     "Interlaced " : "",
  973.                 cur->x, cur->y, cur->width, cur->height);
  974.             if (cur->info.transparent >= 0) {
  975.                 printf("\tTransparent pixel = %d\n",
  976.                     cur->info.transparent + 1);
  977.             }
  978.             if (cur->data.image.cmapSize != 0) {
  979.                 dumpCMAP("  Image Colormap", "\t",
  980.                     cur->data.image.cmapSize,
  981.                     cur->data.image.cmapData);
  982.             }
  983.             break;
  984.         case gif_comment:
  985.             printf("  Comment: %*.*s\n",
  986.                 cur->data.comment.len, 
  987.                 cur->data.comment.len, 
  988.                 cur->data.comment.text);
  989.             break;
  990.         case gif_text:
  991.             printf("  Image Text (at %d,%d): %*.*s\n",
  992.                 cur->x, cur->y,
  993.                 cur->data.text.len, 
  994.                 cur->data.text.len, 
  995.                 cur->data.text.text);
  996.             break;
  997.         }
  998.     }
  999. }
  1000.  
  1001. static void GIFFree(GIFStream *stream)
  1002. {
  1003.     GIFData    *cur, *nxt;
  1004.  
  1005.     if (stream == NULL)
  1006.         return;
  1007.     cur = stream->data;
  1008.  
  1009.     while (cur != NULL) {
  1010.         nxt = cur->next;
  1011.         switch (cur->type) {
  1012.         case gif_image:
  1013.             free(cur->data.image.data);
  1014.             break;
  1015.         case gif_comment:
  1016.             free(cur->data.comment.text);
  1017.             break;
  1018.         case gif_text:
  1019.             free(cur->data.text.text);
  1020.             break;
  1021.         }
  1022.         free(cur);
  1023.         cur = nxt;
  1024.     }
  1025.     free(stream);
  1026. }
  1027.  
  1028. static void setInterlace(GIFStream *stream, int flg)
  1029. {
  1030.     GIFData    *cur = stream->data;
  1031.  
  1032.     for ( ; cur != NULL; cur = cur->next) {
  1033.         if (cur->type == gif_image)
  1034.             cur->data.image.interlaced = flg > 0;
  1035.     }
  1036. }
  1037. static int toval(char *s)
  1038. {
  1039.     if (s[0] == '0' && s[1] == 'x') {
  1040.         int    v;
  1041.         sscanf(s, "0x%x", &v);
  1042.         return v;
  1043.     } else {
  1044.         return atoi(s);
  1045.     }
  1046. }
  1047.  
  1048. static int matchCMAP(char *tpix, int size, unsigned char data[256][3])
  1049. {
  1050.     char    buf[80], *cp;
  1051.     char    c[3][20];
  1052.     int    r, g, b;
  1053.     int    i;
  1054.     int    min, dist;
  1055.  
  1056.     if (strchr(tpix, ',') == NULL) {
  1057.         int    v = atoi(tpix);
  1058.  
  1059.         if (v != 0) {
  1060.             if (v <= size && v > 0)
  1061.                 return v - 1;
  1062.             return -1;
  1063.         }
  1064.         for (v = 0; v < NUMBER(colorTable); v++) {
  1065. /*            if (strcasecmp(colorTable[v].name, tpix) == 0)                        */
  1066.             if (strcmp    (colorTable[v].name, tpix) == 0)
  1067. /*    PREVIOUS LINE WAS CHANGED FOR OS/2 COMPILATION (Stephane Charette)    */
  1068.                 break;
  1069.         }
  1070.         if (v == NUMBER(colorTable)) 
  1071.             return -2;
  1072.         
  1073.         sprintf(buf, "%d,%d,%d", 
  1074.             colorTable[v].r, colorTable[v].g, colorTable[v].b);
  1075.         tpix = buf;
  1076.     }
  1077.  
  1078.     for (cp = tpix, i = 0; i < 3; i++, cp = strchr(cp, ',')) {
  1079.         char    *x;
  1080.  
  1081.         if (cp == NULL)
  1082.             break;
  1083.         if (*cp == ',')
  1084.             cp++;
  1085.  
  1086.         strncpy(c[i], cp, 10);
  1087.         if ((x = strchr(c[i], ',')) != NULL)
  1088.             *x = '\0';
  1089.     }
  1090.  
  1091.     if (i != 3)
  1092.         return -3;
  1093.  
  1094.     r = toval(c[0]);
  1095.     g = toval(c[1]);
  1096.     b = toval(c[2]);
  1097.  
  1098.     min = -3;
  1099.     dist = 255 * 255 * 3;
  1100.  
  1101.     for (i = 0; i < size && dist != 0; i++) {
  1102.         int    d;
  1103.         int    dr = data[i][0] - r;
  1104.         int    dg = data[i][1] - g;
  1105.         int    db = data[i][2] - b;
  1106.  
  1107.         if (dr == 0 && dg == 0 && db == 0)
  1108.             return i;
  1109.  
  1110.         d = dr * dr + dg * dg + db * b;
  1111.  
  1112.         if (d < dist) {
  1113.             dist = d;
  1114.             min = i;
  1115.         }
  1116.     }
  1117.     if (dist > 0)
  1118.         fprintf(stderr, "No exact match using pixel %d\n", min + 1);
  1119.     return min;
  1120. }
  1121.  
  1122. static void setTransparent(GIFStream *stream, char *tpix)
  1123. {
  1124.     GIFData    *cur = stream->data;
  1125.     int    cnt = 0;
  1126.  
  1127.     for ( ; cur != NULL; cur = cur->next) {
  1128.         int    idx;
  1129.  
  1130.         if (cur->type != gif_image)
  1131.             continue;
  1132.         cnt++;
  1133.         if (cur->info.transparent != -1) {
  1134.             fprintf(stderr,"Warning: image %d was already transparent\n");
  1135.         }
  1136.  
  1137.         if (cur->data.image.cmapSize != 0) {
  1138.             idx = matchCMAP(tpix, cur->data.image.cmapSize, 
  1139.                     cur->data.image.cmapData);
  1140.         } else {
  1141.             idx = matchCMAP(tpix, stream->cmapSize, 
  1142.                     stream->cmapData);
  1143.         }
  1144.         if (idx == -1) {
  1145.             fprintf(stderr,"Warning: Pixel index larger than colormap size\n");
  1146.         } else if (idx == -2) {
  1147.             fprintf(stderr,"Warning: No such color known (%s)\n", tpix);
  1148.         } else {
  1149.             cur->info.transparent = idx;
  1150.         }
  1151.     }
  1152. }
  1153.  
  1154. static void addComments(GIFStream *stream, char *text)
  1155. {
  1156.     GIFData    *n;
  1157.  
  1158.     if (text == NULL)
  1159.         return;
  1160.  
  1161.     n = (GIFData *)malloc(sizeof(GIFData));
  1162.     n->type = gif_comment;
  1163.     n->info.transparent = -1;
  1164.     n->info.delayTime = 0;
  1165.     n->info.inputFlag = 0;
  1166.     n->info.disposal = gif_no_disposal;
  1167.     n->width = n->height = n->x = n->y = 0;
  1168.     n->data.comment.len  = strlen(text);
  1169.     n->data.comment.text = (char*)malloc(strlen(text));
  1170.     strcpy(n->data.comment.text, text);
  1171.  
  1172.     n->next = stream->data;
  1173.     stream->data = n;
  1174. }
  1175.  
  1176. static void stripComment(GIFStream *stream)
  1177. {
  1178.     GIFData    *nxt, *cur, *prev = NULL;
  1179.  
  1180.     for (cur = stream->data; cur != NULL; cur = nxt) {
  1181.         nxt = cur->next;
  1182.  
  1183.         if (cur->type == gif_comment) {
  1184.             if (prev == NULL)
  1185.                 stream->data = cur->next;
  1186.             else 
  1187.                 prev->next = cur->next;
  1188.             free(cur->data.comment.text);
  1189.             free(cur);
  1190.         } else {
  1191.             prev = cur;
  1192.         }
  1193.     }
  1194. }
  1195.  
  1196. static void info()
  1197. {
  1198.     printf("Copyright 1994, Home Pages, Inc.\n");
  1199.     printf("\n");
  1200.     printf("Permission to use, copy, and distribute GIFTOOL in its entirety, for\n");
  1201.     printf("non-commercial purposes, is hereby granted without fee, provided that\n");
  1202.     printf("this license information and copyright notice appear in all copies.\n");
  1203.     printf("\n");
  1204.     printf("Note that distributing GIFTOOL 'bundled' in with ANY product is considered\n");
  1205.     printf("to be a 'commercial purpose'.\n");
  1206.     printf("\n");
  1207.     printf("Also note that any copies of GIFTOOL that are distributed MUST be built\n");
  1208.     printf("and/or configured to be in their 'unregistered copy' mode, so that it\n");
  1209.     printf("is made obvious to the user that GIFTOOL is shareware, and that they should\n");
  1210.     printf("consider donating, or at least reading this License Info.\n");
  1211.     printf("\n");
  1212.     printf("Permission to use, copy, and distribute GIFTOOL in its entirety, for\n");
  1213.     printf("non-commercial purposes, is hereby granted without fee, provided that\n");
  1214.     printf("this license information and copyright notice appear in all copies.\n");
  1215.     printf("\n");
  1216.     printf("Note that distributing GIFTOOL 'bundled' in with ANY product is considered\n");
  1217.     printf("to be a 'commercial purpose'.\n");
  1218.     printf("\n");
  1219.     printf("Also note that any copies of GIFTOOL that are distributed MUST be built\n");
  1220.     printf("and/or configured to be in their 'unregistered copy' mode, so that it\n");
  1221.     printf("is made obvious to the user that GIFTOOL is shareware, and that they should\n");
  1222.     printf("consider donating, or at least reading this License Info.\n");
  1223.     printf("\n");
  1224.     printf("The software may be modified for your own purposes, but modified\n");
  1225.     printf("versions may NOT be distributed without prior consent of the author.\n");
  1226.     printf("\n");
  1227.     printf("This software is provided 'as-is', without any express or implied\n");
  1228.     printf("warranty.  In no event will the author be held liable for any damages\n");
  1229.     printf("arising from the use of this software.\n");
  1230.     printf("\n");
  1231.     printf("If you would like to do something with GIFTOOL that this copyright\n");
  1232.     printf("prohibits (such as distributing it with a commercial product,\n");
  1233.     printf("using portions of the source in some other program, etc.), please\n");
  1234.     printf("contact the author.  Arrangements can probably easily be worked out.\n");
  1235.     printf("\n");
  1236.     printf("GIFTOOL is shareware for PERSONAL USE only.  You may use GIFTOOL for \n");
  1237.     printf("your own amusement, and if you find it nifty, useful, generally cool, \n");
  1238.     printf("or of some value to you, your non-deductable donation would be greatly\n");
  1239.     printf("appreciated.  $10 is the suggested donation, though, of course,\n");
  1240.     printf("larger donations are quite welcome.  \n");
  1241.     printf("\n");
  1242.     printf("Commercial, government, and institutional users MUST register their\n");
  1243.     printf("copies of GIFTOOL, for the exceedingly REASONABLE price of just $10 per\n");
  1244.     printf("workstation.  Site licenses are available for those who wish to run \n");
  1245.     printf("GIFTOOL on a large number of machines.  Please contact Home Pages Inc\n");
  1246.     printf("for more details.\n");
  1247.     printf("\n");
  1248.     printf("   US Mail:  Home Pages, Inc.\n");
  1249.     printf("             257 Castro St, Suite 219\n");
  1250.     printf("             Mountain View, CA 94041\n");
  1251.     printf("\n");
  1252.     printf("   Phone:    (415) 903-5353\n");
  1253.     printf("   EMail:    support@homepages.com\n");
  1254.     exit(0);
  1255. }
  1256.  
  1257. static void usage()
  1258. {
  1259.     fprintf(stderr,"Usage: giftool [options] [file]\n");
  1260.     fprintf(stderr,"       giftool (-p|-c|-B) [options] [files...]\n");
  1261.     fprintf(stderr,"\t-B\tBatch Mode, read and write the same filename\n");
  1262.     fprintf(stderr,"\t-i\tSet GIF Interlace mode ON\n");
  1263.     fprintf(stderr,"\t+i\tSet GIF Interlace mode OFF\n");
  1264.     fprintf(stderr,"\t-p\tPrint information about file(s)\n");
  1265.     fprintf(stderr,"\t-c\tPrint comment information\n");
  1266.     fprintf(stderr,"\t+c\tAdd comments to file(s)\n");
  1267.     fprintf(stderr,"\t-C\tStrip comment from file(s)\n");
  1268.     fprintf(stderr,"\t-o file\tSend output to 'file'\n");
  1269.     fprintf(stderr,"\t-rgb name\tUse 'name' as the transparent pixel\n");
  1270.     fprintf(stderr,"\t-rgb ##,##,##\ttUse rgb-value as the transparent pixel\n");
  1271.     fprintf(stderr,"\t-###\tUsed pixel index as transparent (1 == first colormap entry)\n");
  1272.     fprintf(stderr,"\n");
  1273.     fprintf(stderr,"For instance you could say 'giftool -B -i *.gif' to convert all your images\nto interlaced GIF files in one easy step.\n");
  1274.     fprintf(stderr,"\n");
  1275.     fprintf(stderr,"giftool version 1.0 is Copyright 1994 Home Pages, Inc and is shareware.\n");
  1276.     fprintf(stderr,"Please, use the -info option to read the licensing information.\n");
  1277.     exit(1);
  1278. }
  1279.  
  1280. main(int argc, char *argv[]) 
  1281. {
  1282.     int        c, i;
  1283.     int        batchMode = 0;
  1284.     int        interlace = 0, batchInterlace = 0;
  1285.     int        print     = 0;
  1286.     int        stripComments = 0, printComments = 0;
  1287.     int        addTrans  = 0, optimize = 0;
  1288.     char        *transPixel = NULL, *outFile = NULL;
  1289.     char        *addComment = NULL;
  1290.     GIFStream    *stream;
  1291.     int        idx;
  1292.     int        stdinMode = 0;
  1293.  
  1294.     for (idx = 1; idx < argc && 
  1295.             (argv[idx][0] == '-' || argv[idx][0] == '+'); idx++) {
  1296.         char        *arg = argv[idx];
  1297.         if (strcmp(arg, "-O") == 0) {
  1298.             optimize++;
  1299.         } else if (strcmp(arg, "-B") == 0) {
  1300.             batchMode = 1;
  1301.         } else if (strcmp(arg, "+i") == 0) {
  1302.             interlace = -1;
  1303.         } else if (strcmp(arg, "-i") == 0) {
  1304.             interlace = 1;
  1305.         } else if (strcmp(arg, "-c") == 0) {
  1306.             printComments = 1;
  1307.             print++;
  1308.         } else if (strncmp(arg, "+c", 2) == 0) {
  1309.             if (strlen(arg) != 2)
  1310.                 arg += 2;
  1311.             else
  1312.                 arg = argv[++idx];
  1313.             if (idx == argc) usage();
  1314.             addComment = arg;
  1315.         } else if (strcmp(arg, "-C") == 0) {
  1316.             stripComments++;
  1317.         } else if (strcmp(arg, "-p") == 0) {
  1318.             print++;
  1319.         } else if (strncmp(arg, "-o", 2) == 0) {
  1320.             if (strlen(arg) != 2)
  1321.                 arg += 2;
  1322.             else
  1323.                 arg = argv[++idx];
  1324.             if (idx == argc) usage();
  1325.             outFile = arg;
  1326.         } else if (strncmp(arg, "-rgb", 4) == 0) {
  1327.             if (strlen(arg) != 4)
  1328.                 arg += 4;
  1329.             else
  1330.                 arg = argv[++idx];
  1331.             if (idx == argc) usage();
  1332.             if (isdigit(*arg) && strchr(arg, ',') == NULL) {
  1333.                 static char    buf[24];
  1334.                 if (idx == argc-2) usage();
  1335.                 sprintf(buf, "%d,%d,%d", arg, argv[idx+1], argv[idx+2]);
  1336.                 idx += 2;
  1337.                 transPixel = buf;
  1338.             } else {
  1339.                 transPixel = arg;
  1340.             }
  1341.         } else if (isdigit(arg[1])) {
  1342.             transPixel = arg+1;
  1343.         } else if (strcmp(arg, "--") == 0) {
  1344.             idx++;
  1345.             break;
  1346.         } else if (strcmp(arg, "-info") == 0) {
  1347.             info();
  1348.         } else {
  1349.             if (strcmp(arg, "-help") != 0)
  1350.                 printf("Unrecognized option %s\n", arg);
  1351.             usage();
  1352.         }
  1353.     }
  1354.  
  1355.     if (outFile != NULL && batchMode) {
  1356.         fprintf(stderr,"Error: You can't use both the -o and -B options\n");
  1357.         usage();
  1358.     }
  1359.  
  1360.     if (!batchMode && !print) {
  1361.         if (argc - idx > 1)
  1362.             usage();
  1363.     }
  1364.  
  1365.     if (idx == argc) {
  1366.         argc++;
  1367.         stdinMode = 1;
  1368.         batchMode = 0;
  1369.     }
  1370.  
  1371.     for (i = idx; i < argc; i++) {
  1372.         GIFStream    *stream;
  1373.         char        *frm;
  1374.  
  1375.         if (stdinMode) {
  1376.             stream = GIFReadFP(stdin);
  1377.             frm    = NULL;
  1378.         } else {
  1379.             frm    = argv[i];
  1380.             stream = GIFRead(frm);
  1381.         }
  1382.  
  1383.         if (print) {
  1384.             GIFDump(frm, stream, printComments);
  1385.         } else {
  1386.             int    status;
  1387.             char    *out;
  1388.  
  1389.             if (stripComments)
  1390.                 stripComment(stream);
  1391.             addComments(stream, addComment);
  1392.             if (transPixel != NULL) 
  1393.                 setTransparent(stream, transPixel);
  1394.             if (interlace != 0)
  1395.                 setInterlace(stream, interlace);
  1396.  
  1397.             if (batchMode) {
  1398.                 status = GIFWrite(argv[i], stream, optimize);
  1399.                 out = argv[i];
  1400.             } else {
  1401.                 if (outFile == NULL) {
  1402.                     status = GIFWriteFP(stdout, stream, optimize);
  1403.                     out = "<STDOUT>";
  1404.                 } else {
  1405.                     status = GIFWrite(outFile, stream, optimize);
  1406.                     out = outFile;
  1407.                 }
  1408.             }
  1409.             if (status)
  1410.                 fprintf(stderr, "error writing %s\n", out);
  1411.  
  1412.             GIFFree(stream);
  1413.         }
  1414.     }
  1415. }
  1416.