⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preproc.c

📁 Outputs messages to a 2line LCD
💻 C
字号:
/* File preproc.c: 2.3 (84/11/27,11:47:40) */
/*% cc -O -c %
 *
 */

#include <stdio.h>
#include <string.h>
#include "defs.h"
#include "data.h"
#include "headers.h"

static char putmacnew(char c);
static FILE *fixiname();
static char keepch(char c);
static char putmac(char c);
static void toggle(char name, int onoff);

/*
 * open an include file
 */

void doinclude(void) {
   FILE *inp2;

	InInclude = TRUE;
   blanks();
   if (inp2 = (FILE *)fixiname())
      if (inclsp < INCLSIZ) {
         inclstk[inclsp++] = input2;
         input2 = inp2;
         } 
      else {
         fclose (inp2);
         error("Too many nested includes");
         }
   else {
      error("Could not open include file");
      }
   kill();
}

/*
 * fixiname - remove "brackets" around include file name
 */

static FILE *fixiname(void) {
   char c1, c2, *p, *ibp;
   char buf[20];
   FILE *fp;
   char buf2[100];

   ibp = &buf[0];

   if ((c1 = gch()) != '"' && c1 != '<')
      return (NULL);
   for (p = line + lptr; *p && (*p != '\t') && (*p != ' ');)
      *ibp++ = *p++;
   c2 = *(--p);
   if (c1 == '"' ? (c2 != '"') : (c2 != '>')) {
      error("incorrect delimiter");
      return (NULL);
      }
   *(--ibp) = 0;
   fp = NULL;
   if (c1 == '<') {
   	while (fp == NULL && (p = GetIncs("INCLUDE"))) {
      	strcpy(buf2, p);
      	if (strlen(buf2))
      		strcat(buf2, "\\");
      	strcat(buf2, buf);
      	fp = fopen(buf2, "r");
      	}
     	}
	else
   	fp = fopen(buf, "r");
   return (fp);
}

/*
 * "asm" pseudo-statement
 *
 * enters mode where assembly language statements are passed
 * intact through parser
 *
 */

void doasm(void) {
	int old_ctext;

   old_ctext = ctext;
   ctext = 0;
   cmode = 0;
   while (1) {
      xinline();
      if (match("#endasm"))
         break;
      if (feof(input))
         break;
      outstr(line);			// leave errors up to aa90
      nl();
      }
   kill();
   cmode = 1;
   ctext = old_ctext;
}


void dodefine(void) {
   addmac();
}


void doundef(void) {
   int mp;
   char sname[NAMESIZE];

   if (!symname(sname)) {
      illname();
      kill();
      return;
      }

   if (mp = findmac(sname))
      delmac(mp);
   kill();
}


void preprocess(void) {
   if (ifline()) 
      return;
   while (cpp())
      ;
}


void doifdef(int xifdef) {
   char sname[NAMESIZE];
   int k;

   blanks();
   ++iflevel;
   if (skiplevel) 
      return;
   k = symname(sname) && findmac(sname);
   if (k != xifdef) 
      skiplevel = iflevel;
}


int ifline(void) {
   while (1) {
      xinline();
      if (feof(input)) 
         return(1);
      if (match("#ifdef")) {
         doifdef(YES);
         continue;
         } 
      else 
      if (match("#ifndef")) {
         doifdef(NO);
         continue;
         } 
      else 
      if (match("#else")) {
         if (iflevel) {
            if (skiplevel == iflevel) 
               skiplevel = 0;
            else 
            if (skiplevel == 0) 
               skiplevel = iflevel;
            } 
         else 
            noiferr();
         continue;
         } 
      else 
      if (match("#endif")) {
         if (iflevel) {
            if (skiplevel == iflevel) 
               skiplevel = 0;
            iflevel--;
            } 
         else 
            noiferr();
         continue;
         }
      if (!skiplevel) 
         return(0);
      }
}


void noiferr(void) {
   error("No matching #if...");
}



int cpp(void) {
   int k;
   char c, sname[NAMESIZE];
   int tog;
   int cpped;      /* non-zero if something expanded */

   cpped = 0;
   /* don't expand lines with preprocessor commands in them */
   if (!cmode || line[0] == '#') 
      return(0);

   mptr = lptr = 0;
   while (ch()) {
      if ((ch() == ' ') | (ch() == 9)) {
         keepch(' ');
         while ((ch () == ' ') | (ch () == 9))
            gch();
         } 
      else 
      if (ch() == '"') {
         keepch(ch());
         gch();
         while (ch() != '"') {
            if (ch() == 0) {
               error("missing quote");
               break;
               }
            if (ch() == '\\') 
               keepch(gch());
            keepch(gch());
            }
         gch();
         keepch('"');
         } 
      else 
      if (ch() == 39) {
         keepch(39);
         gch();
         while (ch() != 39) {
            if (ch() == 0) {
               error("missing apostrophe");
               break;
               }
            if (ch() == '\\') 
               keepch(gch());
            keepch(gch());
            }
         gch();
         keepch(39);
         } 
      else 
      if ((ch() == '/') & (nch() == '*')) {
         inchar();
         inchar();
         while ((((c = ch()) == '*') & (nch() == '/')) == 0) {
            if (c == '$') {
               inchar();
               tog = TRUE;
               if (ch() == '-') {
                  tog = FALSE;
                  inchar();
                  }
               if (alpha (c = ch())) {
                  inchar();
                  toggle(c, tog);
                  }
               } 
            else {
               if (ch() == 0)
                  xinline();
               else
                  inchar();
               if (feof(input))
                  break;
               }
            }
         inchar();
         inchar();
         } 
      else
      if ((ch() == '/') & (nch() == '/')) {
      	while (ch())
      		inchar();
         }
      else
         if (an(ch())) {
            k = 0;
            while (an(ch())) {
               if (k < NAMEMAX)
                  sname[k++] = ch();
               gch();
               }
            sname[k] = 0;
            if (k = findmac(sname)) {
               cpped = 1;
               while (c = macq[k++])
                  keepch(c);
               } 
            else {
               k = 0;
               while (c = sname[k++])
                  keepch(c);
               }
            }
         else
            keepch(gch());
      }
   
   keepch(0);
   if (mptr >= MPMAX)
      error("line too long");
   lptr = mptr = 0;
   while (line[lptr++] = mline[mptr++])
      ;
   lptr = 0;
   return (cpped);
}


static char keepch(char c) {
   mline[mptr] = c;
   if (mptr < MPMAX)
      mptr++;
   return (c);
}


void defmac(char *s) {
   kill();
   strcpy(line, s);
   addmac();
}


void addmac(void) {
   char sname[NAMESIZE];
   int k;
   int mp;

   if (!symname(sname)) {
      illname();
      kill();
      return;
      }
   if (mp = findmac(sname)) {
      error("Duplicate define");
      delmac(mp);
      }
   k = 0;
   while (putmac(sname[k++]))
      ;
   while (ch() == ' ' || ch() == 9)
      gch();
   while (putmacnew(gch()))
     	;
   if (macptr >= MACMAX)
      error("macro table full");
}


void delmac(int mp) {
   mp--;
   mp--; /* step over previous null */
   while (mp >= 0 && macq[mp]) 
      macq[mp--] = '%';
}
   

static char putmacnew(char c) {
	if (c == '/' && line[lptr] == '/') {
      kill();
      c = 0;
      }
   return putmac(c);
}


static char putmac(char c) {
   macq[macptr] = c;
   if (macptr < MACMAX)
      macptr++;
   return (c);
}


int findmac(char *sname) {
   int k;

   k = 0;
   while (k < macptr) {
      if (astreq(sname, macq + k, NAMEMAX)) {
         while (macq[k++])
         	;
         return (k);
         }
      while (macq[k++])
         ;
      while (macq[k++])
         ;
      }
   return (0);
}


static void toggle(char name, int onoff) {

   switch (name) {
      case 'C':
         ctext = onoff;
         break;
      }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -