You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.5KB

  1. /* fromdos.c : strip the stupid ^M characters without mistakes! */
  2. /* this can do in-place conversion or be used as a pipe... */
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <string.h>
  7. int main(int argc, char** argv) {
  8. int f,c;
  9. if (argc <= 1) {
  10. if (isatty(0)) {
  11. fprintf(stderr,"usage : %s <files>\nStrips ^M characters.\nCan do in-place conversion of many files or can be used in a pipe\n",argv[0]);
  12. return 1;
  13. }
  14. for (;;) {
  15. c = getchar();
  16. while (c == '\r') {
  17. c = getchar();
  18. if (c != '\n') putchar(c);
  19. }
  20. if (c < 0) break;
  21. putchar(c);
  22. }
  23. return 0;
  24. }
  25. for (f = 1; f < argc; f++) {
  26. char* fname = argv[f];
  27. char tempname[1024];
  28. FILE* in = fopen(fname,"rb");
  29. FILE* out;
  30. int mod = 0;
  31. if (!in) {
  32. fprintf(stderr,"%s : %s\n", fname, strerror(errno));
  33. return 1;
  34. }
  35. strcpy(tempname, fname);
  36. strcat(tempname, ".temp");
  37. out = fopen(tempname, "wb");
  38. if (!out) {
  39. fprintf(stderr,"%s : %s\n", fname, strerror(errno));
  40. return 1;
  41. }
  42. for (;;) {
  43. c = getc(in);
  44. while (c == '\r') {
  45. c = getc(in);
  46. if (c == '\n') mod=1; else putc(c,out);
  47. }
  48. if (c < 0) break;
  49. putc(c,out);
  50. }
  51. fclose(in);
  52. fclose(out);
  53. if (!mod) {
  54. fprintf(stderr,"%s : no change\n", fname);
  55. unlink(tempname);
  56. } else if (rename(tempname, fname)) {
  57. fprintf(stderr,"Can't mv %s %s : %s\n",tempname,fname,strerror(errno));
  58. return 1;
  59. }
  60. }
  61. return 0;
  62. }