utils.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "flashfs.h"
  4. char* prog;
  5. ulong sectsize;
  6. ulong nsects;
  7. uchar* sectbuff;
  8. int readonly;
  9. ulong delta;
  10. int eparity;
  11. uchar magic[] = { MAGIC0, MAGIC1, MAGIC2, FFSVERS };
  12. int
  13. putc3(uchar *buff, ulong v)
  14. {
  15. if(v < (1 << 7)) {
  16. buff[0] = v;
  17. return 1;
  18. }
  19. if(v < (1 << 13)) {
  20. buff[0] = 0x80 | (v >> 7);
  21. buff[1] = v & ((1 << 7) - 1);
  22. return 2;
  23. }
  24. if(v < (1 << 21)) {
  25. buff[0] = 0x80 | (v >> 15);
  26. buff[1] = 0x80 | ((v >> 8) & ((1 << 7) - 1));
  27. buff[2] = v;
  28. return 3;
  29. }
  30. fprint(2, "%s: putc3 fail 0x%lux, called from %#p\n", prog, v, getcallerpc(&buff));
  31. abort();
  32. return -1;
  33. }
  34. int
  35. getc3(uchar *buff, ulong *p)
  36. {
  37. int c, d;
  38. c = buff[0];
  39. if((c & 0x80) == 0) {
  40. *p = c;
  41. return 1;
  42. }
  43. c &= ~0x80;
  44. d = buff[1];
  45. if((d & 0x80) == 0) {
  46. *p = (c << 7) | d;
  47. return 2;
  48. }
  49. d &= ~0x80;
  50. *p = (c << 15) | (d << 8) | buff[2];
  51. return 3;
  52. }
  53. ulong
  54. get4(uchar *b)
  55. {
  56. return (b[0] << 0) |
  57. (b[1] << 8) |
  58. (b[2] << 16) |
  59. (b[3] << 24);
  60. }
  61. void
  62. put4(uchar *b, ulong v)
  63. {
  64. b[0] = v >> 0;
  65. b[1] = v >> 8;
  66. b[2] = v >> 16;
  67. b[3] = v >> 24;
  68. }