string.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "string.h"
  2. #include "../cpu/type.h"
  3. /**
  4. * K&R implementation
  5. */
  6. void int_to_ascii(int n, char str[]) {
  7. int i, sign;
  8. if ((sign = n) < 0) n = -n;
  9. i = 0;
  10. do {
  11. str[i++] = n % 10 + '0';
  12. } while ((n /= 10) > 0);
  13. if (sign < 0) str[i++] = '-';
  14. str[i] = '\0';
  15. reverse(str);
  16. }
  17. void hex_to_ascii(int n, char str[]) {
  18. append(str, '0');
  19. append(str, 'x');
  20. char zeros = 0;
  21. s32 tmp;
  22. int i;
  23. for (i = 28; i > 0; i -= 4) {
  24. tmp = (n >> i) & 0xF;
  25. if (tmp == 0 && zeros == 0) continue;
  26. zeros = 1;
  27. if (tmp > 0xA) append(str, tmp - 0xA + 'a');
  28. else append(str, tmp + '0');
  29. }
  30. tmp = n & 0xF;
  31. if (tmp >= 0xA) append(str, tmp - 0xA + 'a');
  32. else append(str, tmp + '0');
  33. }
  34. /* K&R */
  35. void reverse(char s[]) {
  36. int c, i, j;
  37. for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
  38. c = s[i];
  39. s[i] = s[j];
  40. s[j] = c;
  41. }
  42. }
  43. /* K&R */
  44. int strlen(char s[]) {
  45. int i = 0;
  46. while (s[i] != '\0') ++i;
  47. return i;
  48. }
  49. void append(char s[], char n) {
  50. int len = strlen(s);
  51. s[len] = n;
  52. s[len+1] = '\0';
  53. }
  54. void backspace(char s[]) {
  55. int len = strlen(s);
  56. s[len-1] = '\0';
  57. }
  58. /* K&R
  59. * Returns <0 if s1<s2, 0 if s1==s2, >0 if s1>s2 */
  60. int strcmp(char s1[], char s2[]) {
  61. int i;
  62. for (i = 0; s1[i] == s2[i]; i++) {
  63. if (s1[i] == '\0') return 0;
  64. }
  65. return s1[i] - s2[i];
  66. }