⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sscanf.c

📁 freedos32的源代码
💻 C
字号:
/* Project:     OSLib * Description: The OS Construction Kit * Date:                1.6.2000 * Idea by:             Luca Abeni & Gerardo Lamastra * * OSLib is an SO project aimed at developing a common, easy-to-use * low-level infrastructure for developing OS kernels and Embedded * Applications; it partially derives from the HARTIK project but it * currently is independently developed. * * OSLib is distributed under GPL License, and some of its code has * been derived from the Linux kernel source; also some important * ideas come from studying the DJGPP go32 extender. * * We acknowledge the Linux Community, Free Software Foundation, * D.J. Delorie and all the other developers who believe in the * freedom of software and ideas. * * For legalese, check out the included GPL license. */#include <ll/i386/stdlib.h>#include <ll/i386/string.h>#include <ll/i386/limits.h>#include <ll/stdarg.h>#include <ll/ctype.h>#include "sprintf.h"FILE(sscanf);#define STD_SIZE	0#define SHORT_SIZE	1#define LONG_SIZE	2int vsscanf(char *buf,char *fmt,va_list parms){    int scanned = 0,size = 0,suppress = 0;    int w = 0,flag = 0,l = 0;    char c,*c_ptr;    long int n1,*n1l;        int *n1b;    short int *n1s;    long unsigned n2,*n2l,parsing = 0;    unsigned *n2b;    short unsigned *n2s;    double n3,*n3l;    float *n3s;    char *base = buf;    while (*fmt != 0) {	if (*fmt != '%' && !parsing) {	    /* No token detected */	    fmt++;	}	else {	    /* We need to make a conversion */	    if (*fmt == '%') {		fmt++;		parsing = 1;		size = STD_SIZE;		suppress = 0;		w = 0;		flag = 0;		l = 0;	    }	    /* Parse token */	    switch(*fmt) {		case '1' :		case '2' :		case '3' :		case '4' :		case '5' :		case '6' :		case '7' :		case '8' :		case '9' :		case '0' : if (parsing == 1) {		    	      w = strtou(fmt,10,&base);			      /* We use SPACE_PAD to parse %10s			         commands where the number is the				 maximum number of char to store!			      */			      flag |= SPACE_PAD;			      fmt = base-1;			   }			   break;		case 'c' : c = *buf++;			   c_ptr = va_arg(parms, char *);			   *c_ptr = c;			   scanned++;			   parsing = 0;			   break;		case 's' : c_ptr = va_arg(parms, char *);			   while (*buf != 0 && isspace(*buf)) buf++;			   l = 0;			   while (*buf != 0 && !isspace(*buf)) {			       if (!(flag & SPACE_PAD)) *c_ptr++ = *buf;			       else if (l < w) {				   *c_ptr++ = *buf;				   l++;			       }			       buf++;	     			   }			   *c_ptr = 0;			   scanned++;			   parsing = 0;			   break;		case 'i' :		case 'd' : buf = strscn(buf,"1234567890-+");			   n1 = strtoi(buf,10,&base);			   buf = base;			   if (!suppress) {			       switch (size) {				   case STD_SIZE : n1b = va_arg(parms, int *);						   *n1b = (int)n1;						   break;				   case LONG_SIZE : n1l = va_arg(parms, long int *);				   		    *n1l = n1;						    break;				   case SHORT_SIZE : n1s = va_arg(parms, short int *);						     *n1s = (short)(n1);						     break;			       }			       scanned++;			   }			   parsing = 0;			   break;		case 'u' : buf = strscn(buf,"1234567890");			   n2 = strtou(buf,10,&base);			   buf = base;			   if (!suppress) {			      switch (size) {				  case STD_SIZE : n2b = va_arg(parms, unsigned *);				  		  *n2b = (unsigned)n2;						  break;				  case LONG_SIZE : n2l = va_arg(parms, long unsigned *);						   *n2l = n2;						   break;				  case SHORT_SIZE : n2s = va_arg(parms, short unsigned *);						    *n2s = (short)(n2);						    break;			      }			      scanned++;			   }			   parsing = 0;			   break;		case 'x' : buf = strscn(buf,"1234567890xabcdefABCDEF");			   n2 = strtou(buf,16,&base);			   buf = base;			   if (!suppress) {			      switch (size) {				  			          case STD_SIZE : n2b = va_arg(parms, unsigned *);				  		  *n2b = (unsigned)n2;						  break;				  case LONG_SIZE : n2l = va_arg(parms, long unsigned *);						   *n2l = n2;						   break;				  case SHORT_SIZE : n2s = va_arg(parms, short unsigned *);						    *n2s = (short)(n2);						    break;			      }			      scanned++;			   }			   parsing = 0;			   break;		case 'f' :		case 'g' :		case 'e' : buf = strscn(buf,"1234567890.e+-");			   n3 = strtod(buf,&base);			   buf = base;			   if (!suppress) {			       			       switch (size) {				   				 			       	   case STD_SIZE : n3l = va_arg(parms, double *);						   *n3l = n3;						   break;				   case LONG_SIZE : n3l = va_arg(parms, double *);						    *n3l = n3;						    break;				   case SHORT_SIZE : n3s = va_arg(parms, float *);						     *n3s = (float)(n3);						     break;			       }			       scanned++;			   }			   parsing = 0;			   break;		case 'l' : size = LONG_SIZE;			   break;		case 'h' :		case 'n' : size = SHORT_SIZE;			   break;		case '*' : suppress = 1;			   break;		default :  parsing = 0;			   break;	    }	    fmt++;	}    }    return(scanned);}int sscanf(char *buf,char *fmt,...){    va_list parms;    int result;    va_start(parms,fmt);    result = vsscanf(buf,fmt,parms);    va_end(parms);    return(result);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -