#include <stdio.h>
#define  n   8192                     // max cols
#define  XP     0                     // 1: XP;  0: linux
unsigned short h[27];                 // BMP head
int  rows,cols;
FILE *fp,*fp1,*fp2;
unsigned char  a[n],d[n][3],b[256],p[256][4], sb[80],sf[80];
main(int ac, char **av)
{
  int i,j,k,ip=0, m16;                // 1: 16m_color 0: 256_color
  if(ac<2){
    printf("\n\t***** change color_bmp to 256_grey BMP ******\n");
    printf("\n\t                         jiang zhaoji 2011105\n");
    printf("\n\tUsage: col2bmp   #[.bmp]");
    printf("\n\t   or: col2bmp   88.bmp\n\n");   return 0;
  }
  strcpy(sb,av[1]);
  for(i=0;i<strlen(sb);i++){ if(sb[i]=='.')sb[i]=0; if(sb[i]=='#')sb[i]='*'; }
  if(XP)sprintf(sf,"dir/b %s.bmp >col2bmp.tmp",sb);
  else  sprintf(sf,"ls    %s.bmp >col2bmp.tmp",sb);    system(sf);
  fp1=fopen("col2bmp.tmp","r");
l100:
  fgets(sf,80,fp1); ip++;
  if(feof(fp1)){ fclose(fp1); if(XP)system("del col2bmp.tmp");
                               else system("rm  col2bmp.tmp");  return 0; }
  k=strlen(sf); sf[k-1]=0; printf("%3d: %s ",ip,sf);
  fp=fopen(sf,"rb");    fread(h,2,27,fp);
  cols=h[9]; rows=h[11];  k=(cols+3)/4*4;  m16=1;
  if(h[14]==8){ m16=0; fread(p,256,4,fp);
    for(j=0;j<256;j++)for(i=0;i<3;i++)if(p[j][i]!=j)goto l101;
    fclose(fp); printf("\talready!\n"); goto l100;
l101:
    for(j=0;j<256;j++)b[j]=p[j][0]*0.299+p[j][1]*0.587+p[j][2]*0.114+0.5;
  } else { h[14]=8; j=k*rows+1078; h[1]=j&0xffff; h[2]=j>>16; h[5]=1078; }
  for(j=0;j<256;j++){ for(i=0;i<3;i++)p[j][i]=j; p[j][i]=0; }
  fp2=fopen("col2bmp.bmp","wb");
  fwrite(h,2,27,fp2); fwrite(p,256,4,fp2);
  for(j=0;j<rows;j++){
    if(m16){ fread(d,3,k,fp);
      for(i=0;i<cols;i++)a[i]=d[i][0]*0.299+d[i][1]*0.587+d[i][2]*0.114+0.5;
    } else { fread(a,1,k,fp); for(i=0;i<cols;i++)a[i]=b[a[i]]; }
    fwrite(a,1,k,fp2);
  }
  fclose(fp); fclose(fp2); printf("\t%d*%d  ok!\n",cols,rows);
  if(XP)sprintf(sb,"move col2bmp.bmp %s",sf);
  else  sprintf(sb,"mv   col2bmp.bmp %s",sf);  system(sb);
  goto l100;
}
