#include <gtk--/main.h>
#include <gtk--/window.h>
#include <gtk--/button.h>
#include <gtk--/box.h>
#include <gtk--/drawingarea.h>
#include <gtk--/style.h>
#include <gtk--/label.h>
#include <gtk--/widget.h>
#include <sigc++-1.0/sigc++/slot.h>
#include <sigc++-1.0/sigc++/signal_system.h>
#include "errno.h"
#include <sys/stat.h>
#include "save-cwd.h"
#include <unistd.h>
#include "savedir.h"
#include "config.h"
#include <fcntl.h>
#include <sstream>
#include <vector>
#include <cmath>
#include <cstdlib>
#include "context.h"
#include "drawerdep.h"
#include "drawervisitordep.h"
#include "colorpickerdep.h"
#include "dutree.h"
#include "rotatedrawer.h"
#include <stdio.h>
#include <sys/types.h>
#include "pathmax.h"
Include dependency graph for dutree.cpp:
Compounds | |
struct | exclude_st |
class | RotateDrawerCmd |
class | RotateColorCmd |
Defines | |
#define | NAME_SIZE_DEFAULT 512 |
#define | FNM_PATHNAME (1 << 0) |
#define | FNM_NOESCAPE (1 << 1) |
#define | FNM_PERIOD (1 << 2) |
#define | FNM_FILE_NAME FNM_PATHNAME |
#define | FNM_LEADING_DIR (1 << 3) |
#define | FNM_CASEFOLD (1 << 4) |
#define | FNM_NOMATCH 1 |
#define | FOLD(c) |
#define | S_ISLNK(s) 0 |
Functions | |
std::ostream & | operator<< (std::ostream &output, Exception &err) |
Writes an exception to an ostream. | |
void | destroy_handler () |
char * | getcwd () |
char * | xgetcwd () |
void | free_cwd (struct saved_cwd *cwd) |
void xalloc_fail_func | PARAMS ((void))=0 |
void | xalloc_die (void) |
char * | savedir (const char *dir, off_t name_size) |
int | restore_cwd (const struct saved_cwd *cwd, const char *dest, const char *from) |
int | save_cwd (struct saved_cwd *cwd) |
int | fnmatch (const char *pattern, const char *string, int flags) |
exclude_st * | new_exclude (void) |
int | excluded_filename (struct exclude_st const *ex, char const *f, int options) |
int | main (int argc, char *argv[]) |
Variables | |
int | errno |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Value: ((flags & FNM_CASEFOLD) && ISUPPER ((unsigned char) (c)) \ ? tolower ((unsigned char) (c)) \ : (c)) |
|
|
|
Writes an exception to an ostream.
00056 { 00057 err.write(output); 00058 return output; 00059 } |
|
00062 { 00063 Gtk::Main::quit(); 00064 } |
|
|
|
00490 { 00491 char *ret; 00492 unsigned path_max; 00493 char buf[1024]; 00494 00495 errno = 0; 00496 ret = getcwd (buf, sizeof (buf)); 00497 if (ret != NULL) 00498 return xstrdup (buf); 00499 if (errno != ERANGE) 00500 return NULL; 00501 00502 path_max = (unsigned) PATH_MAX; 00503 path_max += 2; /* The getcwd docs say to do this. */ 00504 00505 for (;;) 00506 { 00507 char *cwd = (char *) xmalloc (path_max); 00508 00509 errno = 0; 00510 ret = getcwd (cwd, path_max); 00511 if (ret != NULL) 00512 return ret; 00513 if (errno != ERANGE) 00514 { 00515 int save_errno = errno; 00516 free (cwd); 00517 errno = save_errno; 00518 return NULL; 00519 } 00520 00521 free (cwd); 00522 00523 path_max += path_max / 16; 00524 path_max += 32; 00525 } 00526 } |
|
|
|
|
|
00541 { 00542 if (xalloc_fail_func) 00543 (*xalloc_fail_func) (); 00544 //error (xalloc_exit_failure, 0, "%s", _(xalloc_msg_memory_exhausted)); 00545 /* The `noreturn' cannot be given to error, since it may return if 00546 its first argument is 0. To help compilers understand the 00547 xalloc_die does terminate, call exit. */ 00548 exit (EXIT_FAILURE); 00549 } |
|
00567 { 00568 DIR *dirp; 00569 struct dirent *dp; 00570 char *name_space; 00571 size_t allocated = name_size; /* Overflow is checked indirectly below. */ 00572 size_t used = 0; 00573 int save_errno; 00574 00575 dirp = opendir (dir); 00576 if (dirp == NULL) 00577 return NULL; 00578 00579 /* Use the default if the size is not known. Be sure "allocated" 00580 is at least `1' so there's room for the final NUL byte. 00581 Do not simply test name_size <= 0, because the initialization 00582 of "allocated" might have overflowed. */ 00583 if (name_size < 0 || allocated == 0) 00584 allocated = NAME_SIZE_DEFAULT; 00585 00586 name_space = static_cast<char *>(xmalloc (allocated)); 00587 00588 errno = 0; 00589 while ((dp = readdir (dirp)) != NULL) 00590 { 00591 /* Skip "", ".", and "..". "" is returned by at least one buggy 00592 implementation: Solaris 2.4 readdir on NFS filesystems. */ 00593 char const *entry = dp->d_name; 00594 if (entry[entry[0] != '.' ? 0 : entry[1] != '.' ? 1 : 2] != '\0') 00595 { 00596 size_t entry_size = strlen (entry) + 1; 00597 if (used + entry_size < used) 00598 xalloc_die (); 00599 if (allocated <= used + entry_size) 00600 { 00601 do 00602 { 00603 if (2 * allocated < allocated) 00604 xalloc_die (); 00605 allocated *= 2; 00606 } 00607 while (allocated <= used + entry_size); 00608 00609 name_space = static_cast<char *>(xrealloc (name_space, allocated)); 00610 } 00611 memcpy (name_space + used, entry, entry_size); 00612 used += entry_size; 00613 } 00614 } 00615 name_space[used] = '\0'; 00616 save_errno = errno; 00617 if (CLOSEDIR (dirp) != 0) 00618 save_errno = errno; 00619 if (save_errno != 0) 00620 { 00621 free (name_space); 00622 errno = save_errno; 00623 return NULL; 00624 } 00625 return name_space; 00626 } |
|
00634 { 00635 int fail = 0; 00636 if (cwd->desc >= 0) 00637 { 00638 if (fchdir (cwd->desc)) 00639 { 00640 /*error (0, errno, "cannot return to %s%s%s", 00641 (dest ? dest : "saved working directory"), 00642 (from ? " from " : ""), 00643 (from ? from : ""));*/ 00644 fail = 1; 00645 } 00646 } 00647 else if (chdir (cwd->name) < 0) 00648 { 00649 // error (0, errno, "%s", cwd->name); 00650 fail = 1; 00651 } 00652 return fail; 00653 } |
|
00666 { 00667 static int have_working_fchdir = 1; 00668 00669 cwd->desc = -1; 00670 cwd->name = NULL; 00671 00672 if (have_working_fchdir) 00673 { 00674 #if HAVE_FCHDIR 00675 cwd->desc = open (".", O_RDONLY | O_DIRECTORY); 00676 if (cwd->desc < 0) 00677 { 00678 //error (0, errno, "cannot open current directory"); 00679 return 1; 00680 } 00681 00682 # if __sun__ || sun 00683 /* On SunOS 4, fchdir returns EINVAL if accounting is enabled, 00684 so we have to fall back to chdir. */ 00685 if (fchdir (cwd->desc)) 00686 { 00687 if (errno == EINVAL) 00688 { 00689 close (cwd->desc); 00690 cwd->desc = -1; 00691 have_working_fchdir = 0; 00692 } 00693 else 00694 { 00695 error (0, errno, "current directory"); 00696 close (cwd->desc); 00697 cwd->desc = -1; 00698 return 1; 00699 } 00700 } 00701 # endif /* __sun__ || sun */ 00702 #else 00703 # define fchdir(x) (abort (), 0) 00704 have_working_fchdir = 0; 00705 #endif 00706 } 00707 00708 if (!have_working_fchdir) 00709 { 00710 cwd->name = xgetcwd (); 00711 if (cwd->name == NULL) 00712 { 00713 // error (0, errno, "cannot get current directory"); 00714 return 1; 00715 } 00716 } 00717 return 0; 00718 } |
|
00739 { 00740 register const char *p = pattern, *n = string; 00741 register char c; 00742 00743 /* Note that this evaluates C many times. */ 00744 #define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER ((unsigned char) (c)) \ 00745 ? tolower ((unsigned char) (c)) \ 00746 : (c)) 00747 00748 while ((c = *p++) != '\0') 00749 { 00750 c = FOLD (c); 00751 00752 switch (c) 00753 { 00754 case '?': 00755 if (*n == '\0') 00756 return FNM_NOMATCH; 00757 else if ((flags & FNM_FILE_NAME) && *n == '/') 00758 return FNM_NOMATCH; 00759 else if ((flags & FNM_PERIOD) && *n == '.' && 00760 (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) 00761 return FNM_NOMATCH; 00762 break; 00763 00764 case '\\': 00765 if (!(flags & FNM_NOESCAPE)) 00766 { 00767 c = *p++; 00768 if (c == '\0') 00769 /* Trailing \ loses. */ 00770 return FNM_NOMATCH; 00771 c = FOLD (c); 00772 } 00773 if (FOLD (*n) != c) 00774 return FNM_NOMATCH; 00775 break; 00776 00777 case '*': 00778 if ((flags & FNM_PERIOD) && *n == '.' && 00779 (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) 00780 return FNM_NOMATCH; 00781 00782 for (c = *p++; c == '?' || c == '*'; c = *p++) 00783 { 00784 if (c == '?') 00785 { 00786 /* A ? needs to match one character. */ 00787 if (*n == '\0' || (*n == '/' && (flags & FNM_FILE_NAME))) 00788 /* There isn't another character; no match. */ 00789 return FNM_NOMATCH; 00790 else 00791 /* One character of the string is consumed in matching 00792 this ? wildcard, so *??? won't match if there are 00793 less than three characters. */ 00794 ++n; 00795 } 00796 } 00797 00798 if (c == '\0') 00799 { 00800 if ((flags & (FNM_FILE_NAME | FNM_LEADING_DIR)) == FNM_FILE_NAME) 00801 for (; *n != '\0'; n++) 00802 if (*n == '/') 00803 return FNM_NOMATCH; 00804 return 0; 00805 } 00806 00807 { 00808 char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c; 00809 c1 = FOLD (c1); 00810 for (--p; *n != '\0'; ++n) 00811 if ((c == '[' || FOLD (*n) == c1) && 00812 fnmatch (p, n, flags & ~FNM_PERIOD) == 0) 00813 return 0; 00814 else if (*n == '/' && (flags & FNM_FILE_NAME)) 00815 break; 00816 return FNM_NOMATCH; 00817 } 00818 00819 case '[': 00820 { 00821 /* Nonzero if the sense of the character class is inverted. */ 00822 register int noot; 00823 00824 if (*n == '\0') 00825 return FNM_NOMATCH; 00826 00827 if ((flags & FNM_PERIOD) && *n == '.' && 00828 (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) 00829 return FNM_NOMATCH; 00830 00831 noot = (*p == '!' || *p == '^'); 00832 if (noot) 00833 ++p; 00834 00835 c = *p++; 00836 for (;;) 00837 { 00838 register char cstart = c, cend = c; 00839 00840 if (!(flags & FNM_NOESCAPE) && c == '\\') 00841 { 00842 if (*p == '\0') 00843 return FNM_NOMATCH; 00844 cstart = cend = *p++; 00845 } 00846 00847 cstart = cend = FOLD (cstart); 00848 00849 if (c == '\0') 00850 /* [ (unterminated) loses. */ 00851 return FNM_NOMATCH; 00852 00853 c = *p++; 00854 c = FOLD (c); 00855 00856 if ((flags & FNM_FILE_NAME) && c == '/') 00857 /* [/] can never match. */ 00858 return FNM_NOMATCH; 00859 00860 if (c == '-' && *p != ']') 00861 { 00862 cend = *p++; 00863 if (!(flags & FNM_NOESCAPE) && cend == '\\') 00864 cend = *p++; 00865 if (cend == '\0') 00866 return FNM_NOMATCH; 00867 cend = FOLD (cend); 00868 00869 c = *p++; 00870 } 00871 00872 if (FOLD (*n) >= cstart && FOLD (*n) <= cend) 00873 goto matched; 00874 00875 if (c == ']') 00876 break; 00877 } 00878 if (!noot) 00879 return FNM_NOMATCH; 00880 break; 00881 00882 matched:; 00883 /* Skip the rest of the [...] that already matched. */ 00884 while (c != ']') 00885 { 00886 if (c == '\0') 00887 /* [... (unterminated) loses. */ 00888 return FNM_NOMATCH; 00889 00890 c = *p++; 00891 if (!(flags & FNM_NOESCAPE) && c == '\\') 00892 { 00893 if (*p == '\0') 00894 return FNM_NOMATCH; 00895 /* XXX 1003.2d11 is unclear if this is right. */ 00896 ++p; 00897 } 00898 } 00899 if (noot) 00900 return FNM_NOMATCH; 00901 } 00902 break; 00903 00904 default: 00905 if (c != FOLD (*n)) 00906 return FNM_NOMATCH; 00907 } 00908 00909 ++n; 00910 } 00911 00912 if (*n == '\0') 00913 return 0; 00914 00915 if ((flags & FNM_LEADING_DIR) && *n == '/') 00916 /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */ 00917 return 0; 00918 00919 return FNM_NOMATCH; 00920 00921 #undef FOLD 00922 } |
|
00934 { 00935 struct exclude_st *ex = (struct exclude_st *) xmalloc (sizeof (struct exclude_st)); 00936 ex->exclude_count = 0; 00937 ex->exclude_alloc = 64; 00938 ex->exclude = (char const **) xmalloc (ex->exclude_alloc * sizeof (char *)); 00939 return ex; 00940 } |
|
00944 { 00945 char const * const *exclude = ex->exclude; 00946 int exclude_count = ex->exclude_count; 00947 int i; 00948 00949 for (i = 0; i < exclude_count; i++) 00950 if (fnmatch (exclude[i], f, options) == 0) 00951 return 1; 00952 00953 return 0; 00954 } |
|
01437 { 01438 Context cx1("main()"); 01439 try 01440 { 01441 // all GTK applications must have a gtk_main(). Control ends here 01442 // and waits for an event to occur (like a key press or mouse event). 01443 Gtk::Main kit(argc, argv); 01444 01445 MainWindow dutree; 01446 { 01447 Context cx2("Update thread"); 01448 kit.run(); 01449 } 01450 } 01451 catch (Exception &err) 01452 { 01453 cout << err; 01454 } 01455 catch (ContException &cxe) 01456 { 01457 cxe.print(); 01458 } 01459 return 0; 01460 } |
|
|