home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / online / source / c / compilers / Tickle-4.0.sit.hqx / Tickle-4.0 / src / asd.c < prev    next >
Text File  |  1993-11-18  |  7KB  |  302 lines

  1.  
  2. /*
  3. ** This source code was written by Tim Endres
  4. ** Email: time@ice.com.
  5. ** USMail: 8840 Main Street, Whitmore Lake, MI  48189
  6. **
  7. ** Some portions of this application utilize sources
  8. ** that are copyrighted by ICE Engineering, Inc., and
  9. ** ICE Engineering retains all rights to those sources.
  10. **
  11. ** Neither ICE Engineering, Inc., nor Tim Endres, 
  12. ** warrants this source code for any reason, and neither
  13. ** party assumes any responsbility for the use of these
  14. ** sources, libraries, or applications. The user of these
  15. ** sources and binaries assumes all responsbilities for
  16. ** any resulting consequences.
  17. */
  18.  
  19. #ifdef MPW3
  20. #    pragma segment ASD
  21. #endif
  22.  
  23. #ifndef THINK_C_PRECOMPILED
  24.  
  25. #include <Types.h>
  26. #include <Quickdraw.h>
  27. #include <StandardFile.h>
  28.  
  29. #include <fcntl.h>
  30. #include <stdio.h>
  31.  
  32. #include "defines.h"
  33.  
  34. #endif /*THINK_C_PRECOMPILED*/
  35.  
  36. #include <errno.h>
  37. #include "asd.h"
  38. #include "tcl.h"
  39.  
  40. char *
  41. asd_entry_name(id)
  42.     int        id;
  43.     {
  44.     char    *idname = "UNKNOWN";
  45.  
  46.     switch (id)
  47.         {
  48.         case ASDID_DATA_FORK: idname = "Data Fork"; break;
  49.         case ASDID_RSRC_FORK: idname = "Resource Fork"; break;
  50.         case ASDID_NAME_FORK: idname = "Filename"; break;
  51.         case ASDID_CMNT_FORK: idname = "Comment"; break;
  52.         case ASDID_MICN_FORK: idname = "Monochrome Icon"; break;
  53.         case ASDID_CICN_FORK: idname = "Color Icon"; break;
  54.         case ASDID_INFO_FORK: idname = "Information"; break;
  55.         case ASDID_FNDR_FORK: idname = "Finder Information"; break;
  56.         case ASDID_DATA_PATH: idname = "File Path"; break;
  57.         }
  58.     
  59.     return idname;
  60.     }
  61.  
  62. #ifdef TCLAPPL
  63.  
  64. SF_asd_info()
  65.     {
  66.     Point        mypoint;
  67.     SFReply        asdreply;
  68.     SFTypeList    mytypes;
  69.     FILE        *asdfile;
  70.     int            i, result = SUCCESS;
  71.     long        bytes;
  72.     asd_fndr_fork    finder;
  73.     asd_hdr            header;
  74.     asd_entry        entry;
  75.  
  76.     UInitCursor();
  77.     mypoint.h = mypoint.v = 75;
  78.     mytypes[0] = 'TEXT';
  79.     MyGetFile( mypoint, "\pSelect ASD File:", NULL,
  80.                 (CheckOption()?-1:1), mytypes, NULL, &asdreply );
  81.     if (asdreply.good)
  82.         {
  83.         p2cstr(asdreply.fName);
  84.         Feedback("Apple Single/Double Information for '%s'", asdreply.fName);
  85.         SetVol(NULL, asdreply.vRefNum);
  86.         asdfile = fopen(asdreply.fName, "r");
  87.         if (asdfile == NULL)
  88.             {
  89.             Feedback("Error #%d opening Apple Single/Double file '%s'",
  90.                         errno, asdreply.fName);
  91.             return FAILURE;
  92.             }
  93.         
  94.         bytes = fread(&header, 1, sizeof(asd_hdr), asdfile);
  95.         if (bytes != sizeof(asd_hdr))
  96.             {
  97.             Feedback("Error #%d reading Apple Single/Double header bytes.", errno);
  98.             result = FAILURE;
  99.             }
  100.         else if ( header.magic != MAGIC_APPLE_SINGLE &&
  101.                     header.magic != MAGIC_APPLE_DOUBLE )
  102.             {
  103.             Feedback("File is not in Apple Single/Double format. magic x%08lX",
  104.                             header.magic);
  105.             result = FAILURE;
  106.             }
  107.         else
  108.             {
  109.             print_asd_hdr(&header);
  110.             for ( i = 0 ; i < header.entries ; i++ )
  111.                 {
  112.                 fread(&entry, sizeof(asd_entry), 1, asdfile);
  113.                 print_asd_entry(&entry);
  114.                 switch (entry.id)
  115.                     {
  116.                     case ASDID_FNDR_FORK:
  117.                         get_asd_fndr_data(asdfile, &entry, &finder);
  118.                         print_asd_fndr(&finder);
  119.                         break;
  120.                     }
  121.                 }
  122.             }
  123.         
  124.         fclose(asdfile);
  125.         }
  126.     
  127.     return result;
  128.     }
  129.  
  130. print_asd_entry(entry)
  131.     asd_entry    *entry;
  132.     {
  133.     Feedback("Entry ID %d <%s>", entry->id, asd_entry_name(entry->id));
  134.     Feedback("Entry offset %ld length %ld", entry->offset, entry->length);
  135.     }
  136.  
  137. print_asd_fndr(finder)
  138.     asd_fndr_fork    *finder;
  139.     {
  140.     Feedback("Type '%4.4s'  Creator '%4.4s'", &finder->fdType, &finder->fdCreator);
  141.     Feedback("Flags x%2.2x  Folder %d", finder->fdFlags, finder->fdFldr);
  142.     Feedback("Loc[0] %d  Loc[1] %d", finder->fdLocation[0], finder->fdLocation[1]);
  143.     }
  144.  
  145. print_asd_hdr(hdr)
  146.     asd_hdr        *hdr;
  147.     {
  148.     Feedback("Apple %s Format.",
  149.             (hdr->magic == MAGIC_APPLE_SINGLE) ? "Single" : "Double");
  150.     Feedback("Version 0x%08lx", hdr->version);
  151.     if (hdr->version == 0x00010000)
  152.         Feedback("File system '%16.16s'", hdr->filesys);
  153.     Feedback("Entries %d", hdr->entries);
  154.     }
  155.  
  156. #endif
  157.  
  158. asd_seek_a_name(asdfile, name)
  159.     FILE    *asdfile;
  160.     char    *name;
  161.     {
  162. #pragma unused (asdfile, name)
  163.     }
  164.  
  165. get_asd_fndr_data(fp, entry, finder)
  166.     FILE            *fp;
  167.     asd_entry        *entry;
  168.     asd_fndr_fork    *finder;
  169.     {
  170.     int        position;
  171.     
  172.     position = ftell(fp);
  173.     fseek(fp, entry->offset, SEEK_SET);
  174.     
  175.     fread((char *)finder, 1, sizeof(asd_fndr_fork), fp);
  176.     
  177.     fseek(fp, position, SEEK_SET);
  178.     }
  179.  
  180. int
  181. Cmd_ASD_info(clientData, interp, argc, argv)
  182.     char        *clientData;
  183.     Tcl_Interp    *interp;
  184.     int            argc;
  185.     char        **argv;
  186.     {
  187.     FILE        *asdfile;
  188.     int            i, result = SUCCESS;
  189.     long        bytes;
  190.     asd_hdr            header;
  191.     asd_entry        entry;
  192. #pragma unused (clientData)
  193.  
  194.     if (argc != 2)
  195.         {
  196.         Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0],
  197.                         " asdfilename\"", (char *) NULL);
  198.         return TCL_ERROR;
  199.         }
  200.  
  201.     asdfile = fopen(argv[1], "r");
  202.     if (asdfile == NULL)
  203.         {
  204.         Tcl_AppendResult(interp, "error opening file \"", argv[1],
  205.                             "\"", Tcl_PosixError(interp), (char *) NULL);
  206.         return TCL_ERROR;
  207.         }
  208.     
  209.     bytes = fread(&header, 1, sizeof(asd_hdr), asdfile);
  210.     if (bytes != sizeof(asd_hdr))
  211.         {
  212.         Tcl_AppendResult(interp, "error reading asd header data", (char *) NULL);
  213.         return TCL_ERROR;
  214.         }
  215.     else if ( header.magic != MAGIC_APPLE_SINGLE &&
  216.                 header.magic != MAGIC_APPLE_DOUBLE )
  217.         {
  218.         Tcl_AppendResult(interp, "error file \"", argv[1], 
  219.                         "\" is not in Apple Single/Double format", (char *) NULL);
  220.         return TCL_ERROR;
  221.         }
  222.     else
  223.         {
  224.         append_asd_hdr(interp, &header);
  225.         for ( i = 0 ; i < header.entries ; i++ )
  226.             {
  227.             fread(&entry, sizeof(asd_entry), 1, asdfile);
  228.             append_asd_entry(asdfile, interp, &entry);
  229.             }
  230.         //Tcl_AppendResult(interp, "}", NULL);
  231.         }
  232.     
  233.     fclose(asdfile);
  234.     return TCL_OK;
  235.     }
  236.  
  237. append_asd_hdr(interp, hdr)
  238.     Tcl_Interp    *interp;
  239.     asd_hdr        *hdr;
  240.     {
  241.     char    version[32];
  242.     char    filesys[64];
  243.     char    entries[32];
  244.     
  245.     sprintf(version, "0x%08lX", hdr->version);
  246.     sprintf(filesys, "\"%.16s\"", hdr->filesys);
  247.     sprintf(entries, "%d", hdr->entries);
  248.     Tcl_AppendResult(interp,
  249.             ( (hdr->magic == MAGIC_APPLE_SINGLE) ? "Single " : "Double " ),
  250.             filesys, " ", version, " ", entries,
  251.             NULL);
  252.     }
  253.  
  254. append_asd_fndr(interp, finder)
  255.     Tcl_Interp        *interp;
  256.     asd_fndr_fork    *finder;
  257.     {
  258.     char    type[8], creator[8];
  259.     char    flags[32];
  260.     char    folder[32];
  261.     
  262.     sprintf(type, "\"%4.4s\"", &finder->fdType);
  263.     sprintf(creator, "\"%4.4s\"", &finder->fdCreator);
  264.     sprintf(flags, "0x%04X", finder->fdFlags);
  265.     sprintf(folder, "%d", finder->fdFldr);
  266.     Tcl_AppendResult(interp,
  267.             "{", type, " ", creator, " ", flags, " ", folder, "}",
  268.             NULL);
  269.     }
  270.  
  271. append_asd_entry(asdfile, interp, entry)
  272.     FILE        *asdfile;
  273.     Tcl_Interp    *interp;
  274.     asd_entry    *entry;
  275.     {
  276.     char    id[256];
  277.     char    offset[256];
  278.     char    length[256];
  279.     asd_fndr_fork    finder;
  280.  
  281.     sprintf(id, "%d", entry->id);
  282.     sprintf(offset, "%d", entry->offset);
  283.     sprintf(length, "%d", entry->length);
  284.     Tcl_AppendResult(interp, " {", id, " \"",
  285.                         asd_entry_name(entry->id), "\" ", 
  286.                         offset, " ", length, " ",
  287.                         NULL);
  288.     
  289.     switch (entry->id)
  290.         {
  291.         case ASDID_FNDR_FORK:
  292.             get_asd_fndr_data(asdfile, entry, &finder);
  293.             append_asd_fndr(interp, &finder);
  294.             break;
  295.         default:
  296.             Tcl_AppendResult(interp, "{}", NULL);
  297.             break;
  298.         }
  299.     
  300.     Tcl_AppendResult(interp, "}", NULL);
  301.     }
  302.