/* Copyright (C) 2011-2022 Patrick H. E. Foubet - S.E.R.I.A.N.E. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see *******************************************************************/ #include "conf.h" /* stackC.c */ #include #include #include #include #include "nife.h" #include "mth.h" #include "err.h" #include "debug.h" #include "stackC.h" #include "stackF.h" /* #define DEBUG_M */ void putString(char * S) { void * M; int i; i = i_StackC; if (i == LSTACKC) stopErr("putString",NULL); if ((M = malloc(strlen(S)+1)) == NULL) stopErr("putString","malloc"); #ifdef DEBUG_M printf("New String address : %lu \n",(unsigned long)M); #endif strcpy((char*)M,S); if (fctEnCours) makeFct(T_CHA,M); else { stackC[i++] = (char*)M; _MODIF_i_StackC_(i); } } char * getString(void) /* NOT free() !!! */ { int i; i = i_StackC; if (i) { i--; _MODIF_i_StackC_(i); return(stackC[i]); } messErr(6); return NULL; } int isNString(int n) { if (i_StackC >= n) return 1; return 0; } void IF_dropC(void) { char * S; S=getString(); #ifdef DEBUG_M printf("Del String address : %lu \n",(unsigned long)S); #endif if (S != NULL) free((void*)S); } static void IF_dupC_i(int i) { char * S; int I; I = i_StackC; if (I>=i) { S = stackC[I-i]; putString(S); } else messErr(19); } void IF_dupC(void) { IF_dupC_i(1); } void IF_overC(void) { IF_dupC_i(2); } void IF_swapC(void) { char * S; int I; I = i_StackC; if (I>1) { S = stackC[I-1]; stackC[I-1] = stackC[I-2]; stackC[I-2] = S; } else messErr(19); } void IF_stackC_clear(void) { while (i_StackC) IF_dropC(); } static void IF_catC_i(int i) { char * S1, * S2, *S; int l, I; I = i_StackC; if (I>1) { S1 = stackC[I-2]; S2 = stackC[I-1]; l = strlen(S1) + strlen(S2) + i + 1; if ((S = (char*)malloc(l+1)) == NULL) stopErr("IF_catC_i","malloc"); strcpy(S,S1); if (i) strcat(S, " "); strcat(S,S2); IF_dropC(); IF_dropC(); I = i_StackC; stackC[I++]=S; _MODIF_i_StackC_(I); } else messErr(19); } void IF_catC(void) { IF_catC_i(0); } void IF_catsC(void) { IF_catC_i(1); } void IF_crC(void) { printf("\n"); } static void Get_Date_Time(int x) { struct tm * T; time_t t0; char b[12]; t0 = time(NULL); T = localtime(&t0); if (x) sprintf(b,"%.2d/%.2d/%.4d",T->tm_mday,T->tm_mon+1,T->tm_year+1900); else sprintf(b,"%.2d:%.2d:%.2d",T->tm_hour,T->tm_min,T->tm_sec); putString(b); } void IF_dateC(void) { Get_Date_Time(1); } void IF_timeC(void) { Get_Date_Time(0); } void IF_typeC(void) { int i; i = i_StackC; if (i) { printf("%s",stackC[i-1]); IF_dropC(); } else messErr(6); } void IF_show_stackC(void) { int i,j=0,I; char s; I=i_StackC; for(i=I-1;i>=0;i--) { #ifdef DEBUG_M printf(" %.5d : \"%s\" Add=%lu",strlen(stackC[i]),stackC[i], (unsigned long)(stackC[i])); #else printf(" %.5d : \"%s\"",(int)strlen(stackC[i]),stackC[i]); #endif if (j==0) printf(" <- top"); printf("\n"); j++; if (j==NBLIG) break; } if (i>0) { if (i==1) s=' '; else s='s'; printf(" ... and %d other%c string%c !\n",I-NBLIG,s,s); } else printf("\n"); } void IFD_show_stackC(void) { _IFD_BEGIN_ IF_show_stackC(); _IFD_END_ } void suiteString(char *S) { int end=0; if ((strlen(bufC)+strlen(S)+1) > MAXSTRING) { dropTrSuite(); _MODIF_stringEnCours_(0); messErr(9); return; } if (S[strlen(S)-1] == '"') { S[strlen(S)-1] = '\0'; end=1; } strcat(bufC,S); if (end) { dropTrSuite(); _MODIF_stringEnCours_(0); putString(bufC); } } void IF_debString(void) { bufC[0]='\0'; putTrSuite(suiteString); _MODIF_stringEnCours_(1); } void dump_eltC(int fd, char *A) { uint32_t l; l=strlen(A); write(fd, (void*)&l, sizeof(l)); write(fd, A, l+1); } void dump_stackC(int fd) { uint32_t n, i, l; n = i_StackC; write(fd, (void*)&n, sizeof(n)); for (i=0; i