Printf4.java Source code

Java tutorial

Introduction

Here is the source code for Printf4.java

Source

    /**
       @version 1.10 1997-07-01
       @author Cay Horstmann
    */

    #include"Printf4.h"#include<string.h>#include<stdlib.h>#include<float.h>

    /**
       @param format a string containing a printf format specifier
       (such as "%8.2f"). Substrings "%%" are skipped.
       @return a pointer to the format specifier (skipping the '%')
       or NULL if there wasn't a unique format specifier
     */
    char*find_format(const char format[]){char*p;char*q;

    p=strchr(format,'%');while(p!=NULL&&*(p+1)=='%') /* skip %% */
    p=strchr(p+2,'%');if(p==NULL)return NULL;
    /* now check that % is unique */
    p++;q=strchr(p,'%');while(q!=NULL&&*(q+1)=='%') /* skip %% */
    q=strchr(q+2,'%');if(q!=NULL)return NULL; /* % not unique */
    q=p+strspn(p," -0+#"); /* skip past flags */
    q+=strspn(q,"0123456789"); /* skip past field width */
    if(*q=='.'){q++;q+=strspn(q,"0123456789");}
    /* skip past precision */
    if(strchr("eEfFgG",*q)==NULL)return NULL;
    /* not a floating-point format */
    return p;}

    JNIEXPORT void JNICALL Java_Printf4_fprint(JNIEnv*env,jclass cl,jobject out,jstring format,jdouble x){const char*cformat;char*fmt;jclass class_PrintWriter;jmethodID id_print;char*cstr;int width;int i;

    if(format==NULL){(*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/NullPointerException"),"Printf4.fprint: format is null");return;}

    cformat=(*env)->GetStringUTFChars(env,format,NULL);fmt=find_format(cformat);

    if(fmt==NULL){(*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/IllegalArgumentException"),"Printf4.fprint: format is invalid");return;}

    width=atoi(fmt);if(width==0)width=DBL_DIG+10;cstr=(char*)malloc(strlen(cformat)+width);

    if(cstr==NULL){(*env)->ThrowNew(env,(*env)->FindClass(env,"java/lang/OutOfMemoryError"),"Printf4.fprint: malloc failed");return;}

    sprintf(cstr,cformat,x);

    (*env)->ReleaseStringUTFChars(env,format,cformat);

    /* now call ps.print(str) */

    /* get the class */
    class_PrintWriter=(*env)->GetObjectClass(env,out);

    /* get the method ID */
    id_print=(*env)->GetMethodID(env,class_PrintWriter,"print","(C)V");

    /* call the method */
    for(i=0;cstr[i]!=0&&!(*env)->ExceptionOccurred(env);i++)(*env)->CallVoidMethod(env,out,id_print,cstr[i]);

    free(cstr);}

    /*
       This program is a part of the companion code for Core Java 8th ed.
       (http://horstmann.com/corejava)
    
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
    
       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.
    
       You should have received a copy of the GNU General Public License
       along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */

import java.io.*;

    /**
     * @version 1.10 1997-07-01
     * @author Cay Horstmann
     */
    class Printf4 {
        public static native void fprint(PrintWriter ps, String format, double x);

        static {
            System.loadLibrary("Printf4");
        }
    }

    /*
       This program is a part of the companion code for Core Java 8th ed.
       (http://horstmann.com/corejava)
    
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
    
       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.
    
       You should have received a copy of the GNU General Public License
       along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */

import java.io.*;

    /**
     * @version 1.10 1997-07-01
     * @author Cay Horstmann
     */
    class Printf4Test {
        public static void main(String[] args) {
            double price = 44.95;
            double tax = 7.75;
            double amountDue = price * (1 + tax / 100);
            PrintWriter out = new PrintWriter(System.out);
            /* This call will throw an exception--note the %% */
            Printf4.fprint(out, "Amount due = %%8.2f\n", amountDue);
            out.flush();
        }
    }