comparison src/dired.c @ 5475:248176c74e6b

Merge with trunk.
author Mats Lidell <matsl@xemacs.org>
date Sat, 23 Apr 2011 23:47:13 +0200
parents 0af042a0c116 f560f6608937
children 1f0b15040456
comparison
equal deleted inserted replaced
5474:4dee0387b9de 5475:248176c74e6b
841 If file does not exist, returns nil. 841 If file does not exist, returns nil.
842 */ 842 */
843 (filename)) 843 (filename))
844 { 844 {
845 /* This function can GC. GC checked 1997.06.04. */ 845 /* This function can GC. GC checked 1997.06.04. */
846 Lisp_Object values[12];
847 Lisp_Object directory = Qnil; 846 Lisp_Object directory = Qnil;
848 struct stat s; 847 struct stat s;
849 char modes[10]; 848 char modes[10];
850 Lisp_Object handler; 849 Lisp_Object handler, mode, modestring = Qnil, size, gid;
851 struct gcpro gcpro1, gcpro2; 850 struct gcpro gcpro1, gcpro2, gcpro3;
852 851
853 GCPRO2 (filename, directory); 852 GCPRO3 (filename, directory, modestring);
854 filename = Fexpand_file_name (filename, Qnil); 853 filename = Fexpand_file_name (filename, Qnil);
855 854
856 /* If the file name has special constructs in it, 855 /* If the file name has special constructs in it,
857 call the corresponding file handler. */ 856 call the corresponding file handler. */
858 handler = Ffind_file_name_handler (filename, Qfile_attributes); 857 handler = Ffind_file_name_handler (filename, Qfile_attributes);
889 #endif 888 #endif
890 889
891 switch (s.st_mode & S_IFMT) 890 switch (s.st_mode & S_IFMT)
892 { 891 {
893 default: 892 default:
894 values[0] = Qnil; 893 mode = Qnil;
895 break; 894 break;
896 case S_IFDIR: 895 case S_IFDIR:
897 values[0] = Qt; 896 mode = Qt;
898 break; 897 break;
899 #ifdef S_IFLNK 898 #ifdef S_IFLNK
900 case S_IFLNK: 899 case S_IFLNK:
901 values[0] = Ffile_symlink_p (filename); 900 mode = Ffile_symlink_p (filename);
902 break; 901 break;
903 #endif 902 #endif
904 } 903 }
905 values[1] = make_int (s.st_nlink);
906 values[2] = make_int (s.st_uid);
907 values[3] = make_int (s.st_gid);
908 values[4] = make_time (s.st_atime);
909 values[5] = make_time (s.st_mtime);
910 values[6] = make_time (s.st_ctime);
911 904
912 #ifndef HAVE_BIGNUM 905 #ifndef HAVE_BIGNUM
913 values[7] = make_integer (NUMBER_FITS_IN_AN_EMACS_INT (s.st_size) ? 906 size = make_integer (NUMBER_FITS_IN_AN_EMACS_INT (s.st_size) ?
914 (EMACS_INT)s.st_size : -1); 907 (EMACS_INT)s.st_size : -1);
915 #else 908 #else
916 values[7] = make_integer (s.st_size); 909 size = make_integer (s.st_size);
917 #endif 910 #endif
918 911
919 filemodestring (&s, modes); 912 filemodestring (&s, modes);
920 values[8] = make_string ((Ibyte *) modes, 10); 913 modestring = make_string ((Ibyte *) modes, 10);
914
921 #if defined (BSD4_2) || defined (BSD4_3) /* file gid will be dir gid */ 915 #if defined (BSD4_2) || defined (BSD4_3) /* file gid will be dir gid */
922 { 916 {
923 struct stat sdir; 917 struct stat sdir;
924 918
925 if (!NILP (directory) && qxe_stat (XSTRING_DATA (directory), &sdir) == 0) 919 if (!NILP (directory) && qxe_stat (XSTRING_DATA (directory), &sdir) == 0)
926 values[9] = (sdir.st_gid != s.st_gid) ? Qt : Qnil; 920 gid = (sdir.st_gid != s.st_gid) ? Qt : Qnil;
927 else /* if we can't tell, assume worst */ 921 else /* if we can't tell, assume worst */
928 values[9] = Qt; 922 gid = Qt;
929 } 923 }
930 #else /* file gid will be egid */ 924 #else /* file gid will be egid */
931 values[9] = (s.st_gid != getegid ()) ? Qt : Qnil; 925 gid = (s.st_gid != getegid ()) ? Qt : Qnil;
932 #endif /* BSD4_2 or BSD4_3 */ 926 #endif /* BSD4_2 or BSD4_3 */
933 values[10] = make_int (s.st_ino); 927
934 values[11] = make_int (s.st_dev); 928 RETURN_UNGCPRO (listn (12,
935 UNGCPRO; 929 mode,
936 return Flist (countof (values), values); 930 make_int (s.st_nlink),
931 make_int (s.st_uid),
932 make_int (s.st_gid),
933 make_time (s.st_atime),
934 make_time (s.st_mtime),
935 make_time (s.st_ctime),
936 size,
937 modestring,
938 gid,
939 make_int (s.st_ino),
940 make_int (s.st_dev)));
937 } 941 }
938 942
939 943
940 /************************************************************************/ 944 /************************************************************************/
941 /* initialization */ 945 /* initialization */