예제 #1
0
파일: compile.c 프로젝트: dancahill/nsp
/* return the next quoted block */
static obj_t *n_extractquote(nsp_state *N, cstate *state, unsigned short verbatim)
{
#define __FN__ __FILE__ ":n_extractquote()"
	obj_t *cobj;
	char q = *N->readptr;
	char *qs, *qe;
	obj_t tobj;
	int n;

	DEBUG_IN();
	settrace();
	sanetest();
	if ((q != '\'') && (q != '\"') && (q != '`')) {
		DEBUG_OUT();
		return NULL;
	}
	N->readptr++;
	qs = (char *)N->readptr;
	n_skipquote(N, q, state, verbatim);
	qe = (char *)N->readptr;

	if (verbatim) {
		cobj = nsp_setstr(N, &N->r, "", qs, qe - qs - 1);
	}
	else {
		nc_memset((void *)&tobj, 0, sizeof(obj_t));
		nsp_setstr(N, &tobj, "", NULL, qe - qs - 1);
		n = n_unescape(N, qs, tobj.val->d.str, qe - qs - 1, state);
		cobj = nsp_setstr(N, &N->r, "", tobj.val->d.str, n);
		nsp_unlinkval(N, &tobj);
	}
	DEBUG_OUT();
	return cobj;
#undef __FN__
}
예제 #2
0
파일: align.c 프로젝트: wolski/pairseqsim
void globalAlign(DYNAM *p_dynam)
{
  int i,j;
  int lc1,lc2;
  double max, h, Ix, Iy;

  initglobalA(p_dynam); 
  lc1=p_dynam->lc1;
  lc2=p_dynam->lc2;
  p_dynam->si=lc1-1;
  p_dynam->sj=lc2-1;
  for(i=1; i <lc1; i++)
    {
      for(j=1; j <lc2; j++)
	{
	  p_dynam->h[i][j]= hglob(p_dynam,i,j);
	  p_dynam->Ix[i][j]= ixglob(p_dynam,i,j);
	  p_dynam->Iy[i][j]= iyglob(p_dynam,i,j);
	  settrace(p_dynam,i,j);
	}
    }
  h = p_dynam->h[lc1-1][lc2-1];
  Ix = p_dynam->Ix[lc1-1][lc2-1];
  Iy = p_dynam->Iy[lc1-1][lc2-1];
  max=maximumdouble(3,h,Ix,Iy);
  p_dynam->score=max;
}
예제 #3
0
파일: compile.c 프로젝트: dancahill/nsp
static obj_t *n_newobj(nsp_state *N, cstate *state)
{
#define __FN__ __FILE__ ":n_newobj()"
	settrace();
	if (state->lobj1 == NULL) {
		state->lobj1 = state->tobj1->val->d.table.f = n_newiobj(N, state->index);
	}
	else {
		state->lobj1->next = n_newiobj(N, state->index);
		state->lobj1->next->prev = state->lobj1;
		state->lobj1 = state->lobj1->next;
	}
	state->index++;
	return state->lobj1;
#undef __FN__
}
예제 #4
0
파일: align.c 프로젝트: wolski/pairseqsim
void overlapAlign(DYNAM *p_dynam)
{
  int i , j , lc1 , lc2;
  double score=MIN_DOUBLE;
  double tmp;
  initLocalA(p_dynam);
  lc1=p_dynam->lc1;
  lc2=p_dynam->lc2;
  for(i = 1; i< lc1;i++)
    {
      for(j =1; j<lc2;j++)
	{
	  /*The same conditions like for global but different initialization*/
	  p_dynam->h[i][j]= hglob(p_dynam,i,j);
	  p_dynam->Ix[i][j]= ixglob(p_dynam,i,j);
	  p_dynam->Iy[i][j]= iyglob(p_dynam,i,j);
	  settrace(p_dynam,i,j);
	}
    }

  /*find maximal score in last row or last column*/
  for(i = 1 ; i< lc1; i++)
    {
      tmp = maximumdouble(3 , p_dynam->h[i][lc2-1] , p_dynam->Ix[i][lc2-1] , p_dynam->Iy[i][lc2-1]);
      if(tmp > score)
	{
	  /*set traceback start*/
	  p_dynam->si=i;
	  p_dynam->sj=lc2-1;
	  score=tmp;
	}
    }
  for(i=1 ; i< lc2; i++)
    {
      tmp = maximumdouble(3 ,  p_dynam->h[lc1-1][i] , p_dynam->Ix[lc1-1][i] , p_dynam->Iy[lc1-1][i]);
      if(tmp>score)
	{
	  /*set traceback start*/
	  p_dynam->si=lc1-1;
	  p_dynam->sj=i;
	  score=score;
	}
    }
  p_dynam->score = score;
}
예제 #5
0
파일: compile.c 프로젝트: dancahill/nsp
/* Advance readptr to next matching quote */
static void n_skipquote(nsp_state *N, unsigned short c, cstate *state, unsigned short verbatim)
{
#define __FN__ __FILE__ ":n_skipquote()"
	settrace();
	while (*N->readptr) {
		if (*N->readptr == '\\' && !verbatim) {
			N->readptr++;
		}
		else if (*N->readptr == c) {
			N->readptr++;
			break;
		}
		else if (*N->readptr == '\n') {
			++state->lineno;
		}
		N->readptr++;
		if (!*N->readptr) n_error(N, NE_SYNTAX, __FN__, "unterminated string");
	}
	return;
#undef __FN__
}
예제 #6
0
파일: compile.c 프로젝트: dancahill/nsp
static long n_unescape(nsp_state *N, char *src, char *dst, long len, cstate *state)
{
#define __FN__ __FILE__ ":n_unescape()"
	long i, n;
	short e = 0;

	settrace();
	if (dst == NULL) return 0;
	for (i = 0, n = 0; i < len; i++) {
		if (!e) {
			if (src[i] == '\\') {
				e = 1;
			}
			else {
				dst[n++] = src[i];
			}
			continue;
		}
		switch (src[i]) {
		case '0': dst[n++] = 0;    break;
		case 'a': dst[n++] = '\a'; break;
		case 't': dst[n++] = '\t'; break;
		case 'f': dst[n++] = '\f'; break;
		case 'e': dst[n++] = 27;   break;
		case 'r': dst[n++] = '\r'; break;
		case 'n': dst[n++] = '\n'; break;
		case '\'': dst[n++] = '\''; break;
		case '\"': dst[n++] = '\"'; break;
		case '`': dst[n++] = '`';  break;
		case '\\': dst[n++] = '\\'; break;
		default:
			n_warn(N, __FN__, "bad escape %d", src[i]);
			break;
		}
		e = 0;
	}
	dst[n] = '\0';
	return n;
#undef __FN__
}
예제 #7
0
파일: align.c 프로젝트: wolski/pairseqsim
void localAlign(DYNAM *p_dynam)
{
  int i,j;
  int lc1,lc2;
  double score = MIN_DOUBLE;
  double tmp;

  initLocalA(p_dynam);
  lc1=p_dynam->lc1;
  lc2=p_dynam->lc2;
  for(i = 1; i< lc1;i++)
    {
      for(j =1; j<lc2;j++)
	{
	  /*The same conditions like for global, except for the h matrix.*/
	  p_dynam->h[i][j]= maximumdouble(2, 0.0 ,hglob(p_dynam,i,j));
	  p_dynam->Ix[i][j]= ixglob(p_dynam,i,j);
	  p_dynam->Iy[i][j]= iyglob(p_dynam,i,j);
	  settrace(p_dynam, i, j);
	}
    }

  /*find maximal score in matrices*/
  for(i = 1 ; i< lc1; i++)
    {
      for(j = 1 ; j < lc2 ; j++)
	{
	  tmp = maximumdouble(3,  p_dynam->h[i][j] , p_dynam->Ix[i][j] , p_dynam->Iy[i][j] );
	  if(tmp>score)
	    {
	      p_dynam->si=i; /*set start of traceback*/
	      p_dynam->sj=j; /*set start of traceback*/
	      score=tmp;
	    }
	}
    }
  p_dynam->score = score;
}
예제 #8
0
파일: fmtarenas.c 프로젝트: aahud/harvey
void
threadmain(int argc, char *argv[])
{
	int vers;
	ArenaPart *ap;
	Part *part;
	Arena *arena;
	uint64_t addr, limit, asize, apsize;
	char *file, *name, aname[ANameSize];
	int i, n, blocksize, tabsize, zero;

	ventifmtinstall();
	statsinit();

	blocksize = 8 * 1024;
	asize = 512 * 1024 *1024;
	tabsize = 512 * 1024;		/* BUG: should be determine from number of arenas */
	zero = -1;
	vers = ArenaVersion5;
	ARGBEGIN{
	case 'D':
		settrace(EARGF(usage()));
		break;
	case 'a':
		asize = unittoull(EARGF(usage()));
		if(asize == TWID64)
			usage();
		break;
	case 'b':
		blocksize = unittoull(EARGF(usage()));
		if(blocksize == ~0)
			usage();
		if(blocksize > MaxDiskBlock){
			fprint(2, "block size too large, max %d\n", MaxDiskBlock);
			threadexitsall("usage");
		}
		break;
	case '4':
		vers = ArenaVersion4;
		break;
	case 'Z':
		zero = 0;
		break;
	default:
		usage();
		break;
	}ARGEND

	if(zero == -1){
		if(vers == ArenaVersion4)
			zero = 1;
		else
			zero = 0;
	}

	if(argc != 2)
		usage();

	name = argv[0];
	file = argv[1];

	if(nameok(name) < 0)
		sysfatal("illegal name template %s", name);

	part = initpart(file, ORDWR|ODIRECT);
	if(part == nil)
		sysfatal("can't open partition %s: %r", file);

	if(zero)
		zeropart(part, blocksize);

	maxblocksize = blocksize;
	initdcache(20*blocksize);

	ap = newarenapart(part, blocksize, tabsize);
	if(ap == nil)
		sysfatal("can't initialize arena: %r");

	apsize = ap->size - ap->arenabase;
	n = apsize / asize;
	if(apsize - (n * asize) >= MinArenaSize)
		n++;

	fprint(2, "fmtarenas %s: %,d arenas, %,lld bytes storage, %,d bytes for index map\n",
		file, n, apsize, ap->tabsize);

	ap->narenas = n;
	ap->map = MKNZ(AMap, n);
	ap->arenas = MKNZ(Arena*, n);

	addr = ap->arenabase;
	for(i = 0; i < n; i++){
		limit = addr + asize;
		if(limit >= ap->size || ap->size - limit < MinArenaSize){
			limit = ap->size;
			if(limit - addr < MinArenaSize)
				sysfatal("bad arena set math: runt arena at %lld,%lld %lld", addr, limit, ap->size);
		}

		snprint(aname, ANameSize, "%s%d", name, i);

		if(0) fprint(2, "adding arena %s at [%lld,%lld)\n", aname, addr, limit);

		arena = newarena(part, vers, aname, addr, limit - addr, blocksize);
		if(!arena)
			fprint(2, "can't make new arena %s: %r", aname);
		freearena(arena);

		ap->map[i].start = addr;
		ap->map[i].stop = limit;
		namecp(ap->map[i].name, aname);

		addr = limit;
	}

	if(wbarenapart(ap) < 0)
		fprint(2, "can't write back arena partition header for %s: %r\n", file);

	flushdcache();
	threadexitsall(0);
}
예제 #9
0
파일: breakp2.c 프로젝트: Anastien/ngspice
/* Save a vector with the analysis type given (name). */
void
com_save2(wordlist *wl, char *name)
{
    settrace(wl, VF_ACCUM, name);
}
예제 #10
0
파일: breakp2.c 프로젝트: Anastien/ngspice
void
com_save(wordlist *wl)
{
    settrace(wl, VF_ACCUM, NULL);
}
예제 #11
0
파일: mmventi.c 프로젝트: CoryXie/nix-os
void
threadmain(int argc, char *argv[])
{
	char *haddr, *vaddr, *webroot, *file;

	traceinit();
	threadsetname("main");
	vaddr = nil;
	haddr = "tcp!*!9000";
	webroot = nil;
	ARGBEGIN{
	case 'a':
		vaddr = EARGF(usage());
		break;
	case 'D':
		settrace(EARGF(usage()));
		break;
	case 'd':
		debug = 1;
		nofork = 1;
		break;
	case 'h':
		haddr = EARGF(usage());
		break;
	case 'L':
		ventilogging = 1;
		break;
	case 'r':
		readonly = 1;
		break;
	case 's':
		nofork = 1;
		break;
	case 'W':
		webroot = EARGF(usage());
		break;
	default:
		usage();
	}ARGEND

	if(argc < 1)
		usage();

	file = argv[0];

	if(!nofork)
		rfork(RFNOTEG);

#ifdef PLAN9PORT
	{
		/* sigh - needed to avoid signals when writing to hungup networks */
		struct sigaction sa;
		memset(&sa, 0, sizeof sa);
		sa.sa_handler = SIG_IGN;
		sigaction(SIGPIPE, &sa, nil);
	}
#endif

	ventifmtinstall();
	trace(TraceQuiet, "venti started");
	fprint(2, "%T venti: ");

	statsinit();
	mminit(file, readonly ? OREAD : ORDWR);

	/*
	 * default other configuration-file parameters
	 */
	if(vaddr == nil)
		vaddr = "tcp!*!venti";

	if(haddr){
		fprint(2, "httpd %s...", haddr);
		if(httpdinit(haddr, webroot) < 0)
			fprint(2, "warning: can't start http server: %r");
	}
	fprint(2, "init...");


	fprint(2, "announce %s...", vaddr);
	ventisrv = vtlisten(vaddr);
	if(ventisrv == nil)
		sysfatal("can't announce %s: %r", vaddr);

	fprint(2, "serving.\n");
	if(nofork)
		ventiserver(nil);
	else
		vtproc(ventiserver, nil);

	threadexits(nil);
}
예제 #12
0
int main( int argc, char *argv[] )
{
    int res=0;
    if (argc < 3)
    {
        printf("frunagent <nodelist> start \"command\" [options] \n"
               "                     stop <commandid> [options]\n"
               "                     account <user> <password> <dir> [option]\n"
               "                     dir <dir> [option]\n"
               "                     alive <integer> [option]\n\n"
               "where <nodelist> is of the form h009100:h009119,h007010:h007020\n"
               "or 192.168.6.100:192.168.6.119,192.168.7.10:192.168.7.20\n"
               "or @filename where filename contains a file in the above format\n"
               "options: /n<number_of_thread> /t<call_time_out> /encrypt /o<replication_offset>\n"
              );
        return 255;
    }

    InitModuleObjects();

    StringBuffer tracepath;
    tracepath.append(".").append(PATHSEPCHAR).append("frunagent.txt");
    settrace(tracepath.str(),false);
    ECHO_TO_CONSOLE=true;

    try
    {
        setoptions(argc,argv);
        split_node x(argc,argv);
        if (argv[1][0]=='@')
        {
            StringBuffer b;
            b.loadFile(argv[1]+1);
            char *finger = (char *) b.str();
            while (*finger)
            {
                if (*finger == '\n')
                    *finger++ = ';';
                else if (*finger == '#')
                {
                    while (*finger && *finger != '\n')
                        *finger++ = ' ';
                }
                else
                    finger++;
            }
            x.split_nodes_ex(b.str(),replicationoffset);
        }
        else
            x.split_nodes_ex(argv[1],replicationoffset);
        disp->all_done_ex(false);
    }
    catch(IException *e)
    {
        pexception("",e);
        e->Release();
        res=255;
    }
    catch (...)
    {
        traceft("Caught unknown exception");
    }
#ifdef _TRACING
    traceflush();
#endif
    if (disp) delete disp;

    return res;
}
예제 #13
0
파일: compile.c 프로젝트: dancahill/nsp
uchar   *n_decompose(nsp_state *N, char *srcfile, uchar *srctext, uchar **dsttext, int *dstsize)
{
#define __FN__ __FILE__ ":n_decompose()"
	cstate state;
	obj_t *cobj, *tobj;
	unsigned short op;
	uchar *p, *p2;

	settrace();

	*dsttext = NULL;
	*dstsize = 0;

	if ((srctext[0] == 0x0D) && ((srctext[1] == 0xAC))) {
		n_warn(N, __FN__, "already chewed on this");
		return srctext;
	}
	nc_memset((char *)&state, 0, sizeof(state));
	state.lineno = 1;
	state.destmax = 1024;
	state.destbuf = (uchar *)n_alloc(N, state.destmax, 0);
	N->readptr = srctext;
	tobj = nsp_settable(N, &N->g, "decomped_script");
	nsp_freetable(N, tobj);
	state.tobj1 = nsp_settable(N, tobj, "code");
	n_decompose_sub(N, &state);
	/* header - 8 bytes */
	testgrow(8); /* safe portable use of sprintf is still considered dangerous according to openbsd */
	state.destbuf[state.offset++] = 0x0D;
	state.destbuf[state.offset++] = 0xAC;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	/* file size - 4 bytes */
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	/* optab offset  - 4 bytes (little endian) */
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	/* symtab offset - 4 bytes (little endian) */
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	state.destbuf[state.offset++] = 0;
	/* now write the ops */
	/* optab offset */
	writei4(state.offset, (state.destbuf + 12));
	/* set line number to 1 */
	testgrow((long)(5));
	state.destbuf[state.offset++] = OP_LINENUM;
	writei4(1, (state.destbuf + state.offset));
	state.offset += 4;

	for (cobj = state.tobj1->val->d.table.f; cobj; cobj = cobj->next) {
		op = (unsigned short)cobj->val->attr;
		cobj->val->attr = 0;
		if (op == OP_LINENUM) {
			testgrow((long)(5));
			state.destbuf[state.offset++] = op & 255;
			writei4((int)cobj->val->d.num, (state.destbuf + state.offset));
			state.offset += 4;
			continue;
		}
		if (!nsp_isstr(cobj)) break;
		if (op == OP_UNDEFINED) break;
		if (op == OP_POBRACE) {
			testgrow((long)(5));
			state.destbuf[state.offset++] = op & 255;
			writei4(0, (state.destbuf + state.offset));
			state.offset += 4;
			continue;
		}
		else if (op == OP_POPAREN) {
			testgrow((long)(3));
			state.destbuf[state.offset++] = op & 255;
			writei2(0, (state.destbuf + state.offset));
			state.offset += 2;
			continue;
		}
		else if (op == OP_STRDATA || op == OP_ESTRDATA) {
			testgrow((long)(6 + cobj->val->size));
			state.destbuf[state.offset++] = op & 255;
			writei4(cobj->val->size, (state.destbuf + state.offset));
			state.offset += 4;
			nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size);
			state.offset += cobj->val->size;
			state.destbuf[state.offset++] = 0;
		}
		else if (op == OP_NUMDATA) {
			testgrow((long)(3 + cobj->val->size));
			state.destbuf[state.offset++] = op & 255;
			state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255);
			nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size);
			state.offset += cobj->val->size;
			state.destbuf[state.offset++] = 0;
		}
		else if (op == OP_LABEL) {
			testgrow((long)(3 + cobj->val->size));
			state.destbuf[state.offset++] = op & 255;
			state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255);
			nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size);
			state.offset += cobj->val->size;
			state.destbuf[state.offset++] = '\0';
		}
		else if (OP_ISMATH(op) || OP_ISKEY(op) || OP_ISPUNC(op)) {
			testgrow(1);
			state.destbuf[state.offset++] = op & 255;
			if (op == OP_KFUNC) {
				char *p = srcfile;

				//n_warn(N, __FN__, "'%s'", p);
				if (cobj->next->val->attr == OP_LABEL) {
					cobj = cobj->next;
					op = (unsigned short)cobj->val->attr;
					cobj->val->attr = 0;
					testgrow((long)(3 + cobj->val->size));
					state.destbuf[state.offset++] = op & 255;
					state.destbuf[state.offset++] = (uchar)(cobj->val->size & 255);
					nc_memcpy((char *)state.destbuf + state.offset, cobj->val->d.str, cobj->val->size);
					state.offset += cobj->val->size;
					state.destbuf[state.offset++] = '\0';
				}
				if (srcfile == NULL) p = "";
				testgrow((long)(3 + nc_strlen(p)));
				state.destbuf[state.offset++] = OP_LABEL;
				state.destbuf[state.offset++] = (uchar)(nc_strlen(p) & 255);
				nc_memcpy((char *)state.destbuf + state.offset, p, nc_strlen(p));
				state.offset += nc_strlen(p);
				state.destbuf[state.offset++] = '\0';
			}
		}
		else {
			n_warn(N, __FN__, "bad op?");
		}
	}
	/* file size */
	writei4(state.offset, (state.destbuf + 8));
	/* add some trailing nulls for fun... */
	testgrow(4); writei4(0, (state.destbuf + state.offset));
	state.offset += 4;
	/* n_dumpvars(N, &N->g, 0); */
	nsp_freetable(N, tobj);
	*dsttext = state.destbuf;
	*dstsize = state.destmax;
	for (p = *dsttext + 12; p < *dsttext + state.offset - 4;) {
		if (*p == OP_LINENUM) { p += 5; continue; }
		if (*p == OP_POBRACE) {
			p2 = n_seekop(N, p, 1);
			if (p2 <= p) {
				n_warn(N, __FN__, "pointer did not progress");
				break;
			}
			--p2;
			// if (*p2!=OP_PCBRACE) n_warn(N, __FN__, "no OP_PCBRACE? %d", (p+(p2-p)+5)[0]);
			if (*p2 != OP_PCBRACE) {
				/*
				int i;
				for (i=0;i<state.offset;i++) {
				if (i==p2-*dsttext) {
				printf("-----------------------\r\n[%d]\r\n-------------------", state.destbuf[i]);
				} else {
				if (state.destbuf[i]>=32 && state.destbuf[i]<128) {
				printf("'%c' %d\r\n", state.destbuf[i], state.destbuf[i]);
				} else {
				printf("%d\r\n", state.destbuf[i]);
				}
				}
				}
				*/
				n_warn(N, __FN__, "no OP_PCBRACE? %d .. %d %d %d %d [%d] %d %d", OP_PCBRACE, p2[-4], p2[-3], p2[-2], p2[-1], p2[0], p2[1], p2[2]);
				//n_decompile(N, *dsttext+12, *dsttext+state.offset-4, NULL, 0);
			}
			writei4((p2 - p - 5), (p + 1));
		}
		else if (*p == OP_POPAREN) {
			p2 = n_seekop(N, p, 1);
			if (p2 <= p) {
				n_warn(N, __FN__, "pointer did not progress");
				break;
			}
			--p2;
			if (*p2 != OP_PCPAREN) {
				n_warn(N, __FN__, "no OP_PCPAREN? %d .. %d %d %d %d [%d] %d %d", OP_PCPAREN, p2[-4], p2[-3], p2[-2], p2[-1], p2[0], p2[1], p2[2]);
			}
			writei2((p2 - p - 3), (p + 1));
		}
		p = n_seekop(N, p, 0);
	}
	return *dsttext;
#undef __FN__
}
예제 #14
0
파일: compile.c 프로젝트: dancahill/nsp
static void n_decompose_sub(nsp_state *N, cstate *state)
{
#define __FN__ __FILE__ ":n_decompose_sub()"
	char lastname[MAX_OBJNAMELEN + 1];
	char *p;
	short op;
	short prevop = 0;

	settrace();
	while (*N->readptr) {
		n_skipblank(N, state);
		op = n_getop(N, lastname);
		n_skipblank(N, state);
		if (op == OP_UNDEFINED) {
			n_warn(N, __FN__, "bad op? index=%d line=%d op=%d:%d name='%s'", state->index, state->lineno, op, N->readptr[0], lastname);
			return;
		}
		else if (op == OP_LABEL) {
			n_newobj(N, state);
			nsp_setstr(N, state->lobj1, NULL, lastname, -1);
			state->lobj1->val->attr = op;
		}
		else if (OP_ISMATH(op) || OP_ISKEY(op) || OP_ISPUNC(op)) {
			if (OP_ISKEY(op) && prevop == OP_PDOT) {
				// it's NOT a keyword!
				int i;

				for (i = OP_KEXIT; i <= OP_KBREAK; i++) {
					if (nc_strcmp(oplist[i].name, lastname) == 0) {
						n_newobj(N, state);
						nsp_setstr(N, state->lobj1, NULL, lastname, -1);
						state->lobj1->val->attr = OP_LABEL;
						break;
					}
				}
			}
			else {
				n_newobj(N, state);
				nsp_setstr(N, state->lobj1, NULL, n_getsym(N, op), -1);
				state->lobj1->val->attr = op;
			}
		}
		else if (N->readptr[0] == '\"' || N->readptr[0] == '\'' || N->readptr[0] == '`') {
			op = N->readptr[0];
			n_newobj(N, state);
			nsp_linkval(N, state->lobj1, n_extractquote(N, state, 0));
			state->lobj1->val->attr = op == '`' ? OP_ESTRDATA : OP_STRDATA;
		}
		else if (N->readptr[0] == '@' && (N->readptr[1] == '\"' || N->readptr[1] == '\'' || N->readptr[1] == '`')) {
			op = N->readptr[1];
			N->readptr++;
			n_newobj(N, state);
			nsp_linkval(N, state->lobj1, n_extractquote(N, state, 1));
			state->lobj1->val->attr = op == '`' ? OP_ESTRDATA : OP_STRDATA;
		}
		else if (nc_isdigit(*N->readptr)) {
			p = (char *)N->readptr;
			while (nc_isdigit(*N->readptr) || *N->readptr == '.') N->readptr++;
			n_newobj(N, state);
			nsp_setstr(N, state->lobj1, NULL, p, (char *)N->readptr - p);
			state->lobj1->val->attr = OP_NUMDATA;
		}
		prevop = op;
	}
	return;
#undef __FN__
}
예제 #15
0
파일: compile.c 프로젝트: dancahill/nsp
/* Advance readptr to next non-blank */
static void n_skipblank(nsp_state *N, cstate *state)
{
#define __FN__ __FILE__ ":n_skipblank()"
	uchar *p = N->readptr;

	settrace();
	while (*p) {
		if (p[0] == '#') {
			p++;
			while (*p) {
				if (*p == '\n') {
					n_newobj(N, state);
					nsp_setnum(N, state->lobj1, NULL, ++state->lineno);
					state->lobj1->val->attr = OP_LINENUM;
					break;
				}
				else if (*p == '\r') break;
				p++;
			}
		}
		else if (p[0] == '/'&&p[1] == '/') {
			p += 2;
			while (*p) {
				if (*p == '\n') {
					n_newobj(N, state);
					nsp_setnum(N, state->lobj1, NULL, ++state->lineno);
					state->lobj1->val->attr = OP_LINENUM;
					break;
				}
				else if (*p == '\r') break;
				p++;
			}
		}
		else if (p[0] == '/'&&p[1] == '*') {
			p += 2;
			while (*p) {
				if (*p == '\n') state->lineno++;
				else if (p[0] == '*'&&p[1] == '/') {
					p += 2;
					if (*p == '\n') {
						n_newobj(N, state);
						nsp_setnum(N, state->lobj1, NULL, ++state->lineno);
						state->lobj1->val->attr = OP_LINENUM;
					}
					break;
				}
				p++;
			}
		}
		else {
			if (*p == '\n') {
				n_newobj(N, state);
				nsp_setnum(N, state->lobj1, NULL, ++state->lineno);
				state->lobj1->val->attr = OP_LINENUM;
			}
		}
		if (!nc_isspace(*p)) break;
		p++;
	}
	N->readptr = p;
	return;
#undef __FN__
}
예제 #16
0
파일: venti.c 프로젝트: npe9/harvey
void
threadmain(int argc, char *argv[])
{
	char *configfile, *haddr, *vaddr, *webroot;
	u32int mem, icmem, bcmem, minbcmem, mempcnt, stfree;
	Allocs allocs;
	Config config;

	traceinit();
	threadsetname("main");
	mempcnt = 0;
	vaddr = nil;
	haddr = nil;
	configfile = nil;
	webroot = nil;
	mem = Unspecified;
	icmem = 0;
	bcmem = 0;
	ARGBEGIN{
	case 'a':
		vaddr = EARGF(usage());
		break;
	case 'B':
		bcmem = unittoull(EARGF(usage()));
		break;
	case 'c':
		configfile = EARGF(usage());
		break;
	case 'C':
		mem = unittoull(EARGF(usage()));
		break;
	case 'D':
		settrace(EARGF(usage()));
		break;
	case 'd':
		debug = 1;
		nofork = 1;
		break;
	case 'h':
		haddr = EARGF(usage());
		break;
	case 'm':
		mempcnt = atoi(EARGF(usage()));
		if (mempcnt <= 0 || mempcnt >= 100)
			usage();
		break;
	case 'I':
		icmem = unittoull(EARGF(usage()));
		break;
	case 'L':
		ventilogging = 1;
		break;
	case 'r':
		readonly = 1;
		break;
	case 's':
		nofork = 1;
		break;
	case 'w':			/* compatibility with old venti */
		queuewrites = 1;
		break;
	case 'W':
		webroot = EARGF(usage());
		break;
	default:
		usage();
	}ARGEND

	if(argc)
		usage();

	if(!nofork)
		rfork(RFNOTEG);

#ifdef PLAN9PORT
	{
		/* sigh - needed to avoid signals when writing to hungup networks */
		struct sigaction sa;
		memset(&sa, 0, sizeof sa);
		sa.sa_handler = SIG_IGN;
		sigaction(SIGPIPE, &sa, nil);
	}
#endif

	ventifmtinstall();
	trace(TraceQuiet, "venti started");
	fprint(2, "%T venti: ");

	if(configfile == nil)
		configfile = "venti.conf";

	/* remember free memory before initventi & loadbloom, for auto-sizing */
	stfree = freemem(); 	 
	fprint(2, "conf...");
	if(initventi(configfile, &config) < 0)
		sysfatal("can't init server: %r");
	/*
	 * load bloom filter
	 */
	if(mainindex->bloom && loadbloom(mainindex->bloom) < 0)
		sysfatal("can't load bloom filter: %r");

	/*
	 * size memory allocations; assumes bloom filter is loaded
	 */
	allocs = sizeallocs((Allocs){mem, bcmem, icmem, stfree, mempcnt},
		&config);
	mem = allocs.mem;
	bcmem = allocs.bcmem;
	icmem = allocs.icmem;
	fprint(2, "%s: mem %,ud bcmem %,ud icmem %,ud...",
		argv0, mem, bcmem, icmem);

	/*
	 * default other configuration-file parameters
	 */
	if(haddr == nil)
		haddr = config.haddr;
	if(vaddr == nil)
		vaddr = config.vaddr;
	if(vaddr == nil)
		vaddr = "tcp!*!venti";
	if(webroot == nil)
		webroot = config.webroot;
	if(queuewrites == 0)
		queuewrites = config.queuewrites;

	if(haddr){
		fprint(2, "httpd %s...", haddr);
		if(httpdinit(haddr, webroot) < 0)
			fprint(2, "warning: can't start http server: %r");
	}
	fprint(2, "init...");

	/*
	 * lump cache
	 */
	if(0) fprint(2, "initialize %d bytes of lump cache for %d lumps\n",
		mem, mem / (8 * 1024));
	initlumpcache(mem, mem / (8 * 1024));

	/*
	 * index cache
	 */
	initicache(icmem);
	initicachewrite();

	/*
	 * block cache: need a block for every arena and every process
	 */
	minbcmem = maxblocksize * 
		(mainindex->narenas + mainindex->nsects*4 + 16);
	if(bcmem < minbcmem)
		bcmem = minbcmem;
	if(0) fprint(2, "initialize %d bytes of disk block cache\n", bcmem);
	initdcache(bcmem);

	if(mainindex->bloom)
		startbloomproc(mainindex->bloom);

	fprint(2, "sync...");
	if(!readonly && syncindex(mainindex) < 0)
		sysfatal("can't sync server: %r");

	if(!readonly && queuewrites){
		fprint(2, "queue...");
		if(initlumpqueues(mainindex->nsects) < 0){
			fprint(2, "can't initialize lump queues,"
				" disabling write queueing: %r");
			queuewrites = 0;
		}
	}

	if(initarenasum() < 0)
		fprint(2, "warning: can't initialize arena summing process: %r");

	fprint(2, "announce %s...", vaddr);
	ventisrv = vtlisten(vaddr);
	if(ventisrv == nil)
		sysfatal("can't announce %s: %r", vaddr);

	fprint(2, "serving.\n");
	if(nofork)
		ventiserver(nil);
	else
		vtproc(ventiserver, nil);

	threadexits(nil);
}