Changeset 195


Ignore:
Timestamp:
Aug 18, 2002, 12:04:29 PM (18 years ago)
Author:
landonf (Landon Fuller)
Message:

Move ui_info into its own function
Implement readdir

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/base/Tcl/port1.0/Pextlib.c

    r182 r195  
    33#include <errno.h>
    44#include <string.h>
     5#include <dirent.h>
    56#include <sys/file.h>
     7#include <sys/types.h>
    68#include <tcl.h>
    79
    810#define BUFSIZ 1024
    9 static const char ui_proc[] = "ui_info {";
     11
     12static int ui_info(Tcl_Interp *interp, char *mesg) {
     13        const char ui_proc[] = "ui_info {";
     14        char *script, *p;
     15        int scriptlen, ret;
     16
     17        scriptlen = sizeof(ui_proc) + strlen(mesg);
     18        script = malloc(scriptlen);
     19        if (script == NULL)
     20                return TCL_ERROR;
     21        else
     22                p = script;
     23
     24        memcpy(script, ui_proc, sizeof(ui_proc));
     25        strcat(script, mesg);
     26        p += scriptlen - 2;
     27        *p = '}';
     28        return (Tcl_EvalEx(interp, script, scriptlen - 1, 0));
     29}
    1030
    1131int SystemCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
     
    80100
    81101        while (fgets(buf, BUFSIZ, pipe) != NULL) {
    82                 char *script, *p;
    83                 int scriptlen, ret;
    84 
    85                 scriptlen = sizeof(ui_proc) + strlen(buf);
    86                 script = malloc(scriptlen);
    87                 if (script == NULL)
    88                         break;
    89                 else
    90                         p = script;
    91 
    92                 memcpy(script, ui_proc, sizeof(ui_proc));
    93                 strcat(script, buf);
    94                 p += scriptlen - 2;
    95                 *p = '}';
    96                 if ((ret = Tcl_EvalEx(interp, script, scriptlen - 1, 0)) != TCL_OK)
     102                int ret = ui_info(interp, buf);
     103                if (ret != TCL_OK)
    97104                        return ret;
    98105                Tcl_AppendResult(interp, buf, NULL);
     
    164171}
    165172
     173int ReaddirCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
     174{
     175        DIR *dirp;
     176        struct dirent *dp;
     177        Tcl_Obj *tcl_result;
     178        char *path;
     179
     180        if (objc != 2) {
     181                Tcl_WrongNumArgs(interp, 1, objv, "directory");
     182                return TCL_ERROR;
     183        }
     184
     185        path = Tcl_GetString(objv[1]);
     186        dirp = opendir(path);
     187        if (!dirp) {
     188                Tcl_SetResult(interp, "Directory not found", TCL_STATIC);
     189                return TCL_ERROR;
     190        }
     191        tcl_result = Tcl_NewListObj(0, NULL);
     192        while (dp = readdir(dirp)) {
     193                Tcl_ListObjAppendElement(interp, tcl_result, Tcl_NewStringObj(dp->d_name, -1));
     194        }
     195        closedir(dirp);
     196        Tcl_SetObjResult(interp, tcl_result);
     197       
     198        return TCL_OK;
     199}
     200
    166201int Pextlib_Init(Tcl_Interp *interp)
    167202{
    168203        Tcl_CreateObjCommand(interp, "system", SystemCmd, NULL, NULL);
    169204        Tcl_CreateObjCommand(interp, "flock", FlockCmd, NULL, NULL);
     205        Tcl_CreateObjCommand(interp, "readdir", ReaddirCmd, NULL, NULL);
    170206        if(Tcl_PkgProvide(interp, "Pextlib", "1.0") != TCL_OK)
    171207                return TCL_ERROR;
Note: See TracChangeset for help on using the changeset viewer.