home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / pcjr / arc / PKXARCM.LZH / PKARCM.C next >
C/C++ Source or Header  |  1987-10-04  |  5KB  |  250 lines

  1. /*
  2.  
  3.    This program serves as a simple front end to the PKARC package.
  4.    It is written in Microsoft C v 4.0 and uses the Hammer Library
  5.    from O.E.S. Systems for screen control
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11.  
  12. #include <hamdefs.h>      /* This program uses O.E.S. Systems Hammer Library */
  13.  
  14. extern int menudpth;      /* Menu depth (0=READY mode, 1..?? = menu level */
  15. static int endprog=FALSE; /* end program flag */
  16.  
  17. char arcname[128];
  18.  
  19. main(argc,argv)
  20.    int argc;
  21.    char *argv[];
  22.  
  23.    {
  24.    void cmdmenu();
  25.    unsigned char *makefnam();
  26.  
  27.    if (argc<2) {
  28.       printf("USAGE: pkarcm archive_file\n");
  29.       exit(1);
  30.       }
  31.    
  32.    makefnam(argv[1],".arc",arcname);
  33.  
  34.    strupr(arcname);
  35.    
  36.    clrscn();
  37.    while (!endprog) {
  38.       cmdmenu(argc,argv);
  39.       clrlin(1), clrlin(2);
  40.       locate(6,0), clreos();
  41.       }
  42.  
  43.    locate(0,0); 
  44.    clreos();
  45.    }
  46.  
  47. void cmdmenu()
  48.    {
  49.    static struct menu_str mainm[] = {
  50.       "List",   "List contents of archive",
  51.       "Browse", "Display files on screen",
  52.       "Extract","Extract files from archive",
  53.       "Update", "Add/Update files to archive",
  54.       "Move",   "Add/Update files to archive and DELETE files from directory",
  55.       "Delete", "Delete files from archive",
  56.       "Test",   "Test integrity of files in archive",
  57.       "Quit",   "Return to DOS"
  58.       };
  59.  
  60.    int choice, MYDEPTH=1;
  61.  
  62.    initmenu(0,2,TRUE,205,(NORMAL | HILITE),NORMAL,REVERSE); /* 205=graphic char */
  63.  
  64.    menudpth=MYDEPTH;
  65.  
  66.    for(;;) {
  67.       switch (choice=domenu(mainm,sizeof(mainm),choice)) {
  68.      case 0:
  69.             docmd("Listing contents of","","pkxarc -v");
  70.         break;
  71.  
  72.      case 1:
  73.             dobrowse();
  74.         break;
  75.  
  76.      case 2:
  77.             docmd("Extracting from","extract","pkxarc -x");
  78.         break;
  79.  
  80.          case 3:
  81.             docmd("Updating contents of","update","pkarc -u");
  82.         break;
  83.  
  84.      case 4:
  85.             domove();
  86.         break;
  87.  
  88.      case 5:
  89.             docmd("Deleting files from","delete","pkarc -d");
  90.         break;
  91.  
  92.      case 6:
  93.             docmd("Testing integrity of files in","","pkxarc -t");
  94.         break;
  95.  
  96.      case 7:
  97.         endprog=TRUE;
  98.                return;
  99.          }
  100.       }
  101.    }
  102.  
  103. domove()
  104.    {
  105.    char cmdline[129],line[129];
  106.  
  107.    comment(4,"Moving files to");
  108.       
  109.    if (askyn(6,0,"Are you sure you want your files to be DELETED?",0)) {
  110.       prompt(8,"move",line,sizeof(line));
  111.       execute("pkarc -m",line);
  112.       }
  113.    
  114.    clean_up();
  115.    }
  116.  
  117. dobrowse()
  118.    {
  119.    char line[81],cmdline[129];
  120.  
  121.    comment(4,"Browsing files in");
  122.  
  123.    prompt(6,"display",line,sizeof(line));
  124.  
  125.    locate(0,0);
  126.    clreos();
  127.    
  128.    sprintf(cmdline,"pkxarc -c %s %s | more",arcname,line);
  129.    system(cmdline);
  130.    
  131.    clean_up();
  132.    }
  133.  
  134. docmd(label,tag,cmd)
  135.    char *label,*tag,*cmd;
  136.    
  137.    {
  138.    char line[129];
  139.    
  140.    line[0]='\0';
  141.    
  142.    comment(4,label);
  143.  
  144.    if (*tag) 
  145.       prompt(6,tag,line,sizeof(line));
  146.    
  147.    execute(cmd,line);
  148.    clean_up();
  149.    }
  150.    
  151. comment(row,tag)
  152.    int row;
  153.    char *tag;
  154.       
  155.    {
  156.    clrlin(row);
  157.    locate(row,0);
  158.    printf("%s archive %s",tag,arcname);
  159.    }
  160.       
  161. prompt(row,tag,line,size)
  162.    int row,size;
  163.    char *tag,*line;
  164.    
  165.    {
  166.    clrlin(row);
  167.    locate(row,0);
  168.    printf("Enter specification of file(s) to %s: ",tag);
  169.    gets(line,size);
  170.    
  171.    locate(row+2,0);
  172.    }
  173.  
  174. execute(cmd,list)
  175.    char *cmd,*list;
  176.    
  177.    {
  178.    char cmdline[129];
  179.    
  180.    sprintf(cmdline,"%s %s %s",cmd,arcname,list);
  181.    system(cmdline);
  182.    }
  183.  
  184. clean_up()
  185.    {
  186.    printf("\n\nPress any key to continue...");
  187.    getch();
  188.    
  189.    locate(3,0);
  190.    clreos();
  191.    }
  192.  
  193. /*    split up a file name (subroutine for makefnam)
  194. */
  195.  
  196. static _makefn(source,dest)
  197.    unsigned char *source;
  198.    unsigned char *dest;
  199.    
  200.    {
  201.    int j,k;
  202.  
  203.    memset(dest,0,82);        /* clear result field */
  204.    
  205.    if (strlen(source)>1 && source[1]==':')
  206.       for (j=0;j<2;)
  207.          dest[j++]=*source++;
  208.    
  209.    j=3;
  210.    
  211.    while (strrchr(source,'\\') || strrchr(source,'/')) {
  212.       for (k=0;(*source!='\\')&&(*source!='/');++source)
  213.      if (j<65 && k++<8)
  214.             dest[j++]=*source;
  215.    
  216.          dest[j++] = (*source=='/') ? *source  : '\\';
  217.          ++source;
  218.       }
  219.    
  220.    for (j=67;*source && *source!='.';++source)
  221.       if (j<75)
  222.          dest[j++]=*source;
  223.    
  224.    for (j=76;*source;++source)
  225.        if (j<80)
  226.           dest[j++]=*source;
  227.    }
  228.  
  229. /*    make a file name using a template
  230. */
  231.  
  232. unsigned char *makefnam(rawfn,template,result)
  233.    unsigned char *rawfn;    /* the original file name */
  234.    unsigned char *template;    /* the template data */
  235.    unsigned char *result;    /* where to place the result */
  236.  
  237.    {
  238.    unsigned char et[82],er[82];
  239.  
  240.    _makefn(template,et);
  241.    _makefn(rawfn,er);
  242.  
  243.    *result=0;            /* assure no data */
  244.    strcat(result,er[0]?er:et);
  245.    strcat(result,er[3]?er+3:et+3);
  246.    strcat(result,er[67]?er+67:et+67);
  247.    strcat(result,er[76]?er+76:et+76);
  248.    return result;
  249.    }
  250.