Waitrud Weber’s blog

things and reminders for memories

Specification of :va_arg( *p_ap, char* );

We must care about printf("%c", c);
c means natually  "char c;"

char* vc;
char* vs;
vs = va_arg( *p_ap, char* );
// Not: vc = va_arg( *p_ap, char );

And program executed very smooth if you use malloc to print something to memories.


The fllowing are source code:

// main_000.cpp
void check_lootin () {

 const char* char_string = "char_string";
 char c = 'A';
 int num = 10;
 float f_num = 10.054f;

 DEBUG ("check_lootin", "%f %3d %c %s\r\n", f_num, num, c, char_string );

}

// aDebug.cpp
//
//
// 1st: f_name : Function name
// 2nd: p_ind  : Parameter indicator
//
int DEBUG ( char* f_name, const char* fmt, ...) {
 char* result;
 va_list ap;

 if (debug_allow_print_console == 1 ) {
  printf("START:DEBUG\r\n");

  va_start(ap, fmt);

  wsprintf( (LPSTR) dummy_str_print, (LPCSTR)"%s", vformat(fmt, &ap));

  result = NULL;
  result = (char *) dummy_str_print;
  printf("DEBUG: %s %s \r\n", f_name, result);
  printf("DEBUG: %s %s \r\n", f_name, dummy_str_print);
  va_end(ap);

  printf("END:DEBUG\r\n");
 }

 return 0;
}

// Print.cpp
//
//
//
wchar_t* vformat(const char* fmt, va_list *p_ap) {
// char buf[2000];
 wchar_t* abuf;
 abuf = (wchar_t*) L"aaa";

 // x vswprintf(buf, _toChars((char*)fmt), args);
 // o vswprintf( abuf, L"aaa", args);
 // vswprintf( abuf, _toChars( (char*)fmt ), args);
 // o vswprintf(abuf, _toChars((char*)fmt), args);

 // char *str_org = (char *)"left=%d top=%d right=%d bottom=%d";
 char strx[2000];
 char** ctype;
 char** param;

 double vf;
 int  vi;
 char*  vs;
 char vc;
 char* vsc = "\0\0";
 va_list ap;
 // o wsprintf( (LPWSTR)strx, (LPCWSTR)str_org, 10, 10, 10, 10);
 // o wsprintf( (LPWSTR)strx, (LPCWSTR)str_org, args);

 // 20181127
 // x wsprintf((LPWSTR)strx, (LPCWSTR)fmt, args);

 printf("wchar_t* vformat:start\r\n");

 ctype = (char**) malloc ( sizeof(char*)*256 );
 for( int i=0; i< 256; i++ ) {
  ctype[i] = (char*) malloc ( sizeof(char)* 10 );
 }

 param = (char**) malloc ( sizeof(char*)*256 );
 for( int i=0; i< 256; i++ ) {
  param[i] = (char*) malloc ( sizeof(char)* 30 );
 }

 int c_percent = count_perceent(fmt, (char**)ctype);
// va_start( ap, c_percent);

 int c_param = 0;
 for ( int i=0; i<c_percent; i++ ) {
  printf("loop i: %d/%d\r\n", i, c_percent );
  if ( m_compare ( ctype[i], "int" ) == 1 ) {
   vi = va_arg( *p_ap, int );
   itoa( vi, param[c_param], 10);
   param[c_param] = m_concat(param[c_param], ":");
   c_param++;
  } else if ( m_compare ( ctype[i], "char" ) == 1 ) {
   printf("char:start\r\n");
   vs = va_arg( *p_ap, char* );
   for ( int j=0; j<2; j++) {
    //printf("vs:%d %d", j, vs[j]);
    printf("vs:%d\r\ns", j);
   }
   printf("char:va_arg\r\n");
   //vc = tochar(vs);
   printf("char:tochar\r\n");
   // x vc = va_arg( *p_ap, char* );
   // x vc = vs;
   // x vc = *vs;
   // x vc = va_arg( *p_ap, char );
   // x vs[1] = '\0'; // o
   // o vc = 1;
   // x vsc[0] = vc;

   //printf("char:vs:%d %c char:vc:%d\r\n", vs, vs, vc);

   // x *(vsc) = vc;
   sprintf( param[c_param], "%c", vs);
   // x param[c_param][0] = vc;
   // x param[c_param][1] = '\0';
   printf("char:param:\r\n");
//   param[c_param] = m_concat(param[c_param], ":");
   printf("char:m_concat\r\n");
   c_param++;
   printf("char:end\r\n");
  } else if ( m_compare ( ctype[i], "float" ) == 1 ) {
   vf = va_arg( *p_ap, double );
   sprintf(param[c_param], "%f", vf);
   param[c_param] = m_concat(param[c_param], ":");
   c_param++;
  } else if ( m_compare ( ctype[i], "string" ) == 1 ) {
   vs = va_arg( (va_list)*p_ap, char* );
   param[c_param] = vs;
   param[c_param] = m_concat(param[c_param], ":");
   c_param++;
  }
 }

 for ( int i=0; i< c_param; i++) {
  printf("param:%d %s\r\n", i, param[i]);
 }


 //wsprintf( (LPSTR)strx, (LPCSTR)fmt, args);

 // vsprintf(buf, 2000, _toChars((char*)fmt, args);
 // vswprintf(buf, fmt, args);
 // char* result = toChars( abuf );
 //va_end( ap );

 //free
 for( int i=0; i< 256; i++ ) {
  free(ctype[i]);
 }
 free(ctype);

 for( int i=0; i< 256; i++ ) {
  free(param[i]);
 }
 free(param);

 printf("wchar_t* vformat:end\r\n");

 return abuf;
}

I'm pleasure if you download the below.

https://github.com/WaitrudWeber/source_zip/blob/master/winmain-20190112.zip


Please reffer to the below for compilation.
https://waitrudweber.hatenablog.com/entry/2018/05/01/005938