home *** CD-ROM | disk | FTP | other *** search
/ PC Open 19 / pcopen19.iso / Zipped / PART231.ZIP / SOURCES.ZIP / PART_GEN.C < prev    next >
Encoding:
C/C++ Source or Header  |  1998-01-12  |  5.0 KB  |  190 lines

  1. #include "part.h"
  2.  
  3. char *progress_bar(int percent)
  4. {
  5.  int i;
  6.  static char bar[51];
  7.  
  8.  if( percent<0 ) percent=0;
  9.  if( percent>100 ) percent=100;
  10.  
  11.  for( i=0 ; i<percent/2 ; i++ )
  12.         bar[i]=0xB2;
  13.  while( i!=50 ) bar[i++]=0xB0;
  14.  bar[i]=0;
  15.  
  16.  return bar;
  17. }/* progress_bar */
  18.  
  19.  
  20. int disk_read_rel(struct disk_info *dinfo, struct part_long *p,
  21.                    unsigned long sect, void *buf, int num_sect)
  22. {
  23.  struct disk_addr daddr;
  24.  unsigned long disk_sect = p->container_base + p->rel_sect + sect;
  25.  unsigned long sect_per_cyl = dinfo->num_sects * dinfo->num_heads;
  26.  
  27.  
  28.  daddr.disk = dinfo->disk;
  29.  daddr.cyl =  (disk_sect)/(sect_per_cyl);
  30.  daddr.head = (disk_sect)%(sect_per_cyl)/(dinfo->num_sects);
  31.  daddr.sect = (disk_sect)%(sect_per_cyl)%(dinfo->num_sects)+1;
  32.  
  33.  return disk_read( &daddr, buf, num_sect ); 
  34. }/* disk_read_rel */
  35.  
  36.  
  37. int disk_write_rel(struct disk_info *dinfo, struct part_long *p,
  38.                     unsigned long sect, void *buf, int num_sect)
  39. {
  40.  struct disk_addr daddr;
  41.  unsigned long disk_sect = p->container_base + p->rel_sect + sect;
  42.  unsigned long sect_per_cyl = dinfo->num_sects * dinfo->num_heads;
  43.  
  44.  
  45.  daddr.disk = dinfo->disk;
  46.  daddr.cyl =  (disk_sect)/(sect_per_cyl);
  47.  daddr.head = (disk_sect)%(sect_per_cyl)/(dinfo->num_sects);
  48.  daddr.sect = (disk_sect)%(sect_per_cyl)%(dinfo->num_sects)+1;
  49.  
  50.  return disk_write( &daddr, buf, num_sect ); 
  51. }/* disk_write_rel */
  52.  
  53.  
  54.  
  55. int generic_verify(struct disk_info *dinfo, struct part_long *p,
  56.                    int bbt_size, unsigned long *bbt, int (*progress)(char*) )
  57. {
  58.  char tmp[90];
  59.  struct disk_addr daddr;
  60.  unsigned long base_sect=0; 
  61.  int i, j, cyl, head, sect, num_sect, x, num_bad=0, hd=dinfo->disk;
  62.  
  63.  disk_lock(hd);
  64.  
  65.  progress(MESG_VERIFYING);
  66.  
  67.  for( cyl=p->start_cyl ; cyl<=p->end_cyl ; cyl++ )
  68.     {
  69.      for( head=((cyl==p->start_cyl)?p->start_head:0) ;
  70.           head<((cyl==p->end_cyl)?p->end_head+1:dinfo->num_heads) ; head++ )
  71.         {
  72.          daddr.disk=hd;
  73.          daddr.cyl=cyl;
  74.          daddr.head=head;
  75.  
  76.          if( cyl==p->end_cyl   && head==p->end_head   ) daddr.sect=1;
  77.          if( cyl==p->start_cyl && head==p->start_head ) daddr.sect=p->start_sect;
  78.  
  79.          num_sect=dinfo->num_sects-daddr.sect+1;
  80.  
  81.          if( disk_verify(&daddr,num_sect)==-1 )
  82.            {
  83.             for( sect=0 ; sect<num_sect ; sect++ )
  84.                {
  85.                 daddr.sect=sect+1;
  86.                 if( disk_verify(&daddr,1)==-1 )
  87.                   {
  88.                    if( num_bad==bbt_size ) 
  89.                      {
  90.                       disk_unlock(hd);
  91.                       return FORMAT_FAILED;
  92.                      }
  93.                    bbt[num_bad++]=base_sect+sect;
  94.                   }
  95.                }
  96.            }
  97.  
  98.          base_sect+=num_sect;
  99.  
  100.          x=base_sect*100.0/p->num_sect;
  101.  
  102.          sprintf(tmp,"\r%s %3d%% Cylinder: %3d",progress_bar(x),x,cyl);
  103.          if( (x=progress(tmp))<0 )
  104.            {
  105.             disk_unlock(hd);
  106.             return x;
  107.            }
  108.         }/* head */
  109.     }/* cyl */
  110.  
  111.  disk_unlock(hd);
  112.  return num_bad;
  113. }/* generic_verify */
  114.  
  115.  
  116. int generic_format(struct disk_info *dinfo, struct part_long *p,
  117.                    int bbt_size, unsigned long *bbt, int (*progress)(char*) )
  118. {
  119.  char tmp[90];
  120.  struct disk_addr daddr;
  121.  unsigned long base_sect=0; 
  122.  static unsigned char ftab[512];
  123.  int i, j, cyl, head, sect, num_sect, x, num_bad=0, hd=dinfo->disk;
  124.  
  125.  if( p->start_sect!=1 || p->end_sect!=dinfo->num_sects )
  126.    {
  127.     progress(ERROR_FORMAT_FRACTION);
  128.     return FORMAT_FAILED;
  129.    }
  130.  
  131.  if( detected_os==SYS_WIN95 )
  132.    {
  133.     progress(ERROR_FORMAT_WIN95);
  134.     return FORMAT_FAILED;
  135.    }
  136.  
  137.  disk_lock(hd);
  138.  progress(MESG_FORMATTING);
  139.  
  140.  for( cyl=p->start_cyl ; cyl<=p->end_cyl ; cyl++ )
  141.     {
  142.      for( head=((cyl==p->start_cyl)?p->start_head:0) ;
  143.           head<((cyl==p->end_cyl)?p->end_head+1:dinfo->num_heads) ; head++ )
  144.         {
  145.          daddr.disk=hd;
  146.          daddr.cyl=cyl;
  147.          daddr.head=head;
  148.  
  149.          num_sect=dinfo->num_sects;
  150.  
  151.          for( sect=0 ; sect<num_sect ; sect++ )
  152.             {
  153.              ftab[sect*2+1]=sect+1;
  154.             }
  155.  
  156.          if( disk_format(&daddr,ftab)==-1 )
  157.            {
  158.             progress(ERROR_FORMAT_GEN);
  159.             disk_unlock(hd);
  160.             return FORMAT_FAILED;
  161.            }
  162.  
  163.          for( sect=0 ; sect<num_sect ; sect++ )
  164.           if( ftab[sect*2]!=0 )            /* is it a bad sector? */ 
  165.             {
  166.              if( num_bad==bbt_size ) 
  167.                {
  168.                 disk_unlock(hd);
  169.                 return FORMAT_FAILED;
  170.                }
  171.              bbt[num_bad++]=base_sect+sect;
  172.             }
  173.  
  174.          base_sect+=num_sect;
  175.  
  176.          x=base_sect*100.0/p->num_sect;
  177.  
  178.          sprintf(tmp,"\r%s %3d%% Cylinder: %3d",progress_bar(x),x,cyl);
  179.          if( (x=progress(tmp))<0 )
  180.            {
  181.             disk_unlock(hd);
  182.             return x;
  183.            }
  184.         }/* head */
  185.     }/* cyl */
  186.  
  187.  disk_unlock(hd);
  188.  return num_bad;
  189. }/* generic_format */
  190.