1 /*---------------------------------------------------------------------------*
2 Project: Horizon
3 File: Result.h
4
5 Copyright (C)2009 Nintendo Co., Ltd. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Rev: 38834 $
14 *---------------------------------------------------------------------------*/
15
16 /* Please see man pages for details
17
18
19
20
21 */
22
23 #ifndef NN_RESULT_H_
24 #define NN_RESULT_H_
25
26 #include <nn/types.h>
27 #include <nn/util/util_StaticAssert.h>
28
29 //-------------------------------------------------------------------
30 // for C / C++
31
32 /* Please see man pages for details
33
34
35 */
36
37 /* Please see man pages for details
38
39
40
41
42
43 */
44
45
46 #ifdef __cplusplus
47 extern "C" {
48 #endif // ifdef __cplusplus
49
50 /* Please see man pages for details
51
52 */
53 typedef struct nnResult
54 {
55 bit32 value;
56 }
57 nnResult;
58
59 #ifdef __cplusplus
60 }
61 #endif // ifdef __cplusplus
62
63 /*
64
65 */
66 /*
67
68 */
69
70
71 //-------------------------------------------------------------------
72 // for C++
73
74 #ifdef __cplusplus
75
76 namespace nn {
77
78 /* Please see man pages for details
79
80 */
81
82 class Result{
83 private:
84 static const bit32 MASK_FAIL_BIT = 0x80000000u; // Most Significant Bit
85
86 static const s32 SIZE_DESCRIPTION = 10;
87 static const s32 SIZE_MODULE = 8;
88 static const s32 SIZE_RESERVE = 3;
89 static const s32 SIZE_SUMMARY = 6;
90 static const s32 SIZE_LEVEL = 5;
91
92 static const s32 SHIFTS_DESCRIPTION = 0;
93 static const s32 SHIFTS_MODULE = SHIFTS_DESCRIPTION + SIZE_DESCRIPTION;
94 static const s32 SHIFTS_RESERVE = SHIFTS_MODULE + SIZE_MODULE;
95 static const s32 SHIFTS_SUMMARY = SHIFTS_RESERVE + SIZE_RESERVE;
96 static const s32 SHIFTS_LEVEL = SHIFTS_SUMMARY + SIZE_SUMMARY;
97 NN_STATIC_ASSERT( SHIFTS_LEVEL + SIZE_LEVEL == 32 );
98
99 static const bit32 MASK_NEGATIVE_LEVEL = (~0u) << SIZE_LEVEL;
100
101 #define NN_RESULT_H_MAKE_MASK(size, shift) (((~0u) >> (32 - (size))) << (shift))
102 #define NN_RESULT_H_MAKE_MASK_HELPER(c) \
103 static const bit32 MASK_ ## c = NN_RESULT_H_MAKE_MASK(SIZE_ ## c, SHIFTS_ ## c)
104 NN_RESULT_H_MAKE_MASK_HELPER(DESCRIPTION);
105 NN_RESULT_H_MAKE_MASK_HELPER(MODULE);
106 NN_RESULT_H_MAKE_MASK_HELPER(SUMMARY);
107 NN_RESULT_H_MAKE_MASK_HELPER(LEVEL);
108 #undef NN_RESULT_H_MAKE_MASK_HELPER
109 #undef NN_RESULT_H_MAKE_MASK
110
111 #define NN_RESULT_H_MAKE_MAX(size) ((~0u) >> (32 - (size)))
112 #define NN_RESULT_H_MAKE_MAX_HELPER(c) \
113 static const s32 MAX_ ## c = NN_RESULT_H_MAKE_MAX(SIZE_ ## c)
114 NN_RESULT_H_MAKE_MAX_HELPER(DESCRIPTION);
115 NN_RESULT_H_MAKE_MAX_HELPER(MODULE);
116 NN_RESULT_H_MAKE_MAX_HELPER(SUMMARY);
117 NN_RESULT_H_MAKE_MAX_HELPER(LEVEL);
118 #undef NN_RESULT_H_MAKE_MAX_HELPER
119 #undef NN_RESULT_H_MAKE_MAX
120
121 public:
122 /* Please see man pages for details
123
124 */
125 enum Level
126 {
127 //
128 LEVEL_INFO = 1,
129 //
130 LEVEL_SUCCESS = 0,
131 //
132 LEVEL_FATAL = -1,
133 //
134 LEVEL_RESET = -2,
135 //
136 LEVEL_REINIT = -3,
137 //
138 LEVEL_USAGE = -4,
139 //
140 LEVEL_PERMANENT = -5,
141 //
142 LEVEL_TEMPORARY = -6,
143 //
144 LEVEL_STATUS = -7,
145 //
146 LEVEL_END
147 };
148
149 /* Please see man pages for details
150
151 */
152 enum Summary
153 {
154 SUMMARY_SUCCESS = 0, //
155 SUMMARY_NOTHING_HAPPENED = 1, //
156 SUMMARY_WOULD_BLOCK = 2, //
157 SUMMARY_OUT_OF_RESOURCE = 3, //
158 SUMMARY_NOT_FOUND = 4, //
159 SUMMARY_INVALID_STATE = 5, //
160 SUMMARY_NOT_SUPPORTED = 6, //
161 SUMMARY_INVALID_ARGUMENT = 7, //
162 SUMMARY_WRONG_ARGUMENT = 8, //
163 SUMMARY_CANCELLED = 9, //
164 SUMMARY_STATUS_CHANGED = 10, //
165 SUMMARY_INTERNAL = 11, //
166
167 SUMMARY_INVALID_RESULT_VALUE = MAX_SUMMARY //
168 };
169
170 /* Please see man pages for details
171
172
173
174
175
176 */
177 enum Module
178 {
179 MODULE_COMMON = 0,
180 MODULE_NN_KERNEL = 1,
181 MODULE_NN_UTIL,
182 MODULE_NN_FILE_SERVER,
183 MODULE_NN_LOADER_SERVER,
184 MODULE_NN_TCB,
185 MODULE_NN_OS,
186 MODULE_NN_DBG,
187 MODULE_NN_DMNT,
188 MODULE_NN_PDN,
189 MODULE_NN_GX,
190 MODULE_NN_I2C,
191 MODULE_NN_GPIO,
192 MODULE_NN_DD,
193 MODULE_NN_CODEC,
194 MODULE_NN_SPI,
195 MODULE_NN_PXI,
196 MODULE_NN_FS,
197 MODULE_NN_DI,
198 MODULE_NN_HID,
199 MODULE_NN_CAMERA,
200 MODULE_NN_PI,
201 MODULE_NN_PM,
202 MODULE_NN_PMLOW,
203 MODULE_NN_FSI,
204 MODULE_NN_SRV,
205 MODULE_NN_NDM,
206 MODULE_NN_NWM,
207 MODULE_NN_SOCKET,
208 MODULE_NN_LDR,
209 MODULE_NN_ACC,
210 MODULE_NN_ROMFS,
211 MODULE_NN_AM,
212 MODULE_NN_HIO,
213 MODULE_NN_UPDATER,
214 MODULE_NN_MIC,
215 MODULE_NN_FND,
216 MODULE_NN_MP,
217 MODULE_NN_MPWL,
218 MODULE_NN_AC,
219 MODULE_NN_HTTP,
220 MODULE_NN_DSP,
221 MODULE_NN_SND,
222 MODULE_NN_DLP,
223 MODULE_NN_HIOLOW,
224 MODULE_NN_CSND,
225 MODULE_NN_SSL,
226 MODULE_NN_AMLOW,
227 MODULE_NN_NEX,
228 MODULE_NN_FRIENDS,
229 MODULE_NN_RDT,
230 MODULE_NN_APPLET,
231 MODULE_NN_NIM,
232 MODULE_NN_PTM,
233 MODULE_NN_MIDI,
234 MODULE_NN_MC,
235 MODULE_NN_SWC,
236 MODULE_NN_FATFS,
237 MODULE_NN_NGC,
238 MODULE_NN_CARD,
239 MODULE_NN_CARDNOR,
240 MODULE_NN_SDMC,
241 MODULE_NN_BOSS,
242 MODULE_NN_DBM,
243 MODULE_NN_CFG,
244 MODULE_NN_PS,
245 MODULE_NN_CEC,
246 MODULE_NN_IR,
247 MODULE_NN_UDS,
248 MODULE_NN_PL,
249 MODULE_NN_CUP,
250 MODULE_NN_GYROSCOPE,
251 MODULE_NN_MCU,
252 MODULE_NN_NS,
253 MODULE_NN_NEWS,
254 MODULE_NN_RO,
255 MODULE_NN_GD,
256 MODULE_NN_CARDSPI,
257
258 MODULE_APPLICATION = MAX_MODULE - 1, //
259
260 MODULE_INVALID_RESULT_VALUE = MAX_MODULE //
261 };
262
263 /* Please see man pages for details
264
265
266
267 */
268 enum Description
269 {
270 DESCRIPTION_SUCCESS = 0, //
271
272 DESCRIPTION_INVALID_SELECTION = MAX_DESCRIPTION - 23, //
273 DESCRIPTION_TOO_LARGE = MAX_DESCRIPTION - 22, //
274 DESCRIPTION_NOT_AUTHORIZED = MAX_DESCRIPTION - 21, //
275 DESCRIPTION_ALREADY_DONE = MAX_DESCRIPTION - 20, //
276 DESCRIPTION_INVALID_SIZE = MAX_DESCRIPTION - 19, //
277 DESCRIPTION_INVALID_ENUM_VALUE = MAX_DESCRIPTION - 18, //
278 DESCRIPTION_INVALID_COMBINATION = MAX_DESCRIPTION - 17, //
279 DESCRIPTION_NO_DATA = MAX_DESCRIPTION - 16, //
280 DESCRIPTION_BUSY = MAX_DESCRIPTION - 15, //
281 DESCRIPTION_MISALIGNED_ADDRESS = MAX_DESCRIPTION - 14, //
282 DESCRIPTION_MISALIGNED_SIZE = MAX_DESCRIPTION - 13, //
283 DESCRIPTION_OUT_OF_MEMORY = MAX_DESCRIPTION - 12, //
284 DESCRIPTION_NOT_IMPLEMENTED = MAX_DESCRIPTION - 11, //
285 DESCRIPTION_INVALID_ADDRESS = MAX_DESCRIPTION - 10, //
286 DESCRIPTION_INVALID_POINTER = MAX_DESCRIPTION - 9, //
287 DESCRIPTION_INVALID_HANDLE = MAX_DESCRIPTION - 8, //
288 DESCRIPTION_NOT_INITIALIZED = MAX_DESCRIPTION - 7, //
289 DESCRIPTION_ALREADY_INITIALIZED = MAX_DESCRIPTION - 6, //
290 DESCRIPTION_NOT_FOUND = MAX_DESCRIPTION - 5, //
291 DESCRIPTION_CANCEL_REQUESTED = MAX_DESCRIPTION - 4, //
292 DESCRIPTION_ALREADY_EXISTS = MAX_DESCRIPTION - 3, //
293 DESCRIPTION_OUT_OF_RANGE = MAX_DESCRIPTION - 2, //
294 DESCRIPTION_TIMEOUT = MAX_DESCRIPTION - 1, //
295 DESCRIPTION_INVALID_RESULT_VALUE = MAX_DESCRIPTION - 0 //
296 };
297
298 private:
299
300 bit32 m_Code;
301
302 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> friend struct Const;
303 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> friend struct ConstRange;
Result(bit32 code)304 explicit Result(bit32 code) : m_Code(code) {}
305
306 public:
Result()307 Result()
308 : m_Code( static_cast<bit32>(
309 ((static_cast<bit32>(LEVEL_USAGE) << SHIFTS_LEVEL) & MASK_LEVEL) |
310 ((SUMMARY_INVALID_RESULT_VALUE << SHIFTS_SUMMARY) & MASK_SUMMARY) |
311 ((MODULE_INVALID_RESULT_VALUE << SHIFTS_MODULE) & MASK_MODULE) |
312 ((DESCRIPTION_INVALID_RESULT_VALUE << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
313 {
314 }
315
Result(Level level,Summary summary,Module module,int description)316 Result(Level level, Summary summary, Module module, int description)
317 : m_Code( static_cast<bit32>(
318 ((level << SHIFTS_LEVEL) & MASK_LEVEL) |
319 ((summary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
320 ((module << SHIFTS_MODULE) & MASK_MODULE) |
321 ((description << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) ))
322 {
323 }
324
Result(nnResult result)325 Result(nnResult result) : m_Code(result.value) {}
326 /* Please see man pages for details
327
328
329 */
330 /* Please see man pages for details
331
332 */
IsFailure()333 bool IsFailure() const
334 {
335 return (m_Code & MASK_FAIL_BIT) != 0;
336 }
337
338 /* Please see man pages for details
339
340 */
IsSuccess()341 bool IsSuccess() const
342 {
343 return !IsFailure();
344 }
345 /*
346
347 */
348 /* Please see man pages for details
349
350
351
352
353 */
GetLevel()354 Level GetLevel() const
355 {
356 // TODO: Should create a platform-dependent arithmetic shift inline function and call it
357 if(m_Code & MASK_FAIL_BIT)
358 {
359 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) | MASK_NEGATIVE_LEVEL);
360 }
361 else
362 {
363 return static_cast<Level>( GetCodeBits(MASK_LEVEL, SHIFTS_LEVEL) );
364 }
365 }
366
367 /* Please see man pages for details
368
369
370
371
372 */
GetSummary()373 Summary GetSummary() const
374 {
375 return static_cast<Summary>( GetCodeBits(MASK_SUMMARY, SHIFTS_SUMMARY) );
376 }
377
378 /* Please see man pages for details
379
380
381
382
383 */
GetModule()384 Module GetModule() const
385 {
386 return static_cast<Module>( GetCodeBits(MASK_MODULE, SHIFTS_MODULE) );
387 }
388
389 /* Please see man pages for details
390
391
392
393
394 */
GetDescription()395 int GetDescription() const
396 {
397 return static_cast<int>( GetCodeBits(MASK_DESCRIPTION, SHIFTS_DESCRIPTION) );
398 }
399
GetValue()400 bit32 GetValue() const { return m_Code; }
401 /* Please see man pages for details
402
403
404 */
405 /* Please see man pages for details
406
407
408
409 */
GetPrintableBits()410 bit32 GetPrintableBits() const { return m_Code; }
411
nnResult()412 operator nnResult() const
413 {
414 nnResult r = {m_Code};
415 return r;
416 }
417 /*
418
419 */
420 /* Please see man pages for details
421
422
423 */
424 /* Please see man pages for details
425
426
427
428
429
430
431
432 */
433 bool operator ==(const Result& rhs) const { return this->m_Code == rhs.m_Code; }
434
435 /* Please see man pages for details
436
437
438
439
440
441
442
443 */
444 bool operator !=(const Result& rhs) const { return this->m_Code != rhs.m_Code; }
445 /*
446
447 */
448 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription> struct Const;
449 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax> struct ConstRange;
450 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule> struct Const_LSM;
451 template <Result::Level TLevel, Result::Module TModule> struct Const_LM;
452 template <Result::Level TLevel> struct Const_L;
453
454 private:
GetCodeBits(bit32 mask,s32 shift)455 bit32 GetCodeBits(bit32 mask, s32 shift) const
456 {
457 return ((m_Code & mask) >> shift);
458 }
459
460 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
461 bool operator==(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
462 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
463 bool operator!=(ConstRange<TLevel, TSummary, TModule, TDescription, TDescriptionMin, TDescriptionMax>) const;
464 };
465
466 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription>
467 struct Result::Const : public Result
468 {
469 static const Result::Level Level = TLevel;
470 static const Result::Summary Summary = TSummary;
471 static const Result::Module Module = TModule;
472 static const int Description = TDescription;
473
474 static const bit32 Value = static_cast<bit32>(
475 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
476 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
477 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
478 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
479
ConstConst480 Const() : Result(Value) {}
481
IncludesConst482 static bool Includes(Result result)
483 {
484 return result.GetModule() == TModule && result.GetDescription() == TDescription;
485 }
486 };
487
488 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule, int TDescription, int TDescriptionMin, int TDescriptionMax>
489 struct Result::ConstRange : public Result
490 {
491 static const Result::Level Level = TLevel;
492 static const Result::Summary Summary = TSummary;
493 static const Result::Module Module = TModule;
494 static const int Description = TDescription;
495 static const int DescriptionMin = TDescriptionMin;
496 static const int DescriptionMax = TDescriptionMax;
497
498 static const bit32 Value = static_cast<bit32>(
499 ((static_cast<bit32>(TLevel) << SHIFTS_LEVEL) & MASK_LEVEL) |
500 ((TSummary << SHIFTS_SUMMARY) & MASK_SUMMARY) |
501 ((TModule << SHIFTS_MODULE) & MASK_MODULE) |
502 ((TDescription << SHIFTS_DESCRIPTION) & MASK_DESCRIPTION) );
503
ConstRangeConstRange504 ConstRange() : Result(Value) {}
505
IncludesConstRange506 static bool Includes(Result result)
507 {
508 return result.GetModule() == TModule && (TDescriptionMin <= result.GetDescription() && result.GetDescription() <= TDescriptionMax);
509 }
510
511 friend bool operator<=(Result lhs, ConstRange) { return ConstRange::Includes(lhs); }
512 friend bool operator>=(ConstRange, Result rhs) { return ConstRange::Includes(rhs); }
513 private:
514 bool operator==(Result) const;
515 bool operator!=(Result) const;
516 };
517
518 template <Result::Level TLevel, Result::Summary TSummary, Result::Module TModule>
519 struct Result::Const_LSM : public Result
520 {
521 static const Result::Level Level = TLevel;
522 static const Result::Summary Summary = TSummary;
523 static const Result::Module Module = TModule;
524
525 template <int TDescription>
526 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
527
Const_LSMConst_LSM528 Const_LSM(int description) : Result(TLevel, TSummary, TModule, description) {}
529 };
530
531 template <Result::Level TLevel, Result::Module TModule>
532 struct Result::Const_LM : public Result
533 {
534 static const Result::Level Level = TLevel;
535 static const Result::Module Module = TModule;
536
537 template <Result::Summary TSummary, int TDescription>
538 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
539
Const_LMConst_LM540 Const_LM(Result::Summary summary, int description) : Result(TLevel, summary, TModule, description) {}
541 };
542
543 template <Result::Level TLevel>
544 struct Result::Const_L : public Result
545 {
546 static const Result::Level Level = TLevel;
547
548 template <Result::Summary TSummary, Result::Module TModule, int TDescription>
549 struct Const : public Result::Const<TLevel, TSummary, TModule, TDescription> {};
550
Const_LConst_L551 Const_L(Result::Summary summary, Result::Module module, int description) : Result(TLevel, summary, module, description) {}
552 };
553
554 #define NN_DEFINE_RESULT_CONST(name, level, summary, module, description) \
555 typedef ::nn::Result::Const<(level), (summary), (module), (description)> name
556
557 #define NN_DEFINE_RESULT_CONST_RANGE(name, level, summary, module, description, descriptionMin, descriptionMax) \
558 typedef ::nn::Result::ConstRange<(level), (summary), (module), (description), (descriptionMin), (descriptionMax)> name
559
560 NN_DEFINE_RESULT_CONST(ResultSuccess, Result::LEVEL_SUCCESS, Result::SUMMARY_SUCCESS, Result::MODULE_COMMON, Result::DESCRIPTION_SUCCESS);
561
562 #define NN_DEFINE_RESULT_FUNC_LSM(name, level, summary, module) \
563 typedef ::nn::Result::Const_LSM<(level), (summary), (module)> name
564
565 #define NN_DEFINE_RESULT_CONST_LSM(name, f, description) \
566 typedef f::Const<(description)> name
567
568 #define NN_DEFINE_RESULT_FUNC_LM(name, level, module) \
569 typedef ::nn::Result::Const_LM<(level), (module)> name
570
571 #define NN_DEFINE_RESULT_CONST_LM(name, f, summary, description) \
572 typedef f::Const<(summary), (description)> name
573
574 #define NN_DEFINE_RESULT_FUNC_L(name, level) \
575 typedef ::nn::Result::Const_L<(level)> name
576
577 #define NN_DEFINE_RESULT_CONST_L(name, f, summary, module, description) \
578 typedef f::Const<(summary), (module), (description)> name
579
MakeInfoResult(Result::Summary summary,Result::Module module,int description)580 inline Result MakeInfoResult(Result::Summary summary, Result::Module module, int description)
581 { return Result(Result::LEVEL_INFO, summary, module, description); }
MakeFatalResult(Result::Summary summary,Result::Module module,int description)582 inline Result MakeFatalResult(Result::Summary summary, Result::Module module, int description)
583 { return Result(Result::LEVEL_FATAL, summary, module, description); }
MakeResetResult(Result::Summary summary,Result::Module module,int description)584 inline Result MakeResetResult(Result::Summary summary, Result::Module module, int description)
585 { return Result(Result::LEVEL_RESET, summary, module, description); }
MakeReInitResult(Result::Summary summary,Result::Module module,int description)586 inline Result MakeReInitResult(Result::Summary summary, Result::Module module, int description)
587 { return Result(Result::LEVEL_REINIT, summary, module, description); }
MakeUsageResult(Result::Summary summary,Result::Module module,int description)588 inline Result MakeUsageResult(Result::Summary summary, Result::Module module, int description)
589 { return Result(Result::LEVEL_USAGE, summary, module, description); }
MakePermanentResult(Result::Summary summary,Result::Module module,int description)590 inline Result MakePermanentResult(Result::Summary summary, Result::Module module, int description)
591 { return Result(Result::LEVEL_PERMANENT, summary, module, description); }
MakeTemporaryResult(Result::Summary summary,Result::Module module,int description)592 inline Result MakeTemporaryResult(Result::Summary summary, Result::Module module, int description)
593 { return Result(Result::LEVEL_TEMPORARY, summary, module, description); }
MakeStatusResult(Result::Summary summary,Result::Module module,int description)594 inline Result MakeStatusResult(Result::Summary summary, Result::Module module, int description)
595 { return Result(Result::LEVEL_STATUS, summary, module, description); }
596
597 }
598
599
600 #endif // __cplusplus
601
602 #ifdef __cplusplus
603 extern "C" {
604 #endif
605
606 typedef void (*nnResultHandlerImpl)(nnResult result, const char* filename, int lineno, const char* fmt, va_list vlist);
607
608 int nnResultFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
609 int nnResultTFailureHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
610
611 int nnResultPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
612 int nnResultTPanicHandler(nnResult result, const char* filename, int lineno, const char* fmt, ...);
613
614 nnResult nnMakeInvalidResult(void);
615
616 #ifdef __cplusplus
617 }
618 #endif
619
620 #endif /* NN_RESULT_H_ */
621