home *** CD-ROM | disk | FTP | other *** search
/ Boston 2 / boston-2.iso / DOS / PROGRAM / C / MENUCOPY / MENUCOPY.C < prev    next >
C/C++ Source or Header  |  1993-12-01  |  17KB  |  696 lines

  1.  
  2. ═════════════════════════════════════════════════════════════════════════════
  3. This program was written in Turbo C++ from March 19th to April 25th, 1991.
  4.  
  5.    It consists of 630 lines and has been reduced to the smallest possible
  6.  program I could cram it on.  It's Shareware to anyone who wants to compile
  7.  it themself and utilize it.
  8.    If however, you would like to borrow some of the code for your own
  9.  programs, feel free to do so.    I would like a copy of any program you
  10.  create though (because I LOVE to check out good "C" coding !!).
  11.  
  12.    For information concerning variables, etc., you can write me on
  13.  COMPUSERVE:
  14.         Dave Smith
  15.         71441,2723
  16.  
  17.    I log on daily, so your questions, comments will be answered promptly.
  18.  
  19.    Or write me:      Dave Smith
  20.            I.D.F. Company
  21.            1104 Mason Dr.
  22.            Hurst TX 76053
  23.  
  24.    I will also correspond to anyone by mail.
  25.  
  26.                            thanks,
  27.  
  28.  
  29.       ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  30.       ▒             ▒▒
  31.       ▒             ▒▒▒
  32.       ▒       David Smith    ▒▒▒┐
  33.       ▒             ▒▒▒│┐
  34.       ▒  Compuserve 71441,2723    ▒▒▒││
  35.       ▒             ▒▒▒││
  36.       ▒             ▒▒▒││
  37.       ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒││
  38.        ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒││
  39.      └─────────────────────────┘│
  40.       └─────────────────────────┘
  41.  
  42. ══════════════════════════════════════════════════════════════════════════════
  43.  
  44. #include <stdio.h>
  45. #include <time.h>
  46. #include <sys\stat.h>    // set up for the program
  47. #include <stdlib.h>
  48. #include <dir.h>
  49. #include <string.h>
  50. #include <dos.h>
  51. #include <conio.h>
  52. #include <io.h>
  53.  
  54. void findfile(void);
  55. void finddirs(void);         // a rather long list of function calls
  56. char *getdirectory(char *path);
  57. void menu(void);
  58. void display(void);
  59. void filemenu(void);
  60. void show(void);
  61. void getfiles(void);
  62. void options(void);
  63. void moremenu(void);
  64. void help(void);
  65. int sort_fun(const void *g, const void *h);
  66. void sounds(void);
  67. void end(void);
  68.  
  69. int count=1,num,x,col,temp,junk,music[12],del,moveon,cnn,ba;
  70. int b=1,c,up=2,down,bum=1,maxcount=0,choice;
  71. char ldir[70][70], sdir[70][70],buffer[100],a[200][200],file[40],direc[40],one[100],two[100];
  72. char what[60];
  73. struct date d;               // an even longer list of arrays
  74. struct time ta;
  75.  
  76. void main(void)
  77. {
  78. getdate(&d);
  79. _setcursortype(_NOCURSOR);  // the cursor gets in the way, so we lose it
  80. finddirs();
  81. menu();
  82. end();
  83.  
  84. }
  85.  
  86.  
  87. void finddirs(void)    //finds all the directories on the current drive
  88. {
  89. int y;
  90. char origdir[MAXPATH], rootdir[MAXPATH],tempdir[MAXPATH];
  91. system("prompt $e[0;30;47m");    //colors the screen black-on-white
  92. clrscr();
  93. textcolor(1);
  94. gotoxy(20,7);
  95. cprintf("Dave's MENUCOPY");   //listing of directories we find
  96. textcolor(CYAN);
  97.    gotoxy(15,9);
  98.    cprintf("╔");
  99.    gotoxy(15,11);             //a monotonous way to make a box!!
  100.    cprintf("╚");             // but I had no choice if I wanted to
  101.    for(y=16;y<=45;y++){          // use double lines for borders.
  102.               gotoxy(y,9);
  103.               cprintf("═");
  104.               gotoxy(y,11);
  105.               cprintf("═");
  106.               }
  107.    gotoxy(15,10);
  108.    cprintf("║");
  109. getdirectory(origdir);
  110.   getdirectory(tempdir);
  111.   chdir("\\");
  112.   findfile();
  113.   chdir(tempdir);
  114.  chdir(origdir);
  115.  textcolor(YELLOW+BLINK);
  116.  gotoxy(24,20);
  117.  cprintf("Press any key to start");
  118.  getch();
  119.  clrscr();
  120.  count=1;   // Goto function "MENU" to display directories
  121.  menu();    // then reset the array to the first directory
  122. }
  123.  
  124. void findfile(void)
  125. {
  126. char curdir[MAXPATH], temp[3];
  127. int done, attrib,y;           // my variables
  128. struct ffblk dta;
  129.  getdirectory(curdir);
  130.  
  131. attrib=FA_DIREC+FA_SYSTEM+FA_HIDDEN; //find all directories, even if hidden
  132. done=findfirst("*.*",&dta,attrib);
  133. while(!done)
  134.  {
  135.  strncpy(temp,dta.ff_name,2);
  136.  if(((dta.ff_attrib & FA_DIREC) == FA_DIREC) && (temp[0] !='.'))
  137.   {                      // exclude dots and filenames
  138.    if(strlen(curdir) !=3)
  139.     strcat(curdir,"\\");
  140.    textcolor(MAGENTA);
  141.    strcpy(sdir[count],dta.ff_name); // list the dir's while we find them
  142.    strcat(curdir,dta.ff_name);
  143.    strcpy(ldir[count],curdir);
  144.    count++;              // count=array integer
  145.    maxcount++;              // maxcount=total directories
  146.    gotoxy(16,10);
  147.    clreol();
  148.    textcolor(YELLOW);
  149.    gotoxy(16,10);
  150.    cprintf("Searching: %s",curdir);
  151.    chdir(curdir);   // change into directory then recursively call "FINDFILE"
  152.             // until all dir's are exhausted
  153.    findfile();
  154.    chdir("..");
  155.  
  156.    getdirectory(curdir);
  157.    }
  158.  done=findnext(&dta);
  159.  }
  160. }
  161.  
  162. char *getdirectory(char *path) //specifies pathname based upon what drive
  163. {                   //we're currently in.
  164.  strcpy(path,"X:\\");
  165.  path[0]='A' + getdisk();
  166.  getcurdir(0,path+3);
  167.  return(path);
  168. }
  169.  
  170. void menu(void)
  171. {
  172. int choice,mom,momm;
  173. union REGS r;
  174. r.h.ch=0;
  175. r.h.cl=0;
  176. r.h.dh=24;    //set up for BIOS function call
  177. r.h.dl=79;
  178. r.h.bh=115;
  179. r.h.al=0;
  180. r.h.ah=6;
  181. printf("\x1B[0;%d;%dm",30,47);    //change screen color again
  182. do{
  183. display();           //call "DISPLAY" to show directories based upon screen
  184.                //position.
  185.  
  186. if(moveon){         //if we're called by "OPTIONS MENU" then re-display screen
  187.              //instead of starting over.
  188.       moveon=0;
  189.       getfiles();
  190.       }
  191. choice=getch();
  192. switch(choice)
  193.    {
  194.  case 72:                 //keypresses perform the menu operations
  195.   if(count>1) count--; break;
  196.  case 80:
  197.   if(count<maxcount) count++; break;
  198.  case '\r':
  199.       strcpy(direc,ldir[count]);
  200.       strcpy(buffer,direc);
  201.       buffer[0]='c';         //set up array to change directories
  202.       buffer[1]='d';
  203.       system(buffer);
  204.       b=1;
  205.       for(mom=0;mom<=200;mom++)       //clear out array before re-filling it
  206.      for(momm=0;momm<=200;momm++)
  207.         a[mom][mom]=0;       // the "MOMMA" names keep me from getting
  208.       int86(0x10,&r,&r);       // bored while programming
  209.       num=1;
  210.       getfiles();   // calls the "GETFILES" function, which does just
  211.             // what it says.
  212.  case 27: end();
  213.  case 92:
  214.   sound(300);       /*
  215.   delay(70);        *  Make a cute noise when the file and directory
  216.   nosound();        *  menus are toggled.
  217.   sound(500);        *
  218.   delay(70);        *  I couldn't call the "SOUNDS" function because the
  219.   nosound();        *  delay is different between notes.
  220.   sound(540);        *
  221.   delay(43);
  222.   nosound();
  223.   sound(700);       /*
  224.   delay(32);        *
  225.   nosound();        *
  226.   sound(1300);        */
  227.   delay(32);
  228.   nosound();
  229.   sound(1800);
  230.   delay(32);
  231.   nosound();
  232.   filemenu();        //calls the file menus
  233.  case 59: help();
  234.    }
  235.  }while(bum>0);  //BUM is the guy who keeps us running.
  236.  
  237. }
  238.  
  239. void display()
  240. {
  241. union REGS r;
  242. r.h.ch=0;
  243. r.h.cl=0;     //again, set up for function calls
  244. r.h.dh=24;
  245. r.h.dl=12;
  246. r.h.bh=115;
  247. r.h.al=1;
  248.  
  249.   for(c=1;c<=24;c++)
  250.      {
  251.      textcolor(0);    //print borders for directory and file menus
  252.      gotoxy(12,c);
  253.      cprintf("▌");
  254.      }
  255.   for(c=1;c<=24;c++)
  256.  {
  257.   textcolor(RED);              //This is the method by which
  258.   if(count==c+up-1)textcolor(YELLOW); //we scroll our directories up
  259.   down=up+23;                  //and down the screen.
  260.   gotoxy(1,c);
  261.   cprintf(sdir[up+c-1]);
  262.  
  263.  }
  264.   if(count > down){  r.h.ah=6;         //scroll when user goes over screen
  265.          int86(0x10,&r,&r);  //limit.
  266.          gotoxy(1,24);
  267.          cprintf("%s",sdir[count]);
  268.          up++;
  269.           }
  270.   if(count < up) { r.h.ah=7;
  271.          int86(0x10,&r,&r);
  272.          gotoxy(1,1);
  273.          cprintf("%s",sdir[count]);
  274.          up--;
  275.           }
  276. }
  277.  
  278. void getfiles(void)
  279. {
  280. int done;              //get files in current directory and load them
  281. struct ffblk dta;           //into "A" array.
  282. done=findfirst("*.*",&dta,47);
  283. while(!done)
  284.  {
  285.  strcpy(a[b],dta.ff_name);
  286.  b++;
  287.  num++;
  288.  done=findnext(&dta);
  289.  }
  290.  
  291. qsort((void *)a, num, sizeof(a[0]), sort_fun); //sort files by first letter
  292.                            //using Turbo C++'s qsort
  293.                            //function.
  294. b=1;
  295. filemenu();
  296. }
  297.  
  298. void filemenu(void)
  299. {
  300. int choose,y,yy;
  301. FILE *opey;        //remember Opey, on the Andy Griffith show??
  302. struct stat statbuf;
  303.  
  304. union REGS r;
  305. r.h.ch=0;
  306. r.h.cl=0;
  307. r.h.dh=24;
  308. r.h.dl=11;
  309. r.h.bh=115;
  310. r.h.al=0;
  311. r.h.ah=6;
  312. int86(0x10,&r,&r);
  313.  
  314. do{
  315. if(b<=114) show();    //If you got a lotta files, display them differently.
  316. if(b>114) moremenu();
  317.  for(y=26;y<78;y +=13)
  318.    for(yy=1;yy<=23;yy++)
  319.     { textbackground(7); //print border for files.
  320.       textcolor(0);
  321.       gotoxy(y,yy);
  322.       cprintf("▒");
  323.     }
  324. textcolor(0);
  325.  opey=fopen(a[b],"r"); //Show time, day, date, file size, directory, etc....
  326.  stat(a[b],&statbuf);
  327. while(!kbhit()) { gotoxy(1,24);
  328.           gettime(&ta);
  329.           printf("\x1B[1;%d;%dm",33,44);
  330.           printf("   *MENUCOPY*   ║%s-->%ld bytes║   %d/%d/%d   Time-%2d:%02d:%02d    ",direc,statbuf.st_size,d.da_mon,d.da_day,d.da_year,ta.ti_hour,ta.ti_min,ta.ti_sec);
  331.         }
  332. fclose(opey);
  333. choose=getch();
  334. switch(choose)
  335.    {
  336.  case 72:
  337.   if(b>1) b--; break;
  338.  case 80:
  339.   if(b<num-1) b++; break;
  340.  case 73:          //keypresses rush to first and last file, go
  341.   sound(300);          //up, down, etc..
  342.   delay(130);
  343.   nosound();
  344.   b=1; break;
  345.  case 81:
  346.   sound(300);
  347.   delay(130);
  348.   nosound();
  349.   b=num-1; break;
  350.  case '\r':         //If you choose the file, put it into "FILE"
  351.   strcpy(file,a[b]);
  352.   options();
  353.  case 27: end();
  354.  case 75:
  355.   if(b>=23) b -=23; break;   //go sideways through your files.
  356.  case 77:
  357.   if(b<num-23) b +=23; break;
  358.  case 92:
  359.   menu();
  360.   sound(300);  //Again, here are those sounds !
  361.   delay(70);
  362.   nosound();
  363.   sound(500);
  364.   delay(70);
  365.   nosound();
  366.   sound(540);
  367.   delay(43);
  368.   nosound();
  369.   sound(700);
  370.   delay(32);
  371.   nosound();
  372.   sound(1300);
  373.   delay(32);
  374.   nosound();
  375.   sound(1800);
  376.   delay(32);
  377.   nosound();
  378.  
  379.  case 59: help();  //F1 shows the "HELP" screen
  380.    }
  381.  }while(bum>0);
  382. }
  383.  
  384. void show()    //A "file" version of the "display" function above.
  385. {
  386.  int cc,col,x,attrib;
  387.  
  388.  if(num>114) clrscr(); //Here's the flicker that occurs when you have more
  389.                //than 114 files in a directory !!
  390.    if(num<115) attrib=num;
  391.    if(num>114) attrib=114;
  392.  
  393. textcolor(0);
  394.  for(cc=1;cc<attrib;cc++)
  395.  {
  396.   textbackground(7);
  397.   if(cc==b)    { textcolor(YELLOW); //if file is currently selected,
  398.          textbackground(3);  //highlight it.
  399.            }
  400.   x=14;         //start files at row 14.
  401.   col=cc;
  402.   if(cc>23){
  403.       col=cc-23;  //separate the rows according to how many you have.
  404.       x=27;
  405.       }
  406.   if(cc>46){
  407.       col=cc-46;
  408.       x=40;
  409.       }
  410.   if(cc>69){
  411.       col=cc-69;
  412.       x=53;
  413.       }
  414.   if(cc>92){
  415.       col=cc-92;
  416.       x=66;
  417.       }
  418.   gotoxy(x,col);
  419.   cprintf(a[cc]);
  420.   textcolor(0);
  421.  }
  422. }
  423.  
  424. void options(void)   //the File Options Menu !!
  425. {
  426. int y,junk1;
  427. union REGS r;
  428. r.h.ch=5;
  429. r.h.cl=23;
  430. r.h.dh=19;
  431. r.h.dl=62;
  432. r.h.bh=115;
  433. r.h.al=0;
  434. r.h.ah=6;
  435.  
  436. music[0]=7;       //set up for a call to SOUNDS(); with our melody.
  437. music[1]=9;
  438. music[2]=11;
  439. music[3]=13;
  440. music[4]=15;
  441. music[5]=17;
  442.       ba=5;  //ba=how many numbers in the array
  443.       del=5;
  444.       sounds();
  445. textbackground(1);
  446. for(y=6;y<=18;y++){
  447.    gotoxy(24,y);
  448.    cprintf("                                     ");
  449.           }
  450. textcolor(WHITE);   //the above statement clears out the blue portion for
  451. gotoxy(24,6);        //our file options menu.  Otherwise you'd have a rather
  452. cprintf("╔");        //confusing background with letters, files, etc.
  453. gotoxy(24,18);        //and couldn't read anything from our menu !
  454. cprintf("╚");
  455. for(y=25;y<=60;y++){ gotoxy(y,6);
  456.              cprintf("═ ");
  457.              gotoxy(y,18);
  458.              cprintf("═");
  459.            }
  460. for(y=7;y<=17;y++) { gotoxy(24,y); // Another rather long way to display
  461.              cprintf("║"); // a border.  I would use a "LINE"
  462.              gotoxy(61,y); // Dos function call, but I wouldn't
  463.              cprintf("║"); // get the same pretty double
  464.            }           // lines surrounding my menu.
  465. gotoxy(61,6);
  466. cprintf("╗");
  467. gotoxy(61,18);
  468. cprintf("╝");
  469.  
  470. gotoxy(35,8);
  471. textcolor(LIGHTMAGENTA);
  472. cprintf("FILE OPTIONS");
  473. gotoxy(32,10);
  474. strcpy(one,direc);     //Print out my information.
  475. strcat(one,"\\");
  476. strcat(one,file);
  477. cprintf("%s",one);
  478. gotoxy(33,12);
  479. textcolor(YELLOW);
  480. cprintf("1. Copy");
  481. gotoxy(33,13);
  482. cprintf("2. Move");
  483. gotoxy(33,14);
  484. cprintf("3. Delete");
  485. gotoxy(33,15);
  486. cprintf("4. Quit Program");
  487.  
  488. junk=getch();
  489. switch(junk){
  490.  case 49: gotoxy(26,17);
  491.      cprintf("Copy to: ");    //Copy all the information into a
  492.      scanf("%s",&two);     // string called "BUFFER", then do
  493.      strcpy(buffer,"copy "); // my copying from there.
  494.      strcat(buffer,one);     //
  495.      strcat(buffer," ");     // I use the ">null" so you don't see
  496.      strcat(buffer,two);     // DOS' "1 file copied" message.
  497.      strcat(buffer," >null");// It wouldn't look stylish in the
  498.      system(buffer);     // middle of a menued screen !!
  499.      int86(0x10,&r,&r);
  500.      textbackground(7);
  501.      textcolor(0);
  502.      music[0]=19;
  503.      music[1]=20;
  504.      music[2]=21;
  505.      music[3]=17;
  506.      ba=3;
  507.      del=200;
  508.      sounds();
  509.      filemenu();
  510.  
  511.  case 50: gotoxy(26,17);
  512.      cprintf("Move to: ");     // Same as "COPY" above, but I delete the
  513.      scanf("%s",&two);     // file also.
  514.      strcpy(buffer,"copy ");
  515.      strcat(buffer,one);
  516.      strcat(buffer," ");
  517.      strcat(buffer,two);
  518.      strcat(buffer," >null");
  519.      system(buffer);
  520.      unlink(one);
  521.      textbackground(7);
  522.      clrscr();
  523.      moveon=1;
  524.      music[0]=19;
  525.      music[1]=20;
  526.      music[2]=21;
  527.      music[3]=21;
  528.      music[4]=17;
  529.      music[5]=16;
  530.      del=140;
  531.      ba=5;
  532.      sounds();
  533.      menu();
  534.  
  535.  case 51: gotoxy(26,17);
  536.      gotoxy(26,17);
  537.      cprintf("Erase file %s (y/N)?",one);
  538.       junk1=getch();
  539.       if(junk1==121) unlink(one);
  540.       if(junk1==89)  unlink(one);
  541.      textbackground(7);
  542.      clrscr();
  543.      moveon=1;          //Deletes the file and makes more music.
  544.      music[0]=12;
  545.      music[1]=7;
  546.      music[2]=10;
  547.      del=300;
  548.      ba=2;
  549.      sounds();
  550.      menu();
  551.  
  552.  case 52: end();     //exits the program
  553.  
  554.  case 27: int86(0x10,&r,&r);
  555.       music[0]=7;
  556.       music[1]=9;      //creates the "popping" sound when opening or
  557.       music[2]=11;      //closing the menu.
  558.       music[3]=13;
  559.       music[4]=15;
  560.       music[5]=17;
  561.       ba=5;
  562.       del=5;
  563.       sounds();
  564.       filemenu();
  565.  }
  566.  
  567. end();
  568. }
  569.  
  570. void moremenu(void)   //Used to display more than 114 files.
  571. {
  572. int cc,col,x,y,yy;
  573.  
  574. clrscr();
  575.  
  576.  for(y=13;y<78;y +=13)
  577.    for(yy=1;yy<=23;yy++)
  578.     { textbackground(7);
  579.       textcolor(0);
  580.       gotoxy(y,yy);
  581.       cprintf("▒");
  582.     }
  583. textcolor(0);
  584.  for(cc=115;cc<num;cc++)
  585.  {
  586.   textbackground(7);
  587.   if(cc==b)    { textcolor(YELLOW);
  588.          textbackground(3);
  589.            }
  590.  
  591.   x=1;
  592.   col=cc-115;
  593.   if(cc>137){
  594.       col=cc-137;
  595.       x=14;
  596.       }
  597.   if(cc>160){
  598.       col=cc-160;
  599.       x=26;
  600.       }
  601.   if(cc>183){
  602.       col=cc-183;
  603.       x=38;
  604.       }
  605.   if(cc>206){
  606.       col=cc-206;
  607.       x=50;
  608.       }
  609.   if(cc>231){
  610.       col=cc-231;
  611.       x=62;
  612.       }
  613.   gotoxy(x,col);
  614.   cprintf(a[cc]);
  615.   textcolor(0);
  616.  }
  617. }
  618.  
  619. void help(void)          //My help screen.
  620. {
  621. system("prompt $e[0;30;47m");
  622. clrscr();
  623. printf("\n\n\n");
  624. printf("\n              ╔════════════════════════════════╗      ");
  625. printf("\n             ╔║ DAVE'S MENUCOPY Menuing System ║      ");
  626. printf("\n             ║╚═══════════════════════════════╦╝      ");
  627. printf("\n             ╚════════════════════════════════╝       ");
  628. printf("\n");
  629. printf("\n                       F1 Help screen                 ");
  630. printf("\n           Arrows move between files and directories  ");
  631. printf("\n              Page-up goes to first file in list      ");
  632. printf("\n                Page-Down moves to last file          ");
  633. printf("\n                  Escape exits on any screen          ");
  634. printf("\n               Pressing Enter pulls up file menu      ");
  635. printf("\n       \"\\\" toggles between directory and file menus");
  636. printf("\n              ┌─────────────────────────────────┐     ");
  637. printf("\n            -▒│      CREATED BY DAVE SMITH      │▒-   ");
  638. printf("\n            -▒│ I.D.F. COMPANY FORT WORTH TEXAS │▒-   ");
  639. printf("\n              └─────────────────────────────────┘     ");
  640. printf("\n\n\n");
  641. getch();
  642. clrscr();
  643. }
  644.  
  645. void end(void)               //Closes up the program and exits
  646. {
  647. system("prompt $e[0;37;40m");
  648. clrscr();
  649. textcolor(YELLOW);
  650. gotoxy(28,5);
  651. cprintf("To REGISTER this product");
  652. textcolor(RED);
  653. gotoxy(25,7);
  654. cprintf("for more utilities, write me on");
  655. gotoxy(29,9);
  656. textcolor(CYAN);
  657. cprintf("Compuserve 71441,2723");
  658. printf("\n\n\n");
  659. _setcursortype(_NORMALCURSOR);
  660. exit(0);
  661. }
  662.  
  663. int sort_fun(const void *g, const void *h) //Used with the QSORT function
  664. {                       //to alphabetize the files.
  665.  
  666. return( strcmp(g,h) );
  667.  
  668. }
  669.  
  670. void sounds(void)       //Plays the music and sound effects using
  671. {               //Turbo C++ "sound" function.
  672. int chit;
  673. for(chit=0;chit<=ba;chit++)
  674.  {
  675.  music[chit]=music[chit] * 100;
  676.  sound(music[chit]);
  677.  delay(del);
  678.  nosound();
  679.  }
  680. ba=0;     //sets our array integer to zero.
  681. }
  682.  
  683.        /************************************************/
  684.        /*                           */
  685.        /*  You are welcome to any part of this program */
  686.        /*  for use with your own customized utilities. */
  687.        /*                           */
  688.        /*  You cannot however, use these for profit    */
  689.        /*  or personal gain on your part unless you've */
  690.        /*  received written permission from me, the    */
  691.        /*  author.                       */
  692.        /*                           */
  693.        /*              DAVE SMITH           */
  694.        /*                           */
  695.        /************************************************/
  696.