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

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

?? jim.c

?? 開放源碼實(shí)時(shí)操作系統(tǒng)源碼.
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
    pc->tstart = ++pc->p; pc->len--;
    pc->tline = pc->linenr;
    while (1) {
        if (*pc->p == '\\' && pc->len >= 2) {
            pc->p++; pc->len--;
            if (*pc->p == '\n')
                pc->linenr++;
        } else if (*pc->p == '{') {
            level++;
        } else if (pc->len == 0 || *pc->p == '}') {
            level--;
            if (pc->len == 0 || level == 0) {
                pc->tend = pc->p-1;
                if (pc->len != 0) {
                    pc->p++; pc->len--;
                }
                pc->tt = JIM_TT_STR;
                return JIM_OK;
            }
        } else if (*pc->p == '\n') {
            pc->linenr++;
        }
        pc->p++; pc->len--;
    }
    return JIM_OK; /* unreached */
}

int JimParseStr(struct JimParserCtx *pc)
{
    int newword = (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL ||
            pc->tt == JIM_TT_NONE || pc->tt == JIM_TT_STR);
    if (newword && *pc->p == '{') {
        return JimParseBrace(pc);
    } else if (newword && *pc->p == '"') {
        pc->state = JIM_PS_QUOTE;
        pc->p++; pc->len--;
    }
    pc->tstart = pc->p;
    pc->tline = pc->linenr;
    while (1) {
        if (pc->len == 0) {
            pc->tend = pc->p-1;
            pc->tt = JIM_TT_ESC;
            return JIM_OK;
        }
        switch(*pc->p) {
        case '\\':
            if (pc->state == JIM_PS_DEF &&
                *(pc->p+1) == '\n') {
                pc->tend = pc->p-1;
                pc->tt = JIM_TT_ESC;
                return JIM_OK;
            }
            if (pc->len >= 2) {
                pc->p++; pc->len--;
            }
            break;
        case '$':
        case '[':
            pc->tend = pc->p-1;
            pc->tt = JIM_TT_ESC;
            return JIM_OK;
        case ' ':
        case '\t':
        case '\n':
        case '\r':
        case ';':
            if (pc->state == JIM_PS_DEF) {
                pc->tend = pc->p-1;
                pc->tt = JIM_TT_ESC;
                return JIM_OK;
            } else if (*pc->p == '\n') {
                pc->linenr++;
            }
            break;
        case '"':
            if (pc->state == JIM_PS_QUOTE) {
                pc->tend = pc->p-1;
                pc->tt = JIM_TT_ESC;
                pc->p++; pc->len--;
                pc->state = JIM_PS_DEF;
                return JIM_OK;
            }
            break;
        }
        pc->p++; pc->len--;
    }
    return JIM_OK; /* unreached */
}

int JimParseComment(struct JimParserCtx *pc)
{
    while (*pc->p) {
        if (*pc->p == '\n') {
            pc->linenr++;
            if (*(pc->p-1) != '\\') {
                pc->p++; pc->len--;
                return JIM_OK;
            }
        }
        pc->p++; pc->len--;
    }
    return JIM_OK;
}

/* xdigitval and odigitval are helper functions for JimParserGetToken() */
static int xdigitval(int c)
{
    if (c >= '0' && c <= '9') return c-'0';
    if (c >= 'a' && c <= 'f') return c-'a'+10;
    if (c >= 'A' && c <= 'F') return c-'A'+10;
    return -1;
}

static int odigitval(int c)
{
    if (c >= '0' && c <= '7') return c-'0';
    return -1;
}

/* Perform Tcl escape substitution of 's', storing the result
 * string into 'dest'. The escaped string is guaranteed to
 * be the same length or shorted than the source string.
 * Slen is the length of the string at 's', if it's -1 the string
 * length will be calculated by the function.
 *
 * The function returns the length of the resulting string. */
static int JimEscape(char *dest, const char *s, int slen)
{
    char *p = dest;
    int i, len;
    
    if (slen == -1)
        slen = strlen(s);

    for (i = 0; i < slen; i++) {
        switch(s[i]) {
        case '\\':
            switch(s[i+1]) {
            case 'a': *p++ = 0x7; i++; break;
            case 'b': *p++ = 0x8; i++; break;
            case 'f': *p++ = 0xc; i++; break;
            case 'n': *p++ = 0xa; i++; break;
            case 'r': *p++ = 0xd; i++; break;
            case 't': *p++ = 0x9; i++; break;
            case 'v': *p++ = 0xb; i++; break;
            case '\0': *p++ = '\\'; i++; break;
            case '\n': *p++ = ' '; i++; break;
            default:
                  if (s[i+1] == 'x') {
                    int val = 0;
                    int c = xdigitval(s[i+2]);
                    if (c == -1) {
                        *p++ = 'x';
                        i++;
                        break;
                    }
                    val = c;
                    c = xdigitval(s[i+3]);
                    if (c == -1) {
                        *p++ = val;
                        i += 2;
                        break;
                    }
                    val = (val*16)+c;
                    *p++ = val;
                    i += 3;
                    break;
                  } else if (s[i+1] >= '0' && s[i+1] <= '7')
                  {
                    int val = 0;
                    int c = odigitval(s[i+1]);
                    val = c;
                    c = odigitval(s[i+2]);
                    if (c == -1) {
                        *p++ = val;
                        i ++;
                        break;
                    }
                    val = (val*8)+c;
                    c = odigitval(s[i+3]);
                    if (c == -1) {
                        *p++ = val;
                        i += 2;
                        break;
                    }
                    val = (val*8)+c;
                    *p++ = val;
                    i += 3;
                  } else {
                    *p++ = s[i+1];
                    i++;
                  }
                  break;
            }
            break;
        default:
            *p++ = s[i];
            break;
        }
    }
    len = p-dest;
    *p++ = '\0';
    return len;
}

/* Returns a dynamically allocated copy of the current token in the
 * parser context. The function perform conversion of escapes if
 * the token is of type JIM_TT_ESC.
 *
 * Note that after the conversion, tokens that are grouped with
 * braces in the source code, are always recognizable from the
 * identical string obtained in a different way from the type.
 *
 * For exmple the string:
 *
 * {expand}$a
 * 
 * will return as first token "expand", of type JIM_TT_STR
 *
 * While the string:
 *
 * expand$a
 *
 * will return as first token "expand", of type JIM_TT_ESC
 */
char *JimParserGetToken(struct JimParserCtx *pc,
        int *lenPtr, int *typePtr, int *linePtr)
{
    const char *start, *end;
    char *token;
    int len;

    start = JimParserTstart(pc);
    end = JimParserTend(pc);
    if (start > end) {
        if (lenPtr) *lenPtr = 0;
        if (typePtr) *typePtr = JimParserTtype(pc);
        if (linePtr) *linePtr = JimParserTline(pc);
        token = Jim_Alloc(1);
        token[0] = '\0';
        return token;
    }
    len = (end-start)+1;
    token = Jim_Alloc(len+1);
    if (JimParserTtype(pc) != JIM_TT_ESC) {
        /* No escape conversion needed? Just copy it. */
        memcpy(token, start, len);
        token[len] = '\0';
    } else {
        /* Else convert the escape chars. */
        len = JimEscape(token, start, len);
    }
    if (lenPtr) *lenPtr = len;
    if (typePtr) *typePtr = JimParserTtype(pc);
    if (linePtr) *linePtr = JimParserTline(pc);
    return token;
}

/* The following functin is not really part of the parsing engine of Jim,
 * but it somewhat related. Given an string and its length, it tries
 * to guess if the script is complete or there are instead " " or { }
 * open and not completed. This is useful for interactive shells
 * implementation and for [info complete].
 *
 * If 'stateCharPtr' != NULL, the function stores ' ' on complete script,
 * '{' on scripts incomplete missing one or more '}' to be balanced.
 * '"' on scripts incomplete missing a '"' char.
 *
 * If the script is complete, 1 is returned, otherwise 0. */
int Jim_ScriptIsComplete(const char *s, int len, char *stateCharPtr)
{
    int level = 0;
    int state = ' ';

    while(len) {
        switch (*s) {
            case '\\':
                if (len > 1)
                    s++;
                break;
            case '"':
                if (state == ' ') {
                    state = '"';
                } else if (state == '"') {
                    state = ' ';
                }
                break;
            case '{':
                if (state == '{') {
                    level++;
                } else if (state == ' ') {
                    state = '{';
                    level++;
                }
                break;
            case '}':
                if (state == '{') {
                    level--;
                    if (level == 0)
                        state = ' ';
                }
                break;
        }
        s++;
        len--;
    }
    if (stateCharPtr)
        *stateCharPtr = state;
    return state == ' ';
}

/* -----------------------------------------------------------------------------
 * Tcl Lists parsing
 * ---------------------------------------------------------------------------*/
static int JimParseListSep(struct JimParserCtx *pc);
static int JimParseListStr(struct JimParserCtx *pc);

int JimParseList(struct JimParserCtx *pc)
{
    if (pc->len == 0) {
        pc->tstart = pc->tend = pc->p;
        pc->tline = pc->linenr;
        pc->tt = JIM_TT_EOL;
        pc->eof = 1;
        return JIM_OK;
    }
    switch(*pc->p) {
    case ' ':
    case '\n':
    case '\t':
    case '\r':
        if (pc->state == JIM_PS_DEF)
            return JimParseListSep(pc);
        else
            return JimParseListStr(pc);
        break;
    default:
        return JimParseListStr(pc);
        break;
    }
    return JIM_OK;
}

int JimParseListSep(struct JimParserCtx *pc)
{
    pc->tstart = pc->p;
    pc->tline = pc->linenr;
    while (*pc->p == ' ' || *pc->p == '\t' || *pc->p == '\r' || *pc->p == '\n')
    {
        pc->p++; pc->len--;
    }
    pc->tend = pc->p-1;
    pc->tt = JIM_TT_SEP;
    return JIM_OK;
}

int JimParseListStr(struct JimParserCtx *pc)
{
    int newword = (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL ||
            pc->tt == JIM_TT_NONE);
    if (newword && *pc->p == '{') {
        return JimParseBrace(pc);
    } else if (newword && *pc->p == '"') {
        pc->state = JIM_PS_QUOTE;
        pc->p++; pc->len--;
    }
    pc->tstart = pc->p;
    pc->tline = pc->linenr;
    while (1) {
        if (pc->len == 0) {
            pc->tend = pc->p-1;
            pc->tt = JIM_TT_ESC;
            return JIM_OK;
        }
        switch(*pc->p) {
        case '\\':
            pc->p++; pc->len--;
            break;
        case ' ':
        case '\t':
        case '\n':
        case '\r':
            if (pc->state == JIM_PS_DEF) {
                pc->tend = pc->p-1;
                pc->tt = JIM_TT_ESC;
                return JIM_OK;
            } else if (*pc->p == '\n') {
                pc->linenr++;
            }
            break;
        case '"':
            if (pc->state == JIM_PS_QUOTE) {
                pc->tend = pc->p-1;
                pc->tt = JIM_TT_ESC;
                pc->p++; pc->len--;
                pc->state = JIM_PS_DEF;
                return JIM_OK;
            }
            break;
        }
        pc->p++; pc->len--;
    }
    return JIM_OK; /* unreached */
}

/* -----------------------------------------------------------------------------
 * Jim_Obj related functions
 * ---------------------------------------------------------------------------*/

/* Return a new initialized object. */
Jim_Obj *Jim_NewObj(Jim_Interp *interp)
{
    Jim_Obj *objPtr;

    /* -- Check if there are objects in the free list -- */
    if (interp->freeList != NULL) {
        /* -- Unlink the object from the free list -- */
        objPtr = interp->freeList;
        interp->freeList = objPtr->nextObjPtr;
    } else {
        /* -- No ready to use objects: allocate a new one -- */
        objPtr = Jim_Alloc(sizeof(*objPtr));
    }

    /* Object is returned with refCount of 0. Every
     * kind of GC implemented should take care to don't try
     * to scan objects with refCount == 0. */
    objPtr->refCount = 0;
    /* All the other fields are left not initialized to save time.
     * The caller will probably want set they to the right
     * value anyway. */

    /* -- Put the object into the live list -- */
    objPtr->prevObjPtr = NULL;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性大战久久久| 国产精品传媒视频| 国产精品911| 国产精品你懂的在线欣赏| 99久久伊人网影院| 亚洲综合色噜噜狠狠| 欧美日韩电影在线| 狠狠v欧美v日韩v亚洲ⅴ| 国产午夜精品在线观看| 99久久久国产精品免费蜜臀| 亚洲综合免费观看高清完整版在线| 欧美日韩一区国产| 九色porny丨国产精品| 国产欧美一区二区在线| 色综合久久久久综合体桃花网| 亚洲国产一区视频| 久久99久久久久久久久久久| 国产日产欧美一区| 91国产成人在线| 奇米精品一区二区三区在线观看 | 日韩精品一区二区三区在线播放| 激情综合一区二区三区| 亚洲国产精品v| 在线观看中文字幕不卡| 六月丁香婷婷久久| |精品福利一区二区三区| 欧美日韩卡一卡二| 国产高清在线精品| 亚洲国产欧美在线人成| 精品国产一区二区在线观看| 99久久婷婷国产综合精品电影| 午夜精品一区二区三区三上悠亚 | 国产亚洲精品久| 91久久精品一区二区| 麻豆国产精品官网| 国产精品久久久久久久裸模| 777亚洲妇女| 成人av网站在线观看免费| 亚洲第一会所有码转帖| 久久精品亚洲国产奇米99| 日本韩国视频一区二区| 国产揄拍国内精品对白| 亚洲自拍都市欧美小说| 久久网站最新地址| 欧美性受极品xxxx喷水| 国产.欧美.日韩| 天堂va蜜桃一区二区三区漫画版| 欧美激情一区二区| 欧美电影一区二区| 99久久99久久精品国产片果冻| 日本不卡视频在线| 亚洲欧美激情一区二区| 精品国产123| 欧美性做爰猛烈叫床潮| 成人免费毛片高清视频| 日韩电影在线一区二区三区| 最新热久久免费视频| 欧美videos中文字幕| 欧美中文字幕一二三区视频| 成人午夜在线免费| 蜜桃视频一区二区三区| 亚洲一区二区三区激情| 国产精品你懂的在线| 精品国免费一区二区三区| 欧美三日本三级三级在线播放| 成人成人成人在线视频| 国产一区二区三区免费看| 视频一区二区三区在线| 亚洲免费av高清| 国产午夜精品一区二区三区四区| 欧美一区三区二区| 在线观看www91| 亚洲人123区| 国产亚洲欧洲997久久综合| 欧美精品久久久久久久多人混战| 972aa.com艺术欧美| 成人综合在线观看| 极品少妇xxxx精品少妇| 蜜臀av性久久久久蜜臀aⅴ| 亚洲v精品v日韩v欧美v专区| 国产精品久久久久久亚洲毛片| 久久精品人人做人人爽97| 日韩午夜av一区| 欧美男同性恋视频网站| 欧美综合久久久| 色香色香欲天天天影视综合网| 成人99免费视频| 丁香六月久久综合狠狠色| 国产一区二区三区精品欧美日韩一区二区三区 | 91福利在线播放| aaa亚洲精品| 大白屁股一区二区视频| 国产精品中文字幕欧美| 国产一本一道久久香蕉| 黄页视频在线91| 久久国产人妖系列| 青青草国产精品97视觉盛宴| 丝袜亚洲精品中文字幕一区| 亚洲v日本v欧美v久久精品| 亚洲一区免费在线观看| 亚洲一区二区三区美女| 亚洲一区二区在线视频| 亚洲一卡二卡三卡四卡 | 国产一区二区三区在线观看免费| 美女国产一区二区| 久久国产尿小便嘘嘘尿| 国模少妇一区二区三区| 国产在线视视频有精品| 国产精品中文字幕欧美| 福利一区福利二区| 成人av网站免费观看| 99久久99久久精品免费观看| 99久久免费国产| 91美女片黄在线观看91美女| 日本高清无吗v一区| 欧美性猛交xxxx乱大交退制版 | 欧美一区二区三区小说| 欧美一区二区三区白人 | 欧美成人三级电影在线| 精品国产91洋老外米糕| 久久久久国产精品人| 国产精品午夜电影| 亚洲天天做日日做天天谢日日欢 | 欧美本精品男人aⅴ天堂| 欧美zozozo| 成人av免费在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 99精品视频在线观看免费| 在线欧美小视频| 欧美日本一区二区三区四区| 日韩亚洲电影在线| 国产女人aaa级久久久级 | 91一区二区在线| 在线观看区一区二| 这里只有精品电影| 久久久天堂av| 亚洲人被黑人高潮完整版| 亚洲妇熟xx妇色黄| 麻豆久久一区二区| 粉嫩一区二区三区性色av| 91麻豆福利精品推荐| 欧美日韩国产中文| 精品日韩在线观看| 中文字幕一区不卡| 天堂午夜影视日韩欧美一区二区| 久久99久久99小草精品免视看| 成人晚上爱看视频| 欧美色综合天天久久综合精品| 精品少妇一区二区三区免费观看 | 26uuu国产电影一区二区| 亚洲国产精品激情在线观看| 亚洲一区在线观看免费 | 久久人人爽爽爽人久久久| 国产精品三级电影| 亚洲成人动漫一区| 国产精品正在播放| 欧美丝袜第三区| 精品sm捆绑视频| 亚洲乱码日产精品bd| 免播放器亚洲一区| 不卡一区在线观看| 在线综合亚洲欧美在线视频| av影院午夜一区| 欧美高清dvd| 欧美国产日韩精品免费观看| 亚洲午夜电影网| 国产aⅴ综合色| 欧美日韩精品一区二区在线播放| 亚洲精品一区二区三区影院| 一区二区三区在线看| 精品中文字幕一区二区小辣椒| 97se亚洲国产综合自在线| 精品久久久久久久久久久久久久久 | 天堂一区二区在线| 成人av手机在线观看| 日韩一区二区三区高清免费看看 | 一区二区三区高清| 国产精品456露脸| 欧美日韩国产片| 国产欧美精品在线观看| 日本vs亚洲vs韩国一区三区二区| 99综合电影在线视频| 日韩三级av在线播放| 一区二区三区91| 成人污污视频在线观看| 日韩欧美国产综合| 亚洲一区二区三区四区在线| 成人网男人的天堂| 欧美成人a在线| 亚洲国产一区二区三区青草影视| 成人午夜视频在线观看| 精品欧美一区二区久久| 亚洲激情在线激情| 成人性生交大片免费| 精品国产一区二区三区久久影院 | 麻豆91在线观看| 欧美亚洲日本国产| 中文字幕一区二区三区av| 国产麻豆精品视频| 91精品国产一区二区|