Advertisement
Guest User

Michael

a guest
Sep 7th, 2009
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.96 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <unistd.h>
  3. #include <sys/stat.h>
  4. #include <sys/mman.h>
  5. #include <stdint.h>
  6. #include <stdlib.h>
  7.  
  8. const uint8_t sp=' ';
  9. const uint8_t ret='\n';
  10. const uint8_t quo='\"';
  11. const uint8_t scr='\\';
  12. const uint8_t hxp='x';
  13. const uint8_t blst='[';
  14. const uint8_t elst=']';
  15. const uint8_t bdct='(';
  16. const uint8_t edct=')';
  17. const uint8_t eqv='=';
  18. const int stdout=1;
  19.  
  20. enum obj_type {OBJ_NUL, OBJ_INT, OBJ_STR, OBJ_LST, OBJ_DCT};
  21.  
  22. void Byte2Hex(uint8_t ch);
  23. void PrintSpc(int num);
  24. enum obj_type DetType(const uint8_t* d, size_t shift);
  25. size_t FindSym(const uint8_t* d, uint8_t s, size_t shift, size_t len);
  26. size_t PrintInt(const uint8_t* d, size_t shift, size_t len);
  27. size_t PrintStr(const uint8_t* d, size_t shift, size_t len);
  28. size_t PrintLst(const uint8_t* d, size_t shift, size_t len, int skip);
  29. size_t PrintDct(const uint8_t* d, size_t shift, size_t len, int skip);
  30. size_t PrintObj(const uint8_t* d, size_t shift, size_t len, int skip);
  31.  
  32. void Byte2Hex(uint8_t ch)
  33. {
  34.  static const uint8_t cnv[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  35.  write(stdout,cnv+((ch&(15<<4))>>4),1);
  36.  write(stdout,cnv+(ch&15),1);
  37. }
  38.  
  39. void PrintSpc(int num)
  40. {
  41.  int i;
  42.  for(i=0;i<num;i++) write(stdout,&sp,1);
  43. }
  44.  
  45. enum obj_type DetType(const uint8_t* d, size_t shift)
  46. {
  47. // write(2,d+shift,1);
  48.  if(d[shift]=='i') return OBJ_INT;
  49.  if(d[shift]=='l') return OBJ_LST;
  50.  if(d[shift]=='d') return OBJ_DCT;
  51.  if(d[shift]>=49 && d[shift]<=57) return OBJ_STR;
  52.  return OBJ_NUL;
  53. }
  54.  
  55. size_t FindSym(const uint8_t* d, uint8_t s, size_t shift, size_t len)
  56. {
  57.  size_t i;
  58.  
  59.  for(i=shift;i<len;i++) if(d[i]==s) return i;
  60.  exit(2);
  61. }
  62.  
  63. size_t PrintObj(const uint8_t* d, size_t shift, size_t len, int skip)
  64. {
  65.  switch(DetType(d,shift))
  66.  {
  67.   case(OBJ_NUL): exit(2);
  68.   case(OBJ_INT): return PrintInt(d,shift,len);
  69.   case(OBJ_STR): return PrintStr(d,shift,len);
  70.   case(OBJ_LST): return PrintLst(d,shift,len,skip);
  71.   case(OBJ_DCT): return PrintDct(d,shift,len,skip);
  72.  }
  73.  exit(2);
  74. }
  75.  
  76. size_t PrintInt(const uint8_t* d, size_t shift, size_t len)
  77. {
  78.  size_t e=FindSym(d,'e',shift,len);
  79.  write(stdout,d+shift+1,e-shift-1);
  80.  return e+1;
  81. }
  82.  
  83. size_t PrintStr(const uint8_t* d, size_t shift, size_t len)
  84. {
  85.  size_t e=FindSym(d,':',shift,len);
  86.  int l=atoi(d+shift);
  87.  if(e+l>=len) exit(2);
  88.  size_t p;
  89.  
  90.  write(stdout,&quo,1);
  91.  for(p=e+1;p<=e+l;p++)
  92.  {
  93.   if(d[p]==127 || d[p]<=32)
  94.   {
  95.    write(stdout,&scr,1);
  96.    write(stdout,&hxp,1);
  97.    Byte2Hex(d[p]);
  98.   }
  99.   else if(d[p]=='\\')
  100.   {
  101.    write(stdout,&scr,1);
  102.    write(stdout,&scr,1);
  103.   }
  104.   else if(d[p]=='\"')
  105.   {
  106.    write(stdout,&scr,1);
  107.    write(stdout,&quo,1);
  108.   }
  109.   else write(stdout,d+p,1);
  110.  }
  111.  
  112.  write(stdout,&quo,1);
  113.  return e+l+1;
  114. }
  115.  
  116. size_t PrintLst(const uint8_t* d, size_t shift, size_t len, int skip)
  117. {
  118.  size_t ishift=shift+1;
  119.  
  120.  write(stdout,&blst,1);
  121.  write(stdout,&ret,1);
  122.  
  123.  while(d[ishift]!='e')
  124.  {
  125.   PrintSpc(skip+1);
  126.   ishift=PrintObj(d,ishift,len,skip+1);
  127.   write(stdout,&ret,1);
  128.   if(ishift>=len) exit(2);
  129.  }
  130.  PrintSpc(skip);
  131.  write(stdout,&elst,1);
  132.  return ishift+1;
  133. }
  134.  
  135. size_t PrintDct(const uint8_t* d, size_t shift, size_t len, int skip)
  136. {
  137.  size_t ishift=shift+1;
  138.  
  139.  write(stdout,&bdct,1);
  140.  write(stdout,&ret,1);
  141.  
  142.  while(d[ishift]!='e')
  143.  {
  144.   PrintSpc(skip+1);
  145.   if(DetType(d,ishift)!=OBJ_STR) exit(2);
  146.   ishift=PrintStr(d,ishift,len);
  147.   write(stdout,&sp,1);
  148.   write(stdout,&eqv,1);
  149.   write(stdout,&sp,1);
  150.   ishift=PrintObj(d,ishift,len,skip+1);
  151.   write(stdout,&ret,1);
  152.   if(ishift>=len) exit(2);
  153.  }
  154.  PrintSpc(skip);
  155.  write(stdout,&edct,1);
  156.  return ishift+1;
  157. }
  158.  
  159. int main(int argc, char** argv)
  160. {
  161.  if(argc!=2) return 1;
  162.  
  163.  int fd;
  164.  struct stat st;
  165.  uint8_t *pdata;
  166.  
  167.  fd=open(argv[1],O_RDONLY); if(fd==-1) return 1;
  168.  if(fstat(fd,&st)!=0) return 1;
  169.  if(st.st_size==0) return 1;
  170.  pdata=(uint8_t*) mmap(0,st.st_size,PROT_READ,MAP_SHARED,fd,0);
  171.  PrintDct(pdata,0,st.st_size,0);
  172.  write(stdout,&ret,1);
  173.  munmap(pdata,st.st_size);
  174.  close(fd);
  175.  
  176.  return 0;
  177. }
  178.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement