string.c
上传用户:qddsws
上传日期:2022-06-22
资源大小:723k
文件大小:7k
源码类别:

操作系统开发

开发平台:

C/C++

  1. #include <lib/string.h>
  2. //unsigned char *VGA = (unsigned char *)0xA0000;
  3. int cursorx,cursory;
  4. #include <Bitmapfonts/font1.fnt>
  5. #include <Bitmapfonts/font2.fnt>
  6. #include <Bitmapfonts/font4.fnt>
  7. #include <Bitmapfonts/font5.fnt>
  8. int act;
  9. char *itoa (unsigned long number,char* ret, int base) {
  10. int count=0;
  11. int k=0;
  12. int res=0;
  13. if (number==0) {
  14. ret[0]='0';
  15. ret[1]='';
  16. }
  17. else {
  18. while (number!=0) {
  19. res=number%base;
  20. number=number/base;
  21. if (res<10) ret[k]=res+'0';
  22. else ret[k]=(res-10)+'a';
  23. k++;
  24. }
  25. count=k;
  26. k--;
  27. for(res=0;res < k;res++,k--) {
  28. ret[res]^=ret[k];  
  29. ret[k]^=ret[res];  
  30. ret[res]^=ret[k];
  31. }
  32. }
  33. //if (number==0) {
  34. // ret[0]='0';
  35. // count=1;
  36. //}
  37. ret[count]=0;
  38. return ret;
  39. }
  40. void snprintf (char* dest,const char *fmt, ...){
  41. const char *p;
  42. va_list argp;
  43. int i;
  44. char *s;
  45. char fmtbuf[256];
  46. int k=0;
  47. va_start(argp, fmt);
  48. for(p = fmt; *p != ''; p++){
  49. if(*p != '%') {
  50. //putchar(*p);
  51. dest[k]=*p;
  52. k++;
  53. continue;
  54. }
  55. switch(*++p) {
  56. case 'c':
  57. i = va_arg(argp, int);
  58. dest[k]=i;
  59. k++;
  60. //putchar(i);
  61. break;
  62. case 'd':
  63. i = va_arg(argp, int);
  64. s = itoa(i,fmtbuf,10);
  65. strcpy(&dest[k],s);
  66. k=k+strlen(s);
  67. //fputs(s, stdout);
  68. break;
  69. case 's':
  70. s = va_arg(argp, char *);
  71. strcpy(&dest[k],s);
  72. k=k+strlen(s);
  73. //fputs(s, stdout);
  74. break;
  75. case 'x':
  76. i = va_arg(argp, int);
  77. s = itoa(i, fmtbuf, 16);
  78. strcpy(&dest[k],s);
  79. k=k+strlen(s);
  80. //fputs(s, stdout);
  81. break;
  82. case '%':
  83. //putchar('%');
  84. dest[k]='%';
  85. k++;
  86. break;
  87. }
  88. }
  89. dest[k]='';
  90. va_end(argp);
  91. }
  92. void jump_to_line (int l) {
  93. cursorx=0;
  94. cursory=l;
  95. }
  96. /*char* itoa(int number) {
  97.   char *ret;
  98.   
  99.           char num[5];
  100.           char mun[5];
  101.   ret=(char*)&num;
  102.   int sign=1;
  103.           int x,y;
  104.           for (x=0;x<5;x++) num[x]=0;
  105.           for (x=0;x<5;x++) mun[x]=0;
  106.   if (number<0) {
  107.      number=number*-1;
  108. sign=-1;
  109.   }
  110.   num[0]='0';
  111.           x=0;
  112.           y=number;
  113.           while (y>0) {
  114.               mun[x]=y%10+'0';
  115.               x++;
  116.               y=y/10;
  117.   }
  118.   y=0;
  119.   if (sign==-1) {
  120.      num[0]='-';
  121. y++;
  122.   }
  123.   while (x>0) {
  124.      num[y]=mun[x-1];
  125. y++;
  126. x--;
  127.   }
  128.           return ret;
  129. }
  130. */
  131. void hexkprint4b(unsigned long num) {
  132. char *aux;
  133. char hexnum[5];
  134. hexnum[4]=0;
  135. unsigned long auxtmp=num;/*
  136. if ((auxtmp&0xF)>9) hexnum[3]='A'+(auxtmp&0xF)-10;
  137. else {
  138. aux = itoa (auxtmp&0xF);
  139. hexnum[3]=aux[0];
  140. }
  141. if (((auxtmp&0xF0)>>4)>9) hexnum[2]='A'+((auxtmp&0xF0)>>4)-10;
  142. else {
  143. aux = itoa ((auxtmp&0xF0)>>4);
  144. hexnum[2]=aux[0];
  145. }
  146. if (((auxtmp&0xF00)>>8)>9) hexnum[1]='A'+((auxtmp&0xF00)>>8)-10;
  147. else {
  148. aux = itoa ((auxtmp&0xF00)>>8);
  149. hexnum[1]=aux[0];
  150. }
  151. if (((auxtmp&0xF000)>>12)>9) hexnum[0]='A'+((auxtmp&0xF000)>>12)-10;
  152. else {
  153. aux = itoa ((auxtmp&0xF000)>>12);
  154. hexnum[0]=aux[0];
  155. }*/
  156.  kprint(hexnum);
  157. }
  158. void hexkprint8b(unsigned long num) {
  159. hexkprint4b(num>>16&0xFFFF);
  160. hexkprint4b(num&0xFFFF);
  161. }
  162. void clrscr() {
  163. cursorx=0;
  164. cursory=0;
  165. if (act==1) memset(VGA,BACKGROUND_COLOR,SWIDTH*SHEIGHT*BPP);
  166. }
  167. void test_printk( char * str) {
  168.   int i=0;
  169.   while (str[i]!=0 && i < SWIDTH/(FONT_W)) {
  170.      switch (str[i]) {
  171. case 'n':
  172.      str[i]='';
  173. xyprint(str,cursorx*FONT_W,cursory*FONT_H,DEF_COLOR,DEF_FONT);
  174. cursorx=0;
  175. cursory=cursory+1;
  176. str=str+i+1 ;
  177. i=-1;
  178.   
  179. break;
  180. }
  181. i++;
  182.   }
  183.   
  184.   xyprint(str,cursorx*FONT_W,cursory*FONT_H,DEF_COLOR,DEF_FONT);
  185. cursorx=cursorx+strlen(str);
  186.  
  187. }
  188. #include <devices/sys_console.h>
  189. void kprint( char * str ) {
  190. if (act==2) {
  191. // sys_console_print_text(test_ret_print(),"*");
  192. sys_console_print_text(test_ret_print(),str);
  193. }
  194. else {
  195. int i=0;
  196. while (str[i]!='' && (i+cursorx) < SWIDTH/(FONT_W)) {
  197. switch (str[i]) {
  198. case 'n':
  199.      str[i]='';
  200. xyprint(str,cursorx*FONT_W,cursory*FONT_H,DEF_COLOR,DEF_FONT);
  201. cursorx=0;
  202. cursory=cursory+1;
  203. str=str+i+1 ;
  204. i=-1;
  205.   
  206. break;
  207. }
  208. i++;
  209. if (i+cursorx ==  SWIDTH/(FONT_W) ) {
  210. str[i]='';
  211. xyprint(str,cursorx*FONT_W,cursory*FONT_H,DEF_COLOR,DEF_FONT);
  212. cursorx=0;
  213. cursory=cursory+1;
  214. str=str+i+1 ;
  215. i=0;
  216.  
  217. }
  218. }
  219.   
  220.   xyprint(str,cursorx*FONT_W,cursory*FONT_H,DEF_COLOR,DEF_FONT);
  221. cursorx=cursorx+strlen(str);
  222. }
  223. }
  224. void deact_print () {
  225. act=0;
  226. }
  227. void act_print (int i) {
  228. act=i;
  229. }
  230. void xyprint_area( char * str, int x, int y, int color, int font, word* temp_area) {
  231.   int i=0;
  232. int j=0;
  233. int k=0;
  234. word lin[FONT_W-1];
  235. word lin_mask[FONT_W-1];
  236. word lin_notmask[FONT_W-1];
  237. char faux1;
  238. for (k=0;k<strlen(str);k++) {
  239. int lletra=str[k];
  240. for (j=0;j<FONT_H;j++) {
  241. for (i=0;i<FONT_W;i++) {
  242.    #ifdef FONT1
  243.    if (font==1) faux1=font1[j+(lletra*(FONT_H))];
  244. #endif
  245. #ifdef FONT2
  246. if (font==2) faux1=font2[j+(lletra*(FONT_H))];
  247. #endif
  248. #ifdef FONT4
  249. if (font==4) faux1=font4[j+(lletra*(FONT_H))];
  250. #endif
  251. #ifdef FONT5
  252. if (font==5) faux1=font5[j+(lletra*(FONT_H))];
  253. #endif
  254.     faux1 = faux1 >> i;
  255.     faux1=faux1 & 0x01;
  256.     if (faux1==0x01) {
  257.       lin[FONT_W-1-i]=color;
  258.     }
  259. else{ 
  260.     lin[FONT_W-1-i]=*(word*)(temp_area+(SWIDTH*(y+j))+(x+(FONT_W-1-i)+((FONT_W)*k)));
  261. }
  262.   }
  263.    memcpy (temp_area+(SWIDTH*(y+j))+(x+((FONT_W)*k)),&lin,FONT_W*2);
  264. }
  265. }
  266. }
  267. void xyprint( char * str, int x, int y, int color, int font) {
  268.   int i=0;
  269. int j=0;
  270. int k=0;
  271. word lin[FONT_W-1];
  272. word lin_mask[FONT_W-1];
  273. word lin_notmask[FONT_W-1];
  274. char faux1;
  275. for (k=0;k<strlen(str);k++) {
  276. int lletra=str[k];
  277. for (j=0;j<FONT_H;j++) {
  278. for (i=0;i<FONT_W;i++) {
  279.    #ifdef FONT1
  280.    if (font==1) faux1=font1[j+(lletra*(FONT_H))];
  281. #endif
  282. #ifdef FONT2
  283. if (font==2) faux1=font2[j+(lletra*(FONT_H))];
  284. #endif
  285. #ifdef FONT4
  286. if (font==4) faux1=font4[j+(lletra*(FONT_H))];
  287. #endif
  288. #ifdef FONT5
  289. if (font==5) faux1=font5[j+(lletra*(FONT_H))];
  290. #endif
  291.     faux1 = faux1 >> i;
  292.     faux1=faux1 & 0x01;
  293.     if (faux1==0x01) {
  294.       lin[FONT_W-1-i]=color;
  295.     }
  296. else{ 
  297.     lin[FONT_W-1-i]=*(word*)(VGA+(SWIDTH*(y+j))+(x+(FONT_W-1-i)+((FONT_W)*k)));
  298. }
  299.   }
  300.    memcpy (VGA+(SWIDTH*(y+j))+(x+((FONT_W)*k)),&lin,FONT_W*2);
  301. }
  302. }
  303. }
  304. int abs(int num ) {
  305. if (num<0) num=-num;
  306. return num;
  307. }
  308. void* memwordset(void* dest, word c, dword count) {
  309.   word *ds=dest;
  310. dword i;
  311. for (i=0;i<count;i++) 
  312. ds[i]=c;
  313. return dest;
  314. }
  315. void* memset(void* dest, int c, unsigned int count)
  316. {
  317.      unsigned char* ds = dest;
  318.      unsigned int i;
  319.   for (i = 0; i < count; i++)
  320.            ds[i] = c;
  321.       return dest;
  322. }
  323. void* memcpy(void* dest, const void* src, unsigned int count)
  324. {
  325.    unsigned char* ds = (unsigned char*)dest;
  326.    unsigned char* ss = (unsigned char*)src;
  327.    unsigned int i;
  328.    for (i = 0; i < count; i++)
  329.       ds[i] = ss[i];
  330.         return dest;
  331. }
  332. unsigned int strlen(const char* str)
  333. {
  334.    const char *s;
  335.    for (s = str; *s; ++s) ;
  336.    return (s - str);
  337. char * strcpy(char * dest,const char *src)
  338. {
  339. char *tmp = dest;
  340.         while ((*dest++ = *src++) != '');
  341.         return tmp;
  342. }
  343. int strcmp(const char * cs,const char * ct)
  344. {
  345. register signed char __res;
  346.         while (1) {
  347.          if ((__res = *cs - *ct++) != 0 || !*cs++) break;
  348. }
  349.        
  350. return __res;
  351. }
  352. int strncmp(const char * cs,const char * ct, int n)
  353. {
  354. register signed char __res;
  355.         while (n>0) {
  356.          if ((__res = *cs - *ct++) != 0 || !*cs++) break;
  357. n--;
  358. }
  359.        
  360. return __res;
  361. }