Пример #1
0
void LineEdit(){
	// P50 算法3.2 行编辑程序
	// #:退格 @:退行
	// 利用字符栈S,从终端接收一行并传送至调用过程的数据区
	SqStack S;
	InitStack(S);
	SElemType e;
	char ch = getchar();
	while (ch != EOF){
		while (ch != EOF && ch != '\n'){
			switch (ch){
				case'#': 
					Pop(S, e);
					break;
				case'@':
					ClearStack(S);
					break;
				default:
					Push(S, ch);
					break;
			}
			ch = getchar();	//从终端接收下一个字符
		}
		StackTraverse(S, Visit_Display_Char);
		ClearStack(S);
		if (ch != EOF) ch = getchar();
	}
	DestroyStack(S);
}// LineEdit
Пример #2
0
void lineEdit() {
	SqStack S;
	InitStack(S);
	char ch;
	ch = getchar();
	ElemType e;
	while (ch != EOF) {
		while (ch != EOF && ch != '\n') {
			switch (ch) {
			case '#': 
				Pop(S, e);
				break;
			case '@':
				ClearStack(S);
				break;
			default:
				e.key = ch;
				Push(S, e);
				break;
			}
			ch = getchar();
		}

		PrintStack(S);
		ClearStack(S);
		if (ch != EOF) ch = getchar();
	}
	DestroyStack(S);
}
Пример #3
0
 void LineEdit()
 { /* 利用字符栈s,从终端接收一行并送至调用过程的数据区。算法3.2 */
   SqStack s;
   char ch,c;
   InitStack(&s);
   printf("请输入一个文本文件,^Z结束输入:\n");
   ch=getchar();
   while(ch!=EOF)
   { /* EOF为^Z键,全文结束符 */
     while(ch!=EOF&&ch!='\n')
     {
       switch(ch)
       {
         case '#':Pop(&s,&c);
                  break; /* 仅当栈非空时退栈 */
         case '@':ClearStack(&s);
                  break; /* 重置s为空栈 */
         default :Push(&s,ch); /* 有效字符进栈 */
       }
       ch=getchar(); /* 从终端接收下一个字符 */
     }
     StackTraverse(s,copy); /* 将从栈底到栈顶的栈内字符传送至文件 */
     ClearStack(&s); /* 重置s为空栈 */
     fputc('\n',fp);
     if(ch!=EOF)
       ch=getchar();
   }
   DestroyStack(&s);
 }
Пример #4
0
//********************
void main_LineEdit(){
	SeqStack S;
	char ch;
	DataType e;
	DataType a[50];
	int i,j=0;
	InitStack(&S);
	printf("输入字符序列(#表示前一个字符无效,@表示当前行字符无效).\n");
	ch=getchar();
	while(ch!='\n'){
		switch(ch){
		case '#':
			if(!StackEmpty(S))
				PopStack(&S,&ch);
			break;
		case '@':
			ClearStack(&S);
			break;
		default:
			PushStack(&S,ch);
		}
		ch=getchar();
	}
	while(!StackEmpty(S)){
		PopStack(&S,&e);
		a[j++]=e;
	}
	for(i=j-1;i>=0;i--)
		printf("%c",a[i]);
	printf("\n");
	ClearStack(&S);
	system("pause");
}
Пример #5
0
 static void LineEdit()
 { // 利用字符栈s,从终端接收一行并送至调用过程的数据区。算法3.2
   SqStack s;
   char ch,c;
   InitStack(s);
   printf("请输入一个文本文件,^Z结束输入:\n");
   ch=getchar();
   while(ch!=EOF)
   { // EOF为^Z键,全文结束符
     while(ch!=EOF&&ch!='\n')
     {
       switch(ch)
       {
         case '#':Pop(s,c);
                  break; // 仅当栈非空时退栈
         case '@':ClearStack(s);
                  break; // 重置s为空栈
         default :Push(s,ch); // 有效字符进栈
       }
       ch=getchar(); // 从终端接收下一个字符
     }
     StackTraverse(s,copy); // 将从栈底到栈顶的栈内字符传送至文件
     ClearStack(s); // 重置s为空栈
     fputc('\n',fp);
     if(ch!=EOF)
       ch=getchar();
   }
   DestroyStack(s);
 }
Пример #6
0
 void LineEdit()
 { // 利用字符栈s,从终端接收一行并送至调用过程的数据区。算法3.2
   SqStack s;
   char ch,c;
   int n,i;
   InitStack(s);
   scanf("%d",&n);  //多case
   ch=getchar();
   for(i=1;i<=n;i++)
   { ch=getchar();
     while(ch!='\n')
    {
       switch(ch)
       {
         case '#':Pop(s,c);
                  break; // 仅当栈非空时退栈
         case '@':ClearStack(s);
                  break; // 重置s为空栈
         default :Push(s,ch); // 有效字符进栈
       }
       ch=getchar(); // 从终端接收下一个字符
     }
     StackTraverse(s,visit); // 将从栈底到栈顶的栈内字符输出
    ClearStack(s); // 重置s为空栈
    }
   DestroyStack(s);
 }
Пример #7
0
void LineEdit() {  // 算法3.2
  //利用字符栈S,从终端接收一行并传送至调用过程的数据区。
  char ch,*temp;
  SqStack S;
  InitStack(S);       //构造空栈S
  printf("请输入一行(#:退格;@:清行):\n");
  ch = getchar();     //从终端接收第一个字符
  while (ch != EOF) { //EOF为全文结束符
    while (ch != EOF && ch != '\n') {
      switch (ch) {
        case '#': Pop(S, ch);    break;  // 仅当栈非空时退栈
        case '@': ClearStack(S); break;  // 重置S为空栈
        default : Push(S, ch);   break;  // 有效字符进栈,未考虑栈满情形
      }
      ch = getchar();  // 从终端接收下一个字符
    }	
    temp=S.base;
    while(temp!=S.top) {
      printf("%c",*temp);	      	
      ++temp;
    }		
    // 将从栈底到栈顶的栈内字符传送至调用过程的数据区;
    ClearStack(S);      // 重置S为空栈
    printf("\n");
    if (ch != EOF) {
      printf("请输入一行(#:退格;@:清行):\n");
      ch = getchar();
    }
  }
  DestroyStack(S);
}
Пример #8
0
void LineEdit()
{
	SqStack s;
	char ch;

	InitStack(s);
	printf("请输入一个文本文件,^Z结束输入:\n");
	ch = getchar();
	while (ch != EOF) {
		while (ch != EOF && ch != '\n') {
			switch (ch) {
			case '#': if (!StackEmpty(s))
					Pop(s, ch);
				break;
			case '@': ClearStack(s);
				break;
			default: Push(s, ch);
			}
			ch = getchar();
		}
		StackTraverse(s, copy);
		fputc('\n', fp);
		ClearStack(s);
		if (ch != EOF)
			ch = getchar();
	}
	DestroyStack(s);
}
Пример #9
0
int main () 
{
  stackADT operandStack;
  string line;
  char ch;

  printf("RPN kalkulator -- symulacja (napisz H aby otrzymać pomoc)\n");
  operandStack=NewStack();
  while (TRUE) {
    printf("> ");
    line=GetLine();
    ch=toupper(line[0]);
    switch (ch) {
      case 'Q': exit(0);
      case 'H': HelpCommand(); break;
      case 'C': ClearStack(operandStack); break;
      case 'D': DisplayStack(operandStack); break;
      default: if (isdigit(ch))
          Push(operandStack, StringToReal(line));
        else
          ApplyOperator(ch, operandStack);
        break;
    }
  }
}
Пример #10
0
int main()
{
    int j;
    SqStack s;
    int e;
    if(InitStack(&s)==OK)
    {
    	for(j=1; j<=10; j++)
        	Push(&s,j);		
	}
                
    printf("Õ»ÖÐÔªËØÒÀ´ÎΪ£º");
    StackTraverse(s);
    
    Pop(&s,&e);
    printf("µ¯³öµÄÕ»¶¥ÔªËØe=%d\n",e);
    
    printf("Õ»¿Õ·ñ£º%d(1:¿Õ0:·ñ)\n",StackEmpty(s));
    
    GetTop(s,&e);
    printf("Õ»¶¥ÔªËØe=%dÕ»µÄ³¤¶ÈΪ%d\n",e,StackLength(s));
    
    ClearStack(&s);
    printf("Çå¿ÕÕ»ºó£¬Õ»¿Õ·ñ£º%d(1:¿Õ0:·ñ)\n",StackEmpty(s));
    
    return 0;
}
Пример #11
0
/*---------------------------------------------------------------
 *  allocate the stack, set the maximum and minimum bounds
 *  on the stack, and show that the stack is empty.
 *-------------------------------------------------------------*/
Stack *CreateStack ( int how_many )
{
    Stack *pstk;

    assert ( how_many > 0 );    /* make sure the size is legal */

    pstk = (Stack *) malloc ( sizeof ( Stack ));
    if ( pstk == NULL )
        return ( NULL );

    pstk->stack_size = how_many;

    pstk->base = ( struct StkElement * )
                 malloc ( how_many * sizeof ( struct StkElement ));

    if ( pstk->base == NULL ) /* error in allocating stack */
        return ( NULL );

    pstk->min_stack = 0;
    pstk->max_stack = how_many - 1;

    ClearStack ( pstk );

    return ( pstk );
}
Пример #12
0
int main()
{
	int j;
	SqStack s;
	SElemType e;

	if( InitStack(&s) == OK )
		for(j = 1; j <= 9; j++)
			Push(&s, j);

	printf("The items in the stack is: \n");
	StackTraverse(s, visit);

	Pop(&s, &e);
	printf("The item popped is: %d\n", e);
	printf("\n");

	printf("The stack is empty now? empty:1, not empty:0\t%d\n", StackEmpty(s));
	printf("\n");

	GetTop(s, &e);
	printf("The item at the top of the stack is: %d, the length of the stack is: %d\n",e, StackLength(s));
	printf("\n");

	ClearStack(&s);
	printf("The stack cleared, is the stack empty? empty:1, not empty:0, %d\n", StackEmpty(s));
	printf("\n");

	DestroyStack(&s);
	
	return 0;
}
Пример #13
0
Status scanner(char* c){
	LinkStack* stack = NULL;
	InitStack(&stack);
	Status ret = FALSE;
	int i = 0;
	while(c[i] != '\0'){
		elemType e;
		if( isLeft(c[i]) ){
			Push(stack,(elemType)c[i]);
		}
		if(isRight(c[i])){
			char codeOut;
			Pop(stack,&e);
			codeOut = (char)e;
			if(!isMatch(codeOut,c[i])){
				printf("not matching %c %c\n",codeOut,c[i]);
				ret = FALSE;
				goto EXIT;
			}
		}
		i++;
	}

	if(StackEmpty(stack)){
		ret = TRUE;
	}else{
		ret = FALSE;
	}

EXIT:
	ClearStack(&stack);
	return ret;
}
Пример #14
0
void LineEdit()
{
	char ch, c;
	SqStack s;

	InitStack(&s);
	ch = getchar();

	while (ch != EOF) {
		while ((ch != EOF) && (ch != '\n')) {
			switch (ch) {
			case '#':
				Pop(&s, &c);
				break;
			case '@':
				ClearStack(&s);
				break;
			default:
				Push(&s, ch);
				if (ch == EOF)
					printf("\n push eof\n");
				break;
			}
			ch = getchar();
		}
		// '\n' detected, send out and clear whole stack 
		if (ch == '\n') {
			StackTraverse(s, sendToFile);
			fputc('\n', fp);
			ClearStack(&s);
			ch = getchar();
		} else if (ch == EOF) {
			StackTraverse(s, sendToFile);
			ClearStack(&s);
			printf(" now exit\n");
		}
		/* if (ch == '\n') */
		/* 	fputc('\n', fp); */
		/* if (ch != EOF) */
		/* 	ch = getchar(); */
		/* else */
		/* 	printf("ch == eof, should exit\n"); */
	}
	DestroyStack(&s);
}
Пример #15
0
int main()
{
	Stack s;
	ElemType x;
	cout<<"(1)³õʼ»¯Õ»s"<<endl;
	InitStack(s);
	cout<<"(2)ջΪ"<<(StackEmpty(s)?"¿Õ":"·Ç¿Õ")<<endl;
	cout<<"(3)ÒÀ´ÎÊäÈë×ÖĸÐòÁУ¬ÒÔ¡°#¡±½áÊø£º"<<endl;
	cin>>x;
	while( x!='#')
	{
		Push(s,x);
		cin>>x;
	}
	cout<<"(4)ջΪ"<<(StackEmpty(s)?"¿Õ":"·Ç¿Õ")<<endl;
	cout<<"(5)Õ»³¤¶ÈStackLength(s):"<<StackLength(s)<<endl;
	cout<<"(6a)Õ»¶¥ÔªËØGetTop(s)Ϊ£º";
	cout<<GetTop(s)<<endl;
	cout<<"(6b)Õ»¶¥ÔªËØGetTop1(s,x)Ϊ£º"<<endl;
	GetTop1(s,x);
	cout<<x<<endl;
	cout<<"(7)´ÓÕ»¶¥µ½Õ»µ×ÔªËØPrintStack(s)Ϊ£º"<<endl;
	PrintStack(s);
	cout<<"(8)³öÕ»Pop1(s,x)µÄÔªËØΪ£º"<<endl;
	Pop1(s,x);
	cout<<x<<endl;
	cout<<"(9)³öÕ»ÐòÁÐ:"<<endl;
	while(!StackEmpty(s))
    {
        cout<<Pop(s)<<" ";
    }
    cout<<endl;
    cout<<"(10)ջΪ:"<<(StackEmpty(s)?"¿Õ":"·Ç¿Õ")<<endl;
    cout<<"(11)ÒÀ´Î½øÕ»ÔªËØa,b,c:"<<endl;
    Push(s,'a');
    Push(s,'b');
    Push(s,'c');
    cout<<"(12)´ÓÕ»¶¥µ½Õ»µ×ÔªËØPrintStack(s)Ϊ£º"<<endl;
    PrintStack(s);
    cout<<"(13)Çå¿ÕÕ»ClearStack(s)"<<endl;
    ClearStack(s);
    cout<<"(14)ջΪ"<<(StackEmpty(s)?"¿Õ":"·Ç¿Õ")<<endl;
    cout<<"(15)Ïú»ÙÕ»s:"<<endl;
    DestoryStack(s);
    cout<<"(16)Ïú»ÙÕ»ºóµ÷ÓÃPush(s,e)ºÍPrintStack(s)"<<endl;
    Push(s,'e');
    PrintStack(s);
	return 0;
}
Пример #16
0
void CObjectOStream::Close(void)
{
    if (m_Fail != fNotOpen) {
        try {
            DefaultFlush();
            if ( m_Objects )
                m_Objects->Clear();
            ClearStack();
            m_Fail = fNotOpen;
        }
        catch (CException& exc) {
            if ( InGoodState() )
                RethrowError(fWriteError, "cannot close output stream",exc);
        }
    }
}
Пример #17
0
int main() {
	LinkStack S;
	int result;
	pNode node, topNode;

	//0. InitStack
	InitStack(S);
	if (!S) {
		printf("Init Stack failed!\n");
		return -1;
	}
	PrintStack(S);

	//1. Push
	printf("\n");
	PrintStack(S);
	printf("Push Stack\n");
	node = CreateNode(5);
	if (!node) {
		printf("Create Node failed\n");
		return -1;
	}
	Push(S, node);
	PrintStack(S);
	topNode = Top(S);
	PrintNode(topNode);

	//2. Pop
	printf("\n");
	PrintStack(S);
	if (!StackEmpty(S)) {
		printf("Pop Stack\n");
		Pop(S);
	}
	PrintStack(S);

	//3. Clear
	printf("\n");
	PrintStack(S);
	if (!StackEmpty(S)) {
		printf("Clear Stack\n");
		ClearStack(S);
	}
	PrintStack(S);
}
int main()
{
        int j;
        LinkStack s;
        int e;
        if(InitStack(&s)==OK)
                for(j=1;j<=10;j++)
                        Push(&s,j);
        printf("栈中元素依次为:");
        StackTraverse(s);
        Pop(&s,&e);
        printf("弹出的栈顶元素 e=%d\n",e);
        printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
        GetTop(s,&e);
        printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
        ClearStack(&s);
        printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
        return 0;
}
Пример #19
0
 void main()
 {
   int j;
   LinkStack s;
   SElemType e;
   if(InitStack(&s))
     for(j=1;j<=5;j++)
       Push(s,2*j);
   printf("栈中的元素从栈底到栈顶依次为: ");
   StackTraverse(s,print);
   Pop(s,&e);
   printf("弹出的栈顶元素为%d\n",e);
   printf("栈空否: %d(1:空 0:否)\n",StackEmpty(s));
   GetTop(s,&e);
   printf("当前栈顶元素为%d,栈的长度为%d\n",e,StackLength(s));
   ClearStack(s);
   printf("清空栈后,栈空否: %d(1:空 0:否),栈的长度为%d\n",StackEmpty(s),StackLength(s));
   printf("是否销毁栈了: %d(1:是 0:否)\n",DestroyStack(&s));
 }
Пример #20
0
void testBasicStack() {
	SqStack S;
	InitStack(S);
	if (StackEmpty(S)) printf("the Stack S is Empty");
	PrintStack(S);
	printf("add item to the stack.\n");
	CreateStack(S);
	PrintStack(S);
	printf("pop the top of the stack:\n");
	ElemType e;
	Pop(S, e);
	PrintStack(S);
	printf("the element that is popped out: %d\n", e.key);
	ClearStack(S);
	printf("clear the stack:\n");
	PrintStack(S);
	printf("destroy the stack:\n");
	DestroyStack(S);
	PrintStack(S);
}
Пример #21
0
int main(void) {
Stack s;
StackEntry e;

CreateStack(&s); //for intializing the stack

if (!StackFull(&s))
    Push (e, &s);

if (!StackEmpty(&s))
	Pop (&e, &s);

if (!StackEmpty(&s))
	StackTop (&e, &s);

x = StackSize (&s);

ClearStack (&s);

return 0;

}
Пример #22
0
int main (int argc, char **argv) {
	LiStack *st;
	car_t c1, c2;
	c1.num = 1;
	c1.time = 3;
	c2.num = 2;
	c2.time = 4;
	InitStack (st);
	Push (st, c1);
	Push (st, c2);
	DispStack (st);
	Delete (st, c1);
	DispStack (st);
	c1.num = 4;
	c1.time = 1;
	Push (st, c1);
	DispStack (st);
	Delete (st, c2);
	DispStack (st);
	ClearStack (st);
	return 0;
}
Пример #23
0
void
Permute(Stack *out, Stack *in, Stack *spur)
{
  Stack *temp_out;
  Stack *temp_spur;
  Stack *temp_in; /* the backups. */

  if (StackEmpty(out)) {
	
	while (!StackEmpty(spur))
	  SendTrain(in, spur);
	
	TraverseStack(in, PrintEntry); /* A mode is detected, */
	total++;                       /* then print out the results.*/ 
	ClearStack(in);                /* release the memory. */
#ifdef __TRAVERSE__
	printf("\n");
#endif
  } else {

	if (1 - frame_depth % 2) { /* To decide how to send trains. */
	  SendTrain(spur, out);    /* If 'frame_depth' is odd, */
	} else {                   /* 'out' to 'spur'. If 'frame_depth */
	  SendTrain(in, spur);     /* is even, 'spur' to 'in'. */
	}
	
	temp_out = BackUp(out);
	temp_spur = BackUp(spur);
	temp_in = BackUp(in);
	frame_depth++; /* To enter into a new recursion. */
	Permute(temp_out, temp_in, temp_spur);
	frame_depth--; /* Now back to the higher level of recursion. */

	if (!StackEmpty(out) && !StackEmpty(spur))
	  Permute(out, in, spur);
  }
}
Пример #24
0
int main(int argc, const char *argv[])
{
	LinkStack *testList = NULL;
	elemType e;
	int i;
	srand(time(0));
	printf("list length is %d\n",StackLength(testList));
	if(InitStack(&testList) == ERROR){
		return -1;
	}
	for(i = 0; i < 10 ; i++){
		Push(testList,i);
	}
	printf("list length is %d\n",StackLength(testList));
	PrintStack(testList);
	Pop(testList,&e);
	printf("pop e is %d ,length is %d \n",e,StackLength(testList));
	ClearStack(&testList);
	printf("list length is %d\n",StackLength(testList));

	printf("scanner: is it matching? ");
	scanner("hello(){}") ? printf("true \n"):printf("false \n");
	return 0;
}
Пример #25
0
/*
* @description 销毁栈
*/
void DestoryStack(SqStack *S) {
	ClearStack(S);

	(*S).top = (*S).base = NULL;
}
Пример #26
0
bool DestroyStack(SqStack &S)
{
	ClearStack(S);

	return true;
}
Пример #27
0
Stack::~Stack()
{
    ClearStack();
}
Пример #28
0
BOOL RSAKey::GenKey(DWORD dwFlags)
{
    DWORD dwBitLen;
    DWORD dwByteLen1;
    DWORD dwByteLen2;
    DWORD dwBufferSize1;
    DWORD dwBufferSize2;
    BYTE *pb;

    dwBitLen = dwFlags >> 16;

    // use the default if not specified
    if (dwBitLen == 0)
        dwBitLen = 1024;

    if ((dwBitLen % 16 != 0) || 
        (dwBitLen > 16384))
    {
        SetLastError(NTE_BAD_FLAGS);
        return FALSE;
    }
    m_dwBitLen = dwBitLen;

    dwByteLen1 = dwBitLen / 8;
    dwByteLen2 = dwByteLen1 / 2;

    dwBufferSize1 = BigNum::GetBufferSize(dwByteLen1);
    dwBufferSize2 = BigNum::GetBufferSize(dwByteLen2);

    m_dwSize = BigNum::GetBufferSize(sizeof(DWORD)) + 
            (2 * dwBufferSize1 + 5 * dwBufferSize2);
    pb = (BYTE*)malloc(m_dwSize);
    if (pb == NULL)
    {
        SetLastError(ERROR_OUTOFMEMORY);
        return FALSE;
    }
    m_pBlob = pb;

    m_pExponent = (BigNum*)pb;
    pb += BigNum::GetBufferSize(sizeof(DWORD));

static const BYTE c_DefaultExponent[4] = { 1, 0, 1, 0 };
    BigNum::SetBytes(m_pExponent, c_DefaultExponent, sizeof(DWORD));

#define HELPER(m_pMember, size) \
    m_pMember = (BigNum*)pb; \
    pb += dwBufferSize##size;

    HELPER(m_pModulus, 1);

    HELPER(m_pPrime1, 2);
    HELPER(m_pPrime2, 2);
    HELPER(m_pExponent1, 2);
    HELPER(m_pExponent2, 2);
    HELPER(m_pCoefficient, 2);
    HELPER(m_pPrivateExponent, 1);
#undef HELPER

    if (!GenerateKey())
    {
        ClearStack();
        return FALSE;
    }

    if (!CheckKey())
    {                       
        SetLastError(E_UNEXPECTED);
        _ASSERTE(false);

        ClearStack();
        return FALSE;
    }        

    GetProvider()->SetSignatureKey(this);
    return TRUE;
}
Пример #29
0
BOOL RSAKey::ImportKey(DWORD dwFlags, CONST BYTE *pbData, DWORD dwDataLen)
{            
    BOOL bPrivate;
    DWORD dwBitLen;
    DWORD dwByteLen1;
    DWORD dwByteLen2;
    DWORD dwBufferSize1;
    DWORD dwBufferSize2;
    BYTE *pb;
    BLOBHEADER *pBlobHeader;
    RSAPUBKEY* pRSAPubKey;

    _ASSERTE(dwDataLen >= sizeof(BLOBHEADER));
    pBlobHeader = (BLOBHEADER*)pbData;

    pbData += sizeof(BLOBHEADER);
    dwDataLen -= sizeof(BLOBHEADER);

    switch (pBlobHeader->bType)
    {
    case PUBLICKEYBLOB:
        bPrivate = FALSE;
        break;
    case PRIVATEKEYBLOB:
        bPrivate = TRUE;
        break;
    default:
        goto BadKey;
    }

    if (dwDataLen < sizeof(RSAPUBKEY))
    {
        goto BadKey;
    }
    pRSAPubKey = (RSAPUBKEY*)pbData;

    pbData += sizeof(RSAPUBKEY);
    dwDataLen -= sizeof(RSAPUBKEY);

    if (GET_UNALIGNED_VAL32(&pRSAPubKey->magic) != 
        (bPrivate ? 0x32415352U : 0x31415352U)) // 'RSA2' : 'RSA1'
    {
        goto BadKey;
    }

    dwBitLen = GET_UNALIGNED_VAL32(&pRSAPubKey->bitlen);

    if ((dwBitLen == 0) ||
        (dwBitLen % 16 != 0) ||
        (dwBitLen > 16384))
    {
        goto BadKey;
    }
    m_dwBitLen = dwBitLen;

    dwByteLen1 = dwBitLen / 8;
    dwByteLen2 = dwByteLen1 / 2;

    if (dwDataLen != (bPrivate ? (9 * dwByteLen2) : dwByteLen1))
    {
        goto BadKey;
    }

    dwBufferSize1 = BigNum::GetBufferSize(dwByteLen1);
    dwBufferSize2 = BigNum::GetBufferSize(dwByteLen2);

    m_dwSize = BigNum::GetBufferSize(sizeof(DWORD)) + 
            (bPrivate ? (2 * dwBufferSize1 + 5 * dwBufferSize2) : dwBufferSize1);
    pb = (BYTE*)malloc(m_dwSize);
    if (pb == NULL)
    {
        SetLastError(ERROR_OUTOFMEMORY);
        return FALSE;
    }
    m_pBlob = pb;

    m_pExponent = (BigNum*)pb;
    pb += BigNum::GetBufferSize(sizeof(DWORD));
    BigNum::SetBytes(m_pExponent, (BYTE*)&pRSAPubKey->pubexp, sizeof(DWORD));

#define HELPER(m_pMember, size) \
    m_pMember = (BigNum*)pb; \
    pb += dwBufferSize##size; \
    BigNum::SetBytes(m_pMember, pbData, dwByteLen##size); \
    pbData += dwByteLen##size;

    HELPER(m_pModulus, 1);

    if (!bPrivate)
        return TRUE;

    HELPER(m_pPrime1, 2);
    HELPER(m_pPrime2, 2);
    HELPER(m_pExponent1, 2);
    HELPER(m_pExponent2, 2);
    HELPER(m_pCoefficient, 2);
    HELPER(m_pPrivateExponent, 1);
#undef HELPER

    if (!CheckKey())
    {
        ClearStack();
        goto BadKey;
    }

    ClearStack();

    GetProvider()->SetSignatureKey(this);
    return TRUE;

BadKey:
    SetLastError(NTE_BAD_KEY);
    return FALSE;
}
Пример #30
0
int main(void)
{
	int select;		/*保存选择变量*/
	Elem e;			/*保存从函数返回的结点的值*/
	Elem v;			/*保存传递给函数的结点的值*/
	
	size_t i= 0;
	LINKSTACK S;
	InitStack(&S);	/*初始化栈*/

	srand((int)time(NULL));

	while (1)	/*while_@1*/
	{
		if (!(S.pBottom))
		{
			printf("栈不存在!\n");
			break;
		}

		system("cls");
		Menu();

		printf("请输入您的选择(1~9):");
		scanf("%d", &select);
		getchar();

		switch (select)	/*switch_@1*/
		{
		case 1:			/*入栈.*/
			v = InputValue("入栈元素为:");
			Push(&S, v);
			printf("入栈操作成功!\n");
			
			getchar();
			break;
		case 2:			/*输出栈中元素.*/
			printf("栈为:");
			TraveStack(&S);
			
			getchar();
			break;
		case 3:			/*出栈.*/
			if (OK == Pop(&S, &e))
			{
				printf("出栈成功,出栈元素是%d!\n", e);
			}
			else
			{
				printf("出栈失败!\n");
			}

			getchar();
			break;

		case 4:			/*输出栈的长度.*/
			printf("栈长为: %d \n", StackLength(&S));
			
			getchar();
			break;

		case 5:			/*清空栈.*/
			ClearStack(&S);
			printf("该栈已经清空!\n");
			
			getchar();
			break;
	
		case 6:			/*销毁栈.*/
			DestroyStack(&S);
			printf("栈已删除!\n");
			
			getchar();	
			break;
			
		case 7:			/*返回栈顶结点元素.*/
			if (OK == GetTop(&S, &e))
			{
				printf("栈顶为:%d\n", e);
			}
			else
			{
				printf("不存在栈顶元素!\n");
			}

			getchar();	
			break;

		case 8:			/*判断栈是否为空.*/
			if (StackEmpty(&S) == TRUE)
			{
				printf("栈为空!\n");
			}
			else
			{
				printf("栈非空!\n");
			}

			getchar();	
			break;

		case 9:			/*进制转换*/
			{
				int d;
				unsigned int m, n;
				v = InputValue("请输入一个非负整数:");
				d = InputValue("请输入转换进制:");
				if (v < 0 ||d<2 ||d>16)
				{
					printf("输入数据错误!\n");
					break;
				}
				
				m = (unsigned int)v;
				n = (unsigned int)d;
				Conversion_ten_to_n(m, n);
			
				getchar();
				break;
			}

		default:
			printf("请重新选择!\n");
			
			getchar();
			break;
		}/*switch_@1*/

	}	/*while_@1*/
	
	return EXIT_SUCCESS;
}