351 lines · 5.7 KB · Objective-C
RawDownload
 /* * Copyright (c) 1998 David Stes. * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Library General Public License as published  * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: node.m,v 1.3 2011/06/15 19:06:42 stes Exp $ */ #include "config.h"#include <stddef.h>#include <stdlib.h>#include <ctype.h>#include <assert.h>#include <string.h>#ifndef __OBJECT_INCLUDED__#define __OBJECT_INCLUDED__#include <stdio.h> /* FILE */#include "Object.h" /* Stepstone Object.h assumes #import */#endif#include <ocstring.h>#include <ordcltn.h>#include "node.h"#include "symbol.h"#include "options.h" FILE *gfile;id infilename;char *outfilename;int exitstatus, inlineno, outlineno;id loadedmodules; /* for VICI */ static FILE *backupgfile;static BOOL lastisalpha; char *browsepath(char *filename){ if (!o_browsedir) {   fatal("browse dir not set");   return NULL; } else {   id buf = [String str:o_browsedir];   [buf concatSTR:o_pathsep];   [buf concatSTR:filename];   return [buf str]; }} void gstderr(void){  backupgfile = gfile;  o_nolinetags++;  gfile = stderr;} void gnormal(void){  gfile = backupgfile;  o_nolinetags--;} BOOL needspace(char c){  return isalnum(c) || c == '_' || c == '$';} void gc(char c){  if (needspace(c)) {    if (lastisalpha)      fputc(' ', gfile);    fputc(c, gfile);    lastisalpha = needspace(c);  } else {    if (c == '\n')      outlineno++;    fputc(c, gfile);    lastisalpha = NO;  }} void gextc(void){  if (o_cplus)    gs("extern \"C\" ");} void g_otbvars(void){  /* used at several locations */  gs("  struct OTB *previnst;\n");  gs("  struct OTB *nextinst;\n");} void gs(char *s){  int i, n = strlen(s);   if (n && lastisalpha && needspace(s[0]))    fputc(' ', gfile);  for (i = 0; i < n; i++)    if (s[i] == '\n')      outlineno++;  fputs(s, gfile);  if (n)    lastisalpha = needspace(s[n - 1]);} void gf(char *s,...){  OC_VA_LIST ap;  int i, n = strlen(s);   if (n && lastisalpha && needspace(s[0]))    fputc(' ', gfile);  for (i = 0; i < n; i++)    if (s[i] == '\n')      outlineno++;		/* assumes nl in format */  OC_VA_START(ap, s);  vfprintf(gfile, s, ap);  OC_VA_END(ap);  if (n)    lastisalpha = needspace(s[n - 1]);} void gcom(char *cm){  if (o_comments)    gs(cm);  gc('\n');} /* automatically generated variables (for message expressions) */ #define NUM_VARS_PER_LINE 5 void gvarlist(id c, char *cm, char *iz){  int j, k, n;   for (k = 0, n = [c size]; k < n;) {    gs(cm);    for (j = 0; j < NUM_VARS_PER_LINE && k < n; j++, k++) {      if (j)	gc(',');      gs([[c at:k] str]);      gs(iz);    }    gc(';');    gc('\n');  }} void gcommalist(id args){  int i, n = [args size];   if (n)    [[args at:0] gen];  for (i = 1; i < n; i++) {    gc(',');    [[args at:i] gen];  }} void gl(int no, char *fn){  int d = no - outlineno;   if (o_nolinetags || no == 0 || fn == NULL)    return;   /* usually outfilename will be pointer equal to 'fn' */  if (0 < d && d < 4 && outfilename == fn) {    while (d--)      gc('\n');    outlineno = no;  } else {    if (d != 0 || outfilename != fn) {      if (outlineno)	fputc('\n', gfile);	/* next char (#) must be 1st col */      fprintf(gfile, o_tagformat, no, fn);      outlineno = no;      outfilename = fn;    }  }} void vwarn(char *s, OC_VA_LIST ap){  int n;   vfprintf(stderr, s, ap);  if ((n = strlen(s)) && s[n - 1] != '\n')    fprintf(stderr, "\n");} void warnat(id sym, char *s,...){  if (o_warnings) {    OC_VA_LIST ap;    int no = [sym lineno];    char *fn = [[sym filename] str];     OC_VA_START(ap, s);    if (no != 0 && fn != NULL)      fprintf(stderr, "%s:%d: warning: ", fn, no);    vwarn(s, ap);    OC_VA_END(ap);  }} void warn(char *s,...){  if (o_warnings) {    OC_VA_LIST ap;     OC_VA_START(ap, s);    fprintf(stderr, "%s:%d: warning: ", [infilename str], inlineno);    vwarn(s, ap);    OC_VA_END(ap);  }} void vfatal(char *s, OC_VA_LIST ap){  int n;   vfprintf(stderr, s, ap);  if ((n = strlen(s)) && s[n - 1] != '\n')    fprintf(stderr, "\n");  exitstatus = 1;} void fatal(char *s,...){  OC_VA_LIST ap;   OC_VA_START(ap, s);  fprintf(stderr, "%s:%d: fatal: ", [infilename str], inlineno);  vfatal(s, ap);  OC_VA_END(ap);} void fatalat(id sym, char *s,...){  OC_VA_LIST ap;  int no = [sym lineno];  char *fn = [[sym filename] str];   OC_VA_START(ap, s);  if (no != 0 && fn != NULL)    fprintf(stderr, "%s:%d: fatal: ", fn, no);  vfatal(s, ap);  OC_VA_END(ap);} @implementation Node - synth{  return [self subclassResponsibility:_cmd];} - sgen{  o_nolinetags++;  [self gen];  o_nolinetags--;  return self;} - gen{  return [self subclassResponsibility:_cmd];} - st80{  return self;} - (BOOL)isstorageclass{  return NO;			/* overridden by StorageClass */} - (BOOL)isscalartype{  return NO;			/* overridden by Type */} - (BOOL)isgnuattrib{  return NO;			/* overridden by GnuAttribDecl */} - (BOOL)isid{  return NO;} - (BOOL)isvoid{  return NO;} - dot:sym{  return nil;} - go{  fprintf(stderr,"vici>%s\n",[self name]);  return self;} @end 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t