文档库 最新最全的文档下载
当前位置:文档库 › 1.源码分析

1.源码分析

1.源码分析
1.源码分析

MINIGUI源码分析(1) ------ 滚动条管理分析

//水平滚动条消息处理

static BOOL wndHandleHScrollBar (PMAINWIN pWin, int message, int x, int y) {

static int downPos = SBPOS_UNKNOWN;

static int movePos = SBPOS_UNKNOWN;

static int sbCode;

static int oldBarStart;

static int oldThumbPos;

static int oldx;

int curPos;

RECT rcBar;

//获取水平滚动条矩形区域.

wndGetHScrollBarRect (pWin, &rcBar);

//计算滚动条除左右按钮后的矩形区域.

rcBar.left += GetMainWinMetrics (MWM_CXHSCROLL);

rcBar.right -= GetMainWinMetrics (MWM_CXHSCROLL);

//计算顶点对应的滚动条逻辑位置.

curPos = wndGetHScrollBarPos (pWin, x, y);

//若在滚动条区域外,则返回.

if (curPos == SBPOS_UNKNOWN && downPos == SBPOS_UNKNOWN) {

return FALSE;

}

switch( message )

{

//若为鼠标左键按下。

case MSG_NCLBUTTONDOWN:

//记录开始位置

oldBarStart = pWin->hscroll.barStart;

oldThumbPos = pWin->hscroll.curPos;

oldx = x;

//保存当前位置。

downPos = curPos;

movePos = curPos;

//左按钮,向左翻页。

if (curPos == SBPOS_LEFTARROW)

{

sbDownButton (pWin, curPos);

if (pWin->hscroll.curPos == pWin->hscroll.minPos)

break;

sbCode = SB_LINELEFT;

}

//右按钮,向右翻页。

else if (curPos == SBPOS_RIGHTARROW)

{

sbDownButton (pWin, curPos);

if (pWin->hscroll.curPos == pWin->hscroll.maxPos)

break;

sbCode = SB_LINERIGHT;

}

//点击在滑块左边,向左滚动一单位。

else if (curPos == SBPOS_LEFTSPACE)

{

if (pWin->hscroll.curPos == pWin->hscroll.minPos)

break;

sbCode = SB_PAGELEFT;

}

//点击在滑块右边,向左滚动一单位。

else if (curPos == SBPOS_RIGHTSPACE)

{

if (pWin->hscroll.curPos == pWin->hscroll.maxPos)

break;

sbCode = SB_PAGERIGHT;

}

//拖动滑块.

else if (curPos == SBPOS_THUMB)

{

sbCode = SB_THUMBTRACK;

break;

}

//处理消息

SendNotifyMessage ((HWND)pWin, MSG_HSCROLL, sbCode, 0); /*

设置默认自动回复消息,即按下按钮,按下滚动条除滑块以外的区域不动时,

会自动产生此消息.即当用户按住滚动条按钮不动时,将不停的发送翻页消息,

直到翻页到最边界的情况。

*/

SetAutoRepeatMessage ((HWND)pWin, MSG_HSCROLL, sbCode, 0);

break;

/*

若为左键松开

*/

case MSG_NCLBUTTONUP:

/*

若开始为拖动滑块。

*/

if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB)

{

/*

计算滑块被拖动的距离(象素为单位)

*/

int newBarStart = oldBarStart + x - oldx;

/*

根据滑块被拖动的距离计算滑块被拖动的逻辑滚动距离,然后当前滑块对应的逻辑位置。

*/

int newThumbPos = newBarStart

* (pWin->hscroll.maxPos - pWin->hscroll.minPos + 1)

/ (rcBar.right - rcBar.left) + pWin->hscroll.minPos;

/*

若计算出来的逻辑位置合法,则更新滚动条,发送拖动滑块完成消息(SB_THUMBPOSITION)。

*/

if (newThumbPos != oldThumbPos

&& newThumbPos >= pWin->hscroll.minPos

&& newThumbPos <= pWin->hscroll.maxPos)

SendNotifyMessage ((HWND)pWin,

MSG_HSCROLL, SB_THUMBPOSITION, newThumbPos);

/*

此时用户对滚动条的操作已经完成,清空上一次保存的位置信息,

确保下一次的滚动条操作开始时的参数正确。

*/

downPos = SBPOS_UNKNOWN;

movePos = SBPOS_UNKNOWN;

break;

}

/*

若为翻页,滚动信息,则处理消息.生成滚动条操作完成消息,取消自动恢复消息。

更新按钮显示状态。

*/

if (downPos != SBPOS_UNKNOWN)

{

sbUpButton (pWin, curPos);

SendNotifyMessage ((HWND)pWin, MSG_HSCROLL, SB_ENDSCROLL, 0);

SetAutoRepeatMessage (HWND_DESKTOP, 0, 0, 0);

}

downPos = SBPOS_UNKNOWN;

movePos = SBPOS_UNKNOWN;

break;

/*

若为鼠标移动信息

*/

case MSG_NCMOUSEMOVE:

/*

若用户曾按下滑块。则转换为拖动滑块消息.

*/

if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB)

{

/*

计算滑块拖动的距离(象素)

*/

int newBarStart = oldBarStart + x - oldx;

/*

根据前面计算的滑块拖动距离,计算滑块拖动的逻辑滚动距离,然后当前滑块对应的逻辑位置。

*/

int newThumbPos = newBarStart

* (pWin->hscroll.maxPos - pWin->hscroll.minPos + 1)

/ (rcBar.right - rcBar.left) + pWin->hscroll.minPos;

/*

若计算出来的逻辑位置合法,则更新滚动条,发送拖动滑块消息(SB_THUMBTRACK)。*/

if (newThumbPos != oldThumbPos

&& newThumbPos >= pWin->hscroll.minPos

&& newThumbPos <= pWin->hscroll.maxPos)

{

SendNotifyMessage ((HWND)pWin,

MSG_HSCROLL, SB_THUMBTRACK, newThumbPos);

/*

更新上次拖动位置。

*/

oldThumbPos = newThumbPos;

}

movePos = curPos;

break;

}

//更新按钮显示状态。

if (movePos == downPos && curPos != downPos)

{

sbUpButton (pWin, downPos);

}

else if (movePos != downPos && curPos == downPos)

{

sbDownButton (pWin, downPos);

}

movePos = curPos;

break;

}

return TRUE;

}

//处理垂直滚动条事件,与水平滚动条处理方式一致.

static BOOL wndHandleVScrollBar (PMAINWIN pWin, int message, int x, int y)

{

static int downPos = SBPOS_UNKNOWN;

static int movePos = SBPOS_UNKNOWN;

static int sbCode;

static int oldBarStart;

static int oldThumbPos;

static int oldy;

int curPos;

RECT rcBar;

int newBarStart;

int newThumbPos;

wndGetVScrollBarRect (pWin, &rcBar);

rcBar.top += GetMainWinMetrics (MWM_CYVSCROLL);

rcBar.bottom -= GetMainWinMetrics (MWM_CYVSCROLL);

curPos = wndGetVScrollBarPos (pWin, x, y);

if (curPos == SBPOS_UNKNOWN && downPos == SBPOS_UNKNOWN) return FALSE;

switch (message)

{

case MSG_NCLBUTTONDOWN:

oldBarStart = pWin->vscroll.barStart;

oldThumbPos = pWin->vscroll.curPos;

oldy = y;

downPos = curPos;

movePos = curPos;

if (curPos == SBPOS_UPARROW) {

sbDownButton (pWin, curPos);

if (pWin->vscroll.curPos == pWin->vscroll.minPos)

break;

sbCode = SB_LINEUP;

}

else if (curPos == SBPOS_DOWNARROW) {

sbDownButton (pWin, curPos);

if (pWin->vscroll.curPos == pWin->vscroll.maxPos)

break;

sbCode = SB_LINEDOWN;

}

else if (curPos == SBPOS_UPSPACE) {

if (pWin->vscroll.curPos == pWin->vscroll.minPos)

break;

sbCode = SB_PAGEUP;

}

else if (curPos == SBPOS_DOWNSPACE) {

if (pWin->vscroll.curPos == pWin->vscroll.maxPos)

break;

sbCode = SB_PAGEDOWN;

}

else if (curPos == SBPOS_THUMB) {

sbCode = SB_THUMBTRACK;

break;

}

SendNotifyMessage ((HWND)pWin, MSG_VSCROLL, sbCode, 0);

SetAutoRepeatMessage ((HWND)pWin, MSG_VSCROLL, sbCode, 0);

break;

case MSG_NCLBUTTONUP:

if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB) {

newBarStart = oldBarStart + y - oldy;

newThumbPos = newBarStart

* (pWin->vscroll.maxPos - pWin->vscroll.minPos + 1)

/ (rcBar.bottom - rcBar.top) + pWin->vscroll.minPos;

if (newThumbPos != oldThumbPos

&& newThumbPos >= pWin->vscroll.minPos

&& newThumbPos <= pWin->vscroll.maxPos)

SendNotifyMessage ((HWND)pWin,

MSG_VSCROLL, SB_THUMBPOSITION, newThumbPos);

downPos = SBPOS_UNKNOWN;

movePos = SBPOS_UNKNOWN;

break;

}

if (downPos != SBPOS_UNKNOWN) {

sbUpButton (pWin, curPos);

SendNotifyMessage ((HWND)pWin, MSG_VSCROLL, SB_ENDSCROLL, 0);

SetAutoRepeatMessage (HWND_DESKTOP, 0, 0, 0);

}

downPos = SBPOS_UNKNOWN;

movePos = SBPOS_UNKNOWN;

break;

case MSG_NCMOUSEMOVE:

if (sbCode == SB_THUMBTRACK && downPos == SBPOS_THUMB) { newBarStart = oldBarStart + y - oldy;

newThumbPos = newBarStart

* (pWin->vscroll.maxPos - pWin->vscroll.minPos + 1)

/ (rcBar.bottom - rcBar.top) + pWin->vscroll.minPos;

if (newThumbPos != oldThumbPos

&& newThumbPos >= pWin->vscroll.minPos

&& newThumbPos <= pWin->vscroll.maxPos) {

SendNotifyMessage ((HWND)pWin,

MSG_VSCROLL, SB_THUMBTRACK, newThumbPos);

oldThumbPos = newThumbPos;

}

movePos = curPos;

break;

}

if (movePos == downPos && curPos != downPos)

sbUpButton (pWin, downPos);

else if (movePos != downPos && curPos == downPos)

sbDownButton (pWin, downPos);

movePos = curPos;

break;

}

return TRUE;

}

//计算滚动条滑块大小和位置。

static void wndScrollBarPos (PMAINWIN pWin, BOOL bIsHBar, RECT* rcBar)

{

UINT moveRange;

PSCROLLBARINFO pSBar;

if (bIsHBar)

{

pSBar = &pWin->hscroll;

}

else

{

pSBar = &pWin->vscroll;

}

//若滚动区间为空,则隐藏滚动条.

if (pSBar->minPos == pSBar->maxPos)

{

pSBar->status |= SBS_HIDE;

return;

}

//计算滚动条可用区域(即滚动滑块可以滑动的区间象素个数)

if (bIsHBar)

{

moveRange = RECTWP (rcBar) - (GetMainWinMetrics (MWM_CXHSCROLL)<<1);

}

else

{

moveRange = RECTHP (rcBar) - (GetMainWinMetrics (MWM_CYVSCROLL)<<1);

}

//若页面间隔为0,则取默认滚动滑块长度为当前滑块长度,并进行合法性修正.

if (pSBar->pageStep == 0)

{

pSBar->barLen = GetMainWinMetrics (MWM_DEFBARLEN);

if (pSBar->barLen > moveRange)

{

pSBar->barLen = GetMainWinMetrics (MWM_MINBARLEN);

}

}

/*

否则,计算滚动滑块大小.并对合法性进行修正.

计算方程: 每滚动间隔对应象素大小为moveRange / ScrollRange ;

pageStep:每页大小即控件能显示的区域,所对应的滚动条滚动间隔数.

ScrollRange - PageStep, 就是滚动条的逻辑活动的范围.

对应于moveRange - barLen 就是滚动条能滚定的象素范围.即一一对应关系.

那么滚动条滑块的长度就是PageStep 对应的象素大小.

-> pSBar->barLen = moveRange * PageStep / ScrollRange ;

ScrollRange = pSBar->maxPos - pSBar->minPos ;

(滚动范围以0为开始, 如0 - 99 表示100 个滚动范围)

(若以1 开始, 则出错因为1 - 99 才99 个滚动范围).

"+ 0.5" 是四舍五入的方法。便于取整.

else

{

pSBar->barLen = (int) (moveRange*pSBar->pageStep * 1.0f/

(pSBar->maxPos - pSBar->minPos + 1) + 0.5);

/*

修正合法值.

*/

if (pSBar->barLen < GetMainWinMetrics (MWM_MINBARLEN))

{

pSBar->barLen = GetMainWinMetrics (MWM_MINBARLEN);

}

}

/*

计算滚动滑块开始位置.

计算方程: BarStart = PixelPerScrollGap * CurScrollRange ;

= moveRange * CurScrollRange / ScrollRange ;

即开始位置为每逻辑滚动间隔对应象素大小*当前逻辑滚动间隔;

ScrollRange = pSBar->maxPos - pSBar->minPos ;

(滚动范围以0为开始, 如0 - 99 表示100 个滚动范围)

(若以1 开始, 则出错因为1 - 99 才99 个滚动范围).

"+ 0.5" 是四舍五入的方法。便于取整.

*/

pSBar->barStart = (int) (moveRange*(pSBar->curPos - pSBar->minPos) * 1.0f/

(pSBar->maxPos - pSBar->minPos + 1) + 0.5);

/*

修正非法值。

*/

if (pSBar->barStart + pSBar->barLen > moveRange)

{

pSBar->barStart = moveRange - pSBar->barLen;

}

if (pSBar->barStart < 0)

{

pSBar->barStart = 0;

}

//计算垂直滚动条矩形区域.

static BOOL wndGetVScrollBarRect (const MAINWIN* pWin,

RECT* rcVBar)

{

if (pWin->dwStyle & WS_VSCROLL)

{

//取边界宽度

int iBorder = wndGetBorder (pWin);

//计算滚动条左边和右边

rcVBar->left = pWin->right - GetMainWinMetrics (MWM_CXVSCROLL) - iBorder;

rcVBar->right = pWin->right - iBorder;

//计算矩形顶点和底边

#ifdef _FLAT_WINDOW_STYLE

rcVBar->top = pWin->ct - 1;

#else

rcVBar->top = pWin->ct;

#endif

rcVBar->bottom = pWin->bottom - iBorder;

//若存在水平滚动条,则减去水平滚动条高度

if (pWin->dwStyle & WS_HSCROLL && !(pWin->hscroll.status & SBS_HIDE))

{

rcVBar->bottom -= GetMainWinMetrics (MWM_CYHSCROLL);

}

#ifdef _FLAT_WINDOW_STYLE

if (iBorder > 0)

OffsetRect (rcVBar, 1, 0);

#endif

return TRUE;

}

return FALSE;

}

//计算水平滚动条矩形区域.与垂直情况相似

static BOOL wndGetHScrollBarRect (const MAINWIN* pWin,

RECT* rcHBar)

{

if (pWin->dwStyle & WS_HSCROLL) {

int iBorder = wndGetBorder (pWin);

rcHBar->top = pWin->bottom - GetMainWinMetrics (MWM_CYHSCROLL)

- iBorder;

rcHBar->bottom = pWin->bottom - iBorder;

#ifdef _FLAT_WINDOW_STYLE

rcHBar->left = pWin->cl - 1;

#else

rcHBar->left = pWin->cl;

#endif

rcHBar->right = pWin->right - iBorder;

if (pWin->dwStyle & WS_VSCROLL && !(pWin->vscroll.status & SBS_HIDE)) rcHBar->right -= GetMainWinMetrics (MWM_CXVSCROLL);

#ifdef _FLAT_WINDOW_STYLE

if (iBorder > 0)

OffsetRect (rcHBar, 0, 1);

#endif

return TRUE;

}

return FALSE;

}

//计算点击垂直滚动条上逻辑位置分类.

static int wndGetVScrollBarPos (PMAINWIN pWin, int x, int y)

{

RECT rcBar;

RECT rcArea;

if (pWin->vscroll.status & SBS_DISABLED)

{

return SBPOS_UNKNOWN;

}

//获取垂直滚动条矩形区域.

wndGetVScrollBarRect (pWin, &rcBar);

//若点不再矩形区域内,则返回空.

if (!PtInRect (&rcBar, x, y))

{

return SBPOS_UNKNOWN;

}

rcArea.left = rcBar.left;

rcArea.right = rcBar.right;

//是否为顶部的按钮.

// Left arrow area

rcArea.top = rcBar.top;

rcArea.bottom = rcArea.top + GetMainWinMetrics (MWM_CYVSCROLL);

if (PtInRect (&rcArea, x, y))

{

return SBPOS_UPARROW;

}

//是否为底部的按钮.

// Right arrow area

rcArea.top = rcBar.bottom - GetMainWinMetrics (MWM_CYVSCROLL);

rcArea.bottom = rcBar.bottom;

if (PtInRect (&rcArea, x, y))

{

return SBPOS_DOWNARROW;

}

//是否在滑块上边

if (y < (rcBar.top + pWin->vscroll.barStart

+ GetMainWinMetrics (MWM_CYVSCROLL)))

return SBPOS_UPSPACE;

//是否为滑块下边

if (y > (rcBar.top + pWin->vscroll.barStart + pWin->vscroll.barLen

+ GetMainWinMetrics (MWM_CYVSCROLL)))

return SBPOS_DOWNSPACE;

//在滑块上

return SBPOS_THUMB;

}

//计算点击水平滚动条上逻辑位置分类.与垂直情况类似。

static int wndGetHScrollBarPos (PMAINWIN pWin, int x, int y)

{

RECT rcBar;

RECT rcArea;

if (pWin->hscroll.status & SBS_DISABLED)

return SBPOS_UNKNOWN;

wndGetHScrollBarRect (pWin, &rcBar);

if (!PtInRect (&rcBar, x, y))

return SBPOS_UNKNOWN;

rcArea.top = rcBar.top;

rcArea.bottom = rcBar.bottom;

// Left arrow area

rcArea.left = rcBar.left;

rcArea.right = rcArea.left + GetMainWinMetrics (MWM_CXHSCROLL);

if (PtInRect (&rcArea, x, y))

return SBPOS_LEFTARROW;

// Right arrow area

rcArea.left = rcBar.right - GetMainWinMetrics (MWM_CXHSCROLL);

rcArea.right = rcBar.right;

if (PtInRect (&rcArea, x, y))

return SBPOS_RIGHTARROW;

if (x < (rcBar.left + pWin->hscroll.barStart

+ GetMainWinMetrics (MWM_CXHSCROLL)))

return SBPOS_LEFTSPACE;

if (x > (rcBar.left + pWin->hscroll.barStart + pWin->hscroll.barLen

+ GetMainWinMetrics (MWM_CXHSCROLL)))

return SBPOS_RIGHTSPACE;

return SBPOS_THUMB;

}

//获取滚动条信息结构

static PSCROLLBARINFO wndGetScrollBar (MAINWIN* pWin, int iSBar) {

//水平

if (iSBar == SB_HORZ)

{

if (pWin->dwStyle & WS_HSCROLL)

{

return &pWin->hscroll;

}

}

//垂直

else if (iSBar == SB_VERT)

{

if (pWin->dwStyle & WS_VSCROLL)

{

return &pWin->vscroll;

}

}

return NULL;

}

//设置滚动条是否可用,与设置滚动条是否可见的逻辑相似

BOOL GUIAPI EnableScrollBar (HWND hWnd, int iSBar, BOOL bEnable) {

PSCROLLBARINFO pSBar;

PMAINWIN pWin;

BOOL bPrevState;

RECT rcBar;

pWin = (PMAINWIN)hWnd;

if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )

{

return FALSE;

}

bPrevState = !(pSBar->status & SBS_DISABLED);

if (bEnable && !bPrevState)

{

pSBar->status &= ~SBS_DISABLED;

}

else if (!bEnable && bPrevState)

{

pSBar->status |= SBS_DISABLED;

}

else

{

return FALSE;

}

if (iSBar == SB_VERT)

{

wndGetVScrollBarRect (pWin, &rcBar);

}

else

{

wndGetHScrollBarRect (pWin, &rcBar);

}

rcBar.left -= pWin->left;

rcBar.top -= pWin->top;

rcBar.right -= pWin->left;

rcBar.bottom -= pWin->top;

SendAsyncMessage (hWnd, MSG_NCPAINT, 0, (LPARAM)(&rcBar));

return TRUE;

}

//获取滚动条逻辑滚动位置

BOOL GUIAPI GetScrollPos (HWND hWnd, int iSBar, int* pPos)

{

PSCROLLBARINFO pSBar;

PMAINWIN pWin;

pWin = (PMAINWIN)hWnd;

if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )

{

return FALSE;

}

*pPos = pSBar->curPos;

return TRUE;

}

//获取滚动条逻辑滚动范围。

BOOL GUIAPI GetScrollRange (HWND hWnd, int iSBar, int* pMinPos, int* pMaxPos) {

PSCROLLBARINFO pSBar;

PMAINWIN pWin;

pWin = (PMAINWIN)hWnd;

if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )

{

return FALSE;

}

*pMinPos = pSBar->minPos;

*pMaxPos = pSBar->maxPos;

return TRUE;

}

//设置滚动条当前逻辑滚动位置,与设置滚动条滚动信息类似

BOOL GUIAPI SetScrollPos (HWND hWnd, int iSBar, int iNewPos)

{

PSCROLLBARINFO pSBar;

PMAINWIN pWin;

RECT rcBar;

pWin = (PMAINWIN)hWnd;

if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )

{

return FALSE;

}

if (iNewPos < pSBar->minPos)

{

pSBar->curPos = pSBar->minPos;

}

else

{

pSBar->curPos = iNewPos;

}

if(1)

{

int max = pSBar->maxPos;

max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;

if (pSBar->curPos > max)

pSBar->curPos = max;

}

if (iSBar == SB_VERT)

{

wndGetVScrollBarRect (pWin, &rcBar);

}

else

{

wndGetHScrollBarRect (pWin, &rcBar);

}

rcBar.left -= pWin->left;

rcBar.top -= pWin->top;

rcBar.right -= pWin->left;

rcBar.bottom -= pWin->top;

wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);

if (iSBar == SB_VERT)

{

rcBar.top += GetMainWinMetrics (MWM_CYVSCROLL);

rcBar.bottom -= GetMainWinMetrics (MWM_CYVSCROLL); }

else

{

rcBar.left += GetMainWinMetrics (MWM_CXHSCROLL);

rcBar.right -= GetMainWinMetrics (MWM_CXHSCROLL); }

SendAsyncMessage (hWnd, MSG_NCPAINT, 0, (LPARAM)(&rcBar));

return TRUE;

}

/*

设置滚动条逻辑滚动范围,与设置滚动条滚动信息类似

*/

BOOL GUIAPI SetScrollRange (HWND hWnd, int iSBar, int iMinPos, int iMaxPos) {

PSCROLLBARINFO pSBar;

PMAINWIN pWin;

RECT rcBar;

pWin = (PMAINWIN)hWnd;

if ( !(pSBar = wndGetScrollBar (pWin, iSBar)) )

{

return FALSE;

}

pSBar->minPos = (iMinPos < iMaxPos)?iMinPos:iMaxPos;

pSBar->maxPos = (iMinPos > iMaxPos)?iMinPos:iMaxPos;

// validate parameters.

if (pSBar->curPos < pSBar->minPos)

{

pSBar->curPos = pSBar->minPos;

}

if (pSBar->pageStep <= 0)

{

pSBar->pageStep = 0;

}

else if (pSBar->pageStep > (pSBar->maxPos - pSBar->minPos + 1))

{

pSBar->pageStep = pSBar->maxPos - pSBar->minPos + 1;

}

if(1)

{

int max = pSBar->maxPos;

max -= ((pSBar->pageStep - 1) > 0)?(pSBar->pageStep - 1):0;

if (pSBar->curPos > max)

{

pSBar->curPos = max;

}

}

if (iSBar == SB_VERT)

{

wndGetVScrollBarRect (pWin, &rcBar);

}

else

{

wndGetHScrollBarRect (pWin, &rcBar);

}

rcBar.left -= pWin->left;

rcBar.top -= pWin->top;

rcBar.right -= pWin->left;

rcBar.bottom -= pWin->top;

wndScrollBarPos (pWin, iSBar == SB_HORZ, &rcBar);

if (iSBar == SB_VERT)

{

rcBar.top += GetMainWinMetrics (MWM_CYVSCROLL);

rcBar.bottom -= GetMainWinMetrics (MWM_CYVSCROLL);

}

else

{

rcBar.left += GetMainWinMetrics (MWM_CXHSCROLL);

rcBar.right -= GetMainWinMetrics (MWM_CXHSCROLL);

}

SendAsyncMessage (hWnd, MSG_NCPAINT, 0, (LPARAM)(&rcBar));

return TRUE;

}

//设置滚动条信息

BOOL GUIAPI SetScrollInfo (HWND hWnd, int iSBar,

const SCROLLINFO* lpsi, BOOL fRedraw)

{

PSCROLLBARINFO pSBar;

中国区块链行业分析报告

年10月28日

目录 一、区块链概述 (2) 1、区块链定义 (2) 2、区块链特点 (2) 3、区块链应用 (3) 4、区块链分类 (3) 二、投资分析 (4) 1、VC投资 (4) 2、ICO (4) 3、ICO的价值与风险 (5) 4、VC与ICO (6) 三、产业分析 (7) 1、产业现状 (7) 2、产业关键 (8) 3、产业全景 (9) 四、竞争格局 (12) 1、上市公司 (12) 2、BAT布局 (13)

五、项目分析 (14) 1、项目指标评判 (14) 2、项目介绍 (15) 六、问题和趋势 (16) 1、区块链挑战 (16) 2、行业展望 (18)

一、区块链概述 1、区块链定义 1)区块链-去中心化的记录技术 广义定义:区块链是以区块结构存储数据、多方维护的、使用密码学技术保证传输和访问的实现数据存储的技术体系,代表了目前火热的比特币、以太坊背后的一种去中心化的记录技术。 狭义定义:当结合具体的产品谈区块链时,指的是以区块连接而成的链式数据存储方式。 2、区块链特点 去中心化+不可篡改+可追溯,构筑区块链核心应用能力 特点一:去中心化 去中心化意味着,在区块链网络中分布着众多的节点,节点与节点之间可以自由连接进行数据、资产、信息等的交换,而无需通过第 三方中心机构。例如我们目前常规的转账需要通过银行这个中心机构,在区块链网络中,我们将能实现直接点对点的转账。 特点二:不可篡改 区块链使用了密码学技术来保证区块链上的信息不被篡改,主

要用到的是密码学中的哈希函数以及非对称加密。 特点三:可追溯 区块+链的形式保存了从第一个区块开始的所有历史数据,连接的形式是后一个区块拥有前一个区块的HASH值,区块链上任一一条记录都可通过链式结构追溯本源。 3、区块链应用 区块链的首个应用-比特币 公认最早关于区块链的描述出现在2008年中本聪撰写的论文《比特币:一种点对点的电子现金系统》,2014年后,人们开始关注 比特币背后的区块链技术,随后引发了分布式账本的革新浪潮,接下来我们以比特币为例来看看区块链网络如何运作。区块链在比特币网络中可以看做是一个分布式账本,每一个区块就是账本的一页。这个账本有着以下特点: 特点一:账本上只记录每一笔交易,即记载付款人、收款人、交易额。交易记录具有时序,无论什么时候,每个人的资产都 特点二:账本完全公开,只要任何人需要,都可以获得当前完整的交易记录。

词法分析器实验报告及源代码

数学与软件科学学院实验报告 学期:13至14__ 第_2 学期 2014年3月17 日 课程名称:编译原理专业:2011级5_班 实验编号:01 实验项目:词法分析器指导教师_王开端 姓名:张世镪学号: 2011060566 实验成绩: 一、目的 学习编译原理,词法分析是编译的第一个阶段,其任务是从左至右挨个字符地对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号串形式的中间程序。执行词法分析的程序称为词法分析程序,也称为词法分析器或扫描器。词法分析器的功能是输入源程序,输出单词符号 做一个关于C的词法分析器,C++实现 二、任务及要求 1.词法分析器产生下述C的单词序列 这个C的所有的单词符号,以及它们的种别编码和内部值如下表: -* / & <<=>>===!= && || , : ; { } [ ] ( ) ID和NUM的正规定义式为: ID→letter(letter | didit)* NUM→digit digit* letter→a | … | z | A | … | Z

digit→ 0 | … | 9 如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。 三、大概设计 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器又称扫描器:执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符、界符。3. 输出的单词符号的表示形式: (单词种别,单词符号的属性值) 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 状态转换图实现

【智能路由器】ndpi深度报文分析源码框架

【智能路由器】ndpi深度报文分析源码 框架 某些需求可能会要求路由能精确的分析出流经路由的流量是属于什么类型,比如qq,facebook,支付宝、京东…… 正好,有这么一个基于opendpi框架的深度报文分析的工具——ndpi ndpi是在opendpi的基础上编写而来的协议分析工具。源代码编译后生成两个部分,一个是内核层的xt_ndpi.ko模块,用来实时分析流量,另一个是应用层的lib库,给ndpiReader这个工具提供库,用来分析抓包工具提供的文件或者底层网卡提供的数据包。 开发者必须为其想要分析的app的流量对应开发一个协议分析器,ndpi已经提供了不少现成的协议分析器,如http,QQ,twitter,vmware,yahoo,mysql,pplive等等。 本篇博客中作者arvik只叙述ndpi源码中形成内核层的xt_ndpi.ko模块的源码部分。 之后可能会写一篇介绍ndpi中已有的QQ协议分析器是怎么分析出OICQ协议以识别流量类型和一篇实战型依葫芦画瓢编写微信协议分析器的博客。 ndpi的分析过程: 当底层一帧数据被送入ndpi钩子的时候,流经结构大致如下: 1. 打包该数据帧,搜集l3、l4层报头信息 2. 查询链接跟踪(如果已被标识,则直接获取到该数据帧所属协议类型) 3. 从链接跟踪中未获取流量所属协议类型,则进入深度报文分析过程 4. 率先进行协议猜测,调用相应的协议分析器分析 5. 猜测协议错误、此时ndpi会分类遍历相关类型的协议分析器进行分析,直至分析出结果或遍历完所有相关的协议分析器 6. 将分析出的协议类型标记到链接跟踪中,以便下次可直接从连接跟踪中拿到协议类型 先来看内核模块代码: 几个重要结构 ndpi_detection_module_struct:各种协议分析器都将自己的信息都保存在该结构中 struct ndpi_detection_module_struct { NDPI_PROTOCOL_BITMASK detection_bitmask; //等价于struct xxx { uint32_t fds_bits[8]}; struct xxx dection; 其中fds_bits[8]每一位可代表一种协议,最多可代表256中协议 NDPI_PROTOCOL_BITMASK generic_http_packet_bitmask; u_int32_t current_ts;

NS2.35源码分析报告

NS2-35组件源码分析之 分组(packet)源码分析一、与分组相关的类图 与分组packet相关的类主要有四个:Packet、p_info、PacketHeaderClass、PacketHeaderManager。

二、分组packet的格式 三、与分组packet相关类的框架 1、Packet类 Packet类简介: Packet类定义了分组的结构(bits_,hdrlen_等),提供了处理Packet对象的一系列成员函数(alloc()、copy()、free()等)。同时,packet 类维护了两个Packet对象的链表,一个是公有的,一个是私有的。free_指针指向私有链表,该链表中存放着暂时不用的Packet对象,当需要分配一个分组时,首先查看free_指向的链表,是否有不用的对象空间,如果有,就直接利用,如果没有,就从内存中申请一块空间。 Packet定义: class Packet : public Event { //公有继承Event类 private: unsigned char* bits_; // 分组头集合的起始地址 AppData* data_; // 指向分组数据的指针 static void init(Packet*); // 初始化分组头 bool fflag_; //bool型的变量 protected: static Packet* free_; // 为Packet类所有对象共享的free链表 int ref_count_; // 用于分组被引用的次数,当为0 时释放分组 public: Packet* next_; // 用于连接队列中各分组的指针 static int hdrlen_; //分组头部长 Packet() : bits_(0), data_(0), ref_count_(0), next_(0) { } //构造函数 inline unsigned char* bits() { return (bits_); } //内联函数,用于返回分组头集合的起始地址

Android源代码结构分析

目录 一、源代码结构 (2) 第一层次目录 (2) bionic目录 (3) bootloader目录 (5) build目录 (7) dalvik目录 (9) development目录 (9) external目录 (13) frameworks目录 (19) Hardware (20) Out (22) Kernel (22) packages目录 (22) prebuilt目录 (27) SDK (28) system目录 (28) Vendor (32)

一、源代码结构 第一层次目录 Google提供的Android包含了原始Android的目标机代码,主机编译工具、仿真环境,代码包经过解压缩后,第一级别的目录和文件如下所示: . |-- Makefile (全局的Makefile) |-- bionic (Bionic含义为仿生,这里面是一些基础的库的源代码) |-- bootloader (引导加载器),我们的是bootable, |-- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |-- dalvik (JAVA虚拟机) |-- development (程序开发所需要的模板和工具) |-- external (目标机器使用的一些库) |-- frameworks (应用程序的框架层) |-- hardware (与硬件相关的库) |-- kernel (Linux2.6的源代码) |-- packages (Android的各种应用程序) |-- prebuilt (Android在各种平台下编译的预置脚本) |-- recovery (与目标的恢复功能相关) `-- system (Android的底层的一些库)

兄弟连Go语言+区块链技术培训以太坊源码分析(42)miner挖矿部分源码分析CPU挖矿

兄弟连Go语言+区块链技术培训以太坊源码分析(42)mine r挖矿部分源码分析CPU挖矿 ## agent agent 是具体执行挖矿的对象。它执行的流程就是,接受计算好了的区块头,计算mix hash和nonce,把挖矿好的区块头返回。 构造CpuAgent, 一般情况下不会使用CPU来进行挖矿,一般来说挖矿都是使用的专门的G PU进行挖矿, GPU挖矿的代码不会在这里体现。 type CpuAgent struct { mu sync.Mutex workCh chan *Work // 接受挖矿任务的通道 stop chan struct{} quitCurrentOp chan struct{} returnCh chan<- *Result // 挖矿完成后的返回channel chain consensus.ChainReader // 获取区块链的信息 engine consensus.Engine // 一致性引擎,这里指的是Pow引擎 isMining int32 // isMining indicates whether the agent is curre ntly mining } func NewCpuAgent(chain consensus.ChainReader, engine consensus.Engi ne) *CpuAgent { miner := &CpuAgent{ chain: chain, engine: engine, stop: make(chan struct{}, 1), workCh: make(chan *Work, 1), } return miner } 设置返回值channel和得到Work的channel,方便外界传值和得到返回信息。 func (self *CpuAgent) Work() chan<- *Work { return self.workCh }

软件源代码安全测试系统可行性分析报告

软件源代码安全测试系统可行性分析研究报告

年月

目录 一、项目的背景和必要性1 二、国内外现状和需求分析2 2.1国内外发展现状2 2.2 需求分析2 三、项目实施内容及方案3 3.1 总体思路3 3.2 建设内容4 3.3 项目实施的组织管理5 3.4 项目实施进度计划6 四、实施项目所需条件及解决措施8 4.1 条件需要论述8 4.2 承担单位具备的条件及欠缺条件解决措施8 五、投资估算,资金筹措11 5.1 项目投资估算11 5.2 资金筹措11 六、经济、社会效益及学术价值分析11 七、项目风险性及不确定性分析12 7.1 不确定性分析12 7.2市场风险分析12 7.3 技术风险分析12 八、项目主要承担人员概况13

8.1 项目负责人情况13 8.2 主要承担人员及责任分工13

一、项目的背景和必要性 随着社会信息化的不断加深,计算机软件系统越来越复杂,程序的正确性也难以保证,计算机病毒和各种恶意程序有了赖以生存的环境。软件功能越来越负载,源代码越来越大,我们无法从编码的角度彻底消除所有的漏洞或缺陷,相当数量的安全问题是由于软件自身的安全漏洞引起的。软件开发过程中引入的大量缺陷,是产生软件漏洞的重要原因之一。不同的软件缺陷会产生不同的后果,必须区别对待各类缺陷,分析原因,研究其危害程度,预防方法等。我区的软件业发展尚未成熟,软件测试没有得到足够的重视,大多数软件开发商更多注重的是软件的功能,对于加强软件的安全性投入不足,这更增加了软件安全漏洞存在的可能性。系统攻击者可以解除软件安全漏洞轻易的绕过软件安全认证,对信息系统实施攻击和入侵,获取非法的系统用户权限,执行一系列非法操作和恶意攻击。 为了避免各种安全漏洞的出现,软件测试越来越受到开发人员的重视。软件测试不仅仅是为了找出软件潜在的安全漏洞,通过分析安全漏洞产生的原因,可以帮助我们发现当前软件开发过程中的缺陷,以便及时修复。软件测试可以提高源代码的质量,保证软件的安全性。但是,软件测试是一个非常复杂的执行过程。测试人员需要根据已有的经验,不断的输入各种测试用例以测试。纯人工测试效率低,无法满足信息产业发展的需要。我们需要高效的自动化测试源代码安全测试系统。

Mina2源码分析

Mina2.0框架源码剖析(一) 整个框架最核心的几个包是:org.apache.mina.core.service, org.apache.mina.core.session, org.apache.mina.core.polling以及 org.apache.mina.transport.socket。 这一篇先来看org.apache.mina.core.service。第一个要说的接口是IoService,它是所有IoAcceptor和IoConnector的基接口.对于一个IoService,有哪些信息需要我们关注呢?1)底层的元数据信息TransportMetadata,比如底层的网络服务提供者(NIO,ARP,RXTX等),2)通过这个服务创建一个新会话时,新会话的默认配置IoSessionConfig。3)此服务所管理的所有会话。4)与这个服务相关所产生的事件所对应的监听者(IoServiceListener)。5)处理这个服务所管理的所有连接的处理器(IoHandler)。6)每个会话都有一个过滤器链(IoFilterChain),每个过滤器链通过其对应的IoFilterChainBuilder来负责构建。7)由于此服务管理了一系列会话,因此可以通过广播的方式向所有会话发送消息,返回结果是一个WriteFuture集,后者是一种表示未来预期结果的数据结构。8)服务创建的会话(IoSession)相关的数据通过IoSessionDataStructureFactory来提供。9)发送消息时有一个写缓冲队列。10)服务的闲置状态有三种:读端空闲,写端空闲,双端空闲。11)还提供服务的一些统计信息,比如时间,数据量等。 IoService这个服务是对于服务器端的接受连接和客户端发起连接这两种行为的抽象。 再来从服务器看起,IoAcceptor是IoService 的子接口,它用于绑定到指定的ip和端口,从而接收来自客户端的连接请求,同时会fire相应的客户端连接成功接收/取消/失败等事件给自己的IoHandle去处理。当服务器端的Accpetor从早先绑定的ip和端口上取消绑定时,默认是所有的客户端会话会被关闭,这种情况一般出现在服务器挂掉了,则客户端收到连接关闭的提示。这个接口最重要的两个方法是bind()和unbind(),当这两个方法被调用时,服务端的连接接受线程就启动或关闭了。 再来看一看客户端的连接发起者接口IoConnector,它的功能和IoAcceptor基本对应的,它用于尝试连接到服务器指定的ip和端口,同时会fire相应的客户端连接事件给自己的IoHandle去处理。当connet方法被调用后用于连接服务器端的线程就启动了,而当所有的连接尝试都结束时线程就停止。尝试连接的超时时间可以自行设置。Connect方法返回的结果是ConnectFuture,这和前面说的WriteFuture类似,在后面会有一篇专门讲这个模式的应用。 前面的IoAcceptor和IoConnector就好比是两个负责握手的仆人,而真正代表会话的实际I/O操作的接口是IoProcessor,它对现有的Reactor模式架构的Java NIO框架继续做了一层封装。它的泛型参数指明了它能处理的会话类型。接口中最重要的几个方法,add用于将指定会话加入到此Processor中,让它负责处理与此会话相关的所有I/O操作。由于写操作会有一个写请求队列,flush就用于对指定会话的写请求队列进行强制刷数据。remove方法用于从此Processor中移除和关闭指定会话,

区块链深度研究报告

区块链深度研究报告 2019年11月

目录 第一部分比特币诞生之前,5个对区块链未来有重大影响的互联网技术 (3) 第二部分区块链的诞生与技术核心 (9) 第三部分区块链技术在互联网中的历史地位和未来前景 (13) 第四部分关于区块链在互联网未来地位的判断 (16) 第五部分区块链应用落地的5大方向 (17)

2008年,神秘的中本聪在密码学邮件组第一次提出了区块链的概念,同时区块链也成为“电子货币”比特币的核心技术,在麦肯锡的一份报告中,将区块链技术称之为继蒸汽机、电力、信息和互联网科技之后,最有潜力触发第五轮颠覆性革命浪潮的核心技术。另一方面,区块链技术产生的比特币,山寨币,ICO 项目导致的大量诈骗活动也引起了社会的批判浪潮。 区块链技术究竟是像电子邮箱、Tcp/iP、万维网、社交网络一样,是革命性的,引领互联网未来的技术;还是一个被夸大的、存在巨大缺陷的技术? 要理解区块链的历史地位和未来趋势,就不得不从互联网的诞生开始研究区块链的技术发展简史,从中发掘区块链产生的动因,并由此推断区块链的未来。 一、比特币诞生之前,5个对区块链未来有重大影响的互联网技术 1969年,互联网在美国诞生,此后互联网从美国的四所研究机构扩展到整个地球。在应用上从最早的军事和科研,扩展到人类生活的方方面面,在互联网诞生后的近50年中,有5项技术对区块链的未来发展有特别重大的意义。 1.1974诞生的TCP/IP协议:决定了区块链在互联网技术生态的位置 1974年,互联网发展迈出了最为关键的一步,就是由美国科学家文顿?瑟夫和罗伯特?卡恩共同开发的互联网核心通信技术--TCP/IP协议正式出台。 这个协议实现了在不同计算机,甚至不同类型的网络间传送信息。所有连接在网络上的计算机,只要遵照这个协议,都能够进行通讯和交互。 通俗的说,互联网的数据能穿过几万公里,到达需要的计算机用户手里,主要是互联网世界形成了统一的信息传播机制。也就是互联网设备传播信息时遵循了一个统一的法律-TCP/IP协议。

编译原理词法分析和语法分析报告 代码(C语言版)

词法分析 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 3.1 主程序示意图: 扫描子程序主要部分流程图 其他

词法分析程序的C语言程序源代码: // 词法分析函数: void scan() // 数据传递: 形参fp接收指向文本文件头的文件指针; // 全局变量buffer与line对应保存源文件字符及其行号,char_num保存字符总数。 void scan() { char ch; int flag,j=0,i=-1; while(!feof(fp1)) { ch=fgetc(fp1); flag=judge(ch); printf("%c",ch);//显示打开的文件 if(flag==1||flag==2||flag==3) {i++;buffer[i]=ch;line[i]=row;} else if(flag==4) {i++;buffer[i]='?';line[i]=row;} else if(flag==5) {i++;buffer[i]='~';row++;} else if(flag==7) continue; else cout<<"\n请注意,第"<

gh0st源码分析,整理笔记

MICROSOFT SPEECH SDK 5.1\INCLUDE MICROSOFT SPEECH SDK 5.1\LIB 以上两个目录是教程里面提到的,可以不使用,一样可以编译 第一节课 新建MFC工程,单文档模式,基类用CListView,其余默认即可 打开gh0stView.cpp找到void CGh0stView::OnInitialUpdate()函数 新建一个结NONCLIENTMETRICS ncm; NONCLIENTMETRICS这个结构就包含了非客户区的一些属性 对ncm变量进行初始化memset(&ncm, 0, sizeof(NONCLIENTMETRICS)); 对这个结构的成员函数进行设置 ncm.cbSize = sizeof(NONCLIENTMETRICS); //指定了ncm的大小 使用宏 VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm,0)); 其目的是方便调试,在Debug版本中,如果计算的表达式为0则中断程序,并打印出错误信息,如果在Release版本中,出现表达式为0的时候,则不做任何的处理,当没有发生::SystemParametersInfo调用系统函数,查询或是设置系统参数,或是修改用户的一个外观,返回值是一个BOOL类型 第一个参数是获取非客户区参数 第二个参数是整个的非客户区结构的大小 第三个参数是将获得到的信息保存在ncm这个地址中 第四个参数由于是为了获取信息写0即可,如果是设置信息为目的,就需要换成其它 参考MSDN 第二节课 在gh0stView.h中声明一个私有成员变量 公有成员可以被所有类访问 受保护成员只能在类内部或其子类可以访问 私有成员只能在类内部访问,其子类是不可以访问的 private: CListCtrl* m_pListCtrl; 私有的列表控件的指针,为什么要声明这个呢,我们之前提到了基类是CListView,因此在这个里声明了一个指针 CPP是执行文件,H是头文件 接下来对我们在CPP文件中声明的私有成员变量进行赋值 m_pListCtrl=&GetListCtrl(); GetListCtrl()这个函数的原型是 CListView::GetListCtrl CListCtrl& GetListCtrl() const; 得到一个和视图相关联的一个列表控件的引用 引用的使用方法:引用相当于是一个别名,周瑜和周公谨是一个人,引用和变量也相当于是

兄弟连Go语言+区块链技术培训以太坊源码分析(41)hashimoto源码分析

兄弟连Go语言+区块链技术培训以太坊源码分析(41)hash imoto源码分析 Hashimoto :I/O bound proof of work Abstract: Using a cryptographic hash function not as a proofofwork by i tself, but rather as a generator of pointers to a shared data set, allows for an I /O bound proof of work. This method of proof of work is difficult to optimize vi a ASIC design, and difficult to outsource to nodes without the full data set. The name is based on the three operations which comprise the algorithm: hash, shift, and modulo. 摘要:使用密码散列函数本身并不作为工作的证明, 而是作为指向共享数据集的指针生成器,允许I / O绑定 工作证明。这种工作证明方法很难通过ASIC设计来优化,并且在没有完整数据集的情况下很难外包给节点。这个名字是基于构成算法的三个操作:散列,移位和 模。 The need for proofs which are difficult to outsource and optimize 工作量证明难以外包和优化的需求 A common challenge in cryptocurrency development is maintaining decentr alization ofthe network. The use ofproofofwork to achieve decentralized consensus has b een most notably demonstrated by Bitcoin, which uses partial collisions with zero ofsha2 56, similar to hashcash. As Bitcoin’s popularity has grown, dedicated hardw are (currently applicati on specific integrated circuits, or ASICs) has been produced to rapidly iterate the hashbased proofofwork f unction. Newer projects similar to Bitcoin often use different algorithms for proofofwork, and often with the goal ofASIC

TINY部分源码分析报告

TINY源码分析 一、文件概述 MAIN.C: 主函数 GLOBALS.H:全局定义的文件 SCAN.C/SCAN.H: 词法分析 PARSE.C/PARSE.H:语法分析 UTIL.C/UTIL.H:构造树 SYMTAB.C/SYMTAB.H:符号表 CGEN.C/CGEN.H:生成"汇编代码" CODE.C/CODE.H:这个只是用来把分析过程输出到屏幕的. 二、各个文件的分析 1.MAIN.C: 主要有三个FILE*句柄: source--源代码文件。 listing--显示分析过程的文件,这里重定向到stdout。 code--目标汇编代码文件。 从该文件中可知程序运行的流程: 检查参数正确否(tiny.exe filename)->构造语法树(调用parse函数)->根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数。 2.GLOBALS.H: 定义了关键字个数8个。 定义了关键字,运算符等内容的枚举值。 定义了语句类型的枚举值,这个决定树的结点。

定义了变量类型(也就三种,void, integer, boolean)。定义了树的节点--这个最重要了!!其结构如下所示:typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode; 3.UTIL.C/UTIL.H 主要函数 TreeNode * newStmtNode(StmtKind kind) 此函数创建一个有关语法树的声明节点TreeNode * newExpNode(ExpKind kind) 此函数创建一个有关语法树的表述节点char * copyString(char * s) 此函数分配和创建一个新的已存在树的复制void printTree( TreeNode * tree ) 输出一个语法树 这两个文件主要是关于语法树的创建和输出 4.SCAN.c/SCAN.H 主要有这么几个函数:

JQUERY源码解析(架构与依赖模块)

jQuery设计理念 引用百科的介绍: jQuery是继prototype之后又一个优秀的Javascript框架。它是轻量级的js库,它兼容CSS3,还兼容各种浏览器(IE 6.0+,FF1.5+,Safari 2.0+,Opera9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。 The Write Less,Do More(写更少,做更多),无疑就是jQuery的核心理念,简洁的API、优雅的链式、强大的查询与便捷的操作。从而把jQuery打造成前端世界的一把利剑,所向披靡! 简洁的API: 优雅的链式: 强大的选择器: 便捷的操作:

为什么要做jQuery源码解析? 虽然jQuery的文档很完善,潜意识降低了前端开发的入门的门槛,要实现一个动画随手拈来,只要简单的调用一个animate方法传递几个执行的参数即可,但如果要我们自己实现一个定制的动画呢?我们要考虑的问题太多太多了,浏览器兼容、各种属性的获取、逻辑流程、性能等等,这些才是前端开发的基础核心。 如果我们只知道使用jQuery,而不知道其原理,那就是“知其然,而不知其所以然”,说了这么多,那就赶快跟着慕课网进入“高大上”之旅吧,深入来探究jQuery的内部架构! jQuery整体架构 任何程序代码不是一开始就复杂的,成功也不是一躇而蹴的,早期jQuery的作者John Resig 在2005年提议改进Prototype的“Behaviour”库时,只是想让其使用更简单才发布新的jQuery 框架。起初John Resig估计也没料想jQuery会如此的火热。我们可以看到从发布的第一个1. 0开始到目前最新的2.1.1其代码膨胀到了9000多行,它兼容CSS3,还兼容各种浏览器,jQu ery使用户能更方便地处理DOM、事件、实现动画效果,并且方便地为网站提供AJAX交互。 1、最新jQuery2.1.1版本的结构: 代码请查看右侧代码编辑器(1-24行) 2、jQuery的模块依赖网: (单击图片可放大)

区块链行业分析报告

区块链行业分析报告2020年4月

▍行业投资展望:政策持续支持区块链发展 本周币价迎来大幅提升,市场活跃度略降,预计后续币价将持续震荡。近期,Libra 2.0白皮书正式发布,与旧版相比主要有如下变化:新增单币种稳定币,建立全面的合规和风险管理框架。表明Libra 积极拥抱监管要求。 目前而言,我们认为布局区块链技术的行业龙头、信息技术公司、科技巨头公司有望享受红利。我们建议关注有一定技术储备且能将技术应用到所在行业的龙头公司:公有云巨头提供BaaS 基础设施,如阿里云、腾讯云、金山云等;计算机行业公司主攻各行业应用,应用领域重点推荐金融IT、司法行政信息化和数字货币标的:恒生电子、东方财富、华宇软件、数字认证。 风险因素:币价波动风险;政策落地低于预期;产业化应用低于预期;基础设施搭建缓慢等。 ▍本周市值走势:数字货币总市值提升1.63% 比特币市值走势:市值上升3.44% 本周(2020 年4 月11 日-4 月17 日,下同),流通中的比特币市值达1300.78 亿美元,较上周上升43.23 亿美元,环比+3.44%。 图1:过去一年里流通中的比特币总市值(单位:亿美元) 2,500 2,000 1,500 1,000 500 资料来源:https://www.wendangku.net/doc/76561944.html,,市场部

图 2:本周 TOP10 数字货币占总市值比例 其他数字货币市值 EOS 1% Tezos Binance Coin 1% 1% 11% Litecoin 2% Bitcoin SV 2% Bitcoin Cash Tether 2% 3% XRP 4% Ethereum 9% Bitcoin 64% 资料来源:coinmarketcap ,市场部 表 1:本周 TOP10 数字货币市值变化情况(截至 2020 年 4 月 17 日) # 1 2 3 4 5 6 7 8 9 10 数字货币 市值 本周环比 3.44% 8.44% 1.72% 0.59% 0.26% 4.22% 1.21% 14.54% 5.64% 10.61% 7.20% 16.57% 8.18% Bitcoin 130,078,472,088 18,976,660,194 8,385,919,739 6,403,916,828 4,294,640,509 3,571,876,826 2,758,454,401 2,447,383,046 2,432,528,733 1,487,405,266 180,837,257,630 22,923,198,157 203,760,455,787 Ethereum XRP Tether Bitcoin Cash Bitcoin SV Litecoin Binance Coin EOS Tezos top10 数字货币市值 其他数字货币市值 数字货币总市值 资料来源: coinmarketcap ,市场部 TOP10 数字货币市值走势:TOP 10 上升 7.20% 数字货币总市值提升 8.18%,TOP10 数字货币市值上升 7.20%。本周 TOP10 数字货 币总市值为 1808.37 亿美元。其中 BTC 稳居第一,占总市值比例为 64%;ETH 位列第二, 市值 189.76 亿,环比+8.44%,占总市值维持 9%;XRP 位列第三,市值为 83.85 亿美元, 环比+1.72%,占总市值维持 4%;Tether 位列第四,市值为 64.04 亿美元,环比+0.59%, 占总市值 3%;BCH 位列第五,市值为 42.95 亿美元,占总市值的比例维持 2%。 ▍ 数字货币行情走势:币价整体回升 BTC :币价微涨 3% 根据 coinmarketcap 数据,本周五收盘价为 7096.18 美元/个,单价较上周五上升 230.69 美元,环比 3.36%。本周日均交易量 518.93 万个币,环比-4.50%; 本日均成交

Linux操作系统源代码详细分析报告

Linux操作系统源代码详细分析 容简介: Linux 拥有现代操作系统所有的功能,如真正的抢先式多任务处理、支持多用户,存保护,虚拟存,支持SMP、UP,符合POSIX标准,联网、图形用户接口和桌面环境。具有快速性、稳定性等特点。本书通过分析Linux的核源代码,充分揭示了Linux作为操作系统的核是如何完成保证系统正常运行、协调多个并发进程、管理存等工作的。现实中,能让人自由获取的系统源代码并不多,通过本书的学习,将大大有助于读者编写自己的新程序。 第一部分 Linux 核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 arch/i386/kernel/irq.h 19 arch/i386/kernel/process.c 22 arch/i386/kernel/signal.c 30 arch/i386/kernel/smp.c 38 arch/i386/kernel/time.c 58 arch/i386/kernel/traps.c 65 arch/i386/lib/delay.c 73 arch/i386/mm/fault.c 74 arch/i386/mm/init.c 76 fs/binfmt-elf.c 82 fs/binfmt_java.c 96 fs/exec.c 98 include/asm-generic/smplock.h 107 include/asm-i386/atomic.h 108 include/asm-i386/current.h 109 include/asm-i386/dma.h 109 include/asm-i386/elf.h 113 include/asm-i386/hardirq.h 114 include/asm-i386/page.h 114 include/asm-i386/pgtable.h 115 include/asm-i386/ptrace.h 122 include/asm-i386/semaphore.h 123 include/asm-i386/shmparam.h 124 include/asm-i386/sigcontext.h 125 include/asm-i386/siginfo.h 125 include/asm-i386/signal.h 127 include/asm-i386/smp.h 130 include/asm-i386/softirq.h 132 include/asm-i386/spinlock.h 133 include/asm-i386/system.h 137 include/asm-i386/uaccess.h 139

APP项目功能和架构分析

APP项目功能和架构分析 2016 年2 月12 日提交 提交人: 电话: Email: Wechat: Reverb 项目功能和架构分析 (1) 项目目标............................................................................................................................................... (3) 平台类型 (3) 项目周期: (3) 交付内容............................................................................................................................................... (4) 功能描述............................................................................................................................................... ...5 (5) (7) (9) 开发计划............................................................................................................................................... .10 付款计划............................................................................................................................................... .11 团队项目经验介绍 (12) 项目可能用到的技术内容 (15) 项目目标 平台类型 Web 网站 iOS 端

中国区块链政策现状及趋势分析报告

中国区块链政策现状及趋 势分析报告 2019 年8 月

目录 摘要 (2) 一、区块链政策主要现状及发展历程 (3) (一)中国区块链政策出台背景 (3) (二)区块链监管政策从出台到规范 (4) (三)各省出台相关政策加速行业发展 (7) (四)区块链技术标准和政策日渐完善 (9) 二、中央单位区块链政策 (11) 三、各省市区块链政策 (14) 四、中国区块链监管政策方向及趋势 (25) (一)用区块链技术监管区块链 (25) (二)监管科技和合规科技渐趋成熟 (27) (三)四层监管趋势 (30) (四)监管方向朝着规范全面的方向发展 (32) 五、中国区块链扶持政策方向及趋势 (33) (一)夯实区块链产业发展基础 (33) (二)从四个层面鼓励区块链技术发展 (36) (三)鼓励培育发展区块链新业态 (40) (四)鼓励区块链与实体经济深度融合 (42)

中国区块链政策现状及趋势分析报告 人民创投区块链研究院1 摘要 自 2008 年中本聪发表《比特币:一种点对点的电子现金系统》以来,比特币所采用的区块链底层技术已经发展十多年。近年来,区块链技术在全球范围内受到了极大的关注。各国政府在区块链技术领域积极发力。2016 年,国务院发布《“十三五”国家信息化规划》首次将区块链纳入新技术范畴并作前沿布局,标志着我国开始推动区块链技术和应用发展。此后,中央和地方纷纷出台了相关监管或扶持政策(地方政策偏扶持类),为区块链技术和产业发展营造了良好的政策环境。 本报告主要是从中央顶层设计到地方发展规划,从技术创新到落地应用,从专项政策到配套政策,对中国区块链行业相关政策进行了详细的回顾、总结和趋势分析。该报告第一部分梳理了中国区块链政策主要现状及发展历程,理清区块链政策发展路径;第二部分和第三部分主要对我国区块链政策进行了全方位的盘点和梳理,以全面了解中央和地方区块链政策现状;第四部分和第五部分主要是基于前三部分的内容,对我国区块链监管政策和扶持政策的方向和趋势做了

相关文档
相关文档 最新文档