Beispiel #1
0
void gsc_exec()
{
	char *command;

	if (!stackGetParamString(0, &command))
	{
		stackError("gsc_exec() argument is undefined or has wrong type");
		stackPushUndefined();
		return;
	}

	Com_DPrintf("gsc_exec() executing: %s\n", command);

	FILE *fp;

	fp = popen(command, "r");

	if (fp == NULL)
	{
		stackPushUndefined();
		return;
	}

	char c;
	int curpos = 0;
	char content[COD2_MAX_STRINGLENGTH];

	stackPushArray();

	while ((c = getc(fp)) != EOF)
	{
		if (c == '\n' || curpos == COD2_MAX_STRINGLENGTH - 1)
		{
			content[curpos] = '\0';
			stackPushString(content);
			stackPushArrayLast();
			curpos = 0;
		}
		else
		{
			content[curpos] = c;
			curpos++;
		}
	}

	content[curpos] = '\0';

	stackPushString(content);
	stackPushArrayLast();

	pclose(fp);
}
Beispiel #2
0
void stackPush ( tStack* s, char c ) {
/*   ---------
** Vlo¾í znak na vrchol zásobníku. Pokus o vlo¾ení prvku do plného zásobníku
** je nekorektní a o¹etøete ho voláním procedury stackError(SERR_PUSH).
**
** Pro ovìøení, zda je zásobník plný, pou¾ijte døíve definovanou
** funkci stackFull.
*/

	  if(stackFull(s))
	      stackError(SERR_PUSH);
	  else
	      s->arr[++s->top] = c;
}
Beispiel #3
0
void stackTop ( const tStack* s, char* c ) {
/*   --------
** Vrací znak z vrcholu zásobníku prostøednictvím parametru c.
** Tato operace ale prvek z vrcholu zásobníku neodstraòuje.
** Volání operace Top pøi prázdném zásobníku je nekorektní
** a o¹etøete ho voláním funkce stackError(SERR_TOP).
**
** Pro ovìøení, zda je zásobník prázdný, pou¾ijte døíve definovanou
** funkci stackEmpty.
*/
  if (stackEmpty(s))
    stackError(SERR_TOP);
  else
    *c = s->arr[s->top];
}
Beispiel #4
0
void stackInit ( tStack* s ) {
/*   ---------
** Provede inicializaci zásobníku - nastaví vrchol zásobníku.
** Hodnoty ve statickém poli neupravujte - po inicializaci zásobníku
** jsou nedefinované.
**
** V pøípadì, ¾e funkce dostane jako parametr s == NULL,
** volejte funkci stackError(SERR_INIT). U ostatních funkcí pro zjednodu¹ení
** pøedpokládejte, ¾e tato situace nenastane.
*/
  if(s==NULL)
    stackError(SERR_INIT);
  else
    s->top = -1;
}
Beispiel #5
0
void stackPush ( tStack* s, char c ) {
/*   ---------
** Vlo¾í znak na vrchol zásobníku. Pokus o vlo¾ení prvku do plného zásobníku
** je nekorektní a o¹etøete ho voláním procedury stackError(SERR_PUSH).
**
** Pro ovìøení, zda je zásobník plný, pou¾ijte døíve definovanou
** funkci stackFull.
*/
	if (stackFull(s)!=0)
		stackError(SERR_PUSH); //Pokud je zasobnik plny, zavolam funkci na vypis chyby
	else{
		s->top++;	//jinak zvysim pocet prvku v zasobniku
		s->arr[s->top]=c;	//a ulozim hodnotu na vrchol
	}
}
Beispiel #6
0
void stackTop ( const tStack* s, char* c ) {
/*   --------
** Vrací znak z vrcholu zásobníku prostøednictvím parametru c.
** Tato operace ale prvek z vrcholu zásobníku neodstraòuje.
** Volání operace Top pøi prázdném zásobníku je nekorektní
** a o¹etøete ho voláním funkce stackError(SERR_TOP). 
**
** Pro ovìøení, zda je zásobník prázdný, pou¾ijte døíve definovanou
** funkci stackEmpty.
*/
	if (stackEmpty(s)==-1) 	//Pokud je vrchol zasobniku nastaven na -1 (je prazdny) zavolam funkci pro vypis chyby
		stackError(SERR_TOP);
	else{
		*c=s->arr[s->top]; //do promenne c dal hodnotu z vrcholu zasobniku
	}
}
Beispiel #7
0
void stackPush ( tStack* s, char c ) {
/*   ---------
** Vlo¾í znak na vrchol zásobníku. Pokus o vlo¾ení prvku do plného zásobníku
** je nekorektní a o¹etøete ho voláním procedury stackError(SERR_PUSH).
**
** Pro ovìøení, zda je zásobník plný, pou¾ijte døíve definovanou
** funkci stackFull.
*/

	// Pokud je zasobnik plny (vysledek podminky bude hodnota 1 -> true),
	// zavola se stackError s prisnym kodem chyby, jinak se na vrchol zasobniku
	// vlozi znak v parametru c
	if (stackFull(s)) {
		stackError(SERR_PUSH);
	} else {
		s->top++;
		s->arr[s->top] = c;
	}
}
Beispiel #8
0
void stackTop ( const tStack* s, char* c ) {
/*   --------
** Vrací znak z vrcholu zásobníku prostøednictvím parametru c.
** Tato operace ale prvek z vrcholu zásobníku neodstraòuje.
** Volání operace Top pøi prázdném zásobníku je nekorektní
** a o¹etøete ho voláním funkce stackError(SERR_TOP). 
**
** Pro ovìøení, zda je zásobník prázdný, pou¾ijte døíve definovanou
** funkci stackEmpty.
*/

	// Pokud je zasobnik prazdny (vysledek podminky bude hodnota 1 -> true),
	// zavola se stackError s prislusnym kodem chyby, jinak se do parametru c
	// nacte znak z vrcholu zasobniku
	if (stackEmpty(s)) {
		stackError(SERR_TOP);
	} else {
		*c = s->arr[s->top];
	}
}
Beispiel #9
0
void gsc_exec_async_create_nosave()
{
	char *command;
	int callback;

	if (!stackGetParamString(0, &command))
	{
		stackError("gsc_exec_async_create_nosave() argument is undefined or has wrong type");
		stackPushUndefined();
		return;
	}

	Com_DPrintf("gsc_exec_async_create_nosave() executing: %s\n", command);

	exec_async_task *current = first_exec_async_task;

	while (current != NULL && current->next != NULL)
		current = current->next;

	exec_async_task *newtask = new exec_async_task;

	strncpy(newtask->command, command, COD2_MAX_STRINGLENGTH - 1);
	newtask->command[COD2_MAX_STRINGLENGTH - 1] = '\0';
	newtask->output = NULL;
	newtask->prev = current;
	newtask->next = NULL;

	if (!stackGetParamFunction(1, &callback))
		newtask->callback = 0;
	else
		newtask->callback = callback;

	newtask->done = false;
	newtask->save = false;
	newtask->error = false;
	newtask->levelId = scrVarPub.levelId;
	newtask->hasargument = true;

	int valueInt;
	float valueFloat;
	char *valueString;
	vec3_t valueVector;
	unsigned int valueObject;

	if (stackGetParamInt(2, &valueInt))
	{
		newtask->valueType = INT_VALUE;
		newtask->intValue = valueInt;
	}
	else if (stackGetParamFloat(2, &valueFloat))
	{
		newtask->valueType = FLOAT_VALUE;
		newtask->floatValue = valueFloat;
	}
	else if (stackGetParamString(2, &valueString))
	{
		newtask->valueType = STRING_VALUE;
		strcpy(newtask->stringValue, valueString);
	}
	else if (stackGetParamVector(2, valueVector))
	{
		newtask->valueType = VECTOR_VALUE;
		newtask->vectorValue[0] = valueVector[0];
		newtask->vectorValue[1] = valueVector[1];
		newtask->vectorValue[2] = valueVector[2];
	}
	else if (stackGetParamObject(2, &valueObject))
	{
		newtask->valueType = OBJECT_VALUE;
		newtask->objectValue = valueObject;
	}
	else
		newtask->hasargument = false;

	if (current != NULL)
		current->next = newtask;
	else
		first_exec_async_task = newtask;

	pthread_t exec_doer;

	if (pthread_create(&exec_doer, NULL, exec_async, newtask) != 0)
	{
		stackError("gsc_exec_async_create_nosave() error creating exec async handler thread!");
		stackPushUndefined();
		return;
	}

	if (pthread_detach(exec_doer) != 0)
	{
		stackError("gsc_exec_async_create_nosave() error detaching exec async handler thread!");
		stackPushUndefined();
		return;
	}

	stackPushInt(1);
}