亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? jim-aio.c

?? 開放源碼實(shí)時(shí)操作系統(tǒng)源碼.
?? C
字號:
/* Jim - ANSI I/O extension
 * Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
 *
 * $Id: jim-aio.c,v 1.10 2006/11/06 16:54:48 antirez Exp $
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * A copy of the license is also included in the source distribution
 * of Jim, as a TXT file name called LICENSE.
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <stdio.h>
#include <string.h>
#include <errno.h>

#include <pkgconf/athttpd.h>
#ifndef JIM_STATICEXT
#define JIM_EXTENSION
#endif
#include <cyg/athttpd/jim.h>

#define AIO_CMD_LEN 128
#define AIO_BUF_LEN 1024

typedef struct AioFile {
    FILE *fp;
    int keepOpen; /* If set, the file is not fclosed on cleanup (stdin, ...) */
} AioFile;

static void JimAioSetError(Jim_Interp *interp)
{
    Jim_SetResultString(interp, strerror(errno), -1);
}

static void JimAioDelProc(Jim_Interp *interp, void *privData)
{
    AioFile *af = privData;
    JIM_NOTUSED(interp);

    if (!af->keepOpen)
        fclose(af->fp);
    Jim_Free(af);
}

/* Calls to [aio.file] create commands that are implemented by this
 * C command. */
static int JimAioHandlerCommand(Jim_Interp *interp, int argc,
        Jim_Obj *const *argv)
{
    AioFile *af = Jim_CmdPrivData(interp);
    int option;
    const char *options[] = {
        "close", "seek", "tell", "gets", "read", "puts", "flush", "eof", NULL
    };
    enum {OPT_CLOSE, OPT_SEEK, OPT_TELL, OPT_GETS, OPT_READ, OPT_PUTS,
          OPT_FLUSH, OPT_EOF};

    if (argc < 2) {
        Jim_WrongNumArgs(interp, 1, argv, "method ?args ...?");
        return JIM_ERR;
    }
    if (Jim_GetEnum(interp, argv[1], options, &option, "AIO method",
                JIM_ERRMSG) != JIM_OK)
        return JIM_ERR;
    /* CLOSE */
    if (option == OPT_CLOSE) {
        if (argc != 2) {
            Jim_WrongNumArgs(interp, 2, argv, "");
            return JIM_ERR;
        }
        Jim_DeleteCommand(interp, Jim_GetString(argv[0], NULL));
        return JIM_OK;
    } else if (option == OPT_SEEK) {
    /* SEEK */
        int orig = SEEK_SET;
        long offset;

        if (argc != 3 && argc != 4) {
            Jim_WrongNumArgs(interp, 2, argv, "offset ?origin?");
            return JIM_ERR;
        }
        if (argc == 4) {
            if (Jim_CompareStringImmediate(interp, argv[3], "start"))
                orig = SEEK_SET;
            else if (Jim_CompareStringImmediate(interp, argv[3], "current"))
                orig = SEEK_CUR;
            else if (Jim_CompareStringImmediate(interp, argv[3], "end"))
                orig = SEEK_END;
            else {
                Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
                Jim_AppendStrings(interp, Jim_GetResult(interp),
                        "bad origin \"", Jim_GetString(argv[3], NULL),
                        "\" must be: start, current, or end", NULL);
                return JIM_ERR;
            }
        }
        if (Jim_GetLong(interp, argv[2], &offset) != JIM_OK)
            return JIM_ERR;
        if (fseek(af->fp, offset, orig) == -1) {
            JimAioSetError(interp);
            return JIM_ERR;
        }
        return JIM_OK;
    } else if (option == OPT_TELL) {
    /* TELL */
        long position;

        if (argc != 2) {
            Jim_WrongNumArgs(interp, 2, argv, "");
            return JIM_ERR;
        }
        position = ftell(af->fp);
        Jim_SetResult(interp, Jim_NewIntObj(interp, position));
        return JIM_OK;
    } else if (option == OPT_GETS) {
    /* GETS */
        char buf[AIO_BUF_LEN];
        Jim_Obj *objPtr;

        if (argc != 2 && argc != 3) {
            Jim_WrongNumArgs(interp, 2, argv, "?varName?");
            return JIM_ERR;
        }
        objPtr = Jim_NewStringObj(interp, NULL, 0);
        while (1) {
            int more = 0;
            buf[AIO_BUF_LEN-1] = '_';
            if (fgets(buf, AIO_BUF_LEN, af->fp) == NULL)
                break;
            if (buf[AIO_BUF_LEN-1] == '\0' && buf[AIO_BUF_LEN] == '\n')
                more = 1;
            if (more) {
                Jim_AppendString(interp, objPtr, buf, AIO_BUF_LEN-1);
            } else {
                /* strip "\n" */
                Jim_AppendString(interp, objPtr, buf, strlen(buf)-1);
            }
            if (!more)
                break;
        }
        if (ferror(af->fp)) {
            /* I/O error */
            Jim_IncrRefCount(objPtr);
            Jim_DecrRefCount(interp, objPtr);
            JimAioSetError(interp);
            return JIM_ERR;
        }
        /* On EOF returns -1 if varName was specified, or the empty string. */
        if (feof(af->fp) && Jim_Length(objPtr) == 0) {
            Jim_IncrRefCount(objPtr);
            Jim_DecrRefCount(interp, objPtr);
            if (argc == 3)
                Jim_SetResult(interp, Jim_NewIntObj(interp, -1));
            return JIM_OK;
        }
        if (argc == 3) {
            int totLen;

            Jim_GetString(objPtr, &totLen);
            if (Jim_SetVariable(interp, argv[2], objPtr) != JIM_OK) {
                Jim_IncrRefCount(objPtr);
                Jim_DecrRefCount(interp, objPtr);
                return JIM_ERR;
            }
            Jim_SetResult(interp, Jim_NewIntObj(interp, totLen));
        } else {
            Jim_SetResult(interp, objPtr);
        }
        return JIM_OK;
    } else if (option == OPT_READ) {
    /* READ */
        char buf[AIO_BUF_LEN];
        Jim_Obj *objPtr;
        int nonewline = 0;
        int neededLen = -1; /* -1 is "read as much as possible" */

        if (argc != 2 && argc != 3) {
            Jim_WrongNumArgs(interp, 2, argv, "?-nonewline? ?len?");
            return JIM_ERR;
        }
        if (argc == 3 &&
            Jim_CompareStringImmediate(interp, argv[2], "-nonewline"))
        {
            nonewline = 1;
            argv++;
            argc--;
        }
        if (argc == 3) {
            jim_wide wideValue;
            if (Jim_GetWide(interp, argv[2], &wideValue) != JIM_OK)
                return JIM_ERR;
            if (wideValue < 0) {
                Jim_SetResultString(interp, "invalid parameter: negative len",
                        -1);
                return JIM_ERR;
            }
            neededLen = (int) wideValue;
        }
        objPtr = Jim_NewStringObj(interp, NULL, 0);
        while (neededLen != 0) {
            int retval;
            int readlen;
           
            if (neededLen == -1) {
                readlen = AIO_BUF_LEN;
            } else {
                readlen = (neededLen > AIO_BUF_LEN ? AIO_BUF_LEN : neededLen);
            }
            retval = fread(buf, 1, readlen, af->fp);
            if (retval > 0) {
                Jim_AppendString(interp, objPtr, buf, retval);
                if (neededLen != -1) {
                    neededLen -= retval;
                }
            }
            if (retval != readlen) break;
        }
        /* Check for error conditions */
        if (ferror(af->fp)) {
            /* I/O error */
            Jim_FreeNewObj(interp, objPtr);
            JimAioSetError(interp);
            return JIM_ERR;
        }
        if (nonewline) {
            int len;
            const char *s = Jim_GetString(objPtr, &len);

            if (len > 0 && s[len-1] == '\n') {
                objPtr->length--;
                objPtr->bytes[objPtr->length] = '\0';
            }
        }
        Jim_SetResult(interp, objPtr);
        return JIM_OK;
    } else if (option == OPT_PUTS) {
    /* PUTS */
        int wlen;
        const char *wdata;

        if (argc != 3 && (argc != 4 || !Jim_CompareStringImmediate(
                        interp, argv[2], "-nonewline"))) {
            Jim_WrongNumArgs(interp, 2, argv, "?-nonewline? string");
            return JIM_ERR;
        }
        wdata = Jim_GetString(argv[2+(argc==4)], &wlen);
        if (fwrite(wdata, 1, wlen, af->fp) != (unsigned)wlen ||
            (argc == 3 && fwrite("\n", 1, 1, af->fp) != 1)) {
            JimAioSetError(interp);
            return JIM_ERR;
        }
        return JIM_OK;
    } else if (option  == OPT_FLUSH) {
    /* FLUSH */
        if (argc != 2) {
            Jim_WrongNumArgs(interp, 2, argv, "");
            return JIM_ERR;
        }
        if (fflush(af->fp) == EOF) {
            JimAioSetError(interp);
            return JIM_ERR;
        }
        return JIM_OK;
    } else if (option  == OPT_EOF) {
    /* EOF */
        if (argc != 2) {
            Jim_WrongNumArgs(interp, 2, argv, "");
            return JIM_ERR;
        }
        Jim_SetResult(interp, Jim_NewIntObj(interp, feof(af->fp)));
        return JIM_OK;
    }
    return JIM_OK;
}

static int JimAioOpenCommand(Jim_Interp *interp, int argc, 
        Jim_Obj *const *argv)
{
    FILE *fp;
    AioFile *af;
    char buf[AIO_CMD_LEN];
    const char *mode = "r";
    Jim_Obj *objPtr;
    long fileId;
    const char *options[] = {"input", "output", "error"};
    enum {OPT_INPUT, OPT_OUTPUT, OPT_ERROR};
    int keepOpen = 0, modeLen;

    if (argc != 2 && argc != 3) {
        Jim_WrongNumArgs(interp, 1, argv, "filename ?mode?");
        return JIM_ERR;
    }
    if (argc == 3)
        mode = Jim_GetString(argv[2], &modeLen);
    if (argc == 3 && Jim_CompareStringImmediate(interp, argv[1], "standard") &&
            modeLen >= 3) {
            int option;
        if (Jim_GetEnum(interp, argv[2], options, &option, "standard channel",
                    JIM_ERRMSG) != JIM_OK)
            return JIM_ERR;
        keepOpen = 1;
        switch (option) {
        case OPT_INPUT: fp = stdin; break;
        case OPT_OUTPUT: fp = stdout; break;
        case OPT_ERROR: fp = stderr; break;
        default: fp = NULL; Jim_Panic(interp,"default reached in JimAioOpenCommand()");
                 break;
        }
    } else {
        fp = fopen(Jim_GetString(argv[1], NULL), mode);
        if (fp == NULL) {
            JimAioSetError(interp);
            return JIM_ERR;
        }
    }
    /* Get the next file id */
    if (Jim_EvalGlobal(interp,
                "if {[catch {incr aio.fileId}]} {set aio.fileId 0}") != JIM_OK)
        return JIM_ERR;
    objPtr = Jim_GetGlobalVariableStr(interp, "aio.fileId", JIM_ERRMSG);
    if (objPtr == NULL) return JIM_ERR;
    if (Jim_GetLong(interp, objPtr, &fileId) != JIM_OK) return JIM_ERR;

    /* Create the file command */
    af = Jim_Alloc(sizeof(*af));
    af->fp = fp;
    af->keepOpen = keepOpen;
    sprintf(buf, "aio.handle%ld", fileId);
    Jim_CreateCommand(interp, buf, JimAioHandlerCommand, af, JimAioDelProc);
    Jim_SetResultString(interp, buf, -1);
    return JIM_OK;
}

#ifndef JIM_STATICEXT
int Jim_OnLoad(Jim_Interp *interp)
#else
int Jim_AioInit(Jim_Interp *interp)
#endif
{
    #ifndef JIM_STATICEXT
    Jim_InitExtension(interp);
    #endif
    if (Jim_PackageProvide(interp, "aio", "1.0", JIM_ERRMSG) != JIM_OK)
        return JIM_ERR;
    Jim_CreateCommand(interp, "aio.open", JimAioOpenCommand, NULL, NULL);
    return JIM_OK;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品综合视频| 亚洲成av人片在线观看| 一区二区在线看| 99视频在线观看一区三区| 中日韩免费视频中文字幕| 国产精品一区专区| 久久日韩粉嫩一区二区三区| 久久99久久99精品免视看婷婷| 精品久久国产老人久久综合| 国产主播一区二区三区| 久久综合网色—综合色88| 成人午夜激情在线| 国产亚洲女人久久久久毛片| 成人亚洲精品久久久久软件| 亚洲欧美另类久久久精品2019| 在线视频你懂得一区| 日韩激情在线观看| 欧美大片免费久久精品三p| 国产又黄又大久久| 中文字幕中文乱码欧美一区二区 | 成人午夜视频在线| 亚洲欧美一区二区久久| 欧美午夜影院一区| 日本女人一区二区三区| 日本一区二区动态图| 欧美专区在线观看一区| 黑人精品欧美一区二区蜜桃| 日韩毛片高清在线播放| 欧美精品久久久久久久多人混战| 狠狠色丁香久久婷婷综| 亚洲天堂网中文字| 91麻豆精品91久久久久同性| 国产精品自拍av| 一区二区三区国产| www国产精品av| 91精品福利视频| 国模一区二区三区白浆| 亚洲色图在线播放| 欧美va亚洲va在线观看蝴蝶网| 不卡免费追剧大全电视剧网站| 亚洲国产精品天堂| 国产精品萝li| 欧美电影免费观看完整版| 91香蕉视频mp4| 麻豆精品在线视频| 亚洲欧美日韩中文字幕一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 色综合色综合色综合| 久热成人在线视频| 一区二区三区精品| 国产欧美在线观看一区| 欧美久久久影院| 色综合一区二区| 国产成人综合自拍| 精品一区二区在线视频| 亚洲午夜电影网| 最新国产精品久久精品| 精品欧美黑人一区二区三区| 欧美在线综合视频| 99精品久久99久久久久| 国产麻豆精品一区二区| 青椒成人免费视频| 亚洲第一主播视频| 一区二区三区不卡视频| 亚洲欧洲性图库| 久久一夜天堂av一区二区三区 | 视频在线观看一区| 亚洲欧美aⅴ...| 国产精品国产馆在线真实露脸| 精品99999| 日韩欧美一级片| 欧美一区二区三区四区在线观看| 欧美日韩成人在线| 色偷偷成人一区二区三区91| 99久久久国产精品免费蜜臀| av网站一区二区三区| 成人黄页在线观看| 成人18视频日本| 99久久99久久综合| 99精品视频一区二区| 成人av免费在线播放| 成人av资源站| 成人av网址在线| 91社区在线播放| 99久久er热在这里只有精品15| aaa欧美色吧激情视频| 成人手机在线视频| 99久久精品免费看国产免费软件| 91在线视频免费观看| 91蜜桃免费观看视频| 色婷婷av一区二区三区之一色屋| 日本精品免费观看高清观看| 欧美写真视频网站| 91精品国产全国免费观看 | 色狠狠色狠狠综合| 欧美在线观看视频在线| 91精品一区二区三区在线观看| 91精品国产综合久久福利软件| 精品国产免费一区二区三区四区| 久久久国产精品麻豆| 国产精品久久久久9999吃药| 亚洲摸摸操操av| 天堂蜜桃一区二区三区| 国产乱一区二区| 成a人片国产精品| 欧美午夜电影一区| 欧美哺乳videos| 久久久综合九色合综国产精品| 国产亚洲精品bt天堂精选| 亚洲精品中文在线影院| 视频一区二区欧美| 国产成+人+日韩+欧美+亚洲| 色哟哟一区二区三区| 欧美白人最猛性xxxxx69交| 国产色产综合产在线视频| 亚洲一区中文日韩| 国产一区二区三区黄视频| 色综合咪咪久久| 日韩欧美aaaaaa| 国产精品青草综合久久久久99| 一区二区三区中文字幕在线观看| 麻豆精品在线播放| k8久久久一区二区三区| 91精品久久久久久久99蜜桃| 国产日产精品1区| 亚洲五码中文字幕| 国产xxx精品视频大全| 欧美中文字幕亚洲一区二区va在线| 精品福利二区三区| 亚洲精品一二三区| 国产精品456| 欧美日韩一区二区三区在线| 26uuu成人网一区二区三区| 亚洲美女区一区| 国产激情一区二区三区桃花岛亚洲| 日本乱码高清不卡字幕| 久久九九99视频| 日本亚洲天堂网| 色呦呦国产精品| 国产精品天天看| 看国产成人h片视频| 欧美日韩一二三区| 亚洲欧洲三级电影| 国产成人亚洲综合a∨婷婷| 欧美午夜精品久久久久久孕妇| 精品久久久久久久人人人人传媒| 亚洲福利视频一区| hitomi一区二区三区精品| 久久色在线观看| 青青草国产精品亚洲专区无| 欧美特级限制片免费在线观看| 国产精品免费av| 国产乱国产乱300精品| 91精品国产日韩91久久久久久| 一区二区三区电影在线播| 99精品1区2区| 中文字幕在线观看一区二区| 激情综合色播激情啊| 91精品欧美一区二区三区综合在 | 亚洲bt欧美bt精品| 91色porny| 国产精品久久久久7777按摩| 国产麻豆成人精品| 久久免费国产精品| 国产精品一区二区久久不卡| 日韩一级在线观看| 日本不卡高清视频| 欧美一区二区免费视频| 亚洲最大色网站| 欧美日韩在线一区二区| 亚洲久草在线视频| 欧美在线观看禁18| 午夜激情久久久| 欧美日韩精品欧美日韩精品一综合| 亚洲福利一区二区| 91精品国产综合久久久久久久久久 | 91影院在线观看| 国产精品九色蝌蚪自拍| 91一区在线观看| 亚洲天堂福利av| 欧美在线观看你懂的| 午夜伦欧美伦电影理论片| 69堂亚洲精品首页| 久久99精品久久久久| 久久精品一区二区三区不卡| 国产福利一区二区三区视频在线 | 972aa.com艺术欧美| 一区二区三区精品视频在线| 欧美日韩久久久久久| 日韩二区三区四区| 久久久久久久久蜜桃| 国产高清在线精品| 亚洲女同一区二区| 欧美精品日日鲁夜夜添| 捆绑紧缚一区二区三区视频| 国产亚洲欧美在线| 在线观看免费亚洲| 老司机免费视频一区二区| 久久嫩草精品久久久精品| 一本到不卡精品视频在线观看 |