home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 626a.lha / GUISpell_v1.0 / textclip.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  2KB  |  102 lines

  1. #error By license you aren't permitted to compile this.  Read GUISpell.doc.
  2. #include <string.h>
  3. #include <libraries/iffparse.h> // Why is this needed with proto/all.h?
  4. #include <proto/iffparse.h>
  5. #include "libraries.h"
  6.  
  7. // Check if 0.  If not, then die.
  8. #define CHECK0(a) if (a) goto die
  9.  
  10. // Check if non-0.  If not, then die.
  11. #define CHECKN0(a) if (!(a)) goto die
  12.  
  13. // Check if greater than or equal to 0.  If not, then die.
  14. #define CHECKGE0(a) if ((a) < 0) goto die
  15.  
  16. void TextToClip (char *s)
  17. {
  18.   struct IFFHandle *iff;
  19.   
  20.   CHECKN0 (iff = AllocIFF ());
  21.   CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  22.   InitIFFasClip (iff);
  23.   CHECK0 (OpenIFF (iff, IFFF_WRITE));
  24.  
  25.   CHECKGE0 (PushChunk (iff, 'FTXT', 'FORM', IFFSIZE_UNKNOWN));
  26.  
  27.     CHECKGE0 (PushChunk (iff, 0, 'CHRS', IFFSIZE_UNKNOWN));
  28.     CHECKGE0 (WriteChunkBytes (iff, s, strlen (s)));
  29.     CHECKGE0 (PopChunk (iff));
  30.  
  31.   //CHECKGE0 (PushChunk (iff, 0L, 'ANNO', IFFSIZE_UNKNOWN));
  32.   //CHECKGE0 (WriteChunkBytes (iff, "written by IGadSpell and iffparse", 33));
  33.   //CHECKGE0 (PopChunk (iff));
  34.  
  35.   CHECKGE0 (PopChunk (iff));
  36.  
  37. die:
  38.   if (iff)
  39.     {
  40.       CloseIFF (iff);
  41.       if (iff->iff_Stream)
  42.         CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
  43.       FreeIFF (iff);
  44.     }
  45. }
  46.  
  47. int TextFromClip (char *buffer, int size)
  48. {
  49.   struct IFFHandle *iff;
  50.   int good_read = 0;
  51.  
  52.   CHECKN0 (iff = AllocIFF ());
  53.   CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
  54.   InitIFFasClip (iff);
  55.   CHECK0 (OpenIFF (iff, IFFF_READ));
  56.  
  57.   for (;;)
  58.     {
  59.       switch (ParseIFF (iff, IFFPARSE_RAWSTEP))
  60.         {
  61.         case IFFERR_EOC:
  62.           break;
  63.         case IFFERR_EOF:
  64.           goto die;
  65.         case 0:
  66.     {
  67.       struct ContextNode *chunk = CurrentChunk (iff);
  68.  
  69.           if (chunk && chunk->cn_ID == 'CHRS' && chunk->cn_Type == 'FTXT')
  70.         {
  71.           int bytes_read = ReadChunkBytes (iff, buffer, size);
  72.  
  73.               if (chunk->cn_Size == bytes_read)
  74.         good_read = 1;
  75.               if (chunk->cn_Size > bytes_read)
  76.         good_read = -1;
  77.           if (!bytes_read && chunk->cn_Size)
  78.         good_read = 0;
  79.  
  80.           buffer[bytes_read < size ? bytes_read : size - 1] = '\0';
  81.  
  82.               goto die;
  83.             }
  84.           break;
  85.     }
  86.         default:
  87.           goto die;
  88.         }
  89.     }
  90.  
  91. die:
  92.   if (iff)
  93.     {
  94.       CloseIFF (iff);
  95.       if (iff->iff_Stream)
  96.         CloseClipboard ((struct ClipboardHandle *)iff->iff_Stream);
  97.       FreeIFF (iff);
  98.     }
  99.  
  100.   return good_read;
  101. }
  102.