home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / asmutl / smmaclnk.ark / PUTREL.C < prev    next >
Text File  |  1987-09-10  |  3KB  |  88 lines

  1. /*
  2. ** putrel -- write relocatable-object file
  3. */
  4. #include <stdio.h>
  5. #include "rel.h"
  6. #include "mac.h"
  7. /*
  8. ** put next REL iem
  9. ** return true on success, false on error
  10. ** on call:
  11. **    item = item code
  12. **    type = type of field
  13. **     field = value of field
  14. **    symbol = symbol name
  15. */
  16. putrel() {
  17.   switch(item) {
  18.     case ABS:
  19.       if(!putbits(0, 1) || !putbits(field, 8)) return (NO);
  20.       return (YES);
  21.     case PREL:  case DREL:  case CREL:
  22.       if(!putbits(1, 1) || !putbits(item, 2) || !putfld()) return (NO);
  23.       return (YES);
  24.     }
  25.   if(!putbits(4, 3) || !putbits(item-4, 4)) return (NO);
  26.   switch(item) {
  27.     case CSIZE:  case XCHAIN:  case EPOINT:
  28.       if(!putbits(type, 2) || !putfld()) return (NO);
  29.     case ENAME:  case CNAME:  case PNAME:  case LNAME:  case EXT:
  30.       if(!putsym()) return (NO);
  31.       return (YES);
  32.     case XMOFF:  case XPOFF:  case DSIZE:
  33.     case SETLC:  case CHAIN:  case PSIZE:
  34.       if(!putbits(type, 2) || !putfld()) return (NO);
  35.       return (YES);
  36.     case EPROG:
  37.       if(!putbits(type, 2) || !putfld()) return (NO);
  38.     case EFILE:
  39.       if(outrem < 8 && !putbits(0, outrem)) return (NO);/* finish byte */
  40.       return (YES);
  41.     }
  42.   return (NO);
  43.   }
  44.  
  45. puttyp() {
  46.   if(putbits(type, 2)) return (YES);    /* put 2-bit field type */
  47.   return (NO);
  48.   }
  49. putfld() {                /* put low then high byte */
  50.   if(putbits(field, 8) && putbits(field >> 8, 8)) return (YES);
  51.   return (NO);
  52.   }
  53. putsym() {                /* put symbol */
  54.   int i; char *cp;
  55.   if((i = strlen(symbol)) > MAXSYM) i = MAXSYM; /* enforce max length */
  56.   if(!putbits(i, 3)) return (NO);    /* put 3-bit symbol length */
  57.   cp = symbol;
  58.   while(i--) {
  59.     if(!putbits(*cp++, 8)) return (NO);    /* put next byte */
  60.     }
  61.   return (YES);
  62.   }
  63.  
  64. /*
  65. ** put next n bits from fld into REL file
  66. ** return true on success, false on error
  67. */
  68. putbits(fld, n) int fld, n; {
  69.   int put;
  70.   while(n) {                /* more bits to put */
  71.     if(n > outrem) put = outrem; else put = n;    /* how many for this chunk */
  72.     outchunk = (outchunk << put) +
  73.     ((fld >> (n-put)) & ~(ONES << put));
  74.     n       -= put;        /* decrement bits to put */
  75.     outrem -= put;        /* decr remaining bits */
  76.     if(outrem == 0) {        /* need another chunk */
  77.       if(write(outrel, &outchunk, 1) != 1) {    /* put next bit cluster */
  78.     fputs("\n\7- Write error in REL File\n", stdout);
  79.     return (NO);        /* failure */
  80.     }
  81.       outrem = 8;        /* 8 bits remain */
  82.       }
  83.     }
  84.   return (YES);            /* success */
  85.   }
  86. return (NO);        /* failure */
  87.     }
  88.       outrem = 8