#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#define MAXSTR 21 //string to write
#define MAXLEN 1000
typedef struct Item {
char c;
struct Item *next;
} Item;
//convert Hex->Bin
struct Item *HexToBin(struct Item *BSpisok, struct Item *HSpisok);
/* Enter string-list */
int getList(struct Item **);
/* Get string-list */
void printList(const char *, struct Item *);
/* Free memory */
struct Item *deleteList(struct Item *);
/* Forming new string-list */
struct Item *SaveInputStr(struct Item *);
struct Item *SaveNewStr(struct Item *);
/* Delete spaces from string-list */
struct Item *delSpace(struct Item *);
/* Admission the word in string-list */
struct Item *skipWord(struct Item *);
/* Delete word from string-list */
struct Item *delWord(struct Item *);
//******************************************************************************
//******************************************************************************
//******************************************************************************
int getList(struct Item **pptr)
{
char buf[21], *str;
struct Item head = {'*', NULL};
struct Item *last = &head;
int n, rc = 1;
do{
n = scanf("%20[^\n]", buf);
if (n < 0)
{
deleteList(head.next);
head.next = NULL;
rc = 0;
continue;
}
if (n > 0)
{
for (str = buf; *str != '\0'; ++str)
{
last->next = (struct Item *)malloc(sizeof(struct Item));
last = last->next;
last->c = *str;
}
last->next = NULL;
}
else scanf("%*c");
} while(n > 0);
*pptr = head.next;
return rc;
}
void printList(const char *msg, struct Item *ptr)
{
for (; ptr != NULL; ptr = ptr->next)
}
struct Item *deleteList(struct Item *ptr)
{
struct Item *tmp = NULL;
while(ptr != NULL)
{
tmp = ptr;
ptr = ptr->next;
free(tmp);
}
return ptr;
}
struct Item *SaveNewStr(struct Item *p)
{
struct Item *head = p;
struct Item *cur = head, *prev = head;
int fl = 0;
while(cur && (cur->next = delSpace(cur->next))) {
if (fl)
{
cur = skipWord(cur->next);
prev = cur;
cur = cur->next;
if (cur)
{
cur->c = ' ';
}
}else
cur->next = delWord(cur->next);
fl = !fl;
}
if (prev->next) //?????
{
free(prev->next);
prev->next = NULL;
}
return head;
}
struct Item *delSpace(struct Item *p)
{
struct Item *tmp;
while(p && ( (p->c == ' ') || (p->c == '\t')))
{
tmp = p;
p = p->next;
free(tmp);
}
return p;
}
struct Item *skipWord(struct Item *p)
{
while (p->next && p->next->c != ' ' && p->next->c != '\t')
p = p->next;
return p;
}
struct Item *delWord(struct Item *p)
{
struct Item *tmp;
while (p && p->c != ' ' && p->c != '\t')
{
tmp = p;
p = p->next;
free(tmp);
}
return p;
}
struct Item *SaveInputStr(struct Item *p)
{
char ch;
struct Item *head=p;
struct Item *prev,*cur;
printf("Write your hex string:\n");
//collecting struct
while((ch=getchar())!='\n')
{
cur=(struct Item *)malloc(sizeof(struct Item));
if (head==NULL) head=cur;
else
prev->next=cur;
cur->next=NULL;
cur->c=ch;
printf("cur->c=%c\n", cur
->c
);
prev=cur;
}
return head;
}
//==============================================================================
//****END OF LIST FUNCTIONS****END OF LIST FUNCTIONS****END OF LIST FUNCTIONS***
//==============================================================================
//______________________________________________________________________________
//**MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN*MAIN**
//______________________________________________________________________________
int main(){
struct Item *HexSpisok=NULL, *BinSpisok=NULL;
HexSpisok=SaveInputStr(HexSpisok);
printList("HexSpisok", HexSpisok);
HexSpisok=SaveNewStr(HexSpisok);
printList("HexSpisok", HexSpisok);
BinSpisok=HexToBin(BinSpisok, HexSpisok);
printList("BinSpisok", BinSpisok);
getchar();
}
struct Item *HexToBin(struct Item *BSpisok, struct Item *HSpisok){
int i=0, j=0, flag=1; //j for massiv dig[j]- BIN string
char chr;
char ch,str[4];
struct Item *head=BSpisok, *p=HSpisok;
struct Item *prev, *cur;
// 0 1 2 3 4 5
static char *dig[]={ "0000", "0001", "0010", "0011", "0100", "0101",
// 6 7 8 9 10 11 12 13 14
"0110", "0111","1000", "1001", "1010", "1011", "1100", "1101", "1110",
// 15 16 17 18 19 20 21 22 23 24
"1111", "0", "1", "10", "11", "100", "101", "110", "111"," " };
while ( (p->next!=NULL) && (p->next!=NULL) )
{
chr=p->c;
if (chr==' ')
{
flag=1;
j=24;
}
else if (chr>='A' && chr<='F') j=chr-'A'+10;
else if (chr>='a' && chr<='f') j=chr-'a'+10;
else if (chr>='0' && chr<='9')
if (flag!=1) j=chr-'0'; //flag is to find first char in the word.Just delete left zeroes
else {
j=chr-'0'+16; //+15 is for massiv
flag=0;
}
strcpy(str, dig[j]);
j=strlen(str);
for (; i<j; i++)
{
cur=(struct Item *)calloc(1,sizeof(struct Item));
if (head==NULL) head=cur;
else
prev->next=cur;
cur->next=NULL;
cur->c=str[i];
printf("cur->c=%c\n", cur
->c
);
prev=cur;
}
printf("-----------------\n");
j=0;
i=0;
p=p->next;
}
return head;
}