JSON Tools

JSONViewer Notepad++ plugin
A JSON viewer plugin for notepad++. Displays the selected JSON string in a tree view.
http://sourceforge.net/projects/nppjsonviewer

json2csharp
C# class generator from JSON string
http://json2csharp.com

NestIn

Nest files in Solution Explorer
http://visualstudiogallery.msdn.microsoft.com/9d6ef0ce-2bef-4a82-9a84-7718caa5bb45
Nest any type of file on any other type of file within your solution explorer!  Keep your code more organized! Nest ViewModel and Views, Mapping files on classes or anything else. 

PetaPoco

PetaPoco
PetaPoco · GitHub
PetaPoco Custom SQL Paging
Multi-POCO queries
TwoTableSample
PetaPocoSample · GitHub
Mapping related objects
Quick and easy Unit of Work
PetaPocoPage Repository method to handle the PetaPoco Page<T> query based on the DataTables request object
Many-to-many relationships with PetaPoco
A-simple-web-app · GitHub
Hierarchical Data with PetaPoco Multi-Poco Mapping

Task Parallel Library (TPL)

Task Parallel Library (TPL)
Parallel Programming with Microsoft .NET - Codeplex
Patterns of Parallel Programming - Channel9
Start Multiple Async Tasks and Process Them As They Complete
Parallel Programming with Microsoft .NET - MSDN
Parallel Programming with Microsoft .NET - PDF

HTML5 Input Types

HTML5 New Input Types

input type=text
input type=password
input type=checkbox
input type=radio
input type=button
input type=submit
input type=reset
input type=file
input type=hidden
input type=image
input type=datetime
input type=datetime-local
input type=date
input type=month
input type=time
input type=week
input type=number
input type=range
input type=email
input type=url
input type=search
input type=tel
input type=color

http://www.w3.org/TR/html-markup/input.html

Browser Support

http://www.quirksmode.org/html5/inputs.html

http://www.wufoo.com/html5/

WUFOO - Free HTML Form Templates

Free HTML Form Templates

Inputs vs Buttons

Rediscovering the Button Element

Unicode and Character Sets

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

Paçozluk kavramını biraz açar mısınız?

Paçoz, kendi çıkarları için her yolu mübah sayan, küstah, peş para etmez, sokak kurnazı, zevzek, müptezel, basmakalıp, palavracı, rüküş, hoyrat, içtensiz, pespaye, nekes, terbiyesiz, aşağılık, ahlaksız, kalleş. Dostoyevski ‘Puşlost’ (Poshlost) der. Topluma musallat olan, iblis ayarlı, paçozluktur, Puşlost. İşte kitap paçozluğun hikayesi. Puşlost tüm bu kavramları içinde toplayan tanımlama. Bizde de Ömer Seyfettin’in Efruz Bey tiplemesi, Nesin’in Zübük’ü kısmen buna yakındır. Ama benim ele aldığım paçozluk süreci Puşlost’a daha yakın ve korkum o ki, bu iblis Türkiye’ye yerleşmektedir. Paçozluğun dini, ırkı, sınıfı, cinsiyeti, ırkı yoktur ve giderek Türkiye’ye yerleşiyor.

"benim adımın söylendiği ve insanların bunun ne anlama geldiğini bilmediği bir gün asla olmayacak"


O dünyanın gelmiş geçmiş en büyük futbolcusuydu. Taburcu olduktan iki gün sonra tekrar hastaneye dönmek zorunda kalmış.

Ülkesinde otobiyografi kitabını kutsal kitap kabul eden, "Boca es mi religion, Maradona es mi dios, La bombonera es mi iglesia (Dinim Boca, Tanrım Maradona, Mabedim La bombonera…)" diyen insanlar varmış.

Öteki futbolcularla karşılaştırmak, Tanrı olarak görmek kadar saçma.
Allah şifa versin.

Eğer

eğer bütün etrafindakiler panik içine düştüğü ve bunun sebebini senden bildikleri zaman sen başını dik tutabilir ve sağduyunu kaybetmezsen;

eğer sana kimse güvenmezken sen kendine güvenir ve onların güvenmeyişini de haklı görebilirsen;

eğer beklemesini bilir ve beklemekten yorulmazsan ve ya hakkında yalan söylenir de sen yalanla iş görmezsen, ya da senden nefret edilir de kendini nefrete kaptirmazsan, bütün bunlarla bereaber ne çok iyi ne de çok akıllı görünmezsen;

eğer hayal kurabilir de hayallerine esir olmazsan, eğer düşünebilip de düşüncelerini amaç edinebilirsen, eğer zafer ve mağlubiyet ile karşilaşır ve bu iki hokkabaza ayni şekilde davranabilirsen;

eğer ağzindan çıkan bir gerçeğin bazi alçaklar tarafindan ahmaklara tuzak kurmak için eğilip bükülmesine katlanbilirsen, ya da ömrünü verdiğin şeylerin bir gün başina yıkıldiğini görür ve eğilip yıpranmiş aletlerle onları yeniden yapabilirsen;

eğer bütün kazancını bir yığın yapabilir ve bir yazi tura oyununda hepsini tehlikeye atabilirsen;

ve kaybedip yeniden başlayabilir ve kaybın hakkında bir kelimecik olsun bir şey söylemezsen;

eğer kalbini, sinirlerini, kaslarini yiprandiktan sonra bile işine yaramaya zorlayabilirsen ve kendinde dayan diyen bir iradeden başka bir güç kalmadığı zaman dayanabilirsen;

eğer kalabalık topluuluklarda konuşup onurunu koruyabilrsen, ya da krallarla gezip karakterini kaybetmezsen;

eğer ne düşmanlarin ne de sevgili dostların seni incitemezse;

eğer aşiriya kaçmadan tüm insanları sevebilirsen;

eğer bir daha dönmeyecek olan dakikayi, altmiş saniye koşarak doldurabilirsen;

yeryüzü ve üstündekiler senindir

ve dahası

sen bir insan olursun oğlum

rudyard kipling
if

Advanced System Utilities

Windows için güzel oyuncaklar : Windows Sysinternals
Autologon da çok zaman kazandırıcı bişeymiş, ne mutlu kullanabilene:)

Learning History

The next time you are washing your hands and complain because the water temperature isn't just how you like it, think about how things used to be. Here are some facts about the1500s:

Most people got married in June because they took their yearly bath in May, and still smelled pretty good by June. However, they were starting to smell, so brides carried a bouquet of flowers to hide the body odor. Hence the custom today of carrying a bouquet when getting married.

Baths consisted of a big tub filled with hot water. The man of the house had the privilege of the nice clean water, then all the other sons and men, then the women and finally the children. Last of all the babies. By then the water was so dirty you could actually lose someone in it. Hence the saying, Don't throw the baby out with the Bath water..

Houses had thatched roofs-thick straw-piled high, with no wood underneath. It was the only place for animals to get warm, so all the cats and other small animals (mice, bugs) lived in the roof When it rained it became slippery and sometimes the animals would slip and fall off the roof. Hence the saying . It's raining cats and dogs.

There was nothing to stop things from falling into the house.. This posed a real problem in the bedroom where bugs and other droppings could mess up your nice clean bed. Hence, a bed with big posts and a sheet hung over the top afforded some protection. That's how canopy beds came into existence.

The floor was dirt. Only the wealthy had something other than dirt. Hence the saying, Dirt poor. The wealthy had slate floors that would get slippery in the winter when wet, so they spread thresh (straw) on floor to help! keep t heir footing. As the winter wore on, they added more thresh until, when you opened the door, it would all start slipping outside. A piece of wood was placed in the entrance way. Hence the saying a thresh hold.

(Getting quite an education, aren't you?)

In those old days, they cooked in the kitchen with a big kettle that always hung over the fire. Every day they lit the fire and added things to the pot. They ate mostly vegetables and did not get much meat. They would eat the stew for dinner, leaving leftovers in the pot to get cold overnight and then start over the next day. Sometimes stew had food in it that had been there for quite a while. Hence the rhyme, Peas porridge hot, peas porridge cold, peas porridge in the pot nine days old..

Sometimes they could obtain pork, which made them feel quite special. When visitors came over, they would hang up their bacon to show off. It was a sign of wealth that a man could, bring home the bacon. They would cut off a little to share with guests and would all sit around and chew the fat..

Those with money had plates made of pewter. Food with high acid content caused some of the lead to leach onto the food, causing lead poisoning death. This happened most often with tomatoes, so for the next 400 years or so, tomatoes were considered poisonous.

Bread was divided according to status. Workers got the burnt bottom of the loaf, the family got the middle, and guests got the top, or the upper crust.

Lead cups were used to drink ale or whiskey. The combination would sometimes knock the imbibers out for a couple of days. Someone walking along the road would take them for dead and prepare them for burial. They were laid out on the kitchen table for a couple of days and the family would gather around and eat and drink and wait and see if they would wake up. Hen ce the custom of holding a wake.

England is old and small and the local folks started running out of places to bury people. So they would dig up coffins and would take the bones to a bone-house, and reuse the grave. When reopening these coffins, 1 out of 25 coffins were found to have scratch marks on the inside and they realized they had been burying people alive. So they would tie a string on the wrist of the corpse, lead it through the coffin and up through the ground and tie it to a bell. Someone would have to sit out in the graveyard all night (the graveyard shift.) to listen for the bell; thus, someone could be, saved by the bell or was considered a dead ringer..

And that's the truth...Now, whoever said History was boring !!!

Risk

Bahar aylarının verimli topraklarının içinde iki tohum yan yana yatıyormuş.
Tohumlardan biri diğerine," Ben büyümek istiyorum!" demiş, Köklerimi altımda toprağın derinlerine ve filizimi yeryüzüne göndermek istiyorum.... Baharın müjdecisi tomurcuklarım açılsın istiyorum.... Güneşin sıcağını yüzümde, sabahın tatlı dokunuşunu yapraklarımda
hissetmek istiyorum!"
Ve büyümeye başladı tohum.
İkinci tohum ise," Ben korkuyorum" dedi,." Köklerimi toprağın altındaki derinliklere gönderirsem, karanlıklarda beni neyin beklediğini bilemem. Üstümdeki toprağı zorlayıp yeryüzüne çıkmaya çalışsam, filizlerim zarar görebilir....hem tomurcuklarım açmaya
başladığında üzerlerinde salyangozlar gezip,onları yemeye kalkarsa ? Ya tomurcuklarım, açılıp çiçeğe dönüştüklerinde küçük bir çocuk beni koparıverirse? Yo hayır. En iyisi burada kalıp beklemek. Büyümek için belki daha güvenli bir zaman bulabilirim.."
Ve ikinci tohum beklemeye başladı.
O sırada yumuşamış olan bahar toprağını eşeleyen bir tavuk buldu tohumu ve bir lokmada yutuverdi onu.
Riskleri göze almaktan ve büyümekten korkanları yaşam bir anda yutuverir.
Hikayenin orijinali Patty Hansen'in Patty Hansen'in 'Chicken Soup for the Soul' kitabından alınmış
Burada bunun gibi başka hoş hikayeler de varmış...

Ben tamamen tavuğun yediği tohum gibi düşünüyorum, ötekisi ballıymış:) fazla riske girmeden de çok şey yapılır ama hikaye güzelmiş..

CAPTCHA - Completely Automated Public Turing test to tell Computers and Humans Apart

Weblog'umun yorum yazma sayfasındaki, kayıt girişi imkanı veren özellikten dolayı yaşanması muhtemel bir automated form submission hadisesini engellemek maksadıyla, The Code Project sitesinde gayet öğretici bir örneği bulunan CAPTCHA™ Style Image Generator'ı buraya implemente ettim.

Hepten de kopyacılık olmasın diye C#'ta yazılmış class'ı VB.NET'e çevireyim dedim. Bu da buradaki converterla gayet kolay oldu fakat C#'ın case sensitive olmasından dolayı ufak bir sorun yaşandı. Kodun orijinalinde, yerel değişkenler propertylerle aynı olacak şekilde adlandırılmıştı, onları yeniden adlandırıverdim.
Gerçi güvenlik amacıyla konulmuş bi özelliğin kaynak kodunu açıklamak ta saçmalık ama benim düşmanım yok şükür ayrıca olsa bile

kimse bişey yapamaz. 

VB.NET'e cevirdiğim class : CaptchaImage.vb.txt

Olay şöyle cereyan ediyor:

  • Random bir sayı üretiliyor.
  • Sonra bu sayıyı resme dönüştürülüp sayfaya yerleştiriliyor aynı zamanda postback olduktan sonra kullanıcının yazdığı ile karşılaştırabilmek için session'a atılıyor.
  • Postback olduktan sonra sayfadaki textbox'a girilen sayı, sessionda tutulanla karşılaştırıp münasip eylem gerçekleştiriliyor.

Bundan başka şuradaki gibi komple hazır, harflerle karışık yazılar üretebilen hatta asp.net validation kontrolleriyle falan bile entegre çalışabilen bişey yapılmış. Ama dll olarak veriyolar.

Bana bu kadarı yeterli geldi ama CAPTCHA™ hakkında daha fazla bilgiyi The CAPTCHA Project sitesinde bulabilirmişiz.

İşte Örnek İnsan

They see me mowin’
My front lawn
I know they’re all thinking I’m so white and nerdy
Think I’m just too white and nerdy
Think I’m just too white and nerdy
Can’t you see I’m white and nerdy?
Look at me, I’m white and nerdy
I wanna roll with
The gangstas
But so far they all think I’m too white and nerdy
Think I’m just too white and nerdy
Think I’m just too white and nerdy
I’m just too white and nerdy.
Really really white and nerdy.
First in my class here at MIT
Got skills, I’m a champion at D&D
MC Escher - that’s my favorite MC
Keep your 40, I’ll just have an Earl Grey tea
My rims never spin, to the contrary
You’ll find that they’re quite stationary
All of my action figures are cherry
Steven Hawking’s in my library
My MySpace page is all totally pimped out
Got people beggin’ for my top eight spaces
Yo, I know pi to a thousand places
Ain’t got no grills but I still wear braces
I order all of my sandwiches with mayonnaise
I’m a whiz at Minesweeper - I could play for days
Once you see my sweet moves you’re gonna stay amazed
My fingers’ movin’ so fast I’ll set the place ablaze
There’s no killer app I haven’t run
At Pascal, well I’m number one
Do vector calculus just for fun
I ain’t got a gat but I got a soldering gun
Happy Days is my favorite theme song
I could sure kick your butt in a game of ping pong
I’ll ace any trivia quiz you bring on
I’m fluent in JavaScript as well as Klingon
They see me roll on
My Segway
I know in my heart they think I’m white and nerdy
Think I’m just too white and nerdy
Think I’m just too white and nerdy
Can’t you see I’m white and nerdy
Look at me, I’m white and nerdy
I’d like to roll with
The gangstas
Although it’s apparent I’m too white and nerdy
Think I’m just too white and nerdy
Think I’m just too white and nerdy
I’m just too white and nerdy
How’d I get so white and nerdy
I’ve been browsin’, inspectin’
X-Men comics, you know I collect ‘em
The pens in my pocket, I must protect ‘em
My ergonomic keyboard never leaves me bored
Shopping online for deals on some writable media
I edit Wikipedia
I memorized Holy Grail really well
I can recite it right now and have you ROTFLOL
I got a business doing websites
When my friends need some code, who do they call?
I do HTML for ‘em all
Even made a homepage for my dog
Yo, I got myself a fanny pack
They were havin’ a sale down at The Gap
Spend my nights with a roll of bubble wrap
Pop, pop, hope no one sees me
Gettin’ freaky
I’m nerdy in the extreme
And whiter than sour cream
I was in AV Club and Glee Club and even the Chess Team
Only question I
Ever thought was hard
Was do I like Kirk
Or do I like Picard
Spend every weekend at the Renaissance Fair
Got my name on my underwear
They see me strollin’
They laughin’
And rollin’ their eyes ’cause I’m so white and nerdy
Just because I’m white and nerdy
Just because I’m white and nerdy
All because I’m white and nerdy
Holy cow, I’m white and nerdy
I wanna bowl with
The gangstas
But, oh well, it’s obvious I’m white and nerdy
Think I’m just too white and nerdy
Think I’m just too white and nerdy
I’m just too white and nerdy
Look at me, I’m white and nerdy

Merkez Bankası Döviz Kurları

Bir zamanlar geçmiş tarihlerdeki döviz kuru bilgilerine sık sık bakmam gerekiyordu, bunları TCMBnın sitesinden alıp daha çabuk erişilebilecek bi yerde toplamak hep aklımdaydı ama bi türlü vakit bulup yapamamıştım. Artık döviz kurlarına bakmam gerekmiyor ama ben gene de yaptım.



Program yukarıdaki gibi bir form aracılığıyla T.C. Merkez Bankası Döviz kurları bilgilerini bankanın internet sitesinden alıp bir MS Access veritabanına yazmayı sağlıyor. Programın setupı ve kaynak kodları burada...
DovizKuruSetup.msi

Outlook'tan VBA ile mail gönderme

Sitemin ziyaretçi sayisini arttirmak için gönderdigim masum(!) tanitim mailleri dolayisiyla, mail hesabim kapatildiktan sonra bende bu isi outlookta çalisan asagidaki gibi bir kod parçasi ile yapmaya karar verdim, tabi eski tadi vermedi. Bazilari bos sitenin neyini tanitiyosun deselerde onlara da kulak asmadim devam ettim.
Mail adreslerini outlook contactlarindan degil de databaseten okuyacak sekilde de yaptim gene ayni soruna takildik gmailin de bazi limitleri varmis...

http://mail.google.com/support/bin/answer.py?answer=22839

Sub GetContacts()

    Dim myOlApp As Outlook.Application
    Dim myNamespace As Outlook.NameSpace
    Dim myContacts As Outlook.Items
    Dim myItems As Outlook.Items
    Dim myItem As Outlook.ContactItem
    Set myOlApp = CreateObject("Outlook.Application")
    Set myNamespace = myOlApp.GetNamespace("MAPI")
    Set myContacts = myNamespace.GetDefaultFolder(olFolderContacts).Items
    Set myItems = myContacts.Restrict("[Categories] = 'Personal'")
    For Each myItem In myItems
        If (myItem.Class = olContact) Then
            If Not SendMail(myItem.fullName, myItem.Email1Address) Then
                Exit Sub
            End If
        End If
    Next

End Sub

Function SendMail(fullName As String, email As String) As Boolean

    Dim olApp As Outlook.Application
    Dim objMail As Outlook.MailItem
    Set olApp = Outlook.Application
    Set objMail = olApp.CreateItem(olMailItem)
    With objMail
        .Subject = "Yilin Sitesi"
        Dim strBody As String
        strBody = "Mutlaka ziyaret edin super bir site -benim diye demiyom-"
        strBody = strBody & " adresi : www.muratgokdemir.com"
        strBody = strBody & " lutfen bu maili mumkun oldugunca cok kisiye forward edin:)"
        .Body = strBody
        .To = email
        .Send
    End With
    SendMail = True

End Function

sayıyı yazıya çevirme

#include 
#include 

#define		SIZE			100
#define		SIZE_NUM		 12

char *numtotext(long number, char *str);
char *numtotext2(const char *num, char *str);

int main()
{
	char str[SIZE] = {0};
	numtotext(1345417L, str);
	printf("%s\n", str); 		/* birmilyonüçyüzkırkbeşbindörtyüzonyedi */
	return 0;
}

char *numtotext(long number, char *str)
{
	char *yuz[] = {"milyar", "milyon", "bin", ""};
	char num[SIZE_NUM] = {0};
	int i = SIZE_NUM;

	while (number > 0) {
		int digit = number % 10;
		number /= 10;
		num[--i] = (char) digit;
	}
	
	for (i = 0; i < SIZE_NUM; i+=3){
        char str_temp[SIZE] = {0};
		numtotext2(num + i, str_temp);
		if (str_temp[0] != '\0')
			strcat(str_temp, yuz[i/3]);
			strcat(str, str_temp);
	}
	return str;
}

char *numtotext2(const char *num, char *str)
{
	char *bir[] = {"", "bir","iki","uc","dort","bes","alti","yedi","sekiz","dokuz"};
	char *on[] = {"","on","yirmi","otuz","kirk","elli","altmis","yetmis","seksen","doksan"};
	char strtemp[SIZE];
	int i;

	for (i = 2; i >= 0; --i)
		switch (i) {
			case 2: 
				strcpy(strtemp, bir[num[i]]);
				strcat(str, strrev(strtemp));
				break;
			case 1:
				strcpy(strtemp, on[num[i]]);
				strcat(str, strrev(strtemp));
				break;
			case 0: 
				if (num[i] != 0) {
                    strcpy(strtemp, "yuz");
                    strcat(str, strrev(strtemp));
					if (num[i] > 1){
						strcpy(strtemp, bir[num[i]]);
						strcat(str, strrev(strtemp));
					}
				}
				break;
		}
	return strrev(str);
}

200 basamağa kadar olan sayılarla toplama çıkarma

#include 

#define		SIZE		(200 + 1)		/* maximum length bignum */ 
#define		PLUS			 1			/* positive sign bit */
#define		MINUS			-1			/* negative sign bit */

typedef struct {
    char digits[SIZE];	/* represent the number */
	int sign;			/* 1 if positive, -1 if negative */ 
    int index;			/* index of high-order digit */
} bignum;

void addlong(const char *num1, const char *num2, char *num3);
void sublong(const char *num1, const char *num2, char *num3);
void add_bignum(bignum *bnum1, bignum *bnum2, bignum *bnum3);
void subtract_bignum(bignum *bnum1, bignum *bnum2, bignum *bnum3);
void char_to_bignum(const char *num, bignum *bnum);
void bignum_to_char(const bignum *bnum, char *num);
void put_digits(const char *num, char *ndigits);
int get_index(const char *num);
int get_index_max(int index1, int index2);
int compare_bignum(bignum *bnum1, bignum *bnum2);
void zero_justify(bignum *bnum);

int main()
{
	//char n1[SIZE] = "9999999999999999999999999";
	//char n2[SIZE] = "-9999999999999999998888888888888888";
	char n1[SIZE] = "-123";
	char n2[SIZE] = "23";

	char n3[SIZE];

	addlong(n1, n2, n3);
	puts(n3);

	sublong(n1, n2, n3);
	puts(n3);

	return 0;
}

void addlong(const char *num1, const char *num2, char *num3)
{
	bignum bnum1, bnum2;
	bignum bnum3 = {{0},1,0};
    
	char_to_bignum(num1, &bnum1);
	char_to_bignum(num2, &bnum2);

	add_bignum(&bnum1, &bnum2, &bnum3);

	bignum_to_char(&bnum3, num3);
}

void sublong(const char *num1, const char *num2, char *num3)
{
	bignum bnum1, bnum2;
	bignum bnum3 = {{0},1,0};
    
	char_to_bignum(num1, &bnum1);
	char_to_bignum(num2, &bnum2);

	subtract_bignum(&bnum1, &bnum2, &bnum3);

	bignum_to_char(&bnum3, num3);
}

void add_bignum(bignum *bnum1, bignum *bnum2, bignum *bnum3)
{
	int carry;		/* carry digit */
	int i;			/* counter */

	if (bnum1->sign == bnum2->sign) 
		bnum3->sign = bnum1->sign;
	else {
		if (bnum1->sign == MINUS) {
			bnum1->sign = PLUS;
			subtract_bignum(bnum2, bnum1, bnum3);
			bnum1->sign = MINUS;
		} 
		else
		{
            bnum2->sign = PLUS;
            subtract_bignum(bnum1, bnum2, bnum3);
            bnum2->sign = MINUS;
		}
		return;
	}
	bnum3->index = get_index_max(bnum1->index, bnum2->index) + 1;
	carry = 0;

	for (i = 0; i <= (bnum3->index); i++) {
		bnum3->digits[i] = (carry + bnum1->digits[i] + bnum2->digits[i]) % 10;
		carry = (carry + bnum1->digits[i] + bnum2->digits[i]) / 10;
	}
	zero_justify(bnum3);
}

void subtract_bignum(bignum *bnum1, bignum *bnum2, bignum *bnum3)
{
	int borrow;			/* has anything been borrowed? */
	int v;				/* placeholder digit */
	int i;				/* counter */

	if ((bnum1->sign == MINUS) || (bnum2->sign == MINUS)) {
		bnum2->sign = -1 * bnum2->sign;
        add_bignum(bnum1,bnum2,bnum3);
        bnum2->sign = -1 * bnum2->sign;
		return;
	}
	if (compare_bignum(bnum1,bnum2) == PLUS) {
		subtract_bignum(bnum2,bnum1,bnum3);
		bnum3->sign = MINUS;
		return;
	}
	bnum3->index = get_index_max(bnum1->index,bnum2->index);
    borrow = 0;

    for (i=0; i<=(bnum3->index); i++) {
        v = (bnum1->digits[i] - borrow - bnum2->digits[i]);
		if (bnum1->digits[i] > 0)
			borrow = 0;
		if (v < 0) {
			v = v + 10;
			borrow = 1;
		}
        bnum3->digits[i] = (char) v % 10;
	}
	zero_justify(bnum3);
}

void char_to_bignum(const char *num, bignum *bnum)
{
	 bnum->sign = num[0] == '-' ? -1 : 1;
	 bnum->index = get_index(num);
	 put_digits(num, bnum->digits);
}
void bignum_to_char(const bignum *bnum, char *num)
{
	int k;
	int i = 0;

	if (bnum->sign == MINUS) 
		num[i++] = '-';

	for (k = bnum->index; k >= 0; --k)
		num[i++] = (int) bnum->digits[k] + '0';

	num[i++] = '\0';
}

void put_digits(const char *num, char *ndigits)
{
	int i;
	int flag = 0;
	int index = get_index(num);
		
	if (num[0] == '-' || num[0] == '+')
		flag = 1;
	
	for (i = 0; i <= index; ++i)
        ndigits[i] = num[index + flag - i] - '0';
	for (;i < SIZE; ++i)
		ndigits[i] = (char) 0;
}

int get_index(const char *num)
{
	int len = 0;

	while (num[len] != '\0')
		++len;

	if (num[0] == '-' || num[0] == '+')
		return len -=2;

	return len -= 1;
}

int get_index_max(int index1, int index2)
{
	if (index1 > index2)
		return index1;
	else
		return index2;
}

int compare_bignum(bignum *bnum1, bignum *bnum2)
{
	int i;				/* counter */

	if ((bnum1->sign == MINUS) && (bnum2->sign == PLUS)) 
		return(PLUS);
	if ((bnum1->sign == PLUS) && (bnum2->sign == MINUS)) 
		return(MINUS);

	if (bnum2->index > bnum1->index) 
		return (PLUS * bnum1->sign);
	if (bnum1->index > bnum2->index) 
		return (MINUS * bnum1->sign);

	for (i = bnum1->index; i>=0; i--) {
		if (bnum1->digits[i] > bnum2->digits[i]) 
			return(MINUS * bnum1->sign);
		if (bnum2->digits[i] > bnum1->digits[i]) 
			return(PLUS * bnum1->sign);
	}
	return(0);
}

void zero_justify(bignum *bnum)
{
    while ((bnum->index > 0) && (bnum->digits[bnum->index] == 0))
        bnum->index--;

	if ((bnum->index == 0) && (bnum->digits[0] == 0))
		bnum->sign = PLUS;			/* hack to avoid -0 */
}