Exemple #1
0
long socket_udpsend(int id, const struct socket_udp_address *address, const void *data, int size) {
	const uint8_t *udp_address;
	int addrsize;
	struct socket_req req;
	struct socket * sock = &S.slot[HASH_ID(id)];
	if (sock->id != id || sock->type == SOCKET_TYPE_INVALID) {
		freebuffer((void *)data, size);
		return -1;
	}
	memset(&req, 0, sizeof req);
	req.req = SOCKET_REQ_SENDUDP;
	req.u.send.id = id;
	req.u.send.data = (char *)data;
	req.u.send.size = size;
	udp_address = (const uint8_t *)address;
	switch (udp_address[0]) {
	case PROTOCOL_UDP:
		addrsize = 1 + 2 + 4;
		break;
	case PROTOCOL_UDPv6:
		addrsize = 1 + 2 + 16;
		break;
	default:
		freebuffer((void *)data, size);
		return -1;
	}
	memcpy(req.u.sendudp.address, udp_address, addrsize);
	socket_send_req(&req);
	return sock->wb_size;
}
Exemple #2
0
long socket_send(int id, const void *data, int size, int priority) {
	struct socket_req req;
	struct socket * sock = &S.slot[HASH_ID(id)];
	if (sock->id != id || sock->type == SOCKET_TYPE_INVALID) {
		freebuffer((void *)data, size);
		return -1;
	}
	memset(&req, 0, sizeof req);
	req.req = SOCKET_REQ_SEND;
	req.u.send.id = id;
	req.u.send.data = (char *)data;
	req.u.send.size = size;
	req.u.send.priority = priority;
	socket_send_req(&req);
	return sock->wb_size;
}
Exemple #3
0
charset *parsecharset(const char *str, errmsg_t errmsg)
{
  charset *cset = NULL;
  buffer *cbuf = NULL;
  const wchar_t *p, * const singleescapes = L"_sbqQx";
  int hex1, hex2;
  wchar_t ch;
  wchar_t *wstr;
      
  wstr = (wchar_t *) malloc((strlen(str) + 1) * sizeof(wchar_t));
  if (!wstr) {
    wcscpy(errmsg,outofmem);
    goto pcserror;
  }
  if ((size_t)(-1) == mbstowcs(wstr, str, strlen(str) + 1)) {
    wcscpy(errmsg,mbserror);
    goto pcserror;
  }
  cset = malloc(sizeof (charset));
  if (!cset) {
    wcscpy(errmsg,outofmem);
    goto pcserror;
  }
  cset->inlist = cset->outlist = NULL;
  cset->flags = 0;

  cbuf = newbuffer(sizeof (wchar_t), errmsg);
  if (*errmsg) goto pcserror;

  for (p = wstr;  *p;  ++p)
    if (*p == L'_') {
      ++p;
      if (appearsin(*p, singleescapes)) {
        if      (*p == L'_') ch = L'_' ;
        else if (*p == L's') ch = L' ' ;
        else if (*p == L'b') ch = L'\\';
        else if (*p == L'q') ch = L'\'';
        else if (*p == L'Q') ch = L'\"';
        else /*  *p == 'x'  */ {
          /* FIXME _x metacharacter should allow wide characters input.*/
          hex1 = hexdigtoint(p[1]);
          hex2 = hexdigtoint(p[2]);
          if (hex1 < 0  ||  hex2 < 0) goto pcsbadstr;
          ch = 16 * hex1 + hex2;
          p += 2;
        }
        if (!ch)
          cset->flags |= CS_NUL;
        else {
          additem(cbuf, &ch, errmsg);
          if (*errmsg) goto pcserror;
        }
      }
      else {
        if      (*p == L'A') cset->flags |= CS_UCASE;
        else if (*p == L'a') cset->flags |= CS_LCASE;
        else if (*p == L'0') cset->flags |= CS_DIGIT;
        else goto pcsbadstr;
      }
    }
    else {
      additem(cbuf, p,errmsg);
      if (*errmsg) goto pcserror;
    }
  ch = '\0';
  additem(cbuf, &ch, errmsg);
  if (*errmsg) goto pcserror;
  cset->inlist = copyitems(cbuf,errmsg);
  if (*errmsg) goto pcserror;

pcscleanup:

  if (cbuf) freebuffer(cbuf);
  if (wstr) free(wstr);
  return cset;

pcsbadstr:

  swprintf(errmsg, errmsg_size, L"Bad charset syntax: %.*s\n", errmsg_size - 22, str);

pcserror:

  if (cset) freecharset(cset);
  cset = NULL;
  goto pcscleanup;
}
Exemple #4
0
static charset *csud(
  int u, const charset *cset1, const charset *cset2, errmsg_t errmsg
)
/* Returns the union of cset1 and cset2 if u is 1, or the set    */
/* difference cset1 - cset2 if u is 0.  Returns NULL on failure. */
{
  charset *csu;
  buffer *inbuf = NULL, *outbuf = NULL;
  wchar_t *lists[4], **list, *p, nullchar = L'\0';

  csu = malloc(sizeof (charset));
  if (!csu) {
    wcscpy(errmsg,outofmem);
    goto csuderror;
  }
  inbuf = newbuffer(sizeof (wchar_t), errmsg);
  if (*errmsg) goto csuderror;
  outbuf = newbuffer(sizeof (wchar_t), errmsg);
  if (*errmsg) goto csuderror;
  csu->inlist = csu->outlist = NULL;
  csu->flags =  u  ?  cset1->flags |  cset2->flags
                   :  cset1->flags & ~cset2->flags;

  lists[0] = cset1->inlist;
  lists[1] = cset1->outlist;
  lists[2] = cset2->inlist;
  lists[3] = cset2->outlist;

  for (list = lists;  list < lists + 4;  ++list)
    if (*list) {
      for (p = *list;  *p;  ++p)
        if (u  ?  csmember(*p, cset1) ||  csmember(*p, cset2)
               :  csmember(*p, cset1) && !csmember(*p, cset2)) {
          if (!csmember(*p, csu)) {
            additem(inbuf,p,errmsg);
            if (*errmsg) goto csuderror;
          }
        }
        else
          if (csmember(*p, csu)) {
            additem(outbuf,p,errmsg);
            if (*errmsg) goto csuderror;
          }
    }

  additem(inbuf, &nullchar, errmsg);
  if (*errmsg) goto csuderror;
  additem(outbuf, &nullchar, errmsg);
  if (*errmsg) goto csuderror;
  csu->inlist = copyitems(inbuf,errmsg);
  if (*errmsg) goto csuderror;
  csu->outlist = copyitems(outbuf,errmsg);
  if (*errmsg) goto csuderror;

csudcleanup:

  if (inbuf) freebuffer(inbuf);
  if (outbuf) freebuffer(outbuf);
  return csu;

csuderror:

  if (csu) freecharset(csu);
  csu = NULL;
  goto csudcleanup;
}
Exemple #5
0
// create a cube model that looks like a wavefront model, 
MODEL_T cube_wavefront()
{
	static const float qv[] = {
		-0.5f, -0.5f,  0.5f,
		-0.5f, -0.5f, -0.5f,
		 0.5f, -0.5f, -0.5f,
		 0.5f, -0.5f,  0.5f,
		-0.5f,  0.5f,  0.5f,
		 0.5f,  0.5f,  0.5f,
		 0.5f,  0.5f, -0.5f,
		-0.5f,  0.5f, -0.5f,
	};

	static const float qn[] = {
		 0.0f, -1.0f, -0.0f,
		 0.0f,  1.0f, -0.0f,
		 0.0f,  0.0f,  1.0f,
		 1.0f,  0.0f, -0.0f,
		 0.0f,  0.0f, -1.0f,
		-1.0f,  0.0f, -0.0f,
	};

	static const float qt[] = {
		1.0f, 0.0f,
		1.0f, 1.0f,
		0.0f, 1.0f,
		0.0f, 0.0f,
	};
   
	static const unsigned short qf[] = {
		1,1,1, 2,2,1, 3,3,1,
		3,3,1, 4,4,1, 1,1,1,
		5,4,2, 6,1,2, 7,2,2,
		7,2,2, 8,3,2, 5,4,2,
		1,4,3, 4,1,3, 6,2,3,
		6,2,3, 5,3,3, 1,4,3,
		4,4,4, 3,1,4, 7,2,4,
		7,2,4, 6,3,4, 4,4,4,
		3,4,5, 2,1,5, 8,2,5,
		8,2,5, 7,3,5, 3,4,5,
		2,4,6, 1,1,6, 5,2,6,
		5,2,6, 8,3,6, 2,4,6,
	};
	WAVEFRONT_MODEL_T *model = malloc(sizeof *model);
	if (model) {
		WAVEFRONT_MATERIAL_T *mat = model->material;
		float *temp;
		const int offset = 0;
		memset(model, 0, sizeof *model);

		temp = allocbuffer(3*MAX_VERTICES*sizeof *temp);
		//mat->numverts = countof(qf)/3;
		mat->numverts = sizeof(qf)/sizeof(short)/3;
		// vertex, texture, normal
		deindex(temp, qv, qf+3*offset+0, 3, mat->numverts);
		create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_VERTEX, 3 * mat->numverts * sizeof *qv, temp); // 3

		deindex(temp, qt, qf+3*offset+1, 2, mat->numverts);
		create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_TEXTURE, 2 * mat->numverts * sizeof *qt, temp); // 2

		deindex(temp, qn, qf+3*offset+2, 3, mat->numverts);
		create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_NORMAL, 3 * mat->numverts * sizeof *qn, temp); // 3

		freebuffer(temp);
		model->num_materials = 1;
	}
	return (MODEL_T)model;
}
Exemple #6
0
MODEL_T load_wavefront(const char *modelname, const char *texturename)
{
   WAVEFRONT_MODEL_T *model;
   float *temp, *qv, *qt, *qn;
   unsigned short *qf;
   int i;
   int numverts = 0, offset = 0;
   struct wavefront_model_loading_s *m;
   int s=-1;
   char modelname_obj[128];
   model = malloc(sizeof *model);
   if (!model || !modelname) return NULL;
   memset (model, 0, sizeof *model);
   model->texture = 0; //load_texture(texturename);
   m = allocbuffer(sizeof *m + 
      sizeof(float)*(3+2+3)*MAX_VERTICES +    // 3 vertices + 2 textures + 3 normals
      sizeof(unsigned short)*3*MAX_VERTICES); //each face has 9 vertices
   if (!m) return 0;

   if (strlen(modelname) + 5 <= sizeof modelname_obj) {
      strcpy(modelname_obj, modelname);
      strcat(modelname_obj, ".dat");
      s = load_wavefront_dat(modelname_obj, model, m);
   }
   if (s==0) {}
   else if (strncmp(modelname + strlen(modelname) - 4, ".obj", 4) == 0) {
      #ifdef DUMP_OBJ_DAT
      int size;
      FILE *fp;
      #endif
      s = load_wavefront_obj(modelname, model, m);
      #ifdef DUMP_OBJ_DAT
      strcpy(modelname_obj, modelname);
      strcat(modelname_obj, ".dat");
      size = sizeof *m + 
         sizeof(float)*(3*m->numv+2*m->numt+3*m->numn) +  // 3 vertices + 2 textures + 3 normals
         sizeof(unsigned short)*3*m->numf;                //each face has 9 vertices
      fp = host_file_open(modelname_obj, "w");
      fwrite(m, 1, size, fp);
      fclose(fp);
      #endif
   } else if (strncmp(modelname + strlen(modelname) - 4, ".dat", 4) == 0) {
      s = load_wavefront_dat(modelname, model, m);
   }
   if (s != 0) return 0;

   qv = (float *)(m->data);
   qt = (float *)(m->data + m->numv);
   qn = (float *)(m->data + m->numv + m->numt);
   qf = (unsigned short *)(m->data + m->numv + m->numt + m->numn);

   numverts = m->numf/3;
   vc_assert(numverts <= MAX_VERTICES);

   temp = allocbuffer(3*numverts*sizeof *temp);
   for (i=0; i<m->num_materials; i++) {
      WAVEFRONT_MATERIAL_T *mat = model->material + i;
      mat->numverts = i < m->num_materials-1 ? m->material_index[i+1]-m->material_index[i] : numverts - m->material_index[i];
      // vertex, texture, normal
      deindex(temp, qv, qf+3*offset+0, 3, mat->numverts);
      create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_VERTEX, 3 * mat->numverts * sizeof *qv, temp); // 3
   
      deindex(temp, qt, qf+3*offset+1, 2, mat->numverts);
      create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_TEXTURE, 2 * mat->numverts * sizeof *qt, temp); // 2
   
      deindex(temp, qn, qf+3*offset+2, 3, mat->numverts);
      create_vbo(GL_ARRAY_BUFFER, mat->vbo+VBO_NORMAL, 3 * mat->numverts * sizeof *qn, temp); // 3
      offset += mat->numverts;
      mat->texture = model->texture;
   }
   model->num_materials = m->num_materials;
   vc_assert(offset == numverts);
   freebuffer(temp);
   freebuffer(m);
   return (MODEL_T)model;
}
Exemple #7
0
/* snarfheredoc -- read a heredoc until the eof marker */
extern Tree *snarfheredoc(const char *eof, Boolean quoted) {
	Tree *tree, **tailp;
	Buffer *buf;
	unsigned char *s;

	assert(quoted || strchr(eof, '$') == NULL);	/* can never be typed (whew!) */
	if (strchr(eof, '\n') != NULL) {
		yyerror("here document eof-marker contains a newline");
		return NULL;
	}
	disablehistory = TRUE;

	for (tree = NULL, tailp = &tree, buf = openbuffer(0);;) {
		int c;
		print_prompt2();
		for (s = (unsigned char *) eof; (c = GETC()) == *s; s++)
			;
		if (*s == '\0' && (c == '\n' || c == EOF)) {
			if (buf->current == 0 && tree != NULL)
				freebuffer(buf);
			else
				*tailp = treecons(mk(nQword, sealcountedbuffer(buf)), NULL);
			break;
		}
		if (s != (unsigned char *) eof)
			buf = bufncat(buf, eof, s - (unsigned char *) eof);
		for (;; c = GETC()) {
			if (c == EOF) {
				yyerror("incomplete here document");
				freebuffer(buf);
				disablehistory = FALSE;
				return NULL;
			}
			if (c == '$' && !quoted && (c = GETC()) != '$') {
				Tree *var;
				UNGETC(c);
				if (buf->current == 0)
					freebuffer(buf);
				else {
					*tailp = treecons(mk(nQword, sealcountedbuffer(buf)), NULL);
					tailp = &(*tailp)->CDR;
				}
				var = getherevar();
				if (var == NULL) {
					freebuffer(buf);
					disablehistory = FALSE;
					return NULL;
				}
				*tailp = treecons(var, NULL);
				tailp = &(*tailp)->CDR;
				buf = openbuffer(0);
				continue;
			}
			buf = bufputc(buf, c);
			if (c == '\n')
				break;
		}
	}

	disablehistory = FALSE;
	return tree->CDR == NULL ? tree->CAR : tree;
}