#include <stdio.h>
// INPUT: abcd a abcdef a
// OUTPUT: abcd****a******abcdef*a [
// OUTPUT: ---Detab: abcd****ba*****abcdef*<a
#define MAXLINE 1000
void detab (char s [], int tabwidth, int lim);
int main ()
{
int i, c, max;
max = MAXLINE;
char input [MAXLINE];
for (i
= 0; i
< max
&& (c
= getchar ()) != EOF
; ++i
) {
input [i] = c;
}
detab (input, 8, max);
printf ("\n---Detab: %s...\n", input
); return 0;
}
// lim must be larger than true size to allow for conversion and extra chars
void detab (char s [], int tabwidth, int lim)
{
int i;
int j = 0;
char t [lim];
for (i = 0; i < lim && s[i-1] != '\0'; ++i)
{
t[i] = s[i];
}
t [i] = '\0';
// Good through here
// t never changes from here out
for (i = 0; t[i] != '\0' && i < lim; ++i)
{
// Work on this
// Problem is that the first tab is always correct
// remaining tabs have 1 less '*' than necessary and the next is missing 2. etc.
// also returning the string leads to dirty end of string for some reason
// as in weird letters appended
if (t [i] == '\t')
{
while ((j % tabwidth) != 0)
{
s [j] = '*';
//putchar (s[j]);
++j;
}
//i++ maybe
--j;
}
else
{
s[j] = t[i];
//putchar (s[j]);
}
++j;
}
// last char of s is null
s [j+1] = '\0';
}
I2luY2x1ZGUgPHN0ZGlvLmg+Ci8vIElOUFVUOiAgYWJjZCAgICBhICAgICAgIGFiY2RlZiAgYQovLyBPVVRQVVQ6IGFiY2QqKioqYSoqKioqKmFiY2RlZiphICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLy8gT1VUUFVUOiAtLS1EZXRhYjogYWJjZCoqKipiYSoqKioqYWJjZGVmKjxhCiNkZWZpbmUgTUFYTElORSAxMDAwCgp2b2lkIGRldGFiIChjaGFyIHMgW10sIGludCB0YWJ3aWR0aCwgaW50IGxpbSk7CmludCBtYWluICgpCnsKCWludCBpLCBjLCBtYXg7CgltYXggPSBNQVhMSU5FOwoJY2hhciBpbnB1dCBbTUFYTElORV07Cglmb3IgKGkgPSAwOyBpIDwgbWF4ICYmIChjID0gZ2V0Y2hhciAoKSkgIT0gRU9GOyArK2kpCgl7CgkJaW5wdXQgW2ldID0gYzsKCX0KCWRldGFiIChpbnB1dCwgOCwgbWF4KTsKCXByaW50ZiAoIlxuLS0tRGV0YWI6ICVzLi4uXG4iLCBpbnB1dCk7CglyZXR1cm4gMDsKfQoKLy8gbGltIG11c3QgYmUgbGFyZ2VyIHRoYW4gdHJ1ZSBzaXplIHRvIGFsbG93IGZvciBjb252ZXJzaW9uIGFuZCBleHRyYSBjaGFycwp2b2lkIGRldGFiIChjaGFyIHMgW10sIGludCB0YWJ3aWR0aCwgaW50IGxpbSkKewoJaW50IGk7IAoJaW50IGogPSAwOwoJY2hhciB0IFtsaW1dOwoJZm9yIChpID0gMDsgaSA8IGxpbSAmJiBzW2ktMV0gIT0gJ1wwJzsgKytpKQoJewoJCXRbaV0gPSBzW2ldOwoJfQoJdCBbaV0gPSAnXDAnOwoJLy8gR29vZCB0aHJvdWdoIGhlcmUKCS8vIHQgbmV2ZXIgY2hhbmdlcyBmcm9tIGhlcmUgb3V0CgkKCQoJZm9yIChpID0gMDsgdFtpXSAhPSAnXDAnICYmIGkgPCBsaW07ICsraSkKCXsKCQlwdXRjaGFyICh0IFtpXSk7CgkJLy8gV29yayBvbiB0aGlzCgkJLy8gUHJvYmxlbSBpcyB0aGF0IHRoZSBmaXJzdCB0YWIgaXMgYWx3YXlzIGNvcnJlY3QKCQkvLyByZW1haW5pbmcgdGFicyBoYXZlIDEgbGVzcyAnKicgdGhhbiBuZWNlc3NhcnkgYW5kIHRoZSBuZXh0IGlzIG1pc3NpbmcgMi4gZXRjLgoJCS8vIGFsc28gcmV0dXJuaW5nIHRoZSBzdHJpbmcgbGVhZHMgdG8gZGlydHkgZW5kIG9mIHN0cmluZyBmb3Igc29tZSByZWFzb24KCQkvLyBhcyBpbiB3ZWlyZCBsZXR0ZXJzIGFwcGVuZGVkCgkJaWYgKHQgW2ldID09ICdcdCcpCgkJewoJCQl3aGlsZSAoKGogJSB0YWJ3aWR0aCkgIT0gMCkKCQkJewoJCQkJcyBbal0gPSAnKic7CgkJCQkvL3B1dGNoYXIgKHNbal0pOwoJCQkJKytqOwoJCQl9CgkJCS8vaSsrIG1heWJlCgkJCS0tajsKCQl9CgoJCWVsc2UKCQl7CgkJCXNbal0gPSB0W2ldOwoJCQkvL3B1dGNoYXIgKHNbal0pOwoJCX0KCQkrK2o7Cgl9CgkvLyBsYXN0IGNoYXIgb2YgcyBpcyBudWxsCglzIFtqKzFdID0gJ1wwJzsKfQ==