emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/mac.c


From: Steven Tamm
Subject: [Emacs-diffs] Changes to emacs/src/mac.c
Date: Sun, 10 Jul 2005 14:17:23 -0400

Index: emacs/src/mac.c
diff -c emacs/src/mac.c:1.38 emacs/src/mac.c:1.39
*** emacs/src/mac.c:1.38        Mon Jul  4 16:06:33 2005
--- emacs/src/mac.c     Sun Jul 10 18:17:18 2005
***************
*** 3394,3399 ****
--- 3394,3604 ----
    CloseComponent (as_scripting_component);
  }
  
+ /* Convert a lisp string or integer to the 4 byte character code
+  */
+  
+ OSType mac_get_code_from_arg(Lisp_Object arg, OSType defCode)
+ {
+   OSType result;
+   if (NILP(arg))
+     {
+       result = defCode;
+     } 
+   else if (INTEGERP(arg))
+     {
+       result = XFASTINT(arg);
+     }
+   else
+     {
+       /* check type string */
+       CHECK_STRING(arg);
+       if (strlen(SDATA(arg)) != 4)
+       {
+         error ("Wrong argument: need string of length 4 for code");
+       }
+       /* Should work cross-endian */
+       result = SDATA(arg)[3] + (SDATA(arg)[2] << 8) + 
+       (SDATA(arg)[1] << 16) + (SDATA(arg)[0] << 24);
+     }
+   return result;
+ }
+ 
+ /**
+    Convert the 4 byte character code into a 4 byte string
+  */
+ Lisp_Object mac_get_object_from_code(OSType defCode)
+ {
+   if (defCode == 0) {
+     return make_specified_string("", -1, 0, 0);
+   } else {
+     /* Should work cross-endian */
+     char code[4];
+     code[0] = defCode >> 24 & 0xff;
+     code[1] = defCode >> 16 & 0xff;
+     code[2] = defCode >> 8 & 0xff;
+     code[3] = defCode & 0xff;
+     return make_specified_string(code, -1, 4, 0);
+   }
+ }
+ 
+ 
+ DEFUN ("mac-get-file-creator", Fmac_get_file_creator, Smac_get_file_creator, 
1, 1, 0,
+        doc: /* Get the creator code of FILENAME as a four character string. 
*/)
+   (Lisp_Object filename)
+ {
+   OSErr       status;
+   FSRef defLoc;
+   OSType cCode;
+   Lisp_Object result = Qnil;
+   CHECK_STRING (filename);
+ 
+   if (NILP(Ffile_exists_p(filename)) || !NILP(Ffile_directory_p(filename))) {
+     return Qnil;
+   }
+   filename = Fexpand_file_name (filename, Qnil);
+ 
+   BLOCK_INPUT;
+   status = FSPathMakeRef(SDATA(ENCODE_FILE(filename)), &defLoc, NULL);
+ 
+   if (status == noErr)
+     {
+       FSCatalogInfo catalogInfo;
+       FSRef parentDir;
+       status = FSGetCatalogInfo(&defLoc, kFSCatInfoNodeFlags + 
kFSCatInfoFinderInfo,
+                               &catalogInfo, NULL, NULL, &parentDir);
+       if (status == noErr) 
+       {
+         result = 
mac_get_object_from_code(((FileInfo*)&catalogInfo.finderInfo)->fileCreator);
+       }
+     }
+   UNBLOCK_INPUT;
+   if (status != noErr) {
+     error ("Error while getting file information.");
+   }
+   return result;
+ }
+ 
+ DEFUN ("mac-get-file-type", Fmac_get_file_type, Smac_get_file_type, 1, 1, 0,
+        doc: /* Get the type code of FILENAME as a four character string. */)
+   (Lisp_Object filename)
+ {
+   OSErr       status;
+   FSRef defLoc;
+   OSType cCode;
+   Lisp_Object result = Qnil;
+   CHECK_STRING (filename);
+ 
+   if (NILP(Ffile_exists_p(filename)) || !NILP(Ffile_directory_p(filename))) {
+     return Qnil;
+   }
+   filename = Fexpand_file_name (filename, Qnil);
+ 
+   BLOCK_INPUT;
+   status = FSPathMakeRef(SDATA(ENCODE_FILE(filename)), &defLoc, NULL);
+ 
+   if (status == noErr)
+     {
+       FSCatalogInfo catalogInfo;
+       FSRef parentDir;
+       status = FSGetCatalogInfo(&defLoc, kFSCatInfoNodeFlags + 
kFSCatInfoFinderInfo,
+                               &catalogInfo, NULL, NULL, &parentDir);
+       if (status == noErr) 
+       {
+         result = 
mac_get_object_from_code(((FileInfo*)&catalogInfo.finderInfo)->fileType);
+       }
+     }
+   UNBLOCK_INPUT;
+   if (status != noErr) {
+     error ("Error while getting file information.");
+   }
+   return result;
+ }
+ 
+ DEFUN ("mac-set-file-creator", Fmac_set_file_creator, Smac_set_file_creator, 
1, 2, 0,
+        doc: /* Set creator code of file FILENAME to CODE.
+ If non-nil, CODE must be a 32-bit integer or a 4-character string. Otherwise,
+ 'EMAx' is assumed. Return non-nil if successful.
+    */)
+   (Lisp_Object filename, Lisp_Object code)
+ {
+   OSErr       status;
+   FSRef defLoc;
+   OSType cCode;
+   CHECK_STRING (filename);
+ 
+   cCode = mac_get_code_from_arg(code, 'EMAx');
+ 
+   if (NILP(Ffile_exists_p(filename)) || !NILP(Ffile_directory_p(filename))) {
+     return Qnil;
+   }
+   filename = Fexpand_file_name (filename, Qnil);
+ 
+   BLOCK_INPUT;
+   status = FSPathMakeRef(SDATA(ENCODE_FILE(filename)), &defLoc, NULL);
+ 
+   if (status == noErr)
+     {
+       FSCatalogInfo catalogInfo;
+       FSRef parentDir;
+       status = FSGetCatalogInfo(&defLoc, kFSCatInfoNodeFlags + 
kFSCatInfoFinderInfo,
+                               &catalogInfo, NULL, NULL, &parentDir);
+       if (status == noErr) 
+       {
+       ((FileInfo*)&catalogInfo.finderInfo)->fileCreator = cCode;
+       status = FSSetCatalogInfo(&defLoc, kFSCatInfoFinderInfo, &catalogInfo);
+       /* TODO: on Mac OS 10.2, we need to touch the parent dir, FNNotify? */
+       }
+     }
+   UNBLOCK_INPUT;
+   if (status != noErr) {
+     error ("Error while setting creator information.");
+   }
+   return Qt;
+ }
+ 
+ DEFUN ("mac-set-file-type", Fmac_set_file_type, Smac_set_file_type, 2, 2, 0,
+        doc: /* Set file code of file FILENAME to CODE.
+ CODE must be a 32-bit integer or a 4-character string. Return non-nil if 
successful.
+    */)
+   (filename, code)
+      Lisp_Object filename;
+      Lisp_Object code;
+ {
+   OSErr       status;
+   FSRef defLoc;
+   OSType cCode;
+   CHECK_STRING (filename);
+ 
+   cCode = mac_get_code_from_arg(code, 0); /* Default to empty code*/
+ 
+   if (NILP(Ffile_exists_p(filename)) || !NILP(Ffile_directory_p(filename))) {
+     return Qnil;
+   }
+   filename = Fexpand_file_name (filename, Qnil);
+ 
+   BLOCK_INPUT;
+   status = FSPathMakeRef(SDATA(ENCODE_FILE(filename)), &defLoc, NULL);
+ 
+   if (status == noErr)
+     {
+       FSCatalogInfo catalogInfo;
+       FSRef parentDir;
+       status = FSGetCatalogInfo(&defLoc, kFSCatInfoNodeFlags + 
kFSCatInfoFinderInfo,
+                               &catalogInfo, NULL, NULL, &parentDir);
+       if (status == noErr) 
+       {
+       ((FileInfo*)&catalogInfo.finderInfo)->fileType = cCode;
+       status = FSSetCatalogInfo(&defLoc, kFSCatInfoFinderInfo, &catalogInfo);
+       /* TODO: on Mac OS 10.2, we need to touch the parent dir, FNNotify? */
+       }
+     }
+   UNBLOCK_INPUT;
+   if (status != noErr) {
+     error ("Error while setting creator information.");
+   }
+   return Qt;
+ }
+ 
  
  /* Compile and execute the AppleScript SCRIPT and return the error
     status as function value.  A zero is returned if compilation and
***************
*** 4361,4366 ****
--- 4566,4575 ----
  #endif
    defsubr (&Smac_clear_font_name_table);
  
+   defsubr (&Smac_set_file_creator);
+   defsubr (&Smac_set_file_type);
+   defsubr (&Smac_get_file_creator);
+   defsubr (&Smac_get_file_type);
    defsubr (&Sdo_applescript);
    defsubr (&Smac_file_name_to_posix);
    defsubr (&Sposix_file_name_to_mac);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]