संक्षिप्त उत्तर: हां, यह आपके दोनों समाधानों को पूरी तरह से संभव है।
यदि आप सभी डेटा प्रकारों और प्रारूपों का समर्थन करना चाहते हैं तो printf फ़ंक्शन काफी जटिल है। लेकिन ऐसा कुछ लिखना मुश्किल नहीं है जो कुछ अलग-अलग अड्डों में एक स्ट्रिंग या एक पूर्णांक को आउटपुट कर सके (अधिकांश लोगों को केवल दशमलव और हेक्स की आवश्यकता होती है, लेकिन ऑक्टेटल संभवतः दशमलव और हेक्स होने पर कोड की एक और 3-4 पंक्तियों को जोड़ता है)।
आमतौर पर, printf इस तरह लिखा है:
int printf(const char *fmt, ...)
{
int ret;
va_list args;
va_start(args, fmt)
ret = do_xprintf(outputfunc, NULL, fmt, args);
va_end(args);
return ret;
}
और फिर do_xprintf()
करता है सभी कड़ी मेहनत के सभी संस्करणों (printf, sprintf, fprintf, आदि)
int do_xprintf(void (*outputfunc)(void *extra, char c), void *extra, const char *fmt, va_list args)
{
char *ptr = fmt;
while(1)
{
char c = *ptr++;
if (c == '%')
{
c = *ptr++; // Get next character from format string.
switch(c)
{
case 's':
char *str = va_arg(args, const char *);
while(*str)
{
count++;
outputfunc(extra, *str);
str++;
}
break;
case 'x':
base = 16;
goto output_number;
case 'd':
base = 10;
output_number:
int i = va_arg(args, int);
// magical code to output 'i' in 'base'.
break;
default:
count++;
outputfunc(extra, c);
break;
}
else
count++;
outputfunc(extra, c);
}
return count;
}
के लिए अब, सभी आपको उपर्युक्त कोड के कुछ बिट्स भरना होगा और outputfunc() लिखना होगा जो आपके सीरियल पोर्ट पर आउटपुट करता है।
ध्यान दें कि यह किसी न किसी प्रकार का स्केच है, और मुझे यकीन है कि कोड में कुछ बग हैं - और यदि आप फ़्लोटिंग पॉइंट या "चौड़ाई" का समर्थन करना चाहते हैं, तो आपको थोड़ा और काम करना होगा ...
(अतिरिक्त पैरामीटर पर ध्यान दें - एक FILE *
के उत्पादन के लिए है कि filepointer होगा, sprintf
के लिए, आप बफर और स्थिति बफर में, या कुछ इस तरह के लिए एक ढांचा पारित कर सकते हैं)
हाँ, यह संभव है - आप अपने स्वयं के उत्पादन दिनचर्या लिखना एक छोटे से स्टैंड-अलोन आंशिक printf() कार्यान्वयन मिल जाए, या एक minimimal एम्बेडेड libc से इन कार्यों को सक्षम करने के लिए आवश्यक बैक-एंड समर्थन लिख सकते हैं (संभवतः आपके टूलचेन के साथ शामिल) अपने प्लेटफॉर्म पर चलाने के लिए। –
धन्यवाद। मैंने सुना है कि एक एम्बेडेड libc के रूप में newlib ठीक काम करता है। हालांकि मैं पहले आंशिक printf() की तलाश करूंगा। – Sam
@ChrisStratton: यह ओएस पर प्रभावी ढंग से निर्भर करता है। यह संभव है कि मूल ओएस दिनरेखा मानक पुस्तकालय _are_। –