home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / canada-remote-systems / cpower / cpmsd.arc / CPMSD.C next >
Text File  |  2019-04-13  |  8KB  |  327 lines

  1. /*
  2. ** CPMSD.C - FILTER ├ LANGUAGE SOURCE
  3. **           FILE TO/FROM C-POWER AND
  4. **           MS-DOS
  5. **
  6. ** THIS SOURCE FILE CONTAINS SOME
  7. ** CHANGES TO THE MS-DOS VERSION TO
  8. ** ACCOMMODATE C-POWER PECULIARITIES
  9. ** IE. - 'UNSIGNED'S RATHER THAN 'INT'S
  10. **     - USE OF PRINTF() RATHER THAN
  11. **       PUTS() WHICH IS MORE EFFICIENT
  12. **       WITHIN THE SHELL
  13. **     - FILE SIZE ASSUMED TO BE UNDER 
  14. **       65535 BYTES
  15. **     - SPECIFIC DECLARATION OF 'AUTO'
  16. **       STORAGE WHEN POINTERS ARE TO BE
  17. **       PASSED DUE TO THE WAY C-POWER
  18. **       USES THE 65XX'S ZERO PAGE
  19. **
  20. ** MAR88 BEN PEDERSEN SYSOP C-POWER BBS
  21. ** FEB90 MINOR UPDATES BEN PEDERSEN
  22. **
  23. ** NOTE: ORIGINAL C-POWER LIBRARY 
  24. ** FREAD() AND FWRITE() CONTAIN A BUG.
  25. ** THEY DO NOT RETURN THE NUMBER OF
  26. ** ELEMENTS READ OR WRITTEN IF FEWER ARE
  27. ** AVAILABLE THAN ARE SPECIFIED -- THEY
  28. ** RETURN ZERO INSTEAD OF THE ACTUAL 
  29. ** NUMBER READ OR WRITTEN WHICH IS 
  30. ** NON-STANDARD. THIS PROGRAM REQUIRES
  31. ** THE CORRECTED VERSIONS TO FUNCTION
  32. ** PROPERLY. OBTAIN UPDATED FREAD() AND
  33. ** FWRITE() OR FIX THE OLD ONES YOURSELF
  34. ** USING ═ARK ╥INFRET'S ╥┴ (╥EVERSE 
  35. ** ┴SSEMBLER) AND ├┴╙╙═ (├ ┴SSEMBLER).
  36. **
  37. ** ╠EARNING ┼XPERIENCE ┬┬╙ 416-665-3263
  38. **                         ╟╘ ╬ODE 053/012
  39. */
  40.  
  41. #INCLUDE <STDIO.H>
  42.  
  43. /* C-POWER TO MS-DOS OUTPUT BUFFER MUST
  44.    BE BIGGER DUE TO LINE-FEED INSERTION */
  45. #DEFINE ╧╒╘╙╔┌┼  32 * 254   /* BLOCK SIZE OF OUTPUT FILE BUFFER */
  46. #DEFINE ╔╬╙╔┌┼   28 * 254   /* BLOCK SIZE OF INPUT FILE BUFFER */
  47.  
  48. /* ├╘╠-┌ CHAR USED FOR MS-DOS END-OF-FILE
  49.    AND FOR PADDING THE FINAL BLOCK OF
  50.    XMODEM TRANSFERS BUT ISN'T USED ON ├┬═
  51.    SYSTEMS SO THEY'RE STRIPPED IN MSDTOCP() */
  52. #DEFINE ├╘╠ñ┌   0X001A
  53.  
  54. /* PROGRAM STATUS CODES */
  55. #DEFINE ╧╦┴┘    0
  56. #DEFINE ╘┼╥═╔╬  1
  57. #DEFINE ╔╬┬╒╞╞  2
  58. #DEFINE ╧╒╘┬╒╞  3
  59. #DEFINE ╔╬╞╔╠┼  4
  60. #DEFINE ╧╒╘╞╔╠  5
  61. #DEFINE ╥┼┴─╔╬  6
  62. #DEFINE ╫╥╘╧╒╘  7
  63. #DEFINE ╞╔╬╔╙╚  8
  64.  
  65. /* PROGRAM STATUS MESSAGES */
  66. CHAR *S[] = █
  67.  "",
  68.  " USER TERMINATED",
  69.  " ERROR ALLOCATING INPUT BUFFER",
  70.  " ERROR ALLOCATING OUTPUT BUFFER",
  71.  " ERROR OPENING INPUT FILE",
  72.  " ERROR OPENING OUTPUT FILE",
  73.  " ERROR READING INPUT FILE",
  74.  " ERROR WRITING OUTPUT FILE",
  75.  " FILE TRANSLATION COMPLETE"
  76. ▌;
  77.  
  78. CHAR *MALLOC();
  79. UNSIGNED CPTOMSD(), MSDTOCP(); /* TRANSLATION FUNCTIONS */
  80.  
  81. ╞╔╠┼ INñFN, OUTñFN;            /* FILE NUMBERS */
  82. CHAR *INñBUF, *OUTñBUF;        /* DATA BUFFER POINTERS */
  83.  
  84. MAIN()
  85.  AUTO UNSIGNED TOTALñIN, TOTALñOUT;  /* DATA BYTE TOTALS */
  86.  AUTO UNSIGNED (*FUNCñPTR)();   /* POINTER TO TRANSLATION OPTION FUNCTION */
  87.  CHAR INñFIL[17],OUTñFIL[17];   /* FILE NAME BUFFERS */
  88.  UNSIGNED STATUS;               /* FUNCTION ERROR STATUS */
  89.  
  90.  TOTALñIN = TOTALñOUT = 0;
  91.  
  92.  /* GET OPTION FROM USER */
  93.  IF(STATUS = GETñOPT(&FUNCñPTR))
  94.   EXSTAT(STATUS);
  95.  
  96.  /* ALLOCATE BUFFERS */
  97.  IF(STATUS = MAKEñBUFFS())
  98.   EXSTAT(STATUS);
  99.  
  100.  /* GET AN INPUT FILE */
  101.  IF(STATUS = GETñINFILE(INñFIL))
  102.   EXSTAT(STATUS);
  103.  
  104.  /* GET AN OUTPUT FILE */
  105.  IF(STATUS = GETñOUTFILE(OUTñFIL))
  106.   EXSTAT(STATUS);
  107.  
  108.  /* DO FILE TRANSLATION */
  109.  DO █
  110.   IF(STATUS = TRANSFILE(&TOTALñIN, &TOTALñOUT, FUNCñPTR))
  111.    EXSTAT(STATUS);
  112.  ▌ WHILE(!FEOF(INñFN));
  113.  
  114.  PRINTF("\N %-16S: %U BYTES\N %-16S: %U BYTES\N", INñFIL, TOTALñIN, OUTñFIL, TOTALñOUT);
  115.  
  116.  /* BYE! */
  117.  EXSTAT(╞╔╬╔╙╚);
  118.  
  119. /* ALLOCATE DATA BUFFERS */
  120. MAKEñBUFFS()
  121.  /* ALLOCATE ╔╬╙╔┌┼ INPUT BUFFER */
  122.  IF((INñBUF = (CHAR *)MALLOC(╔╬╙╔┌┼ * SIZEOF(CHAR))) == ╬╒╠╠)
  123.   RETURN(╔╬┬╒╞╞);
  124.  
  125.  /* ALLOCATE ╧╒╘╙╔┌┼ OUTPUT BUFFER */
  126.  /* C-POWER TO MS-DOS OUTPUT FILE WILL BE BIGGER DUE TO INSERTED LINE-FEEDS */
  127.  IF((OUTñBUF = (CHAR *)MALLOC(╧╒╘╙╔┌┼ * SIZEOF(CHAR))) == ╬╒╠╠)
  128.   RETURN(╧╒╘┬╒╞);
  129.  
  130.  RETURN(╧╦┴┘);
  131.  
  132. /* GET AN INPUT FILE */
  133. GETñINFILE(INñFIL)
  134. CHAR *INñFIL;
  135.  /* GET PATH TO INPUT FILE */
  136.  PRINTF("\N INPUT FILE : ");
  137.  SCANF("%16S", INñFIL);
  138.  
  139.  /* OPEN INPUT FILE */
  140.  IF((INñFN = FOPEN(INñFIL, "R")) == ╬╒╠╠ ▀▀ FERROR(INñFN))
  141.   RETURN(╔╬╞╔╠┼);
  142.  ELSE RETURN(╧╦┴┘);
  143.  
  144. /* GET AN OUTPUT FILE */
  145. GETñOUTFILE(OUTñFIL)
  146. CHAR *OUTñFIL;
  147.  /* GET PATH TO OUTPUT FILE */
  148.  PRINTF(" OUTPUT FILE: ");
  149.  SCANF("%16S", OUTñFIL);
  150.  
  151.  /* OPEN OUTPUT FILE */
  152.  IF((OUTñFN = FOPEN(OUTñFIL, "W")) == ╬╒╠╠ ▀▀ FERROR(OUTñFN))
  153.   RETURN(╧╒╘╞╔╠);
  154.  ELSE RETURN(╧╦┴┘);
  155.  
  156. /* DO FILE TRANSLATION */
  157. TRANSFILE(TOTñIN, TOTñOUT, FñPTR)
  158. UNSIGNED *TOTñIN, *TOTñOUT;
  159. UNSIGNED (*FñPTR)();
  160.  AUTO UNSIGNED INBYTES;
  161.  UNSIGNED OUTBYTES, STATUS;
  162.  
  163.  IF(STATUS = DATAñIN(&INBYTES))
  164.   RETURN(STATUS);
  165.  *TOTñIN += INBYTES;
  166.  OUTBYTES = (*FñPTR)(INBYTES);
  167.  *TOTñOUT += OUTBYTES;
  168.  IF(STATUS = DATAñOUT(OUTBYTES))
  169.   RETURN(STATUS);
  170.  RETURN(╧╦┴┘);
  171.  
  172. /* DO MS-DOS TO C-POWER DATA TRANSLATION */
  173. UNSIGNED MSDTOCP(INBYTES)
  174. UNSIGNED INBYTES;
  175.  UNSIGNED OUTBYTES;
  176.  CHAR *INñPTR, *OUTñPTR;
  177.  
  178.  INñPTR = INñBUF;
  179.  OUTñPTR = OUTñBUF;
  180.  
  181.  FOR(OUTBYTES = 0; INñPTR <= INñBUF + INBYTES; INñPTR++, OUTñPTR++, OUTBYTES++) █
  182.   IF(*INñPTR == ├╘╠ñ┌) BREAK;                    /* STRIP ├╘╠-┌ CHARS */
  183.   ELSE IF(*INñPTR >= 0X0041 && *INñPTR <= 0X005A)
  184.    *OUTñPTR = *INñPTR + 0X0080;                  /* UPPER CASE */
  185.   ELSE IF(*INñPTR >= 0X0061 && *INñPTR <= 0X007A)
  186.    *OUTñPTR = *INñPTR - 0X0020;                  /* LOWER CASE */
  187.   ELSE IF(*INñPTR == 0X005F) *OUTñPTR = 0X00A4;  /* UNDERSCORE */
  188.   ELSE IF(*INñPTR == 0X007E) *OUTñPTR = 0X00AF;  /* TILDE */
  189.   ELSE IF(*INñPTR == 0X007B) *OUTñPTR = 0X00DB;  /* LEFT BRACE */
  190.   ELSE IF(*INñPTR == 0X007D) *OUTñPTR = 0X00DD;  /* RIGHT BRACE */
  191.   ELSE IF(*INñPTR == 0X007C) *OUTñPTR = 0X00DF;  /* VERTICAL BAR */
  192.   ELSE IF(*INñPTR == 0X0009) *OUTñPTR = 0X0020;  /* TAB TO SPACE */
  193.   ELSE IF(*INñPTR == 0X000A) █                   /* STRIP LINE FEEDS */
  194.    --OUTñPTR;
  195.    --OUTBYTES;
  196.   ▌
  197.   ELSE *OUTñPTR = *INñPTR;                       /* NO TRANSLATION */
  198.  ▌
  199.  RETURN(--OUTBYTES);
  200.  
  201. /* DO C-POWER TO MS-DOS DATA TRANSLATION */
  202. UNSIGNED CPTOMSD(INBYTES)
  203. UNSIGNED INBYTES;
  204.  UNSIGNED OUTBYTES;
  205.  CHAR *INñPTR, *OUTñPTR;
  206.  
  207.  INñPTR = INñBUF;
  208.  OUTñPTR = OUTñBUF;
  209.  
  210.  FOR(OUTBYTES = 0; INñPTR <= INñBUF + INBYTES; INñPTR++, OUTñPTR++, OUTBYTES++) █
  211.   IF(*INñPTR >= 0X00C1 && *INñPTR <= 0X00DA)
  212.    *OUTñPTR = *INñPTR - 0X0080;                  /* UPPER CASE */
  213.   ELSE IF(*INñPTR >= 0X0041 && *INñPTR <= 0X005A)
  214.    *OUTñPTR = *INñPTR + 0X0020;                  /* LOWER CASE */
  215.   ELSE IF(*INñPTR == 0X00A4) *OUTñPTR = 0X005F;  /* UNDERSCORE */
  216.   ELSE IF(*INñPTR == 0X00AF) *OUTñPTR = 0X007A;  /* TILDE */
  217.   ELSE IF(*INñPTR == 0X00DB) *OUTñPTR = 0X007B;  /* LEFT BRACE */
  218.   ELSE IF(*INñPTR == 0X00DD) *OUTñPTR = 0X007D;  /* RIGHT BRACE */
  219.   ELSE IF(*INñPTR == 0X00DF) *OUTñPTR = 0X007C;  /* VERTICAL BAR */
  220.   ELSE IF(*INñPTR == 0X000D) █                   /* ADD LINE-FEEDS */
  221.    *OUTñPTR = *INñPTR;
  222.    ++OUTñPTR;
  223.    *OUTñPTR = 0X000A;
  224.    ++OUTBYTES;
  225.   ▌
  226.   ELSE *OUTñPTR = *INñPTR;                       /* NO TRANSLATION */
  227.  ▌
  228.  RETURN(--OUTBYTES);
  229.  
  230. /* GET DATA TRANSLATE OPTION */
  231. GETñOPT(FñPTR)
  232. UNSIGNED (**FñPTR)();
  233.  PRINTF("\N C-POWER <=> MS-DOS FILE TRANSLATION\N MAR88  BEN PEDERSEN\N");
  234.  PRINTF("\N 1) C-POWER TO MS-DOS\N 2) MS-DOS TO C-POWER\N 3) QUIT\N\N OPTION: ");
  235.  
  236.  
  237.  SWITCH(GETCHAR()) █
  238.   CASE '1':
  239.    PRINTF("\N C-POWER TO MS-DOS\N");
  240.    *FñPTR = CPTOMSD;
  241.    RETURN(╧╦┴┘);
  242.    BREAK;
  243.   CASE '2':
  244.    PRINTF("\N MS-DOS TO C-POWER\N");
  245.    *FñPTR = MSDTOCP;
  246.    RETURN(╧╦┴┘);
  247.    BREAK;
  248.   CASE '3':
  249.   DEFAULT:
  250.    RETURN(╘┼╥═╔╬);
  251.    BREAK;
  252.  ▌
  253.  
  254. /* READ DATA TO INPUT BUFFER */
  255. DATAñIN(INBYTES)
  256. UNSIGNED *INBYTES;
  257.  
  258.  *INBYTES = FREAD(INñBUF, SIZEOF(CHAR), ╔╬╙╔┌┼, INñFN);
  259.  IF(FERROR(INñFN)) RETURN(╥┼┴─╔╬);
  260.  RETURN(╧╦┴┘);
  261.  
  262. /* WRITE DATA TO OUTPUT FILE */
  263. DATAñOUT(OUTBYTES)
  264. UNSIGNED OUTBYTES;
  265.  IF((FWRITE(OUTñBUF, SIZEOF(CHAR), OUTBYTES, OUTñFN) != OUTBYTES) ▀▀ FERROR(OUTñFN))
  266.   RETURN(╫╥╘╧╒╘);
  267.  ELSE RETURN(╧╦┴┘);
  268.  
  269. /* EXIT FROM PROGRAM */
  270. EXSTAT(STATUS)
  271. UNSIGNED STATUS;
  272.  PRINTF("\N%S\N\N",S[STATUS]);
  273.  
  274.  SWITCH(STATUS) █
  275.   CASE 0:
  276.   CASE 1:
  277.    BREAK;
  278.   CASE 2:
  279.    FREE(INñBUF);
  280.    BREAK;
  281.   CASE 3:
  282.    FREE(INñBUF);
  283.    FREE(OUTñBUF);
  284.    BREAK;
  285.   CASE 4:
  286.    FREE(INñBUF);
  287.    FREE(OUTñBUF);
  288.    FCLOSE(INñFN);
  289.    BREAK;
  290.   CASE 5:
  291.   CASE 6:
  292.   CASE 7:
  293.    FREE(INñBUF);
  294.    FREE(OUTñBUF);
  295.    FCLOSE(INñFN);
  296.    FCLOSE(OUTñFN);
  297.    BREAK;
  298.   CASE 8:
  299.   DEFAULT:
  300.    BREAK;
  301.  ▌
  302.  EXIT();
  303.  
  304. /* END OF CPMSD.C */
  305.