#include <stdio.h>
#include <stdint.h>
#include <string.h>

const char OUTS_ON[] = "<outs_on>";
const char OUTS_ON_CLOSED[] = "<outs_on/>";
const char OUTS_ON_CLOSING[] = "</outs_on>";

void get_state_outs(uint8_t state_outs, char* state_outs_str)
{
  // max string: <outs_on>1,2,3,4,5,6,7,8,</outs_on>
  if(state_outs == 0) //особливу ситуацію обробяємо на початку, щоб далі можна було рівень знизити
  {
    strcpy(state_outs_str, OUTS_ON_CLOSED);
    return;
  }
  
  char *target = state_outs_str;
  strcpy(target, OUTS_ON);
  target += sizeof(OUTS_ON)-1; //OUTS_ON має в кінці \0, але нам він не потрібен
  
  for( uint8_t i=1, bits = state_outs; bits!=0; ++i, bits>>=1) //якщо платформа не дозволяє - винесіть проголошення i з циклу
  {
    if(bits&0x1)
    {
      *target++ = '0'+i; //0x31 - абсолютно незрозуміло, про що мова
      *target++ = ',';
    }
  }
  strcpy(target, OUTS_ON_CLOSING);
}

int main(void) {
	char buffer[100];
	get_state_outs(0, buffer);//empty
	printf("%s\n",buffer);
	get_state_outs(0x6, buffer);//2,3
	printf("%s\n",buffer);
	get_state_outs(0xFF, buffer);//full
	printf("%s\n",buffer);
	return 0;
}
