|
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 #include "T_rndutils.h" |
|
17 |
|
18 const TInt KMaxWordLength = 64 ; |
|
19 const TInt KMaxNgramSize = 8; |
|
20 |
|
21 void CWordNgrams::ConstructL(const TDesC& aFilename, const TInt aN, TBool aUseNarrowChar) |
|
22 { |
|
23 ASSERT(aN<KMaxNgramSize && aN>0); |
|
24 |
|
25 RFs fsSession; |
|
26 RFileReadStream fileStream; |
|
27 User::LeaveIfError(fsSession.Connect()); |
|
28 CleanupClosePushL(fsSession); |
|
29 User::LeaveIfError(fileStream.Open(fsSession, aFilename, EFileRead)); |
|
30 CleanupClosePushL(fileStream); |
|
31 TUint number = 0; |
|
32 TBuf8<KMaxNgramSize> ngram8; |
|
33 #ifdef _UNICODE |
|
34 TBuf<KMaxNgramSize> ngram; |
|
35 #else |
|
36 #define ngram ngram8; |
|
37 #endif |
|
38 TInt err=KErrNone; |
|
39 while(err==KErrNone) |
|
40 { |
|
41 TRAP(err, number = fileStream.ReadUint8L()); |
|
42 if(err==KErrNone) |
|
43 { |
|
44 if(aUseNarrowChar) |
|
45 { |
|
46 fileStream.ReadL(ngram8,aN); |
|
47 SetNgram(ngram8, number); |
|
48 } |
|
49 else |
|
50 { |
|
51 fileStream.ReadL(ngram,aN); |
|
52 SetNgram(ngram, number); |
|
53 } |
|
54 } |
|
55 } |
|
56 CleanupStack::PopAndDestroy(2); |
|
57 } |
|
58 |
|
59 |
|
60 HBufC* CWordNgrams::WordLC() |
|
61 { |
|
62 HBufC* buffer = HBufC::NewLC(KMaxWordLength); |
|
63 TPtr word = buffer->Des(); |
|
64 while(AddLetter(word)) |
|
65 {} |
|
66 return buffer; |
|
67 } |
|
68 |
|
69 |
|
70 /** Return false if done*/ |
|
71 TBool CWordNgrams::AddLetter(TDes& aWord) |
|
72 { |
|
73 if(aWord.Length()==aWord.MaxLength()) |
|
74 { |
|
75 return EFalse; |
|
76 } |
|
77 TChar c = NextLetter(aWord); |
|
78 if(c==0) |
|
79 { |
|
80 return EFalse; |
|
81 } |
|
82 aWord.Append(c); |
|
83 return ETrue; |
|
84 } |
|
85 |
|
86 // |
|
87 // CWordDigrams. |
|
88 // |
|
89 |
|
90 |
|
91 CWordDigrams::CWordDigrams(TInt64& aRandSeed) : iRandSeed(aRandSeed) |
|
92 {} |
|
93 |
|
94 |
|
95 CWordDigrams* CWordDigrams::NewLC(const TDesC& aFilename, TInt64& aRandSeed) |
|
96 { |
|
97 CWordDigrams* self = new(ELeave) CWordDigrams(aRandSeed); |
|
98 CleanupStack::PushL(self); |
|
99 self->ConstructL(aFilename); |
|
100 return self; |
|
101 } |
|
102 |
|
103 void CWordDigrams::SetNgram(const TDesC8& aNgram, TUint aNumber) |
|
104 { |
|
105 iDigrams[Index(aNgram[0])][Index(aNgram[1])] = (TUint8) aNumber; |
|
106 } |
|
107 |
|
108 void CWordDigrams::SetNgram(const TDesC16& /*aNgram*/, TUint /*aNumber*/) |
|
109 {} |
|
110 |
|
111 void CWordDigrams::ConstructL(const TDesC& aFilename) |
|
112 { |
|
113 CWordNgrams::ConstructL(aFilename); |
|
114 for(TInt i=0;i<KDigramNumberOfChars;i++) |
|
115 { |
|
116 TUint max =0; |
|
117 for(TInt j=0;j<KDigramNumberOfChars;j++) |
|
118 { |
|
119 max += iDigrams[i][j]; |
|
120 } |
|
121 iSizes[i] = (TUint16)max; |
|
122 } |
|
123 } |
|
124 |
|
125 |
|
126 |
|
127 TChar CWordDigrams::NextLetter(const TDesC& aWord) |
|
128 { |
|
129 TInt len = aWord.Length(); |
|
130 TInt index = 0; |
|
131 if(len!=0) |
|
132 { |
|
133 index = Index(aWord[len-1]); |
|
134 } |
|
135 |
|
136 if(iSizes[index]==0) |
|
137 { |
|
138 return 0; |
|
139 } |
|
140 TInt x = Math::Rand(iRandSeed) % iSizes[index]; |
|
141 for(TInt i=0;i<KDigramNumberOfChars;i++) |
|
142 { |
|
143 if(x<iDigrams[index][i]) |
|
144 { |
|
145 return Char(i); |
|
146 } |
|
147 x-=iDigrams[index][i]; |
|
148 if(x<=0) |
|
149 { |
|
150 x=1; |
|
151 } |
|
152 } |
|
153 return 0; |
|
154 } |
|
155 |
|
156 |
|
157 |
|
158 TInt CWordDigrams::Index(TChar c) |
|
159 { |
|
160 |
|
161 if(c.IsSpace()) |
|
162 return 1; |
|
163 if(c=='-') |
|
164 return 2; |
|
165 if(c.IsUpper()) |
|
166 return ((TUint)c)-'A'+KDigramNumberOfNonLetters; |
|
167 if(c.IsLower()) |
|
168 return ((TUint) c)-'a'+KDigramNumberOfLetters+KDigramNumberOfNonLetters; |
|
169 return 0; |
|
170 } |
|
171 |
|
172 |
|
173 TChar CWordDigrams::Char(TInt i) |
|
174 { |
|
175 if(i==0) |
|
176 return 0; |
|
177 if(i==1) |
|
178 return ' '; |
|
179 if(i==2) |
|
180 return '-'; |
|
181 if(i<KDigramNumberOfNonLetters+KDigramNumberOfLetters) |
|
182 return TChar('A'+i-KDigramNumberOfNonLetters); |
|
183 return TChar('a'+i-KDigramNumberOfNonLetters-KDigramNumberOfLetters); |
|
184 } |
|
185 |
|
186 |
|
187 CWordDigrams::~CWordDigrams() |
|
188 {} |