ftp.nice.ch/pub/next/unix/developer/plplot.3.0.s.tar.gz#/plplot/src/pldeco.c

This is pldeco.c in view mode; [Download] [Up]

/* Decode a character string, and return an array of float integer symbol */
/* numbers. This routine is responsible for interpreting all escape */
/* sequences. At present the following escape sequences are defined */
/* (the letter following the # may be either upper or lower case): */

/* #u       :      up one level (returns -1) */
/* #d       :      down one level (returns -2) */
/* #b       :      backspace (returns -3) */
/* #+       :      toggles overline mode (returns -4) */
/* #-       :      toggles underline mode (returns -5) */
/* ##       :      # */
/* #gx      :      greek letter corresponding to roman letter x */
/* #fn      :      switch to Normal font */
/* #fr      :      switch to Roman font */
/* #fi      :      switch to Italic font */
/* #fs      :      switch to Script font */
/* #(nnn)   :      Hershey symbol number nnn (any number of digits) */

#include "plplot.h"
#include <stdio.h>
#include <ctype.h>
#ifdef PLSTDC
#include <string.h>
#else
extern int strlen();
#endif

static char font[] = "nris";
static char greek[] = "ABGDEZYHIKLMNCOPRSTUFXQWabgdezyhiklmncoprstufxqw";
#define PLMAXSTR      300
static short symbol[PLMAXSTR];

extern short int *fntlkup;
extern short int numberfonts, numberchars;

void pldeco(sym,length,text)
int *length;
short int **sym;
char *text;
{
   int ch,icol,ifont,ig,j,lentxt;
   char test;

   /* Initialize parameters. */
   lentxt=strlen(text);
   *length=0;
   *sym = symbol;
   gatt(&ifont,&icol);
   if(ifont > numberfonts)
      ifont = 1;

   /* Get next character; treat non-printing characters as spaces. */
   j=0;
   while(j<lentxt) {
     if(*length >= PLMAXSTR)
        return;
     test=text[j++];
     ch=test;
     if (ch<0 || ch>175)   ch = 32;

     /* Test for escape sequence (#) */
     if (ch=='#' && (lentxt-j)>=1) {
       test=text[j++];
       if (test=='#')
         symbol[(*length)++] = *(fntlkup+(ifont-1)*numberchars+ch);
       else if (test=='u' || test=='U')
         symbol[(*length)++] = -1;
       else if (test=='d' || test=='D')
         symbol[(*length)++] = -2;
       else if (test=='b' || test=='B')
         symbol[(*length)++] = -3;
       else if (test=='+')
         symbol[(*length)++] = -4;
       else if (test=='-')
         symbol[(*length)++] = -5;
       else if (test=='(') {
         symbol[*length] = 0;
         while ('0'<=text[j] && text[j]<='9') {
           symbol[*length] = symbol[*length]*10 + text[j] - '0';
           j++;
         }
         (*length)++;
         if (text[j]==')') j++;
       } else if (test=='f' || test=='F') {
		test=text[j++];
		ifont = strpos(font,isupper(test)?tolower(test):test) + 1;
		if (ifont==0 || ifont > numberfonts)
			ifont = 1;
       } else if (test=='g' || test=='G') {
		test=text[j++];
		ig = strpos(greek,test) + 1;
		symbol[(*length)++] = *(fntlkup+(ifont-1)*numberchars + 127+ig);
       } else {
		;
       }
     }
     else
       /* Decode character. */
       symbol[(*length)++] = *(fntlkup+(ifont-1)*numberchars + ch);
   }
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.