home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1995 May / macformat-024.iso / Shareware City / Developers / nshellmegasource1.50 / mega src / commands / mkdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-23  |  6.1 KB  |  279 lines  |  [TEXT/KAHL]

  1. /* ========== the commmand file: ==========
  2.  
  3.     mkdir.c
  4.     
  5.     Copyright (c) 1993,1994 Newport Software Development
  6.     
  7.     You may distribute unmodified copies of this file for
  8.     noncommercial purposes.  You may use this file as a
  9.     reference when writing your own nShell(tm) commands.
  10.     
  11.     All other rights are reserved.
  12.     
  13.    ========== the commmand file: ========== */
  14.  
  15. #ifdef __MWERKS__            // CodeWarrior requires an A4 setup
  16. #include <A4Stuff.h>
  17. #endif
  18.  
  19. #include <script.h>
  20. #include <string.h>
  21.  
  22. #include "nshc.h"
  23.  
  24. #include "arg_utl.proto.h"
  25. #include "fss_utl.proto.h"
  26. #include "nshc_utl.proto.h"
  27. #include "str_utl.proto.h"
  28.  
  29. // data definition - this struct is the root of all data
  30.  
  31. typedef struct {
  32.  
  33.     int        got_fss;        // 0 if FSSpec calls are not available
  34.     int        arg;            // position in arg list
  35.  
  36. } t_mkdir_data;
  37.  
  38. typedef    t_mkdir_data    **mkdir_hndl;
  39.  
  40. /* ======================================== */
  41.  
  42. // prototypes - utility
  43.  
  44. void mkdir_bad( t_nshc_parms *nshc_parms, int code );
  45. void mkdir_bad_file( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, StringPtr msg );
  46. void mkdir_good( t_nshc_parms *nshc_parms );
  47.  
  48. // prototypes - file routines
  49.  
  50. OSErr mkdir(int got_fss, const FSSpec *spec);
  51. OSErr mkdir_info(const FSSpec *spec, int *isDir);
  52. void  mkdir_one( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, t_mkdir_data **hData );
  53.  
  54. // prototypes - state machine
  55.  
  56. void mkdir_start( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls  );
  57. void mkdir_continue( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls );
  58. void mkdir_stop( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls );
  59.  
  60. /* ======================================== */
  61.  
  62. // utility routines
  63.  
  64. /* ======================================== */
  65.  
  66. void mkdir_bad(  t_nshc_parms *nshc_parms, int code )
  67. {
  68.     nshc_parms->action = nsh_stop;
  69.     nshc_parms->result = code;
  70. }
  71.  
  72. void mkdir_bad_file(  t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, StringPtr msg )
  73. {
  74.  
  75.     nshc_calls->NSH_putStr_err("\pmkdir: Directory access error (");
  76.     nshc_calls->NSH_putStr_err(msg);
  77.     nshc_calls->NSH_putStr_err("\p)\r");
  78.  
  79.     nshc_parms->action = nsh_stop;
  80.     nshc_parms->result = NSHC_ERR_GENERAL;
  81. }
  82.  
  83. void mkdir_good(  t_nshc_parms *nshc_parms )
  84. {
  85.     nshc_parms->action = nsh_stop;
  86.     nshc_parms->result = 0;
  87. }
  88.  
  89. /* ======================================== */
  90.  
  91. // file access routines
  92.  
  93. /* ========================================== */
  94.  
  95. OSErr mkdir_info(const FSSpec *spec, int *isDir)
  96. {
  97.     CInfoPBRec pb;
  98.     OSErr error;
  99.  
  100.     pb.hFileInfo.ioNamePtr = (StringPtr)spec->name;
  101.     pb.hFileInfo.ioVRefNum = spec->vRefNum;
  102.     pb.hFileInfo.ioDirID = spec->parID;
  103.     pb.hFileInfo.ioFDirIndex = 0;
  104.     
  105.     error = PBGetCatInfoSync(&pb);
  106.     
  107.     *isDir = (pb.hFileInfo.ioFlAttrib & 0x10) != 0;
  108.         
  109.     return (error);
  110. }
  111.  
  112. /* ========================================== */
  113.  
  114. OSErr mkdir(int got_fss, const FSSpec *spec)
  115. {
  116.     OSErr            result;
  117.     long            dirID;
  118.     HParamBlockRec    pb;
  119.  
  120.     if (got_fss)
  121.         return (FSpDirCreate(spec, smSystemScript, &dirID));
  122.     else {
  123.         pb.fileParam.ioVRefNum = spec->vRefNum;
  124.         pb.fileParam.ioDirID = spec->parID;
  125.         pb.fileParam.ioNamePtr = (StringPtr) &(spec->name);
  126.         
  127.         result = PBDirCreateSync(&pb);
  128.         
  129.         return (result);
  130.         }
  131. }
  132. /* ======================================== */
  133.  
  134. void mkdir_one( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls, t_mkdir_data **hData )
  135. {
  136.     int        result;
  137.     FSSpec    fsspec;
  138.     long    dirID;
  139.     int        isDir;
  140.     int        isEmpty;
  141.     
  142.     // =====> convert argument to fsspec
  143.     
  144.     result = arg_to_fss( nshc_parms, nshc_calls, (**hData).arg, &fsspec );
  145.  
  146.     (**hData).arg++;
  147.     
  148.     if (result) {
  149.         mkdir_bad( nshc_parms, result );
  150.         return;
  151.         }
  152.     
  153.     result = mkdir_info( &fsspec, &isDir );
  154.                 
  155.     if (!result) {
  156.     
  157.         if ( isDir )
  158.             nshc_calls->NSH_putStr_err("\pmkdir: Directory already exists = ");
  159.         else
  160.             nshc_calls->NSH_putStr_err("\pmkdir: File already exists = ");
  161.             
  162.         nshc_calls->NSH_putStr_err((StringPtr)fsspec.name);
  163.         nshc_calls->NSH_putchar('\r');
  164.         return;
  165.         
  166.         }
  167.     
  168.     if ( result != fnfErr ) {
  169.         mkdir_bad_file( nshc_parms, nshc_calls, (StringPtr)fsspec.name );
  170.         return;
  171.         }
  172.             
  173.     // =====> make the new directory
  174.         
  175.     result = mkdir((**hData).got_fss, &fsspec);
  176.     
  177.     if ( result ) {
  178.         mkdir_bad_file( nshc_parms, nshc_calls, (StringPtr)fsspec.name );
  179.         return;
  180.         }
  181.  
  182.     result = fss_wake_parent( &fsspec );
  183.  
  184.     if (result)
  185.         nshc_calls->NSH_putStr_err( "\pmv: Warning - could update finder info.\r" );
  186. }
  187.  
  188. /* ======================================== */
  189.  
  190. // state machine - core routines
  191.  
  192. /* ======================================== */
  193.  
  194. void mkdir_start( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls  )
  195. {
  196.     mkdir_hndl    hData;    // handle to hold our data
  197.     
  198.     if (nshc_parms->argc < 2) {
  199.         nshc_calls->NSH_putStr_err( "\pUsage: mkdir dir [dir...]\r" );
  200.         mkdir_bad( nshc_parms, NSHC_ERR_PARMS );
  201.         return;
  202.         }
  203.         
  204.     nshc_parms->action = nsh_continue;
  205.  
  206.     hData = (mkdir_hndl)NewHandleClear(sizeof(t_mkdir_data));
  207.     
  208.     if (hData) {
  209.         (**hData).arg = 1;                    // start at the arg = 1 position
  210.         (**hData).got_fss = fss_test();        // test if we can use FSSpec calls
  211.         nshc_parms->data = (Handle)hData;
  212.         }
  213.     else {
  214.         nshc_calls->NSH_putStr_err( "\pmkdir: Could not allocate storage.\r" );
  215.         mkdir_bad( nshc_parms, NSHC_ERR_MEMORY );
  216.         }
  217. }
  218.  
  219. /* ======================================== */
  220.  
  221. void mkdir_continue( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls )
  222. {
  223.     int        i;
  224.     mkdir_hndl    hData;
  225.     
  226.     if (hData = (mkdir_hndl)nshc_parms->data) {
  227.  
  228.         if ((**hData).arg >= nshc_parms->argc)
  229.             mkdir_good( nshc_parms );
  230.         else
  231.             mkdir_one( nshc_parms, nshc_calls, hData );
  232.  
  233.         }
  234. }
  235.  
  236. /* ======================================== */
  237.  
  238. void mkdir_stop( t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls )
  239. {
  240.     mkdir_hndl    hData;
  241.     
  242.     if (hData = (mkdir_hndl)nshc_parms->data)
  243.         DisposeHandle(nshc_parms->data);
  244.         
  245.     nshc_parms->action = nsh_idle;
  246. }
  247.  
  248. /* ======================================== */
  249.  
  250. void main(t_nshc_parms *nshc_parms, t_nshc_calls *nshc_calls)
  251. {
  252.     
  253. #ifdef __MWERKS__
  254.     long oldA4  = SetCurrentA4();
  255. #endif
  256.  
  257.     if ( !nshc_bad_version( nshc_parms, nshc_calls, NSHC_VERSION ) ) {
  258.  
  259.         switch (nshc_parms->action) {
  260.             case nsh_start:
  261.                 mkdir_start(nshc_parms, nshc_calls);
  262.                 break;
  263.             case nsh_continue:
  264.                 mkdir_continue(nshc_parms, nshc_calls);
  265.                 break;
  266.             case nsh_stop:
  267.                 mkdir_stop(nshc_parms, nshc_calls);
  268.                 break;
  269.             }
  270.  
  271.         }
  272.  
  273. #ifdef __MWERKS__
  274.     SetA4(oldA4);
  275. #endif
  276. }
  277.  
  278. /* ======================================== */
  279.