473,507 Members | 2,388 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Printing "tab"

mdh
I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:

#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}


However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?

Thanks in advance.

Jun 16 '06 #1
25 11859

mdh wrote:
I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:
>
#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}
>>


However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?


Homework.

Hint: consider a function which accepts a char as input and returns a
char pointer.

Tom

Jun 16 '06 #2
mdh
Tom St Denis wrote:
Hint: consider a function which accepts a char as input and returns a
char pointer.

oh oh....I am on page 77 of K&R...can't wait to get to page 93
"Pointers and Arrays"!!! But, if you change your hint to avoid
pointers...I will byte :-)

Jun 16 '06 #3

mdh wrote:
Tom St Denis wrote:
Hint: consider a function which accepts a char as input and returns a
char pointer.

oh oh....I am on page 77 of K&R...can't wait to get to page 93
"Pointers and Arrays"!!! But, if you change your hint to avoid
pointers...I will byte :-)


Use a switch or if statement then.

if (x == '\t') printf("tab");
else printf("%c", x);

.....

Look ma, no thought!

Tom

Jun 16 '06 #4
mdh

Tom St Denis wrote:
Tom St Denis wrote:

Use a switch or if statement then.

Yes...I thought as much...I was wondering if I could get away without a
long switch statement, but I guess not. Thanks for your input.

Jun 16 '06 #5

mdh wrote:
Tom St Denis wrote:
Tom St Denis wrote:

Use a switch or if statement then.

Yes...I thought as much...I was wondering if I could get away without a
long switch statement, but I guess not. Thanks for your input.


well you're gonna have a huge "default" grouping though. As basically
32-126 are printable on most CP437 terminals.

Of course for extra credit you could detect the current code page and
substitute as appropriate :-)

Tom

Jun 16 '06 #6
mdh

Tom St Denis wrote:
Of course for extra credit you could detect the current code page and
substitute as appropriate :-)


I will take a rain check on that or now :-)

Thank you for you help.

Jun 16 '06 #7
mdh


Use a switch or if statement then.

if (x == '\t') printf("tab");
else printf("%c", x);


This what I have come up with:
>
#include <stdio.h>
# define UPPER_LIMT 127
# define NOT_CHAR 1
# define IS_CHAR 0
# define MAXARR 10
int itochar ( char s[], char i);
int main (){

int i;
char s[MAXARR];

printf("%7s%7s\n\n", "Decimal", "Value");

for ( i=0; i<= UPPER_LIMT; i++)

(IS_CHAR==itochar(s, i)) ? printf("%3d %3c\n", i, i) : printf("%3d
%3s\n", i, s);

return (0);

}
/**********/

int itochar ( char s[], char i){

switch (i) {

case '\t':

s = "TAB";

return NOT_CHAR;

case '\n':

s = "NEWLINE";

return NOT_CHAR;

case '\b':

s = "BACKSPACE";

return NOT_CHAR;

case '\r':

s = "CARRIAGE RETURN";

return NOT_CHAR;

default:

return IS_CHAR;

}

>


My problem is that even though the function " itochar" recognizes a tab
or newline, and even though initially NOT_CHAR is "returned", the
default "IS_CHAR" is then subsequently returned. Please be easy. Any
insight would be appreciated.

Jun 16 '06 #8
mdh schrieb:
int main (){

int i;
char s[MAXARR];

printf("%7s%7s\n\n", "Decimal", "Value");

for ( i=0; i<= UPPER_LIMT; i++)

(IS_CHAR==itochar(s, i)) ? printf("%3d %3c\n", i, i) : printf("%3d
%3s\n", i, s);

return (0);

}
/**********/

int itochar ( char s[], char i){
This is the same as:
int itochar(char* s, char i) {
switch (i) {

case '\t':

s = "TAB";
Here you change the local variable s that it points to another string.
The char array s in function main is not affected. You have to copy the
string into the array:

strcpy(s, "TAB");
My problem is that even though the function " itochar" recognizes a tab
or newline, and even though initially NOT_CHAR is "returned", the
default "IS_CHAR" is then subsequently returned. Please be easy. Any
insight would be appreciated.


see above.

Thomas
Jun 16 '06 #9

Thomas J. Gritzan wrote:
mdh schrieb:
int main (){

int i;
char s[MAXARR];

printf("%7s%7s\n\n", "Decimal", "Value");

for ( i=0; i<= UPPER_LIMT; i++)

(IS_CHAR==itochar(s, i)) ? printf("%3d %3c\n", i, i) : printf("%3d
%3s\n", i, s);

return (0);

}
/**********/

int itochar ( char s[], char i){


This is the same as:
int itochar(char* s, char i) {
switch (i) {

case '\t':

s = "TAB";


Here you change the local variable s that it points to another string.
The char array s in function main is not affected. You have to copy the
string into the array:

strcpy(s, "TAB");


Also, it would be a good idea to increase MAXARR to accomodate the
largest string you're going to put into s, otherwise when you get to

strcpy(s, "CARRIAGE RETURN");

you will overflow s and write into memory that isn't part of the array,
which is bad. Set MAXARR equal to at least 16 (i.e. the number of
characters in "CARRIAGE RETURN" plus room for the terminating '\0'
character), and larger if you want to accomodate longer strings. If you
copy a string somewhere, that somewhere needs to be big enough to hold
the entire string plus one extra slot for the '\0' character.

[snip]

--
Mike S

Jun 16 '06 #10

Mike S wrote:
Thomas J. Gritzan wrote:
mdh schrieb:
int main (){

int i;
char s[MAXARR];

printf("%7s%7s\n\n", "Decimal", "Value");

for ( i=0; i<= UPPER_LIMT; i++)

(IS_CHAR==itochar(s, i)) ? printf("%3d %3c\n", i, i) : printf("%3d
%3s\n", i, s);

return (0);

}
/**********/

int itochar ( char s[], char i){


This is the same as:
int itochar(char* s, char i) {
switch (i) {

case '\t':

s = "TAB";


Here you change the local variable s that it points to another string.
The char array s in function main is not affected. You have to copy the
string into the array:

strcpy(s, "TAB");


Also, it would be a good idea to increase MAXARR to accomodate the
largest string you're going to put into s, otherwise when you get to

strcpy(s, "CARRIAGE RETURN");

you will overflow s and write into memory that isn't part of the array,

[snip]
<afterthought> You need to #include <string.h> if you want to use
strcpy. </afterthought>

--
Mike S

Jun 16 '06 #11
mdh

Mike S wrote:
<afterthought> You need to #include <string.h> if you want to use
strcpy. </afterthought>


thank you Mike.

I also realize that my error was

s="etc etc"

as opposed to

s[0]='t';
s[1]='....etc etc'

Thank you...I have not used strcpy...but certainly makes it easier.

Jun 16 '06 #12
mdh

Thomas J. Gritzan wrote:
Tks Thomas, appreciated.

Jun 16 '06 #13
On 2006-06-16, mdh <md**@comcast.net> wrote:
Use a switch or if statement then.

if (x == '\t') printf("tab");
else printf("%c", x);


This what I have come up with:
>>
<snip ill-formatted code>
>>


My problem is that even though the function " itochar" recognizes a tab
or newline, and even though initially NOT_CHAR is "returned", the
default "IS_CHAR" is then subsequently returned. Please be easy. Any
insight would be appreciated.

Two things:
1) You don't really need a function for this
2) Never underestimate formatting on Usenet.

This problem looks like it would be best solved using pointers:

#include <stdio.h>
#include <stdlib.h>
#define MAX_LIMIT 127

int main (void)
{
char *c[MAX_LIMIT];
char *special[] = {"(Tab)", "(Backspace)", "(Bell)", "(Null)", "(Space)"};
char ctr = 0;

/* Init char listing */
while (ctr < MAX_LIMIT)
{
switch (ctr)
{
case '\t':
c[ctr] = special[0];
break;
case '\b':
c[ctr] = special[1];
break;
case '\a':
c[ctr] = special[2];
break;
case '\0':
c[ctr] = special[3];
break;
case ' ':
c[ctr] = special[4];
break;
/* Whatever other cases you want here. */
default:
c[ctr] = malloc (2);
sprintf (c[ctr], "%c", ctr);
}

ctr++;
}

/* Display listing */
for (ctr = 0; ctr < MAX_LIMIT; ctr++)
printf ("%d: %s\n", ctr, c[ctr]);

return 0;
}
This is easily extensible; just add any other special texts to the special[]
array, and add a corresponsing case in the switch.

You should add code to check for malloc() failures, and there's a case for
replacing my while loop with a for.

I'm sorry that you haven't learned pointers yet; perhaps when you get to them,
you should come back to my solution and see how it works. It doesn't appear
to me that you could elegantly replace text like you want without pointers.

--
Andrew Poelstra < http://www.wpsoftware.net/blog >
To email me, use "apoelstra" at the above address.
I know that area of town like the back of my head.
Jun 16 '06 #14
mdh

Tom St Denis wrote:
Use a switch or if statement then.

if (x == '\t') printf("tab");
else printf("%c", x);


I have ended up using this:

int itochar ( char s[], char i){

switch (i) {

case '\t':

strcpy(s, "HORIZONTAL TAB");

return NOT_CHAR;


Is there a way to capture, for example, "Delete", "Escape", "Cancel"?

Jun 16 '06 #15
mdh
Andrew Poelstra wrote:
I'm sorry that you haven't learned pointers yet; perhaps when you get to them,
you should come back to my solution and see how it works. It doesn't appear
to me that you could elegantly replace text like you want without pointers.


Thanks Andrew...will do...and thanks for the insight. I will bank it
for a few more pages!!

Jun 16 '06 #16
mdh wrote:

I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:

#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}

However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?


#include <limits.h>
....
unsigned int ch;
for (ch = 0; ch < UCHAR_MAX; ch++) {
if (isprint(ch) {
/* output the printing char as you please */
}
else {
/* deal with the non-printing char */
}
}

--
"A man who is right every time is not likely to do very much."
-- Francis Crick, co-discover of DNA
"There is nothing more amazing than stupidity in action."
-- Thomas Matthews
Jun 16 '06 #17
On 2006-06-16, mdh <md**@comcast.net> wrote:

Tom St Denis wrote:
Use a switch or if statement then.

if (x == '\t') printf("tab");
else printf("%c", x);
I have ended up using this:

int itochar ( char s[], char i){

switch (i) {

case '\t':

strcpy(s, "HORIZONTAL TAB");

return NOT_CHAR;


You'd better make sure that s[] can hold "HORIZONTAL TAB".

Is there a way to capture, for example, "Delete", "Escape", "Cancel"?


Not portably. You can grab an ASCII table and figure it out for most
desktop machines (hint: chars are integers).
--
Andrew Poelstra < http://www.wpsoftware.net/blog >
To email me, use "apoelstra" at the above address.
I know that area of town like the back of my head.
Jun 16 '06 #18
mdh

CBFalconer wrote:

unsigned int ch;
for (ch = 0; ch < UCHAR_MAX; ch++) {
if (isprint(ch) {
/* output the printing char as you please */
}
else {
/* deal with the non-printing char */
}
}

Nice...implemeted it...works nicely..thank you.

Jun 17 '06 #19
mdh
CBFalconer wrote:

unsigned int ch;
for (ch = 0; ch < UCHAR_MAX; ch++) {
if (isprint(ch) {
/* output the printing char as you please */
}
else {
/* deal with the non-printing char */
}
}

Nice...implemented it...works nicely..thank you.

Jun 17 '06 #20
mdh wrote:
I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:
#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}
However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?

Thanks in advance.


A 128-entry conversion table would do it. The entries are
strings. At decimal enter "TAB", at 32 enter "BLANK", etc.
Print the strings in the table.
--
Julian V. Noble
Professor Emeritus of Physics
University of Virginia
Jun 17 '06 #21

mdh wrote:
I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:
>
#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}
>>


However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?

Thanks in advance.


Jun 17 '06 #22
CBFalconer wrote:
mdh wrote:
I wrote a little insignificant program, to help me write a more
significant one!!...that was supposed to print all Ascii values from 0
to 127:

#include <stdio.h>
# define UPPER_LIMT 127

int main (){

int i;

printf("%7s%7s\n\n", "Decimal", "Value");
for ( i=0; i<= UPPER_LIMT; i++)
printf( "%3d%7c\n", i, i);
return 0;
}

However, I would like to see, for example, 'TAB' instead of an
upside-down question mark, at decimal value '9'. Is there a
conversion I could use for this in printf?


#include <limits.h>
...
unsigned int ch;
for (ch = 0; ch < UCHAR_MAX; ch++) {
if (isprint(ch) {
/* output the printing char as you please */
}
else {
/* deal with the non-printing char */
}
}


I wrote this several years ago. It may be of interest here. Note that
ASCII 0..31 are controls and not printable. Also 127 is not printable.

#include <stdio.h>
/*
The complete ASCII table is defined so that this program might
run as well on a machine whose native character set is not ASCII.
*/
char *ascii[] = {
"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
"BS ", "HT ", "LF ", "VT ", "FF ", "CR ", "SO ", "SI ",
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
"CAN", "EM ", "SUB", "ESC", "FS ", "GS ", "RS ", "US ",
" ", " ! ", " \" "," # ", " $ ", " % ", " & ", " ' ",
" ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ",
" 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ",
" 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ",
" @ ", " A ", " B ", " C ", " D ", " E ", " F ", " G ",
" H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ",
" P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ",
" X ", " Y ", " Z ", " [ ", " \\ "," ] ", " ^ ", " _ ",
" ` ", " a ", " b ", " c ", " d ", " e ", " f ", " g ",
" h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ",
" p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ",
" x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "DEL"
};
int main(void) {
int i;
size_t asiz = sizeof ascii / sizeof *ascii;
for (i = 0; i < asiz; ++i) {
if (i % 8 == 0) printf("\n|");
printf("%3d %s|", i, ascii[i]);
}
return 0;
}
--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
Jun 17 '06 #23
Joe Wright <jo********@comcast.net> wrote:
I wrote this several years ago. It may be of interest here. Note that
ASCII 0..31 are controls and not printable. Also 127 is not printable.

#include <stdio.h>
/*
The complete ASCII table is defined so that this program might
run as well on a machine whose native character set is not ASCII.
*/
char *ascii[] = {
"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
"BS ", "HT ", "LF ", "VT ", "FF ", "CR ", "SO ", "SI ",
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
"CAN", "EM ", "SUB", "ESC", "FS ", "GS ", "RS ", "US ",
" ", " ! ", " \" "," # ", " \u0024 ", " % ", " & ", " ' ",
" ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ",
" 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ",
" 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ", " \u0040 ", " A ", " B ", " C ", " D ", " E ", " F ", " G ",
" H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ",
" P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ",
" X ", " Y ", " Z ", " [ ", " \\ "," ] ", " ^ ", " _ ", " \u0060 ", " a ", " b ", " c ", " d ", " e ", " f ", " g ",
" h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ",
" p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ",
" x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "DEL"
};


Three of the characters in your table are not in the basic execution
character set.
Jun 17 '06 #24
Jordan Abel wrote:
Joe Wright <jo********@comcast.net> wrote:
I wrote this several years ago. It may be of interest here. Note that
ASCII 0..31 are controls and not printable. Also 127 is not printable.

#include <stdio.h>
/*
The complete ASCII table is defined so that this program might
run as well on a machine whose native character set is not ASCII.
*/
char *ascii[] = {
"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
"BS ", "HT ", "LF ", "VT ", "FF ", "CR ", "SO ", "SI ",
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
"CAN", "EM ", "SUB", "ESC", "FS ", "GS ", "RS ", "US ",
" ", " ! ", " \" "," # ",

" \u0024 ",
" % ", " & ", " ' ",
" ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ",
" 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ",
" 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ",

" \u0040 ",
" A ", " B ", " C ", " D ", " E ", " F ", " G ",
" H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ",
" P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ",
" X ", " Y ", " Z ", " [ ", " \\ "," ] ", " ^ ", " _ ",

" \u0060 ",
" a ", " b ", " c ", " d ", " e ", " f ", " g ",
" h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ",
" p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ",
" x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "DEL"
};


Three of the characters in your table are not in the basic execution
character set.


And what exactly does that mean to you? '@' and '`' are printable,
aren't they? That the ASCII 'CAN' control is not in the basic execution
character set is indeed surprising. NOT!

I must have missed something. What is your point?

--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
Jun 18 '06 #25
Joe Wright <jo********@comcast.net> wrote:
And what exactly does that mean to you? '@' and '`' are printable,
aren't they? That the ASCII 'CAN' control is not in the basic execution
character set is indeed surprising. NOT!
You didn't include the ascii CAN control in a string literal, only the
letters C, A, and N.
I must have missed something. What is your point?

Jun 18 '06 #26

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
2640
by: Dave McCloskey | last post by:
How can I convert the "Enter" key to a "Tab" so my application will act like "Tab" has been hit when the "Enter" key has actually been depressed. This gives type-writer functionality to programs....
0
1419
by: ad | last post by:
The user want to user "Enter" key to jump as "tab" do when editing data in a dataGrid. How can to do that?
5
2876
by: Lars Netzel | last post by:
Hey! I have tried...(in a datagrid) e.KeyDate.Return and e.KeyDate.TAB end e.KeyDate.Enter
0
1088
by: Sven Franz | last post by:
I develop an MDI-Application in vb.net (2002). But I got som errors, I can`t handle. When I have opened some MDI-Children and also closed them, my application crashed when I switch to an other...
7
5700
by: Doug Bell | last post by:
Hi, I have just built a small application with a form that has one Text Box and one Check Box and a couple of Command Buttons. What I am trying to achieve is that if the Text Box has focus and...
2
21199
by: Prabhudhas Peter | last post by:
How to Detect the "TAB" Key is pressed in the Text Box or Combo Box.... Which events catches the TAB key... I Want to perform some operations when the "TAB" key is pressed... -- Peter...
3
4158
by: aryayudhi | last post by:
I have a html page that has javascript that works perfectly in IE, but not in Firefox. The use of this javascript to change "Tab" to "Enter" Button. When we press Tab, it is like when we press Enter...
4
16401
by: HelloWorldHelloWorldHello | last post by:
What i want to know is What is the KeyAscii of " "Tab" key" ?.
0
7223
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7111
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7319
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
1
7031
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
5623
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
1
5042
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...
0
4702
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
1
760
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
412
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.