txt89t.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. void fatal(char *s) {
  5. fprintf(stderr,"error: %s\n");
  6. exit(123);
  7. }
  8. char *create_ti_file(int calc,int tigl_type,char *name,char *folder,char *content,unsigned long content_size,unsigned long *ti_file_size);
  9. char *rightest_of(char *s,char c) {
  10. char *t=strrchr(s,c);
  11. if (t) return t+1;
  12. return s;
  13. }
  14. char *leftest_end_of(char *s,char c) {
  15. char *t=strchr(s,c);
  16. if (t) return t;
  17. return s+strlen(s);
  18. }
  19. int compact=0;
  20. char getTIch(FILE *fp,int reset) {
  21. static int need_space=1;
  22. int c;
  23. if (reset) {
  24. need_space=1;
  25. return 0;
  26. }
  27. if (need_space && need_space--)
  28. return ' ';
  29. do
  30. c=getc(fp);
  31. while (c=='\r');
  32. if (c<0)
  33. return 0;
  34. if (!compact && c=='\n') {
  35. c='\r';
  36. need_space=1;
  37. }
  38. if (c=='\t') {
  39. c=' ';
  40. need_space=!compact;
  41. }
  42. return c;
  43. }
  44. int main(int argc,char **argv) {
  45. char *folder=NULL;
  46. char **p=argv+1;
  47. int n=argc-1;
  48. while (n && **p=='-') {
  49. if (!strcmp(*p,"-f")) {
  50. folder=p[1];
  51. n-=2,p+=2;
  52. continue;
  53. }
  54. if (!strcmp(*p,"-c") || !strcmp(*p,"--compact")) {
  55. compact=1;
  56. n--,p++;
  57. continue;
  58. }
  59. fprintf(stderr,"unknown option\n");
  60. return 2;
  61. }
  62. if (!n) {
  63. fprintf(stderr,"usage: txt89t [-f <folder>] [-c|--compact] <file1> ... <fileN>\n");
  64. return 1;
  65. }
  66. while (n--) {
  67. char *filename=*p++;
  68. char *basename=rightest_of(rightest_of(filename,'\\'),'/');
  69. char *rootname_end=leftest_end_of(basename,'.');
  70. char *rootname=malloc(rootname_end-basename+4+1);
  71. int i;
  72. memcpy(rootname,basename,rootname_end-basename);
  73. rootname[rootname_end-basename]=0;
  74. for (i=0;i<rootname_end-basename;i++) {
  75. char c=tolower(rootname[i]);
  76. if (c=='-' || c==' ') c='_';
  77. rootname[i]=c;
  78. }
  79. {
  80. int len=2/*cursor pos*/+0/*content itself*/+1/*estack tag*/;
  81. unsigned long outlen;
  82. char c,*dat,*dp;
  83. FILE *fp=fopen(filename,"r");
  84. char *outdat;
  85. if (!fp) {
  86. fprintf(stderr,"can't open file '%s'!\n",filename);
  87. return 3;
  88. }
  89. getTIch(0,1);
  90. do
  91. len++;
  92. while (getTIch(fp,0));
  93. fseek(fp,0,SEEK_SET);
  94. getTIch(0,1);
  95. dp=dat=malloc(len);
  96. *dp++=0;
  97. *dp++=1;
  98. do
  99. *dp++=(c=getTIch(fp,0));
  100. while (c);
  101. *dp=0xE0;
  102. fclose(fp);
  103. outdat=create_ti_file(0,0x21,rootname,folder,dat,len,&outlen);
  104. free(dat);
  105. memcpy(rootname,basename,strlen(rootname));
  106. strcat(rootname,".89t");
  107. fp=fopen(rootname,"wb");
  108. if (!fp) {
  109. fprintf(stderr,"can't write file!\n");
  110. return 3;
  111. }
  112. fwrite(outdat,1,outlen,fp);
  113. fclose(fp);
  114. free(outdat);
  115. }
  116. free(rootname);
  117. }
  118. return 0;
  119. }