⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 path.c

📁 Graphviz - Graph Drawing Programs from AT&T Research and Lucent Bell Labs See doc/build.html for
💻 C
📖 第 1 页 / 共 2 页
字号:
        entries[i].statDone = 1;        if (len > maxChars) {            maxChars = len;        }        SFstrdup (&SFlogins[i].name, pw->pw_name);        SFstrdup (&SFlogins[i].dir, pw->pw_dir);        i++;    }    SFhomeDir.dir            = XtMalloc (1);    SFhomeDir.dir[0]         = 0;    SFhomeDir.path           = SFcurrentPath;    SFhomeDir.entries        = entries;    SFhomeDir.nEntries       = i;    SFhomeDir.vOrigin        = 0;  /* :-) */    SFhomeDir.nChars         = maxChars + 2;    SFhomeDir.hOrigin        = 0;    SFhomeDir.changed        = 1;    SFhomeDir.beginSelection = -1;    SFhomeDir.endSelection   = -1;#if defined (SVR4) || defined (SYSV) || defined (USG)    qsort ((char *) entries, (unsigned)i, sizeof (SFEntry), SFcompareEntries);    qsort ((char *) SFlogins, (unsigned)i, sizeof (SFLogin), SFcompareLogins);#else /* defined (SVR4) || defined (SYSV) || defined (USG) */    qsort ((char *) entries, i, sizeof (SFEntry), SFcompareEntries);    qsort ((char *) SFlogins, i, sizeof (SFLogin), SFcompareLogins);#endif /* defined (SVR4) || defined (SYSV) || defined (USG) */    for (i--; i >= 0; i--) {        strcat (entries[i].real, "/");    }}static int SFfindHomeDir (char *begin, char *end) {    char save;    char *theRest;    int  i;    save = *end;    *end = 0;    for (i = SFhomeDir.nEntries - 1; i >= 0; i--) {        if (!strcmp (SFhomeDir.entries[i].real, begin)) {            *end = save;            SFstrdup (&theRest, end);            strcat (strcat (strcpy (                SFcurrentPath, SFlogins[i].dir            ), "/"), theRest);            XtFree (theRest);            SFsetText (SFcurrentPath);            SFtextChanged ();            return 1;        }    }    *end = save;    return 0;}void SFupdatePath (void) {    static int alloc;    static int wasTwiddle = 0;    char       *begin, *end;    int        i, j;    int        prevChange;    int        SFdirPtrSave, SFdirEndSave;    SFDir      *dir;    if (!SFdirs) {        SFdirs = (SFDir *) XtMalloc ((alloc = 10) * sizeof (SFDir));        dir = &(SFdirs[0]);        SFstrdup (&dir->dir, "/");        SFchdir ("/");        SFgetDir (dir);        for (j = 1; j < alloc; j++) {            SFdirs[j].dir = NULL;        }        dir->path = SFcurrentPath + 1;        dir->vOrigin = 0;        dir->hOrigin = 0;        dir->changed = 1;        dir->beginSelection = -1;        dir->endSelection = -1;        SFhomeDir.dir = NULL;    }    SFdirEndSave = SFdirEnd;    SFdirEnd = 1;    SFdirPtrSave = SFdirPtr;    SFdirPtr = 0;    begin = NULL;    if (SFcurrentPath[0] == '~') {        if (!SFtwiddle) {            SFtwiddle = 1;            dir = & (SFdirs[0]);            SFrootDir = *dir;            if (!SFhomeDir.dir) {                SFgetHomeDirs ();            }            *dir = SFhomeDir;            dir->changed = 1;        }        end = SFcurrentPath;        SFdoNotTouchDirPtr = 1;        wasTwiddle = 1;    } else {        if (SFtwiddle) {            SFtwiddle = 0;            dir = & (SFdirs[0]);            *dir = SFrootDir;            dir->changed = 1;        }        end = SFcurrentPath + 1;    }    i = 0;    prevChange = 0;    while (*end) {        while (*end++ == '/') {            ;        }        end--;        begin = end;        while ((*end) && (*end++ != '/')) {            ;        }        if ((end - SFcurrentPath <= SFtextPos) && (* (end - 1) == '/')) {            SFdirPtr = i - 1;            if (SFdirPtr < 0) {                SFdirPtr = 0;            }        }        if (*begin) {            if (*(end - 1) == '/') {                char save = *end;                if (SFtwiddle) {                    if (SFfindHomeDir (begin, end)) {                        return;                    }                }                *end = 0;                i++;                SFdirEnd++;                if (i >= alloc) {                    SFdirs = (SFDir *) XtRealloc (                        (char *) SFdirs,                        (unsigned) ((alloc *= 2) * sizeof (SFDir))                    );                    for (j = alloc / 2; j < alloc; j++) {                        SFdirs[j].dir = NULL;                    }                }                dir = &(SFdirs[i]);                if ((!(dir->dir)) || prevChange || strcmp (dir->dir, begin)) {                    if (dir->dir) {                        SFfree (i);                    }                    prevChange = 1;                    SFstrdup (&dir->dir, begin);                    dir->path = end;                    dir->vOrigin = 0;                    dir->hOrigin = 0;                    dir->changed = 1;                    dir->beginSelection = -1;                    dir->endSelection = -1;                    SFfindFile (dir - 1, begin);                    if (SFchdir (SFcurrentPath) || SFgetDir (dir)) {                        SFunreadableDir (dir);                        break;                    }                }                *end = save;                if (!save) {                    SFunselect ();                }            } else {                if (SFfindFile (& (SFdirs[SFdirEnd-1]), begin)) {                    return;                }            }        } else {            SFunselect ();        }    }    if ((end == SFcurrentPath + 1) && (!SFtwiddle)) {        SFunselect ();    }    for (i = SFdirEnd; i < alloc; i++) {        if (SFdirs[i].dir) {            SFfree (i);        }    }    if (SFdoNotTouchDirPtr) {        if (wasTwiddle) {            wasTwiddle = 0;            SFdirPtr = SFdirEnd - 2;            if (SFdirPtr < 0) {                SFdirPtr = 0;            }        } else {            SFdirPtr = SFdirPtrSave;        }        SFdoNotTouchDirPtr = 0;    }    if ((SFdirPtr != SFdirPtrSave) || (SFdirEnd != SFdirEndSave)) {        XawScrollbarSetThumb (            selFileHScroll,            (float) (((double) SFdirPtr) / SFdirEnd),            (float) (((double) ((SFdirEnd < 3) ? SFdirEnd : 3)) / SFdirEnd)        );    }    if (SFdirPtr != SFdirPtrSave) {        SFdrawLists (SF_DO_SCROLL);    } else {        for (i = 0; i < 3; i++) {            if (SFdirPtr + i < SFdirEnd) {                if (SFdirs[SFdirPtr + i].changed) {                    SFdirs[SFdirPtr + i].changed = 0;                    SFdrawList (i, SF_DO_SCROLL);                }            } else {                SFclearList (i, SF_DO_SCROLL);            }        }    }}void SFsetText (char *path) {    XawTextBlock text;    text.firstPos = 0;    text.length = strlen (path);    text.ptr = path;    text.format = FMT8BIT;    XawTextReplace (selFileField, 0, strlen (SFtextBuffer), &text);    XawTextSetInsertionPoint (selFileField, strlen (SFtextBuffer));}void SFbuttonPressList (Widget w, XtPointer cl, XEvent *ev, Boolean *b) {    SFbuttonPressed = 1;}void SFbuttonReleaseList (Widget w, XtPointer cl, XEvent *ev, Boolean *b) {    SFDir *dir;    intptr_t n;    XButtonReleasedEvent *event;    n = (intptr_t) cl;    event = (XButtonReleasedEvent *) ev;    SFbuttonPressed = 0;    if (SFcurrentInvert[n] != -1) {        if (n < 2) {            SFdoNotTouchDirPtr = 1;        }        SFdoNotTouchVorigin = 1;        dir = &(SFdirs[SFdirPtr + n]);        SFreplaceText (            dir, dir->entries[dir->vOrigin + SFcurrentInvert[n]].shown        );        SFmotionList (w, (XtPointer) n, (XEvent *) event, NULL);    }}static int SFcheckDir (int n, SFDir *dir) {    struct stat statBuf;    int         i;    if ((!stat (".", &statBuf)) && (statBuf.st_mtime != dir->mtime)) {        /*  If the pointer is currently in the window that we are about            to update, we must warp it to prevent the user from            accidentally selecting the wrong file.        */        if (SFcurrentInvert[n] != -1) {            XWarpPointer (                SFdisplay, None, XtWindow (selFileLists[n]), 0, 0, 0, 0, 0, 0            );        }        for (i = dir->nEntries - 1; i >= 0; i--) {            if (dir->entries[i].shown != dir->entries[i].real) {                XtFree (dir->entries[i].shown);            }            XtFree (dir->entries[i].real);        }        XtFree ((char *) dir->entries);        if (SFgetDir (dir)) {            SFunreadableDir (dir);        }        if (dir->vOrigin > dir->nEntries - SFlistSize) {            dir->vOrigin = dir->nEntries - SFlistSize;        }        if (dir->vOrigin < 0) {            dir->vOrigin = 0;        }        if (dir->hOrigin > dir->nChars - SFcharsPerEntry) {            dir->hOrigin = dir->nChars - SFcharsPerEntry;        }        if (dir->hOrigin < 0) {            dir->hOrigin = 0;        }        dir->beginSelection = -1;        dir->endSelection = -1;        SFdoNotTouchVorigin = 1;        if ((dir + 1)->dir) {            SFfindFile (dir, (dir + 1)->dir);        } else {            SFfindFile (dir, dir->path);        }        if (!SFworkProcAdded) {            SFworkProcId = XtAppAddWorkProc (SFapp, SFworkProc, NULL);            SFworkProcAdded = 1;        }        return 1;    }    return 0;}static int SFcheckFiles (SFDir *dir) {    int         from, to;    int         result;    char        old, new;    int         i;    char        *str;    int         last;    struct stat statBuf;    result = 0;    from = dir->vOrigin;    to = dir->vOrigin + SFlistSize;    if (to > dir->nEntries) {        to = dir->nEntries;    }    for (i = from; i < to; i++) {        str = dir->entries[i].real;        last = strlen (str) - 1;        old = str[last];        str[last] = 0;        if (stat (str, &statBuf)) {            new = ' ';        } else {            new = SFstatChar (&statBuf);        }        str[last] = new;        if (new != old) {            result = 1;        }    }    return result;}void SFdirModTimer (XtPointer cl, XtIntervalId *id) {    static int n = -1;    static int f = 0;    char       save;    SFDir      *dir;    if ((!SFtwiddle) && (SFdirPtr < SFdirEnd)) {        n++;        if ((n > 2) || (SFdirPtr + n >= SFdirEnd)) {            n = 0;            f++;            if ((f > 2) || (SFdirPtr + f >= SFdirEnd)) {                f = 0;            }        }        dir = & (SFdirs[SFdirPtr + n]);        save = * (dir->path);        * (dir->path) = 0;        if (SFchdir (SFcurrentPath)) {            *(dir->path) = save;            /* force a re-read */            *(dir->dir) = 0;            SFupdatePath ();        } else {            *(dir->path) = save;            if (SFcheckDir (n, dir) || ((f == n) && SFcheckFiles (dir))) {                SFdrawList (n, SF_DO_SCROLL);            }        }    }    SFdirModTimerId = XtAppAddTimeOut (        SFapp, (unsigned long) 1000, SFdirModTimer, (XtPointer) NULL    );}/* Return a single character describing what kind of file STATBUF is. */char SFstatChar (struct stat *statBuf) {    if (S_ISDIR (statBuf->st_mode)) {        return '/';    } else if (S_ISREG (statBuf->st_mode)) {        return S_ISXXX (statBuf->st_mode) ? '*' : ' ';#ifdef S_ISSOCK    } else if (S_ISSOCK (statBuf->st_mode)) {        return '=';#endif /* S_ISSOCK */    } else {        return ' ';    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -