home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / geneal / part01 / pagemap.c < prev    next >
C/C++ Source or Header  |  1989-03-08  |  2KB  |  93 lines

  1. /* pagemap - functions to manipulate a page of character data
  2.  * Written by Jim McBeath (jimmc) at SCI
  3.  * last edit 29-Jan-85 07:17:11 by jimmc (Jim McBeath)
  4.  * Revision history:
  5.  * 29-Jan-85    Jim McBeath    convert to 7-char-distinct names
  6.  *  2.Aug.87  jimmc  Add pageQPrint()
  7.  * 18.Sep.87  jimmc  add #include xalloc.h
  8.  */
  9.  
  10. #include "pagemap.h"
  11. #include "xalloc.h"
  12. #include <stdio.h>
  13.  
  14. Pagemp
  15. pageInit(r,c)        /* make a new page of data */
  16. int r,c;        /* rows an columns desired in the page */
  17. {
  18. Pagemp pp;
  19. int i, j;
  20. char *ss;
  21.  
  22.     pp = XALLOCM(Pagem,1,"pageInit");    /* get the top level structure */
  23.     pp->rows = r;
  24.     pp->cols = c;        /* put in his numbers */
  25.     pp->data = XALLOCM(char *,r,"pageInit rowpointers");
  26.     for (i=0; i<r; i++)
  27.     {
  28.     pp->data[i] = ss = XALLOCM(char,c+2,"pageInit data");
  29.     for (j=0; j<=c; j++) ss[j]=' ';        /* fill with spaces */
  30.     ss[c+1] = 0;        /* null terminated */
  31.     }
  32.     return pp;            /* return the pointer to him */
  33. }
  34.  
  35. /*..........*/
  36.  
  37. pagPuts(pp,r,c,ss)
  38. Pagemp pp;
  39. int r,c;
  40. char *ss;
  41. {
  42. char *dd;
  43. int n;
  44.  
  45.     dd = &pp->data[r][c];        /* where to put it */
  46.     n = strlen(ss);            /* number of chars to move */
  47.     if (pp->cols - c < n) n = pp->cols - c;    /* don't run off page */
  48.     for ( ; n>0; n--) *(dd++) = *(ss++);    /* transfer string */
  49. }
  50.  
  51. /*..........*/
  52.  
  53. pagePrint(pp,f)        /* output the page */
  54. Pagemp pp;        /* pointer to the page to output */
  55. FILE *f;        /* stream to output to */
  56. {
  57.     pageLPrint(pp,f,"\n");
  58.     fputc('\n',f);
  59. }
  60.  
  61. pageQPrint(pp,f)        /* output the page as a quoted string */
  62. Pagemp pp;        /* pointer to the page to output */
  63. FILE *f;        /* stream to output to */
  64. {
  65.     fputc('"',f);
  66.     pageLPrint(pp,f,"\\n\\\n");
  67.     fputc('"',f);
  68. }
  69.  
  70. pageLPrint(pp,f,linesep)        /* output the page */
  71. Pagemp pp;        /* pointer to the page to output */
  72. FILE *f;        /* stream to output to */
  73. char *linesep;        /* what to print between each line */
  74. {
  75. int r,c;
  76. int lastline;
  77. char *ss;
  78.  
  79.     lastline = -1;
  80.     for (r=0; r<pp->rows; r++)    /* for each row */
  81.     {
  82.     ss = pp->data[r];        /* faster access */
  83.     for (c=pp->cols+1; c>=0; c--)
  84.         if (ss[c]>' ') break;    /* strip trailing spaces and nulls */
  85.     ss[++c] = 0;            /* make it null terminated */
  86.     if (c>0) lastline=r;        /* remember where the last line is */
  87.     }
  88.     for (r=0; r<=lastline; r++)        /* now output the lines */
  89.     fprintf(f,"%s%s",pp->data[r],linesep);
  90. }
  91.  
  92. /* end */
  93.